Tôi đã đọc bài này: http://theory.stanford.edu/~amitp/GameProgramming/Heuristic.html
Nhưng có một số điều tôi không hiểu, ví dụ như bài báo nói rằng hãy sử dụng một cái gì đó như thế này để tìm đường với chuyển động chéo:
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
Tôi không biết làm thế nào để thiết lập D để có được một con đường trông tự nhiên như trong bài viết, tôi đặt D ở mức chi phí thấp nhất giữa các hình vuông liền kề như nó đã nói, và tôi không biết ý nghĩa của những gì về heuristic nên là 4 * D, điều đó dường như không thay đổi bất kỳ điều gì.
Đây là chức năng heuristic và chức năng di chuyển của tôi:
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
Kết quả:
Con đường thuận buồm xuôi gió chúng tôi muốn xảy ra:
Phần còn lại của mã của tôi: http://pastebin.com/TL2cEkeX
Cập nhật
Đây là giải pháp tốt nhất tôi tìm thấy cho đến nay:
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
Nó tạo ra đường dẫn mong muốn từ pic thứ hai, nhưng không xử lý chướng ngại vật rất tốt (có xu hướng bò trên tường) và đôi khi không tạo ra đường dẫn tối ưu trên khoảng cách xa hơn.
Một số điều chỉnh và tối ưu hóa tôi có thể áp dụng để cải thiện nó là gì?