与约束匹配

时间:2013-11-25 22:54:21

标签: algorithm graph constraints

为了好玩,我正在创建一个程序,为Secret Santa礼品交换生成合作伙伴。但是,在此设置中,不允许随机生成对,而是允许约束。

示例:A人和B人互相讨厌,因此A和B都不应该分配给对方购买礼物。

第二个例子:C人去年为D人买了礼物。不应指定C人为D人购买礼物,但仍应允许D人购买礼物。

一般来说,我想从一个集合到它自己生成一个双射函数,但该函数需要对约束敏感。如果有太多的约束使得问题无法解决,则例程应该返回错误或其他内容。

这看起来像某种图形问题,但我真的不知道要解决它的方向。如何以编程方式解决此问题?我可以使用/修改现有的算法吗?

2 个答案:

答案 0 :(得分:3)

基本上你的问题是众所周知的assignment problem

考虑一个二分图,其中每一方都将所有人都作为节点(是的,每个人将出现两次:一次在左侧,一次在右侧)。然后,如果允许A向B发送礼物,则可以从A的左侧向右侧添加B的边缘。然后,您可以应用Hungarian algorithm来查找最大化数量的分配允许的礼物。

Bipartite graph

答案 1 :(得分:0)

听起来像constraint Satisfaction problem。 该问题有一个图形表示,可以直观地显示它是如何解决的。 我参加了一个谈论它的人工智能课程。这是一个讲座幻灯片: Lecture。幻灯片15显示了图片。 阅读幻灯片,有几种解决CSP的算法,包括Variable Elimitation(幻灯片44)。