Я читал это: http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
Но есть некоторые вещи, которые я не понимаю, например, в статье сказано использовать что-то вроде этого для поиска пути с диагональным движением:
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
Я не знаю, как установить D, чтобы получить естественный вид пути, как в статье, я установил D наименьшую стоимость между смежными квадратами, как сказано, и я не знаю, что они имели в виду под тем, что должно быть в эвристическом быть 4 * D, это, кажется, ничего не меняет.
Это моя эвристическая функция и функция перемещения:
def heuristic(self, node, goal):
D = 5
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
def move_cost(self, current, node):
cross = abs(current.x - node.x) == 1 and abs(current.y - node.y) == 1
return 7 if cross else 5
Результат:
Плавный путь плавания, который мы хотим осуществить:
Остальная часть моего кода: http://pastebin.com/TL2cEkeX
Обновить
Это лучшее решение, которое я нашел до сих пор:
def heuristic(node, start, goal):
dx1 = node.x - goal.x
dy1 = node.y - goal.y
dx2 = start.x - goal.x
dy2 = start.y - goal.y
cross = abs(dx1*dy2 - dx2*dy1)
dx3 = abs(dx1)
dy3 = abs(dy1)
return 5 + (cross*0.01) * (dx3+dy3) + (sqrt(2)-2) * min(dx3, dy3)
def move_cost(current, node):
cross = abs(current.x - node.x) == 1 and abs(current.y - node.y) == 1
return 7 if cross else 5
Он создает желаемый путь из второго рисунка, но не очень хорошо справляется с препятствиями (имеет тенденцию ползать по стенам) и не может создать оптимальные пути иногда на больших расстояниях.
Какие уловки и оптимизации я могу применить, чтобы улучшить его?