Python科学恋爱大法

简介: 秋天到了,又是吃螃蟹的季节。白富美学姐前两天约我吃最爱的大闸蟹,席间向来开心的她却显得心事重重。“你肿么啦?”我仔细地掰开蟹壳,问道。“十一假期好多朋友办婚礼,可我男票一点要求婚的意思都没有,我都想考虑备胎了。

秋天到了,又是吃螃蟹的季节。白富美学姐前两天约我吃最爱的大闸蟹,席间向来开心的她却显得心事重重。

bf2db6e99ebbdd17f60e1c6fa09003050905bdf9

“你肿么啦?”我仔细地掰开蟹壳,问道。

“十一假期好多朋友办婚礼,可我男票一点要求婚的意思都没有,我都想考虑备胎了。”

“你自己和他说嘛!”我放下了金黄的大闸蟹。

“我可是个妹子,这样多不好。”学姐叹了口气。

看着学姐犹犹豫豫的样子就知道她需要鼓励了~我眉头一皱,计上心来:

学姐呀,我来给你讲个故事~

有一座城市,当地风俗是,想结婚的男子必须先向心仪的女子求婚,而女子则需要等待求婚。

4024895d895043c9f8fac86203ed4f500a011eae

牧师每年会邀请人数相同的适婚男女参与一次集体相亲。一次相亲活动可能有很多轮,男子会首先向自己最爱的女子求婚,女子则会在所有的追求者中选择她的最爱;如果男子被拒绝,下一轮会向他第二喜欢的女子求婚;上一轮已经订婚的女子如果得到她更爱的人的求婚,则会毫不留情地抛弃未婚夫,和更爱的人在一起。被抛弃的男子需要重新参与求婚。

如此反复,等大家都订婚,就举办集体婚礼。

假设:

1)参加求婚的男女数量保持一致

2)每个男子都按喜爱程度对女子进行排序,比如最爱a,其次爱b,再次爱c

3)每个女子也同样给每个男子排序

0c20b44d7d96afd3c3bffefa693ffa6b315d6163
*此方法名为Gale-Shapley算法。优点如下: 1. 总有大家都订了婚的一天,不可能无限循环 2. 中止后所有的婚姻是稳定婚姻 (不稳定婚姻:比如有两对夫妇M1&F1和M2&F2, M1的老婆是F1,但他更爱F2;而F2的老公虽说是M2,但她更爱M1。这样的婚姻就是不稳定婚姻) 有兴趣的读者可以自行搜索证明过程。

学姐的眼睛开始放光了:

坐在家里等求婚,下辈子请让我生在这个城市吧!

我神秘一笑:

是不是女孩子的天堂,让我们用Python来看一看最后的匹配满意度吧!

(此处展示部分代码,完整源文件请看文末)

一、样本生成

为了完成模拟过程,我们首先需要一些样本,即随机生成数量相等(可设置数量)的男性和女性,同时生成他们对每个异性个体的喜爱排名


#设置男女生喜好样本
print('==============================生成样本数据==============================')
man = pd.DataFrame( [['w'+str(i) for i in random.sample(range(1,women_num+1),women_num)] \
for i in range(man_num)],
index = ['m'+str(i) for i in range(1,man_num+1)],
columns = ['level'+str(i) for i in range(1,women_num+1)]
)

women = pd.DataFrame( [['m'+str(i) for i in random.sample(range(1,man_num+1),man_num)] \
for i in range(women_num)],
index = ['w'+str(i) for i in range(1,women_num+1)],
columns = ['level'+str(i) for i in range(1,man_num+1)]
)
return (man,women)

二、模拟男性求婚过程

每天上午,每位还没订婚的男子,会向还没拒绝过他的女子中,他最爱的那一个求婚。


print('==============================测试集{}模拟开始=============================='.format(i))
print('==============================开始模拟求婚过程==============================')
level_num = 0
while man_ismapping['love_level'].min() == 0:
level_num += 1
print('==============================开始第{}天婚姻配对=============================='.format(level_num))
u_mapping_man = man_ismapping[man_ismapping.target == 'n'].index.tolist()

if level_num < 2:
level_col = 'level' + str(level_num)
man_choose = man[man.index.isin(u_mapping_man)][level_col].to_frame().reset_index()
man_choose.columns = ['man_id', 'women_id']
man_choose['range'] = 1
else:
m_id = u_mapping_man
l = []
for man_id in m_id:
col_n = int(man_ismapping[man_ismapping.index == man_id].range[0])
level_col = 'level' + str(col_n + 1)
women_id = man[man.index == man_id][level_col][0]
rg = col_n + 1
l.append([man_id, women_id, rg])
man_choose = pd.DataFrame(l, columns=['man_id', 'women_id', 'range'])

三、模拟女性接受订婚的过程

每天下午,每位女性会在自己接到的求婚信中,选择她最中意的男子接受求婚;如果没接到求婚,就继续等待。


for r in range(0, len(man_choose)):
relationship = man_choose[man_choose.index == r]
m = [i for i in relationship['man_id']][0]
w = [i for i in relationship['women_id']][0]
find = women[women.index == w].unstack().reset_index()
find.columns = ['level', 'women_id', 'man_id']
find = int([i for i in find[find['man_id'] == m]['level']][0].split('level')[1])
o_love_level = [i for i in women_ismapping[women_ismapping.index == w]['love_level']][0]
rg = [i for i in relationship['range']][0]
if o_love_level == 0:
women_ismapping.loc[w, 'love_level'] = find
women_ismapping.loc[w, 'target'] = m
women_ismapping.loc[w, 'range'] = level_num
man_ismapping.loc[m, 'love_level'] = rg
man_ismapping.loc[m, 'target'] = w
man_ismapping.loc[m, 'range'] = rg
elif o_love_level > find:
m_o = women_ismapping.loc[w, 'target']
man_ismapping.loc[m_o, 'love_level'] = 0
man_ismapping.loc[m_o, 'target'] = 'n'
man_ismapping.loc[m, 'love_level'] = rg
man_ismapping.loc[m, 'target'] = w
man_ismapping.loc[m, 'range'] = rg
women_ismapping.loc[w, 'love_level'] = find
women_ismapping.loc[w, 'target'] = m
women_ismapping.loc[w, 'range'] = level_num
else:
man_ismapping.loc[m, 'range'] = rg
pass

四、运行代码,并导出结果

学姐看着正在运行模拟过程有点着急了,我抽取其中一轮的结果先展示给她看: 77634f1b65165a65c3a951ad7bdcd0623e5a1972

纵轴代表该次模拟结果中,某位男性/女性的伴侣喜爱排名,即:匹配到的伴侣是他/她第X喜欢的异性。

显然,男性匹配到的伴侣离自己的最爱比女性更近——不止一点点!这可和“妹子天堂”的预期有点远啊!

学姐陷入了困惑:明明女性才掌握着订婚的决定权,而且男性即使暂时订婚成功,也有被抛弃的可能啊!你看,随着匹配轮次增加,男性的伴侣总是从自己最喜欢的对象慢慢变成不那么喜欢的对象而女性伴侣却在一步步变好。你这个会不会是偶然啊!

我:是不是偶然,让我们来看看100次模拟中,男性/女性匹配到的伴侣喜爱排名均值分布吧~

ff678a6abeef9956cf080245e35f3f8cfc6d326b

*纵轴代表其中一次模拟中,男性/女性的平均伴侣喜爱排名均值,即:匹配到的伴侣是他们/她们第X喜欢的异性。

可以明显看到,男性最终匹配到的伴侣的喜爱排名普遍高于女性。

学姐终于收起了质疑原来主动出击真有这么大的作用!为什么呀~

我分析道:学姐你看,女孩只能坐在家里等求婚,她喜欢的人可能连看到她的机会都没有。而男性在主动做出选择之时,每次都能选择自己最喜欢的对象。即使被拒绝,他的下一次求婚,也能送给可能接受他的、他最爱的女孩儿。这个游戏保证男孩的伴侣是可能和他在一起的最好的那一个,但对女孩就不是

b95c6d901e3a04ab275097aa790740bd9fbe260f

学姐:你说得对。面对自己喜欢的人,我应该去争取,而不只是等待。

我:这就对啦!世界上有什么事不需要努力呢?你有喜欢的人,就要好好努力,提升自己,去吸引ta,爱ta~


原文发布时间为:2018-10-14

本文作者:木木

本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”。

相关文章
|
4月前
|
存储 人工智能 数据处理
Python:编程的艺术与科学的完美交融
Python:编程的艺术与科学的完美交融
27 1
|
16天前
|
机器学习/深度学习 数据采集 测试技术
利用Python实现简单的机器学习模型软件测试的艺术与科学:探索自动化测试框架的奥秘
【8月更文挑战第27天】在本文中,我们将一起探索如何通过Python编程语言创建一个简单的机器学习模型。我们将使用scikit-learn库中的线性回归模型作为示例,并通过一个实际的数据集来训练我们的模型。文章将详细解释每一步的过程,包括数据预处理、模型训练和预测结果的评估。最后,我们会用代码块展示整个过程,确保读者能够跟随步骤实践并理解每个阶段的重要性。
|
2月前
|
自然语言处理 程序员 编译器
`pylatex`是一个Python库,用于生成LaTeX文档。LaTeX是一种用于高质量排版和打印的文档准备系统,特别适用于科学、技术和数学文档。
`pylatex`是一个Python库,用于生成LaTeX文档。LaTeX是一种用于高质量排版和打印的文档准备系统,特别适用于科学、技术和数学文档。
|
1月前
|
消息中间件 数据库 开发者
|
4月前
|
程序员 Python
利用Python实现科学式占卜
一直以来,中式占卜都是基于算命先生手工实现,程序繁琐(往往需要沐浴、计算天时、静心等等流程)。准备工作复杂(通常需要铜钱等道具),计算方法复杂,需要纯手工计算二进制并转换为最终的卦象,为了解决这个问题,笔者基于python实现了一套科学算命工具,用于快速进行占卜。 本文的算命方式采用八卦 + 周易+ 梅花易数实现,脚本基于python3.9.0开发。本人对于周易五行研究较浅,如有疏漏请见谅。 最终效果如图,在运行程序之后,会根据当前的运势自动获取你心中所想之事的卦象(本卦、互卦、变卦) 前置知识 基础原理 首先我们需要了解一些最基本的占卜知识,目前我国几种比较主流的占卜方式基本都是基
54 0
|
机器学习/深度学习 缓存 数据可视化
Python视频制作引擎Manim安装教程2021版(科学概念可视化)
Python视频制作引擎Manim安装教程2021版(科学概念可视化)
733 0
Python视频制作引擎Manim安装教程2021版(科学概念可视化)
Python编程语言学习:如何将excel表格内的科学计数法转为常规数值并全部显示?
Python编程语言学习:如何将excel表格内的科学计数法转为常规数值并全部显示?
Python编程语言学习:如何将excel表格内的科学计数法转为常规数值并全部显示?
用Python写了一个谈恋爱AA公式后,我被分手了
网友们对线了一晚上,最终得出了一个结论:如果男生要求女朋友和她各出一半就没那么多破事了。 大家对于这个结论貌似都挺满意,有几个网友虽然不太同意,但架不住他们人多,嘴里骂骂咧咧的走了。大家都散了,只留我一人在原地懵逼,这就完了???好戏才刚刚开始好不好,作为一个程序员,我关心的地方不是恋爱究竟该不该AA,而是具体应该怎么AA。 既然提了AA,那我们就把AA算明白,如果你觉得恋爱AA就是一人出一半的话,那你就太单纯了。 首先,男生和女生吃的东西的量是不一样的,比如一顿饭,男生吃三分之二,女生吃三分之一,那饭钱五五开对女生就不太公平,如果饭量反过来
138 0
|
人工智能 Python
书籍python科学工程介绍 Python for Science and Engineering - 2019
简介 本指南提供了快速而精辟的Python编程介绍。 作者精心开发了一种在任何科学和工程学科中使用Python的简洁方法,包含大量示例,实用提示和内部提示。 读者将会看到为什么Python是如此广泛吸引人的程序,并学习语法,数据结构,输入和输出,绘图,条件和循环,用户定义函数,曲线拟合,数值例程,动画和可视化的基础知识。
|
索引 Python
Python 科学工具笔记
Python 科学工具笔记 numpy a = numpy.array([1,2,3,4]);// 创建一个numpy的数组对象 此时a.shape显示的值为(4,); 由此得出结论在一维的数组中, 数组的是列优先的 numpy.
1118 0