我询问了最低费用最高流量several weeks ago。克拉斯克维奇的回答很棒,解决了我的问题。我implemented it它工作正常(仅限法语,对不起)。另外,该算法可以处理 i ( i > 1)项目对每个学生的分配。
现在我正在尝试更难的事情。我想在选择上添加限制。如果想要影响每个学生的 i ( i > 1)项目,我希望能够指定哪些项目是兼容的(彼此)
在某些项目不兼容的情况下,我希望算法返回全局最优,即影响 i 项目给每个学生最大化全球幸福感和兼容性约束。
将 i 链接到原始方法(并检查每个步骤的约束)将无济于事,因为它只会返回局部最优值。
有关正确使用图表的想法吗?
答案 0 :(得分:1)
不幸的是,它在多项式时间内无法解决(除非P = NP
或存在其他约束)。
这是从最大独立集问题(已知为NP完全)的多项式时间减少到这个:
给定图表G
和数字k
,请执行以下操作:
为图G
中的每个顶点创建一个项目,并假设如果G
中相应顶点之间存在边缘,则两个项目不兼容。
创建一个平等地喜欢每个项目的学生(我们可以假设每个项目给他的快乐等于1
)。
使用解决问题中所述问题的算法找到最大幸福感。我们称之为h
。
如果项目全部兼容,则可以选择一组项目,这意味着G
的拾取顶点形成一个独立的集合(由于我们构建图形的方式)。
因此,h
等于最大独立集的大小。
返回h >= k
。
在实践中意味着什么?这意味着寻找这个问题的多项式时间解决方案是不合理的。有几件事可以做:
如果输入很小,您可以使用详尽的搜索。
如果不是,您可以使用启发式和/或近似来找到相对较好的解决方案(不一定是最佳解决方案)。
答案 1 :(得分:1)
如果你可以忍受库依赖,整数编程将比你自己实现的任何东西更快更容易。您所要做的就是将原始问题表示为整数程序,然后在最后添加您的临时约束。