【问题标题】:A* search Java - TSP [duplicate]A *搜索Java - TSP [重复]
【发布时间】:2012-12-07 16:46:02
【问题描述】:

可能重复:
Implementation of A Star (A*) Algorithm in Java

对于一个任务,我必须实现一些搜索算法来解决旅行商问题,我理解这个问题并且我理解算法是如何工作的,我只是不知道如何实现它(我的 Java 不是很棒),但这应该是最简单的部分,但不幸的是,我对 Java 的了解还不足以应用我对算法的了解。

因此,我想知道是否有人可以提供一些关于如何开始使用它的提示或技巧,或者甚至可以提供一些好的链接来阅读,如果有更容易开始的算法,我还必须实现一些其他算法我很乐意和那个一起去!我已经看过这里但似乎找不到任何相关的内容:/

非常感谢任何帮助!谢谢

【问题讨论】:

  • 基本的 java 教程并不难或特别冗长,结合 JUNG 之类的库或类似的东西可以帮助您处理图形对象方面的事情(节点、边等),您应该学会了并且运行得相当快。寻找专注于数据结构和算法的教程,您应该会看到大量示例来帮助您。
  • 我想我需要使用各种节点来比较所有的算法,我已经给了一些文本文件来测试。哦,我在这里看到了关于 A* 的其他内容,但似乎与 TSP 无关,或者如果是,那么我不知道如何实现它以在 TSP 上工作

标签: java search traveling-salesman


【解决方案1】:

我不是专家,但我认为 A* 不能用来解决旅行商问题。我确定您知道 TSP 是 NP 难的,因此确切的解决方案非常复杂,并且并非在每种情况下都存在。我知道(并且已经使用)逼近解决方案的最简单方法是所谓的“模拟退火”,这是一种随机方法(即随机!)。

这个想法很简单。您将这些点组织成一个列表,该列表代表所有节点之间的路径(这称为“游览”)。计算游览时间并保存长度。然后,您选择一个随机子列表并简单地反转它。计算新的长度。如果新列表较短,则保留它,否则丢弃它。只需将这些步骤重复 100/1,000/10,000,000 次(取决于点数),您就会得到一个合理的近似值。

例如,假设有 5 个点(伪代码)...

List tour = [e, b, a, d, c]
int len = tourLength(tour)
List newTour = [e, b] + [d, a] + [c] // a and d have been reversed
int newLen = tourLength(newTour)
if(newLen < len) {
    tour = newTour
}

对于 10 个点,100 次迭代应该会产生良好的结果。

【讨论】:

  • DP节点数少的精确解。
  • 好点。编辑了我的答案。
  • 我能问一下为什么a和d颠倒了吗?
  • 它们只是随机选择的。在每次迭代中,您随机选择列表的一部分并将其反转。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多