【问题标题】:Transforming dijkstras to a* python将 dijkstras 转换为 a* python
【发布时间】:2013-02-06 01:47:19
【问题描述】:

所以,假设我在dijkstras.py 中有一些代码可以在给定图形 G 的情况下执行 dijkstras。

def shortest_path(G, start, end):
   def flatten(L):       # Flatten linked list of form [0,[1,[2,[]]]]
      while len(L) > 0:
         yield L[0]
         L = L[1]
   q = [(0, start, ())]  # Heap of (cost, path_head, path_rest).
   visited = set()       # Visited vertices.
   while True:
      (cost, v1, path) = heapq.heappop(q)
      if v1 not in visited:
         visited.add(v1)
         if v1 == end:
            return [('cost', cost)] + [('path', list(flatten(path))[::-1] + [v1])]
         path = (v1, path)
         for (v2, cost2) in G[v1].iteritems():
            if v2 not in visited:
               heapq.heappush(q, (cost + cost2, v2, path))

而 G 是这样的:

 G = {
                's': {'u':10, 'x':5},
                'u':{'v':1, 'x':2},
                'v':{'y':4},
                'x':{'u':3, 'v':9, 'y':2},
                'y': {'s':7, 'v':6}
        }

我们将如何转换现有算法 shortest_path(G, start, end) 以利用 a* 并进行最少的修改。

我的想法是:

def shortest_path(G, start, end, h): #where h is the heuristic function
   def flatten(L):       # Flatten linked list of form [0,[1,[2,[]]]]
      while len(L) > 0:
         yield L[0]
         L = L[1]
   q = [(0, start, ())]  # Heap of (cost, path_head, path_rest).
   visited = set()       # Visited vertices.
   while True:
      (cost, v1, path) = heapq.heappop(q)
      if v1 not in visited:
         visited.add(v1)
         if v1 == end:
            return [('cost', cost)] + [('path', list(flatten(path))[::-1] + [v1])]
         path = (v1, path)
         for (v2, cost2) in G[v1].iteritems():
            if v2 not in visited:
               heapq.heappush(q, (cost + cost2 + h(v2), v2, path)) #modification here

但我还没有运行它,所以我不知道它会如何运行。在我开始编写更多代码之前,我只是想从某人那里得到这个。

【问题讨论】:

  • 成本 cost + cost2 + h(v2) 似乎是正确的。这应该是唯一的修改。
  • 太棒了!非常感谢!

标签: python algorithm artificial-intelligence dijkstra a-star


【解决方案1】:

正如 alfa 所建议的,正确的解决方案是使用 cost + cost2 + h(v2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2023-03-10
    • 2014-08-25
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多