gpt4 book ai didi

python - 带旋转的算法 A-star

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:16 24 4
gpt4 key购买 nike

我有一个问题。如果可以在我的算法中添加旋转。我的意思是,例如,如果我想从 (0,0) 转到 (0,1),首先我需要旋转然后转到那个字段。我不知道该怎么做。我实现的算法A-start是这样的

import numpy
from heapq import *


def heuristic(a, b):
return (b[0] - a[0]) ** 2 + (b[1] - a[1]) ** 2


def astar(array, start, goal):
neighbors = [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]

close_set = set()
came_from = {}
gscore = {start: 0}
fscore = {start: heuristic(start, goal)}
oheap = []

heappush(oheap, (fscore[start], start))

while oheap:

current = heappop(oheap)[1]

if current == goal:
data = []
while current in came_from:
data.append(current)
current = came_from[current]
return data

close_set.add(current)
for i, j in neighbors:
neighbor = current[0] + i, current[1] + j
tentative_g_score = gscore[current] + heuristic(current, neighbor)
if 0 <= neighbor[0] < array.shape[0]:
if 0 <= neighbor[1] < array.shape[1]:
if array[neighbor[0]][neighbor[1]] == 1:
continue
else:
# array bound y walls
continue
else:
# array bound x walls
continue

if neighbor in close_set and tentative_g_score >= gscore.get(neighbor, 0):
continue

if tentative_g_score < gscore.get(neighbor, 0) or neighbor not in [i[1] for i in oheap]:
came_from[neighbor] = current
gscore[neighbor] = tentative_g_score
fscore[neighbor] = tentative_g_score + heuristic(neighbor, goal)
heappush(oheap, (fscore[neighbor], neighbor))

return False

'''这是一个使用我的算法和 numpy 数组的例子, astar(数组,开始,目的地) astar函数返回点列表(最短路径)'''

nmap = numpy.array([
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

print (astar(nmap, (0, 0), (10, 13)))

最佳答案

这不是算法问题。这是一个数据结构问题。

仅当您只关心位置时,将节点表示为 (0, 0) 才有意义。如果旋转是一个问题,那么你面对的方向也很重要。例如,您可以将不同的方向编码为 1、2、3、4,然后图中的每个节点都可以表示类似 (0, 0, 2) 或 (0, 0, 3) 的内容。现在不同节点之间的边将通过移动(相同方向但位置不同)或通过旋转(相同位置但不同方向)。

算法(除了邻居计算)将保持不变。

关于python - 带旋转的算法 A-star,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53801192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com