背景我正在研究优化问题,并设法将问题减少到检查图表是否包含哈密尔顿路径。减少的问题如下:
问题我们会得到一系列边(示例:e[1,5], e[3,4], ..., e[2,3]
)。我们需要找到从该序列的开始处获取的边数,以便使用这些边形成的图包含哈密顿路径。我们还需要返回路径。
我的算法问题可以通过从没有边缘的图形开始来解决。我们逐个插入边缘并检查图形在每次迭代中是否包含哈密顿路径。通过使用哈密顿路径存在的必要条件,可以使这种方法更快一些。尽管如此,该算法仍然效率很低。
最大的问题有没有办法以更有效的方式解决这个问题(可能通过使用早期迭代中的计算来加速以后的迭代)?
答案 0 :(得分:0)
我建议使用constraint satisfiability toolkit来解决此问题。我会坚持使用Boolean satisfiability框架,但您可以查看其他选项,例如SMT,integer programming。
让我们介绍一组表示图中每个顶点的布尔变量:
v_0,v_1,...,v_N
接下来,让我们介绍一组布尔变量来表示每个可能的边缘(显然是N ^ 2):
e_0,e_1,...,e_ {N ^ 2}
查看this link了解详情。
当且仅当图中存在对应的顶点/边时,布尔变量X为 True 。在你的情况下,我们谈论的是边缘。
此时,您可以尝试将边缘选择算法作为一组布尔约束来引入:
您可以依靠pseudo-boolean encodings来引入此类限制。
如果对输入变量有这样的赋值,结果布尔公式返回 True (它的满足),那么你可以将这个赋值作为图形来解释包含哈密尔顿路径并且它是由给定的规则集(约束)构建的。您可以使用SAT解算器(例如Glucose)来查找此类作业。
我使用类似的方法来解决10 ^ 5个变量和10 ^ 6个约束的实际问题。它可能耗费大量时间和内存,但它比蛮力更好,更灵活:您可以轻松添加/删除其他约束而无需修改代码。
我看到一些缺点:
我的算法可能并不完美,但如果您不确切知道如何构建结果(因此没有明确的算法可以做到这一点,除了蛮力)约束可满足性工具包是非常有效的方法。
编辑:
如果图表已加权,您仍然可以使用SAT来解决此问题,但这将更加困难:权重应该在给定范围内并且应该是离散的。不过,您可以考虑mixed integer programming