私はこれを読んでいます: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
2番目の写真から目的のパスを生成しますが、障害物をうまく処理できず(壁をcraう傾向があります)、長距離で最適なパスを生成できません。
それを改善するために適用できるいくつかの調整と最適化は何ですか?