bootstraptable没有找到匹配的记录_求解:三十而已中王曼妮的恋爱匹配问题?

王曼妮的红线模型

c58fd745f4fccce9faf23ef835675f45.png
8fc4ea8617f8b1d645394e6a2a8f54b2.png
31d8a3ddaeb373f93851750f8fa4479e.png
46f7ed9d927538ff92bcae3201d76e6d.png
619beeea462bd484fb610e4c42a17b4d.png
ec0f929bc492367c707f034feb1a2bc8.png
dae7d513b53e774d266e86f5ee1d771c.png
6f163469ea73b33e4ea197e0d4d37166.png
e2e604044b775f8f45e42f1945cb7f24.png
9d6c669e53401120e5fd7c04b0113d34.png

王曼妮红线模型之原理——匈牙利算法

在上述模型中,将所有对象分成男方和女方两组,这就是所谓的二分图

每个子图里有多个对象,即节点。每个节点只与另一个子图里的节点连接,可以为0到多个。

我们模型的优化目标,就是为尽可能多的节点连线。而约束条件就是:每个节点具有唯一占有性质,即当该节点与某一个节点连接后,其他节点不得再与该节点连接。(像极了爱情里的坟墓)

解决这个模型的方法有很多种,而大名鼎鼎的匈牙利算法就是解决该问题的最优秀方法之一,易于理解,效果拔群。

匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法。美国数学家哈罗德·库恩于1955年提出该算法。此算法之所以被称作匈牙利算法,是因为算法很大一部分是基于以前匈牙利数学家Dénes Kőnig和Jenő Egerváry的工作之上创建起来的。(来自百度百科)

对该算法的英文讲解,可以参考:http://www.hungarianalgorithm.com/examplehungarianalgorithm.php

该算法的多目标追踪应用,可以参考:https://zhuanlan.zhihu.com/p/62981901

匈牙利算法的编程实现

"""
使用一个二维矩阵记录节点对应关系
1表示匹配,0表示不匹配
每一行表示一个女孩的倾向
同理,每一列是一个女孩对男孩的倾向
"""
arr = [
[1, 1, 1],
[0, 1, 0],
[1, 0, 0],
[0, 0, 1]
]

# 使用一个一维数组记录右边子图的匹配状态
boys_matched = [None] * len(arr[0])
"""
对于每一个女孩,遍历寻找是否有能匹配成功的男孩
在遍历时,若对该男孩本身无兴趣,则跳过(矩阵中对应位置为0)
若有兴趣,且该男孩未有主,则直接匹配,并标记占有
若有兴趣,但该男孩已经有主,且已访问过,则跳过
若有兴趣,但该男孩已经有主,且未访问过,则尝试对系统进行回溯
若遍历结束也未能寻找到能匹配的男孩,则不对该女孩进行匹配
"""
def find_boy(girl_i):
# 遍历第i个男孩的女孩列表,如果能成功找到一个让所有人满意的女孩,则为该男孩与该女孩进行标记
for (boy_i, boy_like) in enumerate(arr[girl_i]):
if boy_like and not boys_used[boy_i]:
boys_used[boy_i] = True
# 如果女孩未被抢走,或者通过回溯能够让所有人满意,则进行标记
if boys_matched[boy_i] is None or find_boy(boys_matched[boy_i]):
boys_matched[boy_i] = girl_i
return True
return False

这个算法的关键在于,不但要有一个boys_matched全局一维数组记录每个男孩的匹配情况,还要有一个boys_visited局部数组记录每个男孩的访问情况,这个数组在遍历每个女生时重置。

因此,主循环写成如下。

if __name__ == '__main__':

# 主循环,对二分图的左边,即矩阵的行进行遍历
for (girl_i, girl_preference) in enumerate(arr):
# 重置访问数组
boys_used = [False] * len(girl_preference)
find_boy(girl_i)

# 输出最终结果
for (i, j) in enumerate(boys_matched):
print(f'{i} -- {j}')

结果如下。

0 -- 2
1 -- 1
2 -- 0

也就是0号女生(王曼妮)与2号男生(张志)匹配,1号女生(赵静语)与1号男生(海王)匹配,2号女生(咖啡店店员)与0号男生(咖啡店店主)匹配。

完全符合我们图里的描述与思路。

然而。。。

爱情里最真实的样子

1b21c545d0c61a5c520414d3807a8e34.png

结语

前段时间两天看完《三十而已》,还是很有感触的。

这首先是因为三十对于自己来说,也是一个即将要面对的问题。其次取材地点在上海,是我经常工作的城市。此外,还有浓浓的金融风(尽管多是讽刺寓意),这些都与我息息相关。

近期恰好在研究算法时遇到匈牙利算法,觉得很适合用它去描述与理解一些问题。不过,在肯定该算法的同时,也必须指出,该算法只是一个双向连线模型,没有考虑线的权重。如果我们在该模型的基础之上考虑线的权重,其实可以更加吻合编剧对该剧的发展期望的。比如我们设王曼妮对姜辰、海王、张志的权重为0.1、0.4、0.2,对其他人的权重为0.3;等等。

算法归算法,只是一种思想。而模型归模型,其本身尚不具备完全解释现实的能力。人在世界上,很多决策都是基于复杂环境的应变反应,具有较大不确定性,况且还有类似王曼妮最后甩手十万就去欧洲留学的迷之决策……

希望本篇文章对你的某些方面有所启发。

下期再见!

作者:南川

素材:如曼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值