【问题标题】:Construct a graph containing a Hamiltonian path构造一个包含哈密顿路径的图
【发布时间】:2017-09-12 18:05:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否有更多关于如何完成第 2 步的信息?更具体地说,要添加的边是如何选择的?
  • N 可以有多大?有估计吗?
  • @CaptainTrunky 现在我正在研究 N 大约为 100 的问题,但我最终想解决 N 大约为 10^4 的问题
  • @justhalf 请查看我对问题所做的编辑

标签: algorithm optimization graph-theory hamiltonian-cycle


【解决方案1】:

我建议使用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。在您的情况下,我们谈论的是边缘。

此时,您可以尝试将您的边缘选择算法引入为一组布尔约束:

  1. 如果顶点 v_i 的度数为 D,则边 E 必须存在
  2. 如果存在 v_i 和 v_j 之间的边,则边 E 必须不存在

您可以依靠pseudo-boolean encodings 来引入此类约束。

如果对输入变量进行了这样的赋值,结果布尔公式返回 True(这是 满足),那么您可以将此赋值解释为包含哈密顿路径 AND它是由一组给定的规则(约束)构建的。您可以使用 SAT 求解器(例如 Glucose 来查找此类作业。

我使用类似的方法来解决具有 10^5 个变量和 10^6 个约束的实际问题。这可能会耗费大量时间和内存,但它比暴力破解更好,而且更灵活:您可以轻松添加/删除额外的约束,而无需修改代码。

我看到了一些缺点:

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

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

编辑:

如果一个图是加权的,你仍然可以使用 SAT 来解决这个问题,但它会更难:权重应该在给定的范围内并且应该是离散的。不过,你可以考虑mixed integer programming

【讨论】:

  • 这个答案提供了一种用哈密顿路径构建图的方法。我意识到我对问题的说明有些不清楚。我已经编辑了问题,请查看更新的版本。我要解决的是检查图是否有哈密顿路径而不是构造这样的图。
  • @LakshayGarg 您可以使用或多或少相同的方法来检查是否存在哈密顿路径。我是古玩,你真的需要逐步构建图表吗?我的方法只允许您一步构建。
  • 不,没有必要逐步构建图形,但我不确定如何在 SAT 中加入最小路径权重约束。此外,对于我正在处理的问题,我相信我将插入边缘的序列将非常接近最小权重哈密顿路径。我仍然会尝试实施您的方法,看看它是否被证明更有效。
  • @LakshayGarg 您可以使用混合整数规划来解决相同的问题。它更适合处理权重。或者您可以尝试最大可满足性方法,但这会非常困难。
猜你喜欢
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多