【问题标题】:Dijkstra's shortest paths algorithm with a partially ordered tree as a priority queue以偏序树为优先队列的 Dijkstra 最短路径算法
【发布时间】:2020-03-15 00:34:07
【问题描述】:

我试图从以下源转换 C 代码以实现 Dijkstra,其中部分有序树作为优先级队列,链接邻接列表作为图的表示。 http://infolab.stanford.edu/~ullman/fcsccode/fig9.44-47.txt

我执行了以下操作,但它没有按预期工作,并且还会引发 Indexerror。

class Node():
    def __init__(self):
        self.name = None
        self.label = None
        self.next = None

class GraphElement():
    def __init__(self):
        self.dist = None
        self.successors = None
        self.toPot = None

MAX = 6
INFTY = 100

def swap(a, b, G, P):
    temp = Node()
    temp = P[b]
    P[b] = P[a]
    P[a] = temp

    G[P[a]].toPot = a
    G[P[b]].toPot = b


def priority(a, G, P):
    return G[P[a]].dist

def bubbleUp(a, G, P):
    if (a > 1):
        if priority(a, G, P) < priority(a//2, G, P):
            swap(a, a//2, G, P)
            bubbleUp(a//2, G, P)

def bubbleDown(a, G, P, last):
    child = 2*a
    if (child < last):
        if priority(child+1, G, P) < priority(child, G, P):
            child += 1

def initialize(G, P, pLast):
    for i in range(0, MAX):
        G[i].dist = INFTY
        G[i].toPot = i+1
        P[i+1] = i

    # P[0] = 0
    G[0].dist = 0
    pLast = MAX

def Dijkstra(G, P, pLast):
    u = Node()
    v = Node()
    initialize(G, P, pLast)

    count = 1
    while(pLast >= 1):
        v = P[1]
        swap(1, pLast, G, P)
        pLast -= 1
        bubbleDown(1, G, P, pLast)
        ps = G[v].successors


        while (ps != None):
            u = ps.name
            print(str(count) + " to " + str(u) + ":")
            if G[u].dist > G[v].dist + ps.label:

                G[u].dist = G[v].dist + ps.label
                bubbleUp(G[u].toPot, G, P)
            print(str(G[u].dist))

            ps = ps.next


if __name__ == '__main__':

    A12 = Node()
    A12.name = 2
    A12.label = 4

    A13 = Node()
    A13.name = 3
    A13.label = 1

    A14 = Node()
    A14.name = 4
    A14.label = 5

    A15 = Node()
    A15.name = 5
    A15.label = 8

    A16 = Node()
    A16.name = 6
    A16.label = 10

    A32 = Node()
    A32.name = 2
    A32.label = 2

    A45 = Node()
    A45.name = 5
    A45.label = 2

    A56 = Node()
    A56.name = 6
    A56.label = 1

    graph = []
    for i in range(MAX):
        graph.append(GraphElement())

    graph[0].successors = A12
    A12.next = A13
    A13.next = A14
    A14.next = A15
    A15.next = A16
    A16.next = None

    graph[1].successors = None

    graph[2].successors = A32
    A32.next = None

    graph[3].successors = A45
    A45.next = None

    graph[4].successors = A56
    A56.next = None

    graph[5].successors = None

    potNodes = []
    for i in range(MAX+1):
        potNodes.append(Node())

    PotNode = []
    for i in range(MAX):
        PotNode.append(Node())

    print("The shortest path from node: ")
    Dijkstra(graph, potNodes, MAX)

它产生以下输出:

1 to 2:
4
1 to 3:
1
1 to 4:
5
1 to 5:
8
1 to 6:
    Dijkstra(graph, potNodes, MAX)
      if G[u].dist > G[v].dist + ps.label:
IndexError: list index out of range

Process finished with exit code 1

**预期输出:

1 to 2:
3
1 to 3:
1
1 to 4:
5
1 to 5:
7
1 to 6:
8

**

谁能帮我找出我得到错误结果的原因?谢谢!

【问题讨论】:

  • 请说明您的图表和优先级队列。对于大多数问题,我们期望minimal, reproducible example为什么是预期的输出?那真的是说明问题的最小程序和图表吗?你的调试痕迹在哪里?我们至少应该有您追踪print 语句的结果。
  • @Prune 我不确定我在程序中哪里错了 - 在说明图形(初始化)或优先队列或实现 Dijkstra 时。这就是我发布整个程序的原因

标签: python priority-queue dijkstra


【解决方案1】:

您的索引在错误所在的行和其他几行不正确

print(str(count) + " to " + str(u) + ":")
if G[u-1].dist > G[v].dist + ps.label:

    G[u-1].dist = G[v].dist + ps.label
    bubbleUp(G[u-1].toPot, G, P)
print(str(G[u-1].dist))

您还需要修改这两行以获得正确的结果:

G[P[a]].toPot = a-1
G[P[b]].toPot = b-1

输出:

The shortest path from node: 
1 to 2:
4
1 to 3:
1
1 to 4:
5
1 to 5:
8
1 to 6:
10
1 to 2:
3
1 to 5:
7
1 to 6:
8

【讨论】:

  • 谢谢!这清除了索引错误。 Dijkstra 算法的结果仍然错误。
  • 是的,我可以看到它正在设法为两条腿行程 1-2 和 1-5 获得正确的结果。但是 1-6 是一个三腿旅行,它没有到达那里
  • 设法找到它并添加到我的答案中
猜你喜欢
  • 2021-04-18
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多