我一直在阅读: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
它会从第二张图片中产生所需的路径,但不能很好地处理障碍物(容易在墙壁上爬行),有时甚至无法在更长的距离上产生最佳路径。
我可以应用哪些调整和优化来改进它?