繁体   English   中英

构造包含哈密顿路径的图

[英]Construct a graph containing a Hamiltonian path

背景信息我正在研究优化问题,并设法将问题减少到检查图形是否包含哈密顿路径。 简化的问题如下:

我们给了问题一个边序列(例如: e[1,5], e[3,4], ..., e[2,3] )。 我们需要找到从该序列开始处要取的边数,以便使用这些边形成的图包含哈密顿路径。 我们还需要返回路径。

我的算法该问题可以通过从无边的图形开始解决。 我们一个接一个地插入边,并检查图在每次迭代中是否包含哈密顿路径。 通过使用存在哈密顿路径的必要条件,可以使此方法更快一些。 尽管如此,该算法仍然效率很低。

重大问题是否有办法以更有效的方式解决此问题(也许通过使用早期迭代中完成的计算来加快以后的迭代速度)?

我建议使用约束可满足性工具包来解决此问题。 我将继续使用布尔可满足性框架,但是您可以查看其他选项,例如SMTinteger programming

让我们介绍一组布尔变量,它们代表图中的每个顶点:

v_0,v_1,...,v_N

接下来,我们介绍一组布尔变量来表示每个可能的边(显然是N ^ 2):

e_0,e_1,...,e_ {N ^ 2}

检查此链接以获取详细信息。

当且仅当图形中存在相应的顶点/边时,布尔变量X才为True 就您而言,我们正在谈论边缘。

目前,您可以尝试将边沿选择算法作为一组布尔约束引入:

  1. 如果顶点v_i具有度D,则必须存在边E
  2. 如果存在v_i和v_j之间的边,那么边E必须不存在
  3. 等等

您可以依靠伪布尔编码来引入此类约束。

如果对输入变量进行了这样的赋值,则结果布尔公式返回True (这是满足的 ),那么您可以将该赋值解释为包含汉密尔顿路径的图,并通过给定的一组规则(约束)构建。 您可以使用SAT解算器(例如, 葡萄糖)来查找此类分配。

我使用类似的方法来解决具有10 ^ 5变量和10 ^ 6约束的实际问题。 这可能会占用大量时间和内存,但它的工作原理要比蛮力好得多,并且更加灵活:您可以轻松添加/删除其他约束,而无需修改代码。

我看到一些缺点:

  1. 在您的情况下,这种方法可能不太可扩展。 结果在很大程度上取决于问题本身,因此很难预测
  2. 将图构建过程编码为一组布尔约束,这并非易事。
  3. 本质上,SAT解算器返回随机分配。 如果您想查看其他解决方案/图形,则必须为问题添加新的约束。

我的算法可能并不完美,但是如果您不确切地知道如何构建结果(除了蛮力,就没有明确的算法可以做到),约束可满足性工具包是一种非常有效的方法。

编辑:

如果对图形进行加权,您仍然可以使用SAT来解决此问题,但这会困难得多:权重应该在给定范围内并且应该是离散的。 不过,您可以考虑使用混合整数编程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM