秋天到了,又是吃螃蟹的季节。白富美学姐前两天约我吃最爱的大闸蟹,席间向来开心的她却显得心事重重。
“你肿么啦?”我仔细地掰开蟹壳,问道。
“十一假期好多朋友办婚礼,可我男票一点要求婚的意思都没有,我都想考虑备胎了。”
“你自己和他说嘛!”我放下了金黄的大闸蟹。
“我可是个妹子,这样多不好。”学姐叹了口气。
看着学姐犹犹豫豫的样子就知道她需要鼓励了~我眉头一皱,计上心来:
学姐呀,我来给你讲个故事~
有一座城市,当地风俗是,想结婚的男子必须先向心仪的女子求婚,而女子则需要等待求婚。
牧师每年会邀请人数相同的适婚男女参与一次集体相亲。一次相亲活动可能有很多轮,男子会首先向自己最爱的女子求婚,女子则会在所有的追求者中选择她的最爱;如果男子被拒绝,下一轮会向他第二喜欢的女子求婚;上一轮已经订婚的女子如果得到她更爱的人的求婚,则会毫不留情地抛弃未婚夫,和更爱的人在一起。被抛弃的男子需要重新参与求婚。
如此反复,等大家都订婚,就举办集体婚礼。
假设:
1)参加求婚的男女数量保持一致
2)每个男子都按喜爱程度对女子进行排序,比如最爱a,其次爱b,再次爱c
3)每个女子也同样给每个男子排序
*此方法名为Gale-Shapley算法。优点如下:
1. 总有大家都订了婚的一天,不可能无限循环
2. 中止后所有的婚姻是稳定婚姻
(不稳定婚姻:比如有两对夫妇M1&F1和M2&F2, M1的老婆是F1,但他更爱F2;而F2的老公虽说是M2,但她更爱M1。这样的婚姻就是不稳定婚姻)
有兴趣的读者可以自行搜索证明过程。
学姐的眼睛开始放光了:
坐在家里等求婚,下辈子请让我生在这个城市吧!
我神秘一笑:
是不是女孩子的天堂,让我们用Python来看一看最后的匹配满意度吧!
(此处展示部分代码,完整源文件请看文末)
一、样本生成
为了完成模拟过程,我们首先需要一些样本,即随机生成数量相等(可设置数量)的男性和女性,同时生成他们对每个异性个体的喜爱排名。
二、模拟男性求婚过程
每天上午,每位还没订婚的男子,会向还没拒绝过他的女子中,他最爱的那一个求婚。
三、模拟女性接受订婚的过程
每天下午,每位女性会在自己接到的求婚信中,选择她最中意的男子接受求婚;如果没接到求婚,就继续等待。
四、运行代码,并导出结果
学姐看着正在运行模拟过程有点着急了,我抽取其中一轮的结果先展示给她看:
纵轴代表该次模拟结果中,某位男性/女性的伴侣喜爱排名,即:匹配到的伴侣是他/她第X喜欢的异性。
显然,男性匹配到的伴侣离自己的最爱比女性更近——不止一点点!这可和“妹子天堂”的预期有点远啊!
学姐陷入了困惑:明明女性才掌握着订婚的决定权,而且男性即使暂时订婚成功,也有被抛弃的可能啊!你看,随着匹配轮次增加,男性的伴侣总是从自己最喜欢的对象慢慢变成不那么喜欢的对象;而女性伴侣却在一步步变好。你这个会不会是偶然啊!
我:是不是偶然,让我们来看看100次模拟中,男性/女性匹配到的伴侣喜爱排名均值分布吧~
*纵轴代表其中一次模拟中,男性/女性的平均伴侣喜爱排名均值,即:匹配到的伴侣是他们/她们第X喜欢的异性。
可以明显看到,男性最终匹配到的伴侣的喜爱排名普遍高于女性。
学姐终于收起了质疑:原来主动出击真有这么大的作用!为什么呀~
我分析道:学姐你看,女孩只能坐在家里等求婚,她喜欢的人可能连看到她的机会都没有。而男性在主动做出选择之时,每次都能选择自己最喜欢的对象。即使被拒绝,他的下一次求婚,也能送给可能接受他的、他最爱的女孩儿。这个游戏保证男孩的伴侣是可能和他在一起的最好的那一个,但对女孩就不是。
学姐:你说得对。面对自己喜欢的人,我应该去争取,而不只是等待。
我:这就对啦!世界上有什么事不需要努力呢?你有喜欢的人,就要好好努力,提升自己,去吸引ta,爱ta~
领取专属 10元无门槛券
私享最新 技术干货