基础Astar算法及节点优化python代码实现

本文介绍基础A*算法的工作原理,并提供了一段优化后的Python代码实现。通过地图文件示例map7.txt,详细阐述了如何应用A*算法进行路径规划,适用于游戏开发、机器人导航等领域。
摘要由CSDN通过智能技术生成

地图文件示例
map7.txt

s#####bbb###########
#bb###bbb######bbb##
#bb###bbb######bbb##
######bbb######bbb##
######bbb###########
#bbb##bbb###########
#bbb##bbb###########
#bbb##bbb#bbbb######
#bbb##bbb#bbbb######
#bbb######bbbb######
##########bbbb######
####################
#####bbb###bbb#bbbb#
#####bbb###bbb#bbbb#
bbbb#######bbb#bbbb#
bbbb##bbb###########
######bbb#bb#####bbb
##########bb#####bbb
##########bb########
##########bb#######g

全部代码

import matplotlib.pyplot as plt

height = 0  # 行数
weight = 0  # 列数
start = (0, 0)  # 起点
goal = (0, 0)  # 终点

road = []  # 路坐标   数组
wall = []  # 墙坐标   数组
closeList = []  # close 数组
openList = []  # open   数组
dirt = {
   }  # 父子节点  字典

valuedistance = {
   }  # 与起点终点距离和   字典
finalList = []  # 最终路径 数组

map_name = 'map7.txt'  # 地图文件

# 读取地图
def read_Map():
    FILE_STORAGE_WAY = map_name
    ifile = open(FILE_STORAGE_WAY, 'r')  # 作为只读文件打开

    global height, weight, start, goal  # 声明全局变量
    fileLine = ifile.readline()  # 按行读
    while len(fileLine) > 0:
        weight = len(fileLine.split('\n')[0])  # 去除换行符
        for i in range(0, weight):
            if 's' == fileLine[i]:  # 起点
                start = (height, i)
                road.append((height, i))
            if 'g' == fileLine[i]:  # 终点
                goal = (height, i)
                road.append((height, i))
            if '#' == fileLine[i]:  # 路
                road.append((height, i))
            if 'b' == fileLine[i]:  # 墙
                wall.append((height, i))
        height += 1
        fileLine = ifile.readline()


# 计算节点和终点的曼哈顿距离
def goal_distance(value):
	# 计算在x、y轴的移动距离差
    tmp = abs(abs(value[0] - goal[0]) - abs(value[1] - goal[1]))
    if tmp == 0:
    	# 如果仅为斜向距离,斜方向移动距离单位为1.4
        goal_distance = abs(value[0] - goal[0]) * 1.4
    else:
    	# 如果为x或y轴距离+斜向距离
        goal_distance = tmp + min(abs(value[0] - goal[0]), abs(value[1] - goal[1])) * 1.4
    return goal_distance


#  通过递归父节点至起点, 计算节点与起点距离。(不能直接计算两点距离,中间有障碍物)
def start_distance(value):
    father_value = dirt[value]
    if abs(value[0] - father_value[0]) == 1 and abs(value[1] - father_value[1]):  # 如果是斜距
        start_distance = 1.4
    else:
        start_distance = 1
    while father_value is not start:  # 父节点不是起点
        value = father_value
        father_value = dirt[father_value]
        if abs(value[0] - father_value[0]) == 1 and abs(value[1] - father_value[1]):  # 如果是斜距
            start_distance += 1.4
        else:
            start_distance += 1

    return start_distance


# 实现 更新节点距离 功能
def change_father_value(value, new_value, dis):
    # 领接节点不是当前节点 且领接节点在openList或closeList中
    if new_value != dirt[value] and (new_value in openList or new_value in closeList):
        value_distance = start_distance(value) + goal_distance(value)
        new_value_distance = start_distance(new_value) + goal_distance(value)
        if round(new_value_distance + dis, 1) < round
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值