ฉันได้อ่านสิ่งนี้แล้ว: 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
มันสร้างเส้นทางที่ต้องการจากรูปที่สอง แต่ไม่จัดการกับอุปสรรคได้ดีมาก (มีแนวโน้มที่จะคลานบนผนัง) และล้มเหลวในการสร้างเส้นทางที่ดีที่สุดบางครั้งในระยะทางไกล
ฉันสามารถใช้การปรับแต่งและปรับแต่งเพื่อปรับปรุงได้อย่างไร