我只是希望有人验证以下问题是否是 NP 完全的,或者实际上是否有比简单的蛮力组合检查更好/更容易的解决方案。
我们的软件中存在某种资源分配问题,我将用一个例子来解释它。
假设我们需要 4 个人在白班期间工作。这个数字,以及它是“白班”的事实都记录在我们的数据库中。
但是,我们不要求任何人来填补这些空缺,为了满足要求,需要满足一些要求。
在这 4 人中,假设其中 2 人必须是护士,其中 1 人必须是医生。
其中一名医生还必须作为特定团队的一员工作。
所以我们有这组信息:
白班:4
1医生
1医生,需要在A组工作
1护士
以上不是问题。当我们开始挑选人员进行白班工作并试图弄清楚我们迄今为止挑选的人员是否真的能够满足标准时,问题就出现了。
例如,假设我们选择 James、John、Ursula 和 Mary 工作,其中 James 和 Ursula 是医生,John 和 Mary 是护士。
Ursula 也在 A 队工作。
现在,根据我们尝试满足要求的顺序,我们最终可能会推断出我们是否有合适的人,除非我们开始尝试不同的组合。
例如,如果从列表中首先选择 Ursula,我们可以将她与“1 位医生”标准进行匹配。然后我们到了 James,我们注意到,由于他不在 A 队工作,所以关于“1 位医生,需要在 A 队工作”的其他条件,不能由他填写。由于另外两个人是护士,他们也不符合这个标准。
所以我们回溯并首先尝试詹姆斯,他也可以满足第一个标准,然后厄休拉可以满足需要该团队的标准。
所以问题对我们来说是因为我们需要尝试不同的组合,直到我们全部尝试过,在这种情况下,我们有一些标准尚未满足,即使工作的正面总数与总数相同需要的磁头数量,或者我们找到了一个有效的组合。
这是唯一的解决方案,有人能想到更好的解决方案吗?
编辑:一些澄清。
对这个问题的评论提到,对于这几个人,我们应该使用蛮力,我同意,这可能是我们可以做的,我们甚至可以这样做,在同一条车道上,某种优化着眼于如果数据量小,则选择不同的排序算法,初始开销较小。
但问题是,这是一个名册规划系统的一部分,其中可能有很多人参与其中,既是“我们需要 X 人上白班”,又是“我们有这个 Y 人池那将是这样做的”,以及一个大型“我们为那些必须以某种方式与这些 Y 人匹配的那些 X 人的 Z 标准列表”,然后你补充说我们将拥有当领导者调整花名册时,需要在几天内实时进行相同的计算,然后就需要快速解决方案。
基本上,领导者会在屏幕上看到一个实时总和信息,说明还有多少人仍然失踪,无论是在整个白班,还有多少人符合各种标准,以及我们实际上有多少人除了我们拥有的那些。当领导者用“如果詹姆斯上白班而不是乌苏拉,乌苏拉上夜班怎么办”来调整名单时,这个显示将不得不更新半直播。
但是非常感谢到目前为止已经回答这个问题的人,约束满足问题听起来像是我们需要走的路,但我们肯定会仔细研究这里的所有链接和算法名称。
这就是我喜欢 StackOverflow 的原因 :)