最短路径算法-1

本文介绍了四种寻找图中最短路径的算法:爬山法、集束搜索、分支界定法和A*算法。爬山法基于DFS,容易陷入局部最优;集束搜索是BFS的改进版,选择k个启发式距离最近的顶点;分支界定法根据实际路径长度选择最短路径;A*算法结合了累积路径长度和启发式距离,效率较高,但启发式函数的质量直接影响结果。
摘要由CSDN通过智能技术生成

最短路径算法-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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值