最短路径算法-1
爬山法(Hill-Climbing)
在图的表示中,我介绍了如何自定义类来表示图,其中就有启发式距离的表示。爬山法是在DFS上基于启发式距离的一种算法。有点类似于贪婪算法,每一次选择离目标顶点最近的顶点进行遍历,因此只需对DFS的代码增加选取离目标最近顶点即可。
def hill_climbing(graph, start, goal):
pathlist=[(start,)]
if start == goal:
return [start]
while len(pathlist) > 0:
curr_path = pathlist.pop(0)
curr_node = curr_path[-1]
new_nodes = graph.get_connected_nodes(curr_node)
if len(curr_path) > 1:
new_nodes = [node for node in new_nodes if node not in curr_path]
if goal in new_nodes:
goal_path = curr_path + (goal, )
return list(goal_path)
# 根据启发式距离对顶点进行排序
dis = [(graph.get_heuristic(node, goal), node) for node in new_nodes]
dis = sorted(dis)
# 取距离最近的顶点
new_nodes = [node[1] for node in dis]
new_paths = [curr_path + (node,) for node in new_nodes]
new_paths.extend(pathlist)
pathlist = new_paths
else:
return