基本上我有一个包含12个节点(代表城市)和13个边(代表路线)的图表。
现在让我们说(随机)我有一个访问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中的项目,所以这只是预编码研究。
答案 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,但你需要做的是减少图形,使它只包含要访问的节点。
如何减少图表是留给读者的练习; - )