假设有8个女孩和8个男孩。每个人都会按照您的喜好为您列出可以约会的8个合作伙伴的排名。例如,第一个女孩可能会给您[3,6,2,8,8,1,4,5,7];这意味着他们最喜欢3号男孩,然后是6号男孩,依此类推。如果我们将她与6号男孩配对,她不会那么生气。特别是,我们为此配对加1的罚款。同样,如果6号男孩让她成为第三选择,我们也会在总罚分上加上2。
我们的目标是设计一种效率算法,将这些男孩和女孩配对,以使总惩罚最小化。此罚分是所有16个罚则的总和,这是他们与他们的最佳选择之间的距离。
我在凌晨3点想到了这个问题,这使我无法重新上床睡觉。天真的解决方案需要O(n!),这显然是不可接受的。我以为也许我可以做一个图形表示并搜索图形,但这可能还需要n!空间。分而治之并没有派上用场,贪婪的算法也不是最佳选择。也许线性编程会有所帮助,但我没有进一步研究。
感谢任何指导或建议。
答案 0 :(得分:0)
这是稳定婚姻问题的一个示例,可以肯定比O(N!)时间更好。要解决此问题,您可以选择男人或女人(对于这种解释,我们将说男人),然后遍历所有没有伴侣的男人。然后,您查看该男人的偏爱列表,并“提议”该男人没有提议的列表中排名最高的女人。如果女人没有配对,或者比现在的男人更喜欢这个男人,她会接受的。否则,男人会保持单身。您继续遍历所有男人,直到没有人成对。
此算法运行时间为O(N ^ 2),因为永远不会超过N ^ 2个提议。这是因为每个男人都可以向每个女人求婚,并且有N个男人和N个女人,所以总共有N ^ 2个唯一的提议,并且每个提议只能进行一次,因为该算法不会让男人求婚多次给同一个女人。
此算法产生的解决方案是一个稳定的解决方案,这意味着没有一对男女比当前的伴侣更愿意彼此相爱,并且针对您迭代的性别进行了优化(在我的解释中,男人是可以的,但您也可以轻松地将其应用在女人身上。
也有一些算法试图找到一个稳定的配对,该配对不会针对男性或女性进行优化,而是寻找一种适合所有人的解决方案。对于这样一种算法,您可以从找到男性和女性的最佳婚姻开始(如果他们相同,则无需进行算法即可知道答案),然后查看女性,剩下的人是谁男性最优化配对和其伴侣m在男性最优化匹配中表现最差。除了这次以外,执行另一个男性优化匹配,从m向其偏好列表中的下一个女人w求婚开始。如果在接下来的配对中最差的人是男人,那么您的答案是以前的配对,否则,继续进行其他男性优化配对,并在此配对中对最差者进行相同的更改,直到找到最差的配对为止一个人是一个男人,你有你的答案(一个男人最糟糕的情况下的最后一次配对)。该算法将使人们的首选伴侣与其实际伴侣之间的最大距离最小化。该算法将找到O(N ^ 4),因为它找到的稳定匹配不超过N ^ 2次。