稳定的婚姻问题


12

背景

假设有2*n要结婚的人,并且进一步假设每个人n在以下约束下完全被其他人吸引:

  1. 吸引力是对称的 ; 即如果人A被人吸引B,则人B被人吸引A
  2. 吸引力是反传递的 ; 也就是说,如果一个A人和一个人B都被一个人吸引C,那么一个A人和B另一个人就不会被彼此吸引。

因此,吸引力网络形成(无向)完整的二部图 Kn,n。我们还假设每个人都对他们吸引的人进行排名。这些可以表示为图中的边缘权重。

一个婚姻是一个配对(A,B)地方AB被吸引到对方。如果存在另一场婚姻,婚姻中的婚姻是不稳定的,那么每一次婚姻中的一个人都可以与伴侣离婚并结婚,并且双方最终都会得到比其前夫更高的伴侣。

目标

您的任务是编写一个完整的程序或函数,以每个人的喜好作为输入并为每个人输出一个婚姻,以使每个婚姻稳定下来。

输入值

输入可以采用任何方便的格式;例如加权图,首选项的有序列表,字典/关联等。您可以选择将总人数作为输入,但不允许其他输入。

输出量

输出也可以采用任何方便的格式;例如,元组列表,最小边缘覆盖,与每个人的伴侣相关的功能等等。请注意,唯一的约束是每次婚姻都是稳定的,没有其他最优性要求。

笔记

  1. 您可以O(n^2)Wikipedia或此Numberphile视频上找到更多信息和解决此问题的算法。但是,您可以自由使用任何算法。
  2. 禁止出现标准漏洞
  3. 这是。最短答案(以字节为单位)获胜。

15
吸引力是对称的哈!
路易斯·门多

5
@LuisMendo我继续沿用不切实际的单词问题的传统:)
ngenisis

2
今天是情人节(UTC + 8在这里)
busukxuan

Answers:


7

Mathematica,28个字节

上会认为,这是作弊。我自己这样:

Combinatorica`StableMarriage
  • 需要以男性和女性偏好的权重矩阵来调用。
  • 返回耦合的直接索引。

(是Combinatorica,不赞成使用,但字节数少于FindIndependentEdgeSet


示例(类似于GoT):( 公平地说-我猜到了权重...但我对结果还可以)

在此处输入图片说明

m = {{2, 4, 3, 1}, {1, 2, 4, 3}, {3, 2, 1, 4}, {4, 2, 1, 3}};
w = {{2, 3, 4, 1}, {3, 2, 1, 4}, {3, 2, 4, 1}, {4, 1, 2, 3}};
result = Combinatorica`StableMarriage[w, m];
MapThread[
  UndirectedEdge[Show[#1, ImageSize -> 130], 
    Show[#2, ImageSize -> 130]] &, {names1, 
   names2[[result]]}] // TableForm

块引用


3
+1用于开发Mathematica的史诗库,该库对除代码高尔夫球程序之外的所有功能无用。
SIGSTACKFAULT

2
我必须养成禁止内置的习惯,即使我确信其中不存在:)
ngenisis

永远不要低估Mathematicas的内置函数; D
朱利安·克鲁格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.