【问题标题】:Minimal Distance Hamiltonian Path Javascript最小距离哈密顿路径Javascript
【发布时间】:2011-11-12 14:10:12
【问题描述】:

我知道这是一个相当常见的问题(一般是 tsp),但我已经被它难住了一段时间了。我正在寻找给定一组 x,y 坐标的最小距离哈密顿路径。起点和终点是完全任意的,但它不能循环,因此标准 tsp 已退出(尽管据说在与所有其他节点的距离为 0 处添加一个虚拟点,然后稍后将其删除,但我不知道该怎么做)。

有很多链接指向数学论文等讨论解决类似问题的算法,但我更愿意使用代码而不是复杂的方程式,而且我真的不想重新发明轮子。

在主要语言 java、c#、c++、ruby、javascript、php 等中肯定有一个相当简单的实现可以解决我的问题的大约 20 个节点版本。

编辑:我也在寻找尽可能准确的,显然不能完全准确到20!有很多排列,但等于或优于人类在几分钟内所能做的就完美了。

Edit2:另外澄清一下,我正在使用未加权图上的标准二维坐标。距离 A->B == B->A

Edit3:为了消除混淆,这里有一个可视化的示例,仅用几个点来说明 tsp 可能不是最理想的(这种情况很容易解决,但如果有更多节点,它可能会更极端)。

TSP 减最长段(红线)

期望的输出

【问题讨论】:

  • 我认为虚拟点与其他一切距离为零的想法是,TSP 答案将使用两个长度为零的链接,一个到那个虚拟点,一个到那个虚拟点。因此,修改后的问题中 TSP 的成本正是您的哈密顿路径的成本,并且最小化它会产生最小哈密顿路径的成本,您可以通过删除虚拟节点及其往返链接来恢复。跨度>
  • 我已经修改了一个免费库来做到这一点:www.chihoang.de/index.php?id=1373。它使用蚁群优化算法。我用双最小生成树检查它。我不太确定我的方法是不是很不科学,但欢迎你看看?

标签: javascript algorithm traveling-salesman


【解决方案1】:

你可以解决双调欧几里得旅行商问题。在O(n^2):http://en.wikipedia.org/wiki/Bitonic_tour中是可以通过动态规划求解的tsp的简化版

【讨论】:

  • 看起来这会创建一个闭合电路:/。在某些配置中,简单地移除闭合电路中最长的段并不能很好地解决我的问题。
  • 如果你解决了 tsp 然后你删除了最长的部分,你必须在它们之间有更好的路径。如果这是错误的,那么我们可以找到另一个通过该点的电路添加您删除的段,您将获得 tsp 的最短解决方案
  • 看看图片,除非我遗漏了一些东西,否则我很确定 tsp 方法不会起作用。如果您在看到图片后认为它仍然有效,我会尝试弄清楚您的意思。
  • 好吧,也许你是对的......但是添加一个虚拟节点肯定会为双音巡演和 tsp 完成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多