可能的NP完全问题?

时间:2009-06-05 16:00:50

标签: algorithm allocation np-complete constraint-satisfaction

我只是想让某人验证以下问题是NP完全还是实际上比简单的强力组合检查更好/更容易解决。

我们的软件中存在一种资源分配问题,我将以一个例子来解释它。

假设我们需要4个人在白班工作。这个数字,以及它是“白班”的事实记录在我们的数据库中。

但是,我们不需要任何人填写这些地点,需要填写一些要求才能满足要求。

在这4个中,我们说其中2个必须是护士,其中1个必须是医生。

其中一名医生也必须作为特定团队的一员工作。

所以我们有这组信息:

  

白班:4
  1名医生   1名医生,需要在A队工作   1名护士

以上不是问题。当我们开始挑选人们在白班工作并试图弄清楚我们到目前为止所选择的人是否真的能够满足标准时,就会出现问题。

例如,假设我们选择James,John,Ursula和Mary来工作,James和Ursula是医生,John和Mary是护士。

厄秀拉也在A队工作。

现在,根据我们尝试适应法案的顺序,我们最终可能会推断出我们是否拥有合适的人,除非我们开始尝试不同的组合。

例如,如果在列表中首先选择Ursula,我们可以将她与“1医生”标准相匹配。然后我们到了詹姆斯,我们注意到,由于他不在A队工作,其他关于“1位医生,需要在A队工作”的标准,不能用他来填补。由于其他两个人都是护士,他们也不符合这个标准。

所以我们首先回溯并尝试詹姆斯,他也可以符合第一个标准,然后厄秀拉可以满足需要该团队的标准。

因此我们需要尝试不同的组合,因为我们需要尝试不同的组合,在这种情况下我们有一些尚未填充的标准,即使工作头的总数相同作为所需的总头数,或者我们找到了一个有效的组合。

这是唯一的解决方案,任何人都可以想到更好的解决方案吗?


修改:一些澄清。

对这个问题的评论提到,对于这几个人,我们应该蛮力,我同意,这可能是我们可以做的,我们甚至可以做到这一点,在一些优化看待的同一条道路上如果数据大小很小,数据的大小和选择不同的排序算法,初始开销较小。

问题在于,这是一个名册规划系统的一部分,你可能会涉及很多人,“我们在白天需要X人”以及“我们有这个游泳池” Y人将会这样做“,以及潜在的大”我们有这些X人的Z标准列表,必须以某种方式与这些Y人匹配“,然后你再加上这个事实:我们将有很多天来实时进行同样的计算,因为领导者会调整名册,然后需要快速解决方案。

基本上,领导者会在屏幕上看到一个实时信息,说明有多少人仍在失踪,无论是在整个班次,还是有多少人符合各种标准,以及有多少人除了我们拥有的人之外,我们实际上是人。这个显示器必须更新半实时,而领导者调整名单时“如果詹姆斯采取白天而不是厄秀拉,而厄秀拉则需要夜班”。

但是非常感谢到目前为止已经回答过这个问题的人,约束满足问题听起来像我们需要的方式,但我们肯定会在这里仔细查看所有链接和算法名称。

这就是我喜欢StackOverflow的原因:)。

9 个答案:

答案 0 :(得分:11)

你所拥有的是constraint satisfaction problem;它们与NP的关系很有意思,因为它们通常是NP但通常不是NP完全的,即它们易于处理多项式时间解决方案。

正如ebo在评论中指出的那样,您的情况听起来好像可以表示为exact cover problem,您可以将Knuth's Algorithm X应用于{{3}}。如果你采取这种方法,请告诉我们它是如何工作的。

答案 1 :(得分:3)

看起来你有一个constraint satisfaction problem

在您的情况下,我首先会特别关注约束传播技术 - 您可以通过这种方式将问题缩小到可管理的大小。

如果没有人符合标准,会发生什么?

答案 2 :(得分:1)

您所描述的是“室友问题”,this thesis中略有描述。

忍受我,我正在寻找更好的链接。

修改

这是另一个相当密集的thesis

答案 3 :(得分:1)

至于我,我很可能会尝试减少bipartite graph matching问题。另外要证明问题是NP通常要比找不到多项式解决方案复杂得多。

答案 4 :(得分:1)

我不确定你的问题是NP,它没有那种味道,但如果我是你,我会做的就是订购这些职位的要求,这样你就可以尝试填写最具体的问题,因为人少了将填补这些职位,因此您不太可能需要回溯很多。没有理由不将它与算法X(一种纯粹的Knuth-ness算法)结合起来。

答案 5 :(得分:1)

我会把这个理论留给别人,因为我的数学头脑不是很好,但是你可能会发现像Cassowary / Cassowary.net或NSolver这样的工具可以将你的问题声明性地表示为约束满足问题,然后解决约束

在这些工具中,结合约束传播的单纯形法经常用于确定性地减少解空间,然后在给定成本函数的情况下找到最优解。对于较大的解空间(似乎不适用于您指定的问题的大小),偶尔会使用遗传算法。

如果我没记错的话,NSolver还在示例代码中包含了Chun博士在香港工作的实际护士排班问题的简化。还有a paper on the work he did.

答案 6 :(得分:1)

听起来我觉得你有几个可分解的问题会更容易解决:

- 从A队中选择一名医生 - 从任何团队中选择另一位医生 - 选择两名护士

所以你有三个独立的问题。

澄清但是,您是否必须有两名医生(一名来自指定团队)和两名护士,或一名指定团队的医生,两名护士,另一名可以是医生或护士?

答案 7 :(得分:1)

一些问题:

  1. 目标是满足约束完全,还是仅(但尽可能多)?
  2. 一个人可以成为多个团队的成员吗?
  3. 所有可能的限制是什么? (例如,我们是否需要一名医生,这是几个团队的成员?)
  4. 如果你想完全满足约束 ,那么我会严格按顺序排列约束,即最难实现的约束(例如上面例子中的医生和团队A) )应该先检查

    如果你想满足的约束,那么它就是一个不同的故事......你必须指定某种加权/重要性函数来决定我们宁愿拥有什么,当我们不能完全匹配,并有多种可供选择的可能性。

答案 8 :(得分:1)

如果您有多个或多个约束,请查看Drools Planner(开源,java)。

蛮力分支和绑定以及类似技术需要很长时间。诸如之类的确定性算法首先填充最大的移位是非常不理想的。元启发式是一种很好的解决方法。

详细了解Drools Planner的真实世界护士排班示例。很容易添加许多约束,例如“年轻的护士不想在星期六晚上工作”或“一些护士不想连续工作很多天”。