用程序来找合适的对象(一)

2016-12-05  本文已影响0人  欺负v看

引言

文章开始先讲一个古老的段子:

有一天,柏拉图问苏格拉底:什麽是爱情?苏格拉底说:我请你穿越这片稻田,去摘一株最大最金黄的麦穗回来,但是有个规则:你不能走回头路,而且你只能摘一次.於是柏拉图去做了.

许久之后,他却空著双手回来了.苏格拉底问他怎麽空手回来了?

柏拉图说道:当我走在田间的时候,曾看到过几株特别大特别灿烂的麦穗,可是,我总想著前面也许会有更大更好的,於是就没有摘;但是,我继续走的时候,看到的麦穗,总觉得还不如先前看到的好,所以我最后什麽都没有摘到.

苏格拉底意味深长地说:这,就是爱情.

文章真实性就不去考究了,这篇文章想告诉我们什么呢?

就是珍惜眼前人了,不要好高骛远,错过的不会再回来最后什么都不剩......

这个当然不是我想讲的东西

今天我说的就是,如果你是柏拉图,你应该采取什么策略,才能找到最优解。

(其实可以直接到最下面看图即可)


问题分析

按照高中议论文的常规套路,好像应该先发表一下自己的观点,然后找几个例子(最好是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)

100boys成功率

好像看不出什么规律

那我们再看看1000boys的情况

1000boys成功率

好像有一点轨迹了

10000boys

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年期间

如果想要找出最好的第一次

那么高一的盛夏,就是最好的分界线

上一篇 下一篇

猜你喜欢

热点阅读