最短路径问题
如下图所示,求解从起点到终点的最短路径。
算法思路
狄克斯特拉算法包含4个步骤:
(1) 找出“最便宜”的节点,即从起点出发可在最小cost到达的节点。
(2) 更新该节点的邻居的开销,即从起点到邻居节点的cost。
(3) 重复这个过程,直到对图中的每个节点都这样做了。
(4) 计算最终路径。
代码实现
def dijkstra():
graph = {}
costs = {}
parents = {}
# graph
graph["start"] = {'A':5,'B':2}
graph['A'] = {'C':4,'D':2}
graph['B'] = {'A':8,'D':7}
graph['C'] = {'D':6,'final':3}
graph['D'] = {'final':1}
graph["final"] = {}
# costs
infinity = float("inf")
costs['A'] = 5
costs['B'] = 2
costs['C'] = infinity
costs['D'] = infinity
costs["final"] = infinity
# parents
parents['A'] = "start"
parents['B'] = "start"
parents['C'] = None
parents['D'] = None
parents["final"] = None
# processed
processed = []
def find_lowest_cost_node(node:dict):
cost = float('inf')
res = None
for n in node.keys():
if not n in processed and node[n] < cost:
cost = node[n]
res = n
return res
node = find_lowest_cost_node(costs)
while node:
neighbors = graph[node]
for k in neighbors.keys():
cost_new = neighbors[k] + costs[node]
if cost_new < costs[k]:
costs[k] = cost_new
parents[k] = node
processed.append(node)
node = find_lowest_cost_node(costs)
return costs, parents