旅行时间最小化算法

时间:2013-04-30 23:35:58

标签: algorithm shortest-path traveling-salesman

我正在寻找创建算法的指导,以最大限度地减少一组旅行者到达一组固定目的地的总旅行时间。旅行者不是都在同一个地方开始,但旅行者必须先访问每个目的地,然后才能认为情景完成(类似于TSP)。

我正在考虑生成一个矩阵,其中位于(x,y)的值将是从起始位置x到目标y的行程距离,然后执行某种矩阵运算/算法选择值,使每个行/列只从中选择一个值,并将这些值的总和最小化。有没有人有这种算法的背景?

根据评论澄清:

  • 每个目的地必须由一位旅行者访问。所有旅行者 不必访问所有目的地。
  • 如果目的地比旅行者多,旅行者应该 只是打算每个击中一个任意目的地(仍然最小化 旅行时间),然后重复问题,但少了两个 目的地。
  • 目的地和旅客的最大数量应为30左右 目的地和10个旅行者,所以数量不是很多。我想要 尽管如此,尽量避免使用纯粹的蛮力。

3 个答案:

答案 0 :(得分:3)

查看Floyd-Warshall algorithmMerge Sort algorithm

鉴于要访问的位置数(顶点)是V且旅行者的数量是T,如果应用Floyd-Warshall算法,它应该为您提供图中顶点对之间的最短路径,O( V ^ 3)复杂性。

然后,您可以按升序对最短路径的长度进行排序,这将是O(V lg V)复杂度的操作。

由于您按顺序应用这些算法,因此整体复杂度仍为O(V ^ 3)。

你必须执行第二阶段K次,其中K是天花板(V / T),因为在第一次迭代中,你会访问T个顶点,但是V大于T所以你有更多的顶点要访问。在下一次迭代中,您将从计算中删除已访问的顶点,并对剩余的距离进行排序(您已在上一步中找到),然后从T旅行者的新位置继续访问它们。

您可以通过为每个顶点选择最小距离来获得更好的结果,因此您选择的下一个顶点是最接近的顶点。

因此,你的整体复杂性将开始看起来像O(V ^ 3)+ K x O(V lg V),我认为它往往接近O(V ^ 3)。

这些只是让你入门的一些想法。

答案 1 :(得分:2)

如果我理解你的问题,我怀疑旅行者的数量与快速找到解决方案有关。因此,我们通过一些启发式解决基本的旅行商问题,然后围绕该周期移动旅行者。

记录了各种构造方法和各种迭代改进方法。下面是一些例子(从学术到精彩的动画例子):

答案 2 :(得分:1)

由于旅行商问题在因子复杂性上运行,它可以快速增长到超出CPY运行的合理范围。幸运的是,较新的计算机都配备了功能完备的显卡,可以运行比CPU快数百或数千倍的问题。

我已经发布了对TSP here的一个相当简单的解决方案的分析和比较,其中包括在NVIDIA显卡上运行的C#代码。还需要下载CUDAfy CUDAfy库以直接运行代码。

凭借我的Quad i7,16GB笔记本电脑和NVIDIA GEFORCE GT显卡,我报告了11个城市的性能提升,差不多大约70次(14.7秒到0.2秒),将问题从单个CPU内核移植到GPU。

CUDA Tuning项目中的代码属于MIT许可,因此可以免费使用归属。