У меня есть вопрос. Если есть возможность добавить в мой алгоритм ротацию. Я имею в виду, например, если я хочу перейти от (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 возвращает список точек (кратчайший путь) '' '
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). Теперь ребра между разными узлами будут либо перемещаться (в том же направлении, но в другом месте), либо посредством вращения (в том же месте, но в другом направлении).
Алгоритм (кроме вычисления соседей) останется неизменным.
Окей, ты прав! Это дает мне другую точку зрения на эту проблему. Спасибо за совет!