寻找一种算法来找到最短路径

时间:2013-11-19 20:45:49

标签: c graph graph-algorithm traveling-salesman

基本上我有一个包含12个节点(代表城市)和13个边(代表路线)的图表。

enter image description here

现在让我们说(随机)我有一个访问n个节点的计划,从特定的节点(A)出发。所以(having N <= (12-1))然后来到起点。

对于我一直在寻找的内容,它看起来几乎与Traveling Salesman Problem相似,但不同之处在于我的销售员并不一定需要访问所有节点。

我在找什么算法?

修改

显然这不是TSP,因为TSP说必须关闭图表,我们只会经历每个城市(节点) 一次。在我的情况下,如果它缩短了路线,它可以不止一次穿越城市。

我正在寻找的更多例子:

示例一:

Depart from: A
Need to visit (B,D,E,L,G,J,K)
Come back to: A

示例二:

Depart from: A
Need to visit (B,C,D,G,H,I,J,K)
Come back to: A

规则:

- Get shortest path
- No specific order
- Can visit one node (city) more than once

请记住,这是针对C中的项目,所以这只是预编码研究。

2 个答案:

答案 0 :(得分:1)

这里有很多算法。口号是路径寻找。

从一开始就要学习的最佳算法是好老Dijkstra http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

然后对于较大的图形(不是迷宫),您可能需要一种具有某种方向启发式算法的算法,使得评估更快,就像A *算法一样。 http://en.wikipedia.org/wiki/A *

还有其他人,但这些是最常见的两种。

从讨论中更新:

从我们的讨论开始,我认为通过“必须有节点”B | L | I | D | G | K | J的所有排列,从A开始然后再到A将是解决它的方法:

// Prepare a two dimensional array for the permutations
Node permutation[permutationCount][7];

// Fill it with all permutations
...

int cost[permutationCount];

for (int i = 0; i < permutationCount; ++i) {
    cost[i] =   dijkstraCost(nodeA,             permutation[i][0]) 
              + dijkstraCost(permutation[i][0], permutation[i][1])
              + dijkstraCost(permutation[i][1], permutation[i][2])
              + dijkstraCost(permutation[i][2], permutation[i][3])
              + dijkstraCost(permutation[i][3], permutation[i][4])
              + dijkstraCost(permutation[i][4], permutation[i][5])
              + dijkstraCost(permutation[i][5], permutation[i][6])
              + dijkstraCost(permutation[i][6], nodeA);
}

// Now Evaluate lowest cost and you have your shortest path(s)
....

我认为这应该有用。

答案 1 :(得分:0)

你是对的,它是一个TSP,但你需要做的是减少图形,使它只包含要访问的节点。

如何减少图表是留给读者的练习; - )