【问题标题】:Self-defined Dijkstra's algorithm in PythonPython中自定义的Dijkstra算法
【发布时间】:2021-02-28 07:04:39
【问题描述】:

我可以成功运行非函数格式的代码。但是,一旦我将所有内容打包成一个函数。我会收到一个错误。数据如下:

# A
graph_a = {}
graph_a['s'] = {}
graph_a['a'] = {}
graph_a['b'] = {}
graph_a['c'] = {}
graph_a['d'] = {}
graph_a['f'] = {}
graph_a['s']['a'] = 2
graph_a['s']['b'] = 5
graph_a['a']['b'] = 8
graph_a['a']['d'] = 7
graph_a['b']['d'] = 2
graph_a['b']['c'] = 4
graph_a['c']['d'] = 6
graph_a['c']['f'] = 3
graph_a['d']['f'] = 1

cost_a = {}
cost_a['a'] = 2
cost_a['b'] = 5
cost_a['f'] = float('inf')
cost_a['c'] = float('inf')
cost_a['d'] = float('inf')

parent_a = {}
parent_a['a'] = 's'
parent_a['b'] = 's'
parent_a['c'] = None
parent_a['d'] = None
parent_a['f'] = None

我还定义了最低成本节点函数,在每次迭代中找到成本最低的节点。

searched = []

def lowestcostnode(x):
    lowestnode = None
    lowestcost = float('inf')
    for node in x:
        if x[node] < lowestcost and node not in searched:
            lowestcost = x[node]
            lowestnode = node
    return lowestnode

我可以通过以下方式成功获得结果:

searched = []
node = lowestcostnode(cost_a)
while node is not None:
    currentcost = cost_a[node]
    neighbors = graph_a[node]
    for n in neighbors:
        if cost_a[n] > currentcost + neighbors[n]:
            cost_a[n] = currentcost + neighbors[n]
            parent_a[n] = node
    searched.append(node)
    node = lowestcostnode(cost_a)

结果如下:

cost_a
{'a': 2, 'b': 5, 'f': 8, 'c': 9, 'd': 7}

但是一旦我尝试将代码打包到一个函数中,我就会收到错误消息:

  1. 如果我在函数中创建搜索列表,该函数将生成如下错误消息:
def dijkstra(graph, parent, cost):
    searched = []
    node = lowestcostnode(cost)
    while node is not None:
        currentcost = cost[node]
        neighbors = graph[node]
        for n in neighbors:
            if cost[n] > currentcost + neighbors[n]:
                cost[n] = currentcost + neighbors[n]
                parent[n] = node
        searched.append(node)
        node = lowestcostnode(cost)
    print('parent as:', parent)
    print('cost as:', cost)
    return parent, cost

错误将是:

dijkstra(graph_a, cost_a, parent_a)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-57-00f1df255994> in <module>
----> 1 dijkstra(graph, parent, cost)

<ipython-input-56-517377fe9acb> in dijkstra(graph, parent, cost)
     12 def dijkstra(graph, parent, cost):
     13     searched = []
---> 14     node = lowestcostnode(cost)
     15     while node is not None:
     16         currentcost = cost[node]

<ipython-input-56-517377fe9acb> in lowestcostnode(x)
      5     lowestcost = float('inf')
      6     for node in x:
----> 7         if x[node] < lowestcost and node not in searched:
      8             lowestcost = x[node]
      9             lowestnode = node

NameError: name 'searched' is not defined

但是,在调用最低成本节点函数之前,我已经定义了搜索的一行。

提前感谢您的帮助。

【问题讨论】:

    标签: python function dijkstra


    【解决方案1】:

    您正在呼叫: dijkstra(graph_a, cost_a, parent_a) 但根据您的函数定义,我希望: dijkstra(graph_a, parent_a, cost_a)

    这能解决您的问题吗?

    【讨论】:

    • 感谢您指出这一点。它部分解决了问题,但是一旦我在函数中插入 searched = [],我将收到错误消息。然后我更新了问题。
    • 将搜索作为参数传递。如果你把搜索放在函数中,那么它是一个局部变量,所以其他函数不知道它的存在。 def 最低成本节点(x,搜索):
    • 谢谢。甚至我在函数中声明了这个变量,然后在这个函数中调用了另一个函数。在这种情况下,声明的变量仍然是该函数的局部变量,并且在该函数中调用的另一个函数中无法识别?
    猜你喜欢
    • 2014-05-18
    • 2011-06-27
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多