【问题标题】:walk through all vertices in a non-hamiltonian, unweighted, undirected graph遍历非哈密顿、未加权、无向图中的所有顶点
【发布时间】:2014-07-17 02:34:51
【问题描述】:

我想找到一种启发式或算法来解决类似旅行销售人员的问题,但有一些关键区别:

-图表未加权。 (所以从任意一个顶点走到一个连通顶点的代价是1)

-我想通过每个顶点至少一次,而不是恰好一次

-图表中有死胡同,我们将不得不从中回溯。

图表看起来像这样:

目前,我正在沿着一条随机路线前进,将我的历史记录保存在堆栈中,直到我到达一个未连接到任何未经过的顶点的顶点 - 然后我回溯到最近的未探索分支并探索它。我重复这个直到没有顶点可以探索——我可以使用这个方法在 2n 步中遍历图形,其中 n 是顶点的数量。我觉得一定有更好的方法 - 如果有任何帮助或指向我应该研究的材料,我将不胜感激!

【问题讨论】:

    标签: algorithm graph graph-theory heuristics


    【解决方案1】:

    您的问题实际上是 TSP 的一般定义。您当前的方法可能比 2n 大得多,您可以通过一条很长的路径,然后返回到一些未访问的顶点,该顶点连接到路径的第一个顶点,这会导致最优方法与您的方法之间存在任意大的差距。

    如果您正在寻找一个好的启发式方法,那么nearest neighbor 是一个好方法。首先找到每两个顶点之间的最短路径并创建一个新图G',使得每条边uv的权重是G中这两个顶点之间的最短路径的长度。然后在新创建的图中运行最近邻算法。

    另一种方法是使用Christofides algorithm。查找图的生成树,然后基于此生成树创建欧拉之旅。这个总是最多 3/2 x 最优,所以你可以使用这个和最近邻算法的组合来获得一个好的结果。

    顺便说一句,几乎所有众所周知的 TSP 启发式方法都适用于您的问题,我知道并且我认为您可以在网络上找到它的实现是 tour merging algorithm,这要归功于 Cook 和 Seymour,它非常准确但不是很快也不是很容易实现。 (如果您没有找到实现,您可以要求论文作者提供实现)。

    【讨论】:

    • 我可能不太了解最近邻或 Christofides 算法,但它们似乎都要求某些城市离其他城市更近,并且您可以从任何其他城市直接到达任何城市。在我的情况下,我认为这些事情都无法完成 - 我的图表上的许多节点仅通过中间节点连接到其他节点,并且 is 直接连接到另一个节点的每个节点正好是 1单位离开。换句话说,我认为我不能根据重量或距离做出决定,而那些算法需要两者兼而有之。
    • @user3635299,我已经提到如何从图 G 制作图 G'。G' 是一个完整的图,并且满足两种情况所需的所有条件。
    • 哦,是的,我现在明白了!当从 G' 回到 G 时,您认为可以在 n
    • @user3635299,不,我所说的并非所有近似值都是相对于 G' 而不是 G,但这些近似值很有可能比您的方法更好。顺便说一句,您的图具有类似实心网格的结构,您可以添加额外的边和顶点以使其成为实心网格图(除了与其他边交叉的长边),然后可以在多项式时间内检查实心网格图中的哈密顿循环。实心网格是无孔无限网格的子图。
    • 到目前为止,我创建了 G' 并对其应用了最近邻算法,对结果非常满意!我的原始代码在 946 步中遍历了 475 个节点的图,现在它在 811 中执行!我会在上面尝试更多的算法,但只想说:非常感谢!
    【解决方案2】:

    由于您的图表中的最佳成本将超过 n,因为很明显,您必须从末端节点返回,我不会说存在更好的方法,但是,我认为您可以进行一些优化做的是当你回溯时,你应该寻找替代路由器回到你想回溯的节点,因为它不是一棵树,你可以在返回时找到更短的路线。大概还有更多这些小技巧,祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2021-08-23
      • 2014-06-26
      相关资源
      最近更新 更多