【高级算法设计与分析】实验2:单向与双向A*搜索算法

本文介绍了实验中对A*搜索算法的实现,包括单向和双向版本,用于解决寻路问题。实验要求在带有不同地形代价的地图上找到起点到终点的最低代价路径。A*算法结合启发式函数找到最优路径,双向A*算法能更快找到最短路径。文章还讨论了启发式函数的重要性以及算法实现中的关键点,如地图构造、节点表示和代价计算。最后,通过实例展示了算法的应用和结果可视化。
摘要由CSDN通过智能技术生成

实验二:搜索算法

  1. 实验目的
    1、掌握搜索算法的基本设计思想与方法,
    2、掌握 A*算法的设计思想与方法,
    3、熟练使用高级编程语言实现搜索算法,
    4、利用实验测试给出的搜索算法的正确性。

  2. 实验学时
    4学时。

  3. 实验问题
    寻路问题。以图1为例,输入一个方格表示的地图,要求用A*算法找到并输出从起点(在方格中标示字母S)到终点(在方格中标示字母T)的代价最小
    的路径。有如下条件及要求:
    (1)每一步都落在方格中,而不是横竖线的交叉点。
    (2)灰色格子表示障碍,无法通行。
    (3)在每个格子处,若无障碍,下一步可以达到八个相邻的格子,并且只可以到达无障碍的相邻格子。其中,向上、下、左、右四个方向移动的代价为1,向四个斜角方向移动的代价为√2。
    (4)在一些特殊格子上行走要花费额外的地形代价。比如,黄色格子代表沙漠,经过它的代价为4;蓝色格子代表溪流,经过它的代价为2;白色格子为普通地形,经过它的代价为0。
    (5)经过一条路径总的代价为移动代价+地形代价。其中移动代价是路径上所做的所有移动的代价的总和;地形代价为路径上除起点外所有格子的地形代价的总和。比如,在下图的示例中,路径 A→B→C 的代价为√2+1(移动)+0(地形),而路径 D→E→F 的代价为2(移动)+6(地形)。
    在这里插入图片描述

  4. 实验步骤
    4.1 实现单向与双向的 A搜索算法
    以下图为样例,实现单向和双向 A
    算法并测试输出。输出的路径应该与图2-1 中以圆点标示的路径一致,或者略有不同但是有一样的代价。规则和条件如第3节所述。
    双向A算法应当从S点和T点同时进行A搜索。
    图 2-1
    首先进行地图的构造,使用-1表示不可达,4表示沙漠,2表示河流,如地图1的构造为:

    def get_Map1():
        Map = np.zeros((14, 17))
        # 不可达
        Map[5][6] = Map[6][6] = Map[7][7] = Map[8][7] = Map[9][7] = Map[9][8] = Map[10][8] = Map[11][8] = -1
        # 开始和结束
        start = point(11, 4)
        end = point(2, 13)
    
        return Map, start, end
    

    其中,定义point表示点的行和列,其实例对象表示地图中的一个位置。然后node 类用于表示 A* 算法中的节点,包含了当前节点的位置 (row 和 col)、父节点 (parent)、代价值 (G)、启发值 (H)、总代价值 (F),以及一个标志 (reverse) 用于表示是否是反向遍历中的结点。在节点初始化时,计算 G、H 和 F 的值,其中 G 表示从起点到当前节点的实际代价,H 表示当前节点到目标节点的启发值,F 是 G 和 H 的和。其中,重写了__lt__ 方法定义了节点之间的比较规则,以便在使用堆的数据结构时能够按照总代价值进行排序。实现代码如下所示:

    	class node(object):
    	    def __init__(self, parent, point: point, topography: int, end: point, reverse: bool):
    	        self.row, self.col = point.row, point.col
    	        self.parent = parent
    	        self.reverse = reverse
    	        self.G = 0
    	        self.H = 0
    	  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值