【问题标题】:K shortest path pythonK最短路径python
【发布时间】:2017-05-21 15:48:29
【问题描述】:

我在查找从名为 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

这相当于 Pseudo Code 的实际代码等价物,可以在 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 或图形库。我必须只使用 Python 中的基本库。

有人能够理解问题吗?

【问题讨论】:

  • 你希望你的输出是什么?

标签: python shortest-path dijkstra


【解决方案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 到每个相应的邻居

【讨论】:

  • 它适用于 S 和 T
  • 什么意思?它对哪些源和目标不起作用?
  • 我将它增加 1,因为我在所有边缘之间都有单位权重,尽管我之前忘了提...
  • 它适用于 S 和 T 是什么意思?你能解释一下吗?
  • 谢谢....好吧,举个例子,假设我有一个图,假设有 100 个节点,那么如果我给算法 S>10,T>10,它不返回任何东西...
【解决方案2】:

问题 1: 将 if count[U]&lt;=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])

它对我有用,所以如果您遇到其他问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多