问题标签 [traveling-salesman]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1785 浏览

java - 实现本地搜索(2-opt)以解决 Java 中的 TSP

我正在尝试实现这一点,但我找不到一篇好的论文或描述如何做到这一点,你们能指出我正确的方向吗?我确实在 C# 中有一个实现,但我不知道将代码转换为 Java。

根据评论,我添加了一些我无法转换为 Java 的 C# 代码:

0 投票
2 回答
1275 浏览

java - Java TSP 置换点

为学校做一个项目,我们实现最近邻启发式(我已经做过),以及我们进行详尽搜索的旅行销售员问题(然后我们分析算法,它们的时间复杂度等)。我们的老师说要四处寻找用于详尽搜索部分的代码(或修改),而不是像在最近邻部分中那样对整个事物进行编程。我环顾四周,只找到了与我们被指示如何执行程序无关的内容。与使用整数的典型问题相反,我们使用点 (x, y)。我的目标是计算最短排列并能够知道该排列是什么。所以我想有一个数组数组(其中包含排列)。

如果有人可以帮助我进行详尽的搜索,那就太好了。

这是我的代码的一些摘录(成员变量、计算两点之间距离的函数以及所有点的存储位置):

任何帮助是极大的赞赏。

0 投票
0 回答
218 浏览

function - MathProg 递归函数

在尝试解决一个相当大的 TSP 问题时,我在计算 Mathprog 中的链接节点时遇到了麻烦:假设我有

距离函数 d(c1,c2)

和其他一些条件

进行所有可能的削减以解决电路需要电源组和其他一些东西,但是在 20 多个节点上,问题太贪婪了,我无法找到解决方案。

所以我想我会限制求解器连接所有 a[i,j] 强加

这与

这可能不会导致解决方案,但无法实现如此简单的事情令人非常沮丧......有没有办法在 mathprog (gmpl) 中实现这样的伪代码?

0 投票
3 回答
4557 浏览

implementation - 在遗传算法中应用变异来解决旅行商问题

我正在从事一项小型学术任务,以使用遗传算法 (GA) 解决旅行商问题 (TSP)。我正在遵循一个非常简单的经典表示,将城市和旅游存储在数组中,例如,10 个城市的旅游可以表示为 9-1-0-4-3-8-6-5-2-7 等等。对 GA 有相当基本的了解,我对您将遵循哪种方法将不同类型的突变应用于 TSP 有点困惑。假设我们的路线表示为路线,突变率用变量 m_rate 表示。

[1] 简单插入突变

假设我们有:1-2-3-4-5-6-7-8-9。然后我们选择一个随机城市,比如索引 5,然后选择一个随机插入索引,比如 2,那么突变的染色体是:1-2-6-3-4-5-7-8-9。

现在这是我正在做的应用突变:

换句话说,我正在遍历路线中的每个城市并查看突变条件是否成立 (m_rate>Math.random()),如果是,那么我会在该索引处停下来,然后随机选择一个插入点,而不使用变异概率变量。只要没有遇到数组的末尾,我就会继续将相同的东西应用于其他所有剩余的城市或索引。这是正确的方法吗?应用第一个突变后,我应该停止还是跳出循环?突变概率是否应该以某种方式参与选择插入点?虽然这对我来说似乎没有多大意义。如果有可能不止一个城市在染色体或路线上发生突变,染色体有没有可能发生突变?换句话说,如果我最终进行第二次或第三次突变将染色体反转为其初始形式(突变之前)会发生什么?

[2] 相互交换突变。

在染色体中选择一个随机城市,然后选择第二个随机城市并交换两者。例如,在路线 1-5-2-8-0-9-3-7-4-6 中。如果我们最终选择索引 2 和索引 7,那么突变的染色体是:1-5-7-8-0-9-3-2-4-6。

我正在遵循与上述插入突变类似的方法,遍历路线中的每个城市并检查概率条件,然后直接选择一个随机城市进行交换,而不应用任何类型的突变率。上面同样的问题在这里适用..

[3] 反转突变。

这是最棘手的一个。给定一个像这样的染色体:1-2-3-4-5-6-7-8-9,我们选择一个像索引 2 到索引 5 的突变切割,然后反转那个子路径 ==> 1-2-6-5- 4-3-7-8-9。

但是你如何应用这个?你是不是循环遍历路线,然后根据突变率选择一个城市,然后直接选择另一个指标来确定子路线的长度?突变一次并退出?在这种实现中,如果我们的突变切割最终是 0-9 或 0-(length-1) ,整个染色体或路线是否可以突变以反转整个事物?在这种情况下,突变率的真正价值是什么?我有点迷失在这里...

我提前道歉,因为它太长了。但我会很感激任何关于这些问题的评论,或者如果有人可以指导我到任何详细讨论这些事情的资源。我看过很多研究论文,但没有多少人接触过这种细节和细节。

谢谢你。

0 投票
1 回答
144 浏览

algorithm - 旅行推销员变体,规划旅行路线

我正在寻找问题的名称和解决方案的算法。

我有一个连接节点图(A..Z),其中每个节点都连接到其他每个节点。我想绘制通过这些节点访问给定节点子集(A,D,K,W)的最短路径。路径可能包括不在子集中的节点,即 A->C->W->D->K 是可以接受的。在节点之间旅行的成本是非负的,但不一定是线性的。因此,从 A->B->C 的路径段可能比 A->C“更短”

我认为这是旅行销售员的变体。

0 投票
2 回答
6485 浏览

c - 2-Opt 本地搜索实现

我正在尝试实施本地搜索(使用 2-opt)来解决旅行商问题。但是,我无法正确地重新创建一个完整的电路(节点之旅)。我认为我的算法可能有缺陷。这是我对 2-opt 的实现:

a->b->...d->c->...a

切换到

a->d->...b->c->...a

我的一般过程看起来像标准交换:将 b 存储为临时存储 c 作为 temp2 a->d b->c

我的代码如下所示:

现在我明白这段代码并不完美。例如,如果重新洗牌的两个节点没有创建完整的电路,则代码只会在再次尝试之前更改第二个节点。但我的问题是为什么我一开始就无法完成完整的巡回演出。

谢谢你的帮助!

0 投票
1 回答
5736 浏览

artificial-intelligence - PACMAN:吃掉所有点的捷径

我正在尝试为 PACMAN 问题找到一个解决方案,即找到一条可以吃掉大迷宫中所有点的短路径(不是最短的,而是一条好的路径)。我见过很多人在谈论 TSP、Dijsktra、BFS、A*。我不认为这是一个 TSP,因为我不必回到我开始的地方,如果我愿意,我可以重复节点。而且我认为 Dijsktra、BFS 和 A* 不会有帮助,因为我不是在寻找最短路径,即使是这样,它也不会在合理的时间内给出答案。

任何人都可以给我提示吗?这是什么问题?这是一种TSP吗?什么样的算法可以有效地解决这个问题?我将不胜感激有关实施的任何提示。

0 投票
2 回答
7386 浏览

algorithm - TSP NP-Hard 怎么样?

我在SO的答案之一中阅读了以下内容:

旅行商问题,正如通常所提出的,是找到连接所有城市的最便宜的路线。这不是决策问题,我们无法直接验证任何提议的解决方案。我们可以将其重述为一个决策问题:给定成本 C,有没有比 C 更便宜的路线?这个问题是 NP 完全的,只需一点点工作,我们就可以像修改后的 NP 完全形式一样简单地求解原始 TSP。因此,TSP 是 NP 难的,因为它至少与 NP 完全问题一样难。

我知道 TSP 是 NP-Complete 但问题是如何 NP-Hard ?我读到NP中但不在P中的问题是NP-Hard。我无法将这件事与 TSP 联系起来。请解释一下。

0 投票
1 回答
2175 浏览

traveling-salesman - 如何将 TSP 变成最小哈密顿路径?

我正在尝试解决这个问题http://coj.uci.cu/24h/problem.xhtml?abb=1368

经过大量研究并花费大量时间,我能够为 TSP 实现分支定界算法,该算法得到一条通过所有点并返回开始的路径。

我在想从那条路径中删除最长的边我会得到答案,但是当我完成我的算法时,我发现这并非在所有情况下都是正确的,阅读这个问题:Minimal Distance Hamiltonian Path Javascript

我找到了一些答案,说添加一个与其他点的距离为零的虚拟点,然后删除它可以解决问题,但我不知道具体情况。我已经添加了那个虚拟点,现在不是得到 26.01,而是 16.23 作为答案。我还没有删除虚拟点,因为我不明白“添加虚拟点的全部意义”。

你能指导我解决这个问题吗?还是采用另一种方法而不是 TSP 更好?

0 投票
1 回答
12777 浏览

traveling-salesman - 了解旅行推销员的时间复杂度

我从多个来源以及我对它在 2^N 时间内运行的算法的理解中阅读。我的问题是什么导致 TSP 达到这个运行时间?我似乎找不到伪代码,所以我可以检查它。