引言
文章开始先讲一个古老的段子:
有一天,柏拉图问苏格拉底:什麽是爱情?苏格拉底说:我请你穿越这片稻田,去摘一株最大最金黄的麦穗回来,但是有个规则:你不能走回头路,而且你只能摘一次.於是柏拉图去做了.
许久之后,他却空著双手回来了.苏格拉底问他怎麽空手回来了?
柏拉图说道:当我走在田间的时候,曾看到过几株特别大特别灿烂的麦穗,可是,我总想著前面也许会有更大更好的,於是就没有摘;但是,我继续走的时候,看到的麦穗,总觉得还不如先前看到的好,所以我最后什麽都没有摘到.
苏格拉底意味深长地说:这,就是爱情.
文章真实性就不去考究了,这篇文章想告诉我们什么呢?
就是珍惜眼前人了,不要好高骛远,错过的不会再回来最后什么都不剩......
这个当然不是我想讲的东西
今天我说的就是,如果你是柏拉图,你应该采取什么策略,才能找到最优解。
(其实可以直接到最下面看图即可)
问题分析
按照高中议论文的常规套路,好像应该先发表一下自己的观点,然后找几个例子(最好是3个)来论证,最后再总结一下,然后再升华一下blabla……
以这个写篇作文的话,应该大家都能写。但是长篇大论一大堆,道理一箩筐,好像并没有什么卵用,还是没有告诉别人,应该怎么选。不妨换个角度,从数学的方式来解答苏格拉底的问题。
对于柏拉图来说,困扰他最大问题或者说矛盾就是在前面的时候觉得不着急,总是觉得后面还有好的。到了后面的时候,感觉这些都不如前面,然后一无所获。
我们先假设到了最后,马上要离开的时候。突然遇到比前面还好的,柏拉图会不会选?答案应该是肯定的。
于是,不妨设稻田集合为S,集合有n个元素,用0~1来表示喜欢程度,max表示他心中最好的,这个“快离开的时候” 就是柏拉图访问到第k个元素的时候
柏拉图都对于前k个元素,选择无视,心中默默的记下并且不停更新max,当到了“快离开的时候”,即k+1的时候,柏拉图就慌了,只要找到比心中max大的就不管后面的了,直接就选,不过故事中恰巧后面没有比max大的。
这个思路好像没有什么问题啊
问题建模
略微思考一下这个思路核心,其实就是用样本估计总体。
再复述一下过程。
对于前k个数,只要记下并且更新max,后n-k中如果找到一个数大于前k个数中的max 那么就选这个数
乍一看这个思路好像不算很有说服力。
想象一下假如有2个班实力旗鼓相当,成绩差不多,而且分数段也差不多。现在知道a班最高分。我想知道b班最高分。于是我可以一个一个问b班的人,问到一个比a班最高分还高的人的时候,我决定我可以不问了。这个人八成就是b班最高分。
如果这点想通了,那就好办了,回到刚刚的问题,前k个人就是相当于a班的人,即是样本。
在这个案例中 样本过小,则估计偏差大,样本过大,则剩下的选择太小。
如何选择样本就是解决问题的关键所在。
对于这个k,应该可以通过概率论的知识算出来
但是作为一个程序员最好的办法就是一个一个试……
代码
我们先假设有100个boy
每个能遇到 200 girls
假设girls符合标准正态分布
如果找的girl就是200中最好的 称作找到best的boy

(第一次用tmd 发现默认的格式好像没法贴代码)
100个boys 结果是这样的
(横坐标是划分的比例 即k/n
纵坐标是成功率 找到best的boys / 总的boys)

好像看不出什么规律
那我们再看看1000boys的情况

好像有一点轨迹了
10000boys

这个好像能看出点什么了
最大值好像在35~40之间
而且这个函数图像
有点眼熟
套f(x)= -ln(x)*x 进去看看(全凭直觉)

看红线
卧槽,可以啊基本拟合了
厉害了我的哥
最大值点就是1/e
而且最大值也是1/e
e师兄,好巧好巧
不巧,我在等你
哎,数学就是这么优雅,完美。
虽然我并不知道为什么但是一定是这个了没错!
所以在1/e的地方选 200人的话 就是差不多看过76人后就不要在犹豫了
找到best概率最大 有37% 接近4成 还是阔以啦 毕竟这种问题不可能100%的解
当然其实大多数人并不一定要找到best,找到90%best就行了
而且只是找到了不代表就能成功
问题还比较复杂
有机会下次再说
后记
�学生时代如果不算小学,从懵懂的青春期开始算起,到大学毕业,10年期间
如果想要找出最好的第一次
那么高一的盛夏,就是最好的分界线
网友评论