问题描述
我完全被这个(整数)线性规划公式化任务困住了:
输入:包含循环的有向边加权图。
目标:找到一组边,它们的权重之和最小,这样如果从图中删除这些边,图就会变成无环的。
编辑:对于任何感兴趣的人,我发现(在我朋友的帮助下),您可以使用拓扑排序来解决这个问题。你只需要为每条边引入一个约束,这样:\r\n
其中 topologicalOrder[ edge.parent ] << topologicalOrder[ edge.child ] + ( M * edgeInactive[edge])
是节点拓扑位置的整数数组,topologicalOrder[node]
是布尔数组,表示边缘在结果(非循环)图中是否处于活动状态。
edgeInactive
是用于在 M
时“关闭”约束的 Big M 方法。
然后你只需要最小化非活动边的权重总和。
旧(较慢)解决方案:
我的想法是创建节点的拓扑排序(对于无环图,当拓扑排序时,所有边都将从左到右定向),但是因为我得到了带有循环的图,所以我将寻找这样的拓扑排序,总和从右到左的边数最少。
这种方法有效,但真的很慢...
(我正在尝试用 Gurobi 解决这个问题,但我认为它是非常普遍的线性规划公式问题。) 我的代码:
edgeActive[edge] == true
非常感谢您的帮助...
解决方法
这看起来像一个(一般)NP-hard 问题:minimum feedback arc set。至少 this answer 表明了这一点。
您可能会使用此关键字找到更多资源。
我记得当我在 Kemeny–Young method
上做一些 ILP 工作时,我阅读了有关 above 问题的 ILP 公式在 Google Scholar 上快速查找可以让我们:
Ali、Alnur 和 Marina Meilă。 “凯门尼排名实验:什么时候有效?”数学社会科学 64.1 (2012): 28-40.
说的是:
“上述ILP公式在[10,28]之前已经给出。这个公式也可以解释为求解最小加权反馈弧 设置问题来自计算机科学 [10,19]"
我猜你可能会从这篇论文开始 (Link to pdf as referenced by Google Scholar)
,我发现(在我朋友的帮助下),你可以使用拓扑排序来解决这个问题。你只需要为每条边引入一个约束,这样:topologicalOrder[ edge.parent ] << topologicalOrder[ edge.child ] + ( M * edgeInactive[edge])
其中 topologicalOrder[node]
是节点拓扑位置的整数数组,edgeInactive
是布尔数组,表示边缘在结果(非循环)图中是否处于活动状态。
M
是用于在 edgeActive[edge] == true
时“关闭”约束的 Big M 方法。
然后你只需要最小化非活动边的权重总和。