我遇到了从名为S的源到名为T的目的地找到K最短路径的问题。我的代码看起来像这样
K = 4
S = 'C'
T = 'A'
B = {}
P = set()
count = {}
for U in graph.keys():
count[U] = 0
B[S] = 0
while(len(B)>=1 and count[T]<K):
PU = min(B, key = B.get)
cost = B[PU]
U = PU[len(PU)-1]
del B[PU]
count[U] += 1
if U==T:
P.add(U)
if count[U]<=K:
V = graph[U].keys()
for v in V:
if v not in PU:
PV = PU+v
B[PV] = cost+1
这相当于伪代码的实际代码,可以在https://en.wikipedia.org/wiki/K_shortest_path_routing找到。实际变量也与伪代码相同。此外,我的图形如下所示:
{
'A': {'C': 4.0, 'B': 10.0, 'E': 10.0, 'D': 10.0, 'G': 1.0, 'F': 2.0, 'I': 3.0, 'H': 3.0, 'J': 10.0}, 'C': {'A': 4.0, 'B': 5.0, 'E': 9.0, 'D': 6.0, 'G': 9.0, 'F': 10.0, 'I': 5.0, 'H': 10.0, 'J': 5.0}, 'B': {'A': 2.0, 'C': 10.0, 'E': 8.0, 'D': 1.0, 'G': 8.0, 'F': 4.0, 'I': 2.0, 'H': 2.0, 'J': 6.0}, 'E': {'A': 9.0, 'C': 5.0, 'B': 10.0, 'D': 4.0, 'G': 9.0, 'F': 9.0, 'I': 3.0, 'H': 3.0, 'J': 7.0}, 'D': {'A': 4.0, 'C': 6.0, 'B': 5.0, 'E': 7.0, 'G': 1.0, 'F': 1.0, 'I': 2.0, 'H': 9.0, 'J': 3.0},
'G': {'A': 2.0, 'C': 10.0, 'B': 3.0, 'E': 1.0, 'D': 10.0, 'F': 5.0, 'I': 5.0, 'H': 6.0, 'J': 1.0}, 'F': {'A': 2.0, 'C': 3.0, 'B': 6.0, 'E': 7.0, 'D': 8.0, 'G': 10.0, 'I': 1.0, 'H': 8.0, 'J': 2.0}, 'I': {'A': 1.0, 'C': 1.0, 'B': 2.0, 'E': 1.0, 'D': 6.0, 'G': 7.0, 'F': 1.0, 'H': 6.0, 'J': 2.0},
'H': {'A': 3.0, 'C': 4.0, 'B': 5.0, 'E': 1.0, 'D': 2.0, 'G': 6.0, 'F': 4.0, 'I': 1.0, 'J': 4.0},
'J': {'A': 5.0, 'C': 6.0, 'B': 1.0, 'E': 8.0, 'D': 7.0, 'G': 9.0, 'F': 8.0, 'I': 10.0, 'H': 1.0}}
我的输出看起来像这样
{'A'}
虽然应该有四条路径。
另外,请注意我不允许使用Networkx或Graph库。我只能在Python中使用基本库。
有人能够理解这个问题吗?
答案 0 :(得分:1)
问题1:
将if count[U]<=K:
置于while循环下,而不是if。
问题2: 改变这个:
if U==T:
P.add(U)
到此:
if U==T:
P.add(PU)
问题3:我对此感到有点困惑。
将PU = min(B, key = B.get)
更改为此PU = min(B,key=lambda x:B[x])
它对我有用,所以如果你遇到其他问题,请告诉我。
答案 1 :(得分:1)
我在代码中做了一些更改。您检查节点是否为目标以及后面的代码时出现错误。
K = 4
S = 'C'
T = 'F'
B = {}
P = set()
count = {}
for U in graph.keys():
count[U] = 0
B[S] = 0
while(len(B)>=1 and count[T]<K):
PU = min(B, key = B.get)
print('Minimum Distance found in this loop : ' , PU)
cost = B[PU]
U = PU[len(PU)-1]
del B[PU]
count[U] += 1
if(U == T):
P.add(PU)
print('Closest neighbour of ' , S , ' is : ', U)
print('Reached target')
print('Final map : ', P)
exit(0)
else:
if count[U] <= K:
V = graph[U].keys()
print('Looking at neighbours of : ', PU)
for v in V:
if v not in PU:
PV = PU + v
print(PV)
B[PV] = cost+1
print('B dictionary is : ', B)
运行此程序,你会得到类似的东西:
Minimum Distance found in this loop : C
Looking at neighbours of : C
CA
CB
CE
CD
CG
CF
CI
CH
CJ
B dictionary is : {'CA': 1, 'CB': 1, 'CE': 1, 'CD': 1, 'CG': 1, 'CF': 1, 'CI': 1, 'CH': 1, 'CJ': 1}
Minimum Distance found in this loop : CA
Closest neighbour of C is : A
Reached target
Final map : {'CA'}
输出应该是相当自我描述的。 此外,你有与每个节点相关的权重(我认为是那个),然后我不明白为什么你将距离计数增加1到每个相应的邻居