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

实验二:搜索算法

  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
    	    
  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向A*算法是一种基于图搜索的规划算法,它是A*算法的一种变体。与单向A*算法不同的是,双向A*算法同时从起点和终点开始搜索,直到两个搜索队列相遇。 双向A*算法的思想是利用启发式函数估计从起点到终点和从终点到起点的距离,并分别使用两个搜索队列进行搜索。通过从两个方向同时搜索,可以减少搜索的空间和时间复杂度。 在双向A*算法中,需要定义两个启发式函数。一个启发式函数用于从起点开始的搜索,估计从起点到当前节点的代价;另一个启发式函数用于从终点开始的搜索,估计从终点到当前节点的代价。这两个启发式函数可以根据问题的具体特点进行设计,以尽可能地减少搜索的代价和时间。 在搜索过程中,双向A*算法通过维护两个搜索队列来分别搜索起点和终点。每次从两个队列分别选择一个最优节点进行扩展,并更新节点的估计代价和路径记录。当两个搜索队列相遇时,说明已经找到了起点到终点的最优路径,搜索结束。 双向A*算法相比于单向A*算法具有一定的优势。首先,它可以减少搜索的空间和时间复杂度,因为从两个方向同时搜索可以更快地找到最优路径。其次,双向A*算法对于搜索空间较大的问题具有更好的效率和性能。 然而,双向A*算法也存在一些限制。首先,它要求能够从终点到起点进行搜索,这在某些问题中可能无法满足。另外,双向A*算法需要同时维护两个搜索队列,这可能会增加一定的内存占用。 总之,双向A*算法是一种基于图搜索的规划算法,通过同时从起点和终点开始搜索,可以更快地找到最优路径。它是A*算法的一种改进,适用于需要减少搜索代价和时间的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值