Ich habe dies gelesen: http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
Aber es gibt einige Dinge, die ich nicht verstehe, zum Beispiel, in dem Artikel heißt es, dass man so etwas für die Wegfindung mit diagonalen Bewegungen verwenden soll:
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
Ich weiß nicht, wie man D setzt, um einen natürlich aussehenden Pfad wie in dem Artikel zu erhalten, ich setze D auf die niedrigsten Kosten zwischen benachbarten Quadraten, wie es heißt, und ich weiß nicht, was sie mit dem Zeug über die Heuristik gemeint haben sollen sei 4 * D, das scheint nichts zu ändern.
Dies ist meine heuristische Funktion und Bewegungsfunktion:
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
Ergebnis:
Den reibungslosen Segelweg wollen wir schaffen:
Der Rest meines Codes: http://pastebin.com/TL2cEkeX
Aktualisieren
Dies ist die beste Lösung, die ich bisher gefunden habe:
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
Ab dem zweiten Bild wird der gewünschte Pfad erstellt, Hindernisse werden jedoch nicht gut bewältigt (es kann an Wänden kriechen), und manchmal werden auf längeren Strecken keine optimalen Pfade erstellt.
Welche Verbesserungen und Optimierungen kann ich anwenden, um es zu verbessern?