Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm A*算法如何应用于旅行商问题?_Algorithm_A Star_Traveling Salesman - Fatal编程技术网

Algorithm A*算法如何应用于旅行商问题?

Algorithm A*算法如何应用于旅行商问题?,algorithm,a-star,traveling-salesman,Algorithm,A Star,Traveling Salesman,可能重复: 我最近了解到,A*算法可以应用于旅行商问题。机器人我们如何准确地定义起点和目标,以及如何将权重应用于节点(启发式是什么) 有人能给我解释一下A*在这里是如何应用的吗?A*是Dijsktra的一个衍生物,我认为它不能以这种方式使用。首先,TSP通常从任何节点开始。但更重要的是,这些算法寻求找到两点之间的最短路径,而与访问的节点数无关。事实上,它们依赖于这样一个事实:从S到T的最短路径通过某个节点A,如果成本相同,从S到A的路径是无关的 我看到这种功能的唯一方法是生成一个表示所访问节点

可能重复:

我最近了解到,A*算法可以应用于旅行商问题。机器人我们如何准确地定义起点和目标,以及如何将权重应用于节点(启发式是什么)


有人能给我解释一下A*在这里是如何应用的吗?

A*是Dijsktra的一个衍生物,我认为它不能以这种方式使用。首先,TSP通常从任何节点开始。但更重要的是,这些算法寻求找到两点之间的最短路径,而与访问的节点数无关。事实上,它们依赖于这样一个事实:从S到T的最短路径通过某个节点A,如果成本相同,从S到A的路径是无关的

我看到这种功能的唯一方法是生成一个表示所访问节点的新图形。例如,在优先级队列中,您将放置一组已访问的节点和当前节点。这可能会导致检查$n2^n$节点(这不是TSP动态规划解决方案的运行时间)。到目前为止,还不是很好,但是通过使用*而不是Dijsktra,您可能能够找到在合理时间内运行的启发式方法


要实现这一点,您的起始节点将是(1,{}),结束节点将是(1,{1..n})。您将模拟原始图形的边权重。至于关于启发式的建议,你可以自己决定。

A*是Dijkstra算法的扩展,其中考虑了遍历有向图的最佳解决方案。我不确定这是否适用于TSP问题

TSP问题表明,您希望在只访问每个目的地一次的同时最小化旅行距离。A*算法需要一个启发式算法来引导它的方向,即已知最优解是一条直线(您必须小心使用A*启发式算法,以免高估到目标的距离)。这不适用于TSP问题


这还包含关于A*算法和TSP问题的信息。

A*可以在这里应用,尽管它可能不是最好的算法

你必须远离城市和它们之间道路的图表。相反,定义一个有向图,其中部分路由是节点,两个节点x和y是连接的,如果y可以通过在原始城市图中添加单个“步骤”从x构建。起始节点是一个空路径。目标节点是访问所有城市的路径。(该路径的最优性由启发式和A*算法本身的属性保证。)

[EDIT:起初我认为路径应该是一个有序的城市列表,但现在我相信@spinning\u plate提出的用一对(长度、一组城市)表示路径的建议已经足够了。]

路径成本是行驶的总距离。启发式必须是总最小行程长度的某种可接受估计(通常是低估)

这种估计的一个很好的候选者可能是TSP(放松问题的解决方案)的快速近似。您将在尚未覆盖的城市集合上为每个节点(部分路线)运行近似算法。这就给了算法一个必要的上限,即销售人员仍然要走的距离

如果我有一把锤子(搜索),每个问题(TSP)都是一颗钉子(寻路)

是的,从理论上讲,可以将TSP问题转化为一个更大的图,并对其进行*搜索。但遗憾的是,它毫无用处,因为它无法伸缩(参见Spining_plate的评论)。在现代硬件上,即使是很小的实例也可能需要数年才能解决

TSP是,寻路不是

如果是螺钉(NP完全问题),请使用螺丝刀(元启发式…)


使用诸如元启发式(遗传算法、模拟退火等)等算法。有关软件示例,请参阅openTS、jgap、cpsolver等。我不想发展任何东西,只是想理解A*是如何应用于实际问题的。你确定它是A*还是广义自适应A*吗?我想象它可以用类似于拉斯曼答案中描述的方法来应用。(看)@Spaceghost-嗯?“在本文中,我们展示了如何做到这一点,从而得到广义自适应A*(GAA*),它在状态空间中找到最短路径,其中行动成本可以随时间增加或减少。”-这与这个问题有什么关系?顺便问一下,有人在重复的问题中找到了一个解决方案:我非常确定这是一个重复的问题,因此正确地标记为重复的问题。虽然这是我在google搜索中的第一个结果…+1,但如果能将链接发布到原始链接就好了,除了节点应该是路径而不是城市集。有关启发式的提示,请参见我的答案。@larsmans-我不是100%确定,但我不同意。就像在常规最短路径中一样,我们如何到达节点X和{节点Y、Z和T}与路径的其余部分无关,无论我们访问YZT还是TZY等。但是,我们需要存储最大值来重建路径。动态规划方法也表明这一点是正确的,如果我们在所有未访问的节点2上构造一个算法TSP(节点,访问)=最小TSP(节点2,访问+节点)+成本(节点,节点2),并将其记忆,我们得到的解是o(2^n)而不是n!是的,我想你是对的。一个(集合,长度)组合可能是算法所需的全部,它会立即为您提供必要的对称性破坏。一个可能的启发式方法是最小生成树(MST)加上将MST连接到已固定段的最短边的长度。您不需要为每一步都创建一个新的图。只需了解每个节点(已访问/未访问)的状态,以及您最近的移动是什么,这意味着对于每个状态,您至少需要O(n)状态(仍然不需要)