【无标题】

本文介绍了使用A星算法解决迷宫问题,探讨了算法原理、实现思路和Python代码实现。通过可视化展示搜索过程,并讨论了如何通过调整估价函数(如从曼哈顿距离到欧式距离)来优化搜索效率。
摘要由CSDN通过智能技术生成

迷宫问题
迷宫图从入口到出口有若干条通路,求从入口到出口最短路径的走法。
下图为一简单迷宫示意图及其平面坐标表示。以平面坐标图来表示迷宫的通路时,问题的状态以所处的坐标位置来表示,即综合数据库定义为(x,y), 1<=x, y<=N(N为迷宫问题的最大坐标数),则迷宫问题归结为求(1,1)到(4,4)的最短路径问题。
迷宫问题对于本题我采用的是课上学过的A星算法来实现,因为在没有堵死情况下,A星算法一定能找到解并且是最优解。
A星算法介绍
所谓A*,是由著名人工智能学者Nlsson提出,他基于A搜索算法,在确定好估价函数后,对open表进行遍历,将最小值取出放到close表中,并且把该点周围的点传入open表中,大体步骤如下:
1.把初始节点放入open表
2.若open为空则搜索失败退出
3.移除open表中第一个结点并放入close中后顺序编号n
4.若目标节点把附有F(S。)的初始为S=N则搜索成功
5.若N不可扩展,则转至步骤2
6.对N进行扩展
不断通过f(n)=g(n)+h(n)寻找值最小的点
而A是基于此步骤上额外增加了一个条件即定义h(n)为目标状态的最优路径代价,当A搜索算法的启发函数h(n)恒小于等于h*(n)时,即成为A算法
实现思路
在我求解问题时,我参考了许多先例,学习了许多大佬们对A
算法的实现,我更倾向于用Python来实现此题的求解,因为Python能够可视化,这样对结果能更为清晰的展现。并且调用函数也比较方便。
在实现过程中,我主要用到了可视化库,堆库,numpy和heapq库
并且基于此设计了多个类:
首先是点类AstarPoint
用于记录该点的信息,并且保存父节点的坐标信息
地图类CostMap
是实现可视化的基础,创建地图背景是实现迷宫的构造,其中包含障碍物的设置
可视化类ShowMap
这就是对地图的可视化的实现
接下来就是核心算法GetMinnumIndex函数
用于返回open表中最小值的下标
A*star函数
这是代码中的核心部分,是用来实现寻找最优路径并保存其信息的函数。

对于此该图问题,由于只能上下左右走,所以我是以曼哈顿距离来设为预估函数的。下面就是代码的实现。
AstarPoint类和导入的库

import numpy as np
import matplotlib.pyplot as plt
import heapq
class AstarPoint(object):
    '''
    Astar点类
    self_x,self_y : int, 点的坐标
    g: float, 点的g值(深度)
    f_value: float, 估价函数f的值
    ParentPosition: tuple,父节点的坐标(元组类型)
    '''
    #点的信息生成函数
    def __init__(self,self_x,self_y,g,f_value,ParentPosition=None):
        self.SelfPosition=(self_x,self_y)
        self.ParentPosition=ParentPosition
        self.f_value=f_value
        self.g=g
    #返回自身坐标   
    def __hash__(self):
        return self.SelfPosition
    #返回此点处周围点坐标    
    def __eq__(self,other):
        return self.SelfPosition==other.SelfPosition
    

地图类CostMap

class CostMap(object):
    def __init__(self,init_map):
        '''
            init_map :初始化的CostMap,通常为np.zeros
        '''
        self.map=init_map
     # 障碍物设置,clean用于清除障碍物,如果为0则根据起点坐标到终点坐标设置∞来表示障碍物  
    def obstacle_setter(self,start_x,end_x,start_y,end_y,is_clean=False):
        '''
        start_x, start_y : 起点的坐标
        end_x, end_y :终点的坐标
        is_clean : Ture表示清除所有障碍物
        inf是无穷大
        '''
        if not is_clean:
            self.map[start_x:end_x,start_y:end_y]=np.inf
        else:
            self.map[:,:]=0

可视化实现ShowMap

# 可视化函数
def ShowMap(CostMap,StartPoint=None,EndPoint=None,Path=None):
    '''
       ShowMap用于以表格形式或者以栅格图形式展示地图
    CostMap : 设置好的空白地图
    StartPoint, EndPoint : 起点和终点 默认为None
    Path : list类型:最短路径保存的结点
    '''
    ColorPlan=list("rgbcwk")#红色,绿色,蓝色,青色,白色,黑色
    squareSpace=0.33333
    squareAera=3000
        
        #创建地图
    Figure,Axes=plt.subplots(1)#fig, axes = plt.subplots(1):即表示一次性在figure上创建1个网格,
    Figure.set_size_inches(CostMap.shape)
        
        #绘制图形
    Obstacle=np.where(CostMap == np.inf)#将无穷大的数定义为障碍物
    Suspects=np.where((CostMap > 0) & (CostMap < np.inf))#其他不为0和无穷大的点定义为猜测点
        
        #添加障碍物,起点,终点和路径,所谓的网格颜色的生成即为在斜对角坐标间涂上对应颜色
        #scatter是对散点进行不同操作
    for (x,y) in zip(Obstacle[0],Obstacle[1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值