我需要以良好的精度和足够的时间(例如1-2天)解决大量顶点(30-100)的TSP。我的图可以包含不对称边(g [i] [j]不等于g [j] [i])。
我尝试了贪婪,很少(也许是我的坏习惯,但是结果比贪婪更糟),简单的遗传算法(几乎比贪婪更好),对O(2 ^ n * n)来说是动态的(快出记忆)。 / p>
答案 0 :(得分:0)
嗯,30-100个顶点的数目并不是很大。你错过了一些零吗?还是面临着TSPLIB中p43之类的难以解决的特殊情况?
无论如何,如果您正在寻找一种很好的启发式方法,那么我曾经将蚁群优化用于非对称TSP。它易于实现,并且提供程序具有良好的性能。
您可以看一下我以前的实现:https://github.com/aligusnet/optimer/tree/master/src/heuristics/aco
答案 1 :(得分:0)
如果您不能接受最优方案,而是“接近最优方案”,那么我建议您使用“随机旅行”算法。该算法的思想-不要BFS / DFS搜索整个组合树,而只搜索随机的DFS子树。
例如,您有一个顶点[A-Z],而起点在[A]内。尝试从[AB -...],[AC -...]等开始的每个路径10000次尝试(总共32个前缀),其中[...]是通过图形随机选择的全深度路径,根据您的规则。将适当路径的成本保持在数组内,其中成本是每个前缀的成本之和。由于您对所有“起始前缀”使用了相同的尝试,因此最小前缀之和将显示出距[A]最佳的步伐。当然,这不能保证达到最佳,但这是很高的可能性。 例如,使用路径[A-K]的10,000次尝试的总和最低。下一步-接受第一步[A-K],然后再次重复算法,直到找到解决方案为止。
答案 2 :(得分:0)
下面是OptaPlanner实现的the TSP source code。当激活NearestSelection时,它可以处理多达10,000次访问的数据集(如果未激活,则可以处理多达500次访问)-要超过10k,您需要激活一个权衡取舍的分区搜索。>
它在import/belgium/road-time
目录中具有非对称数据集(使用OpenStreetMap数据)。无法证明它是否达到了最佳解决方案。通常,终止设置为几分钟或未改进的几分钟。
基准显示,在配置了特定的MoveSelector设置的情况下,“延迟接受”的结果要比“模拟退火”和“禁忌搜索”略好,但是您的里程可能会有所不同...