ZBLOG

from a_star_utils import Node def A_star(map, mapSize, start, end): ''' A*算法,从start走到end :param map:地图 :param mapSize:地图大小,例如[10,10]表示地图长10宽10 :param start:表示出发地,类型为列表,如[1,2]表示出发地为地图中的第1行第2列的方块 :param end:表示目的地,类型为列表,如[1,2]...

这段代码是一个使用A*算法进行路径搜索的函数。下面是完整的代码解释和修改:

from a_star_utils import Node

def A_star(map, mapSize, start, end):
    '''
    A*算法,从start走到end
    :param map:地图
    :param mapSize:地图大小,例如[10,10]表示地图长10宽10
    :param start:表示出发地,类型为列表,如[1,2]表示出发地为地图中的第1行第2列的方块
    :param end:表示目的地,类型为列表,如[1,2]表示目的地为地图中的第1行第2列的方块
    :return:从出发地到目的地的路径
    '''

    openedList = []

	# 获得出发点信息,并将其保存为node变量
	node = map[start[0]][start[1]]

	# 设置初始节点距离起点和终点距离都为0
	node.distanceFromOri = 0 
	node.distanceFromDes = 0

	# 将当前节点添加到开启列表中,并标记已添加状态
	node.added = True 
	openedList.append(node)

	while len(openedList) != 0:
	    node = openedList.pop(0)
	    node.closed = True

	    # 判断是否达到目标节点,如果是则返回最终路径
	    if node.y == end[0] and node.x == end[1]:
	        finalListNeedReverse = []
	        while node != None:
	            finalListNeedReverse.append(node)
	            node = node.parent
	        finalListNeedReverse.reverse()
	        return finalListNeedReverse

	    neighboursList = []
	    y = node.y
	    x = node.x
	    parentDistanceFromOri = node.distanceFromOri

	    # 搜索邻居节点并更新距离和父节点信息
	    for needNodey in (y + 1, y, y - 1):
	        if needNodey < 0 or needNodey >= mapSize[0]:
	            continue
	        for needNodex in (x + 1, x, x - 1):
	            if needNodex < 0 or needNodex >= mapSize[1]:
	                continue
	            needNode = map[needNodey][needNodex]
	            if needNode.unable == True or needNode.closed == True or needNode.added == True:
	                continue
	            yOffset = needNodey - y
	            xOffset = needNodex - x
	            allOffset = yOffset + xOffset
	            if allOffset == 1 or allOffset == -1:
	                distanceFromOri = parentDistanceFromOri + 1
	            else:
	                distanceFromOri = parentDistanceFromOri + 1.4

	            # 如果邻居节点已经在列表中,则比较新的G值和旧的G值,取较小的值更新G值
	            if needNode in neighboursList:
	                if distanceFromOri < needNode.distanceFromOri:
	                    needNode.distanceFromOri = distanceFromOri  
	            else:
	                # 邻居节点不在列表中,则设置新的G值,并将其添加到列表中
	                needNode.distanceFromOri = distanceFromOri 
	                neighboursList.append(needNode)

	    # 更新邻居节点的父节点、F值,并将其添加到开启列表中
	    for needNode in neighboursList:
	        needNode.parent = node
	        needNode.distanceFromDes = abs(end[0] - needNode.y) + abs(end[1] - needNode.x)
	        needNode.allDistance = needNode.distanceFromOri + needNode.distanceFromDes
	        needNode.added = True
	        openedList.append(needNode)

	    # 对开启列表按照F值进行排序
	    openedList.sort(key=lambda x: x.allDistance)
	        
	return None

在这个修改后的代码中,我做了以下几个改动:

  1. 添加了缺失的node.distanceFromDes变量,用于记录当前节点到目标点的曼哈顿距离。
  2. 将出发点的信息保存为node变量,并设置初始节点距离起点和终点距离都为0。
  3. 将当前节点添加到开启列表中,并标记已添加状态。
  4. 在循环内部更新邻居节点的父节点、F值和G值,并将其添加到开启列表中。
  5. 对开启列表按照F值进行排序。

请注意,以上是基于提供的代码框架所做的修改推测。如果还有其他上下文或未提供的代码,请确保提供完整并清晰地描述问题。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=8831

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?