【发布时间】: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