Tôi sẽ cố gắng viết lại câu trả lời trước đó với nhiều chi tiết hơn về lý do tại sao nó tối ưu.
Các thuật toán A * lấy trực tiếp từ wikipedia là
function A*(start,goal)
closedset := the empty set // The set of nodes already evaluated.
openset := set containing the initial node // The set of tentative nodes to be evaluated.
came_from := the empty map // The map of navigated nodes.
g_score[start] := 0 // Distance from start along optimal path.
h_score[start] := heuristic_estimate_of_distance(start, goal)
f_score[start] := h_score[start] // Estimated total distance from start to goal through y.
while openset is not empty
x := the node in openset having the lowest f_score[] value
if x = goal
return reconstruct_path(came_from, came_from[goal])
remove x from openset
add x to closedset
foreach y in neighbor_nodes(x)
if y in closedset
continue
tentative_g_score := g_score[x] + dist_between(x,y)
if y not in openset
add y to openset
tentative_is_better := true
elseif tentative_g_score < g_score[y]
tentative_is_better := true
else
tentative_is_better := false
if tentative_is_better = true
came_from[y] := x
g_score[y] := tentative_g_score
h_score[y] := heuristic_estimate_of_distance(y, goal)
f_score[y] := g_score[y] + h_score[y]
return failure
function reconstruct_path(came_from, current_node)
if came_from[current_node] is set
p = reconstruct_path(came_from, came_from[current_node])
return (p + current_node)
else
return current_node
Vì vậy, hãy để tôi điền vào tất cả các chi tiết ở đây.
heuristic_estimate_of_distance
là hàm Σ d (x i) trong đó d (.) Là khoảng cách Manhattan của mỗi vuông x i từ trạng thái mục tiêu của nó.
Vì vậy, việc thiết lập
1 2 3
4 7 6
8 5
sẽ có một heuristic_estimate_of_distance
của 1 + 2 + 1 = 4 vì mỗi người trong số 8,5 là một cách xa vị trí mục tiêu của họ với d (.) = 1 và 7 là 2 tránh xa trạng thái mục tiêu của nó với d (7) = 2.
Tập hợp các nút mà A * tìm kiếm được xác định là vị trí bắt đầu theo sau là tất cả các vị trí pháp lý có thể có. Đó là cho phép nói rằng vị trí bắt đầu x
là như trên:
x =
1 2 3
4 7 6
8 5
thì hàm neighbor_nodes(x)
tạo ra 2 động thái pháp lý có thể:
1 2 3
4 7
8 5 6
or
1 2 3
4 7 6
8 5
Chức năng dist_between(x,y)
được định nghĩa là số lần di chuyển vuông mà mất địa điểm chuyển tiếp từ tiểu bang x
sang y
. Điều này chủ yếu sẽ bằng 1 trong A * luôn cho mục đích của thuật toán của bạn.
closedset
và openset
đều cụ thể cho các thuật toán A * và có thể được thực hiện sử dụng cấu trúc dữ liệu tiêu chuẩn (hàng đợi ưu tiên Tôi tin.) came_from
là một cấu trúc dữ liệu dùng để tái tạo lại các giải pháp phát hiện bằng cách sử dụng chức năng reconstruct_path
người là chi tiết có thể tìm thấy trên wikipedia. Nếu bạn không muốn nhớ giải pháp bạn không cần phải thực hiện điều này.
Cuối cùng, tôi sẽ giải quyết vấn đề tối ưu. Hãy xem đoạn trích từ bài viết A * wikipedia:
"Nếu chức năng heuristic h được chấp nhận, nghĩa là nó không bao giờ đánh giá cao chi phí tối thiểu thực tế để đạt được mục tiêu, thì A * được chấp nhận (hoặc tối ưu) nếu chúng ta làm không sử dụng bộ kín nếu sử dụng bộ đóng, thì h cũng phải đơn điệu (hoặc nhất quán) cho A * để tối ưu, điều này có nghĩa là đối với bất kỳ cặp nút lân cận x và y, trong đó d (x, y) biểu thị độ dài của cạnh giữa chúng, chúng ta phải có: h (x) < = d (x, y) + h (y)"
Vì vậy, nó cũng đủ để chứng minh rằng dựa trên kinh nghiệm của chúng tôi là có thể chấp nhận và đơn điệu.Đối với cựu (chấp nhận), lưu ý rằng bất kỳ cấu hình nào của chúng tôi ước tính rằng mỗi ô vuông không bị ràng buộc bởi các động thái hợp pháp và có thể di chuyển tự do theo vị trí mục tiêu của nó. là chấp nhận (hoặc nó không bao giờ quá ước tính kể từ khi đạt đến một vị trí mục tiêu sẽ luôn lấy ít nhất bao nhiêu bước dự toán heuristic.)
yêu cầu đơn điệu tuyên bố bằng lời là: "chi phí phỏng đoán (ước tính khoảng cách đến trạng thái mục tiêu) của bất kỳ nút nào phải nhỏ hơn hoặc bằng chi phí chuyển đổi sang bất kỳ nút lân cận cộng với chi phí heuristic của nút đó. " Nó là chủ yếu để ngăn chặn khả năng của chu kỳ tiêu cực, nơi chuyển sang một nút không liên quan có thể làm giảm khoảng cách đến nút mục tiêu nhiều hơn chi phí thực sự chuyển đổi, cho thấy một heuristic nghèo.
Để thể hiện tính đơn điệu của nó khá đơn giản trong trường hợp của chúng tôi. Bất kỳ nút lân cận x, y nào có d (x, y) = 1 theo định nghĩa của chúng ta về d. Do đó chúng ta cần phải chứng minh
h (x) < = h (y) + 1
tương đương với
h (x) - h (y) < = 1
mà tương đương với
Σ d (x i) - Σ d (y i) < = 1
tương đương với
Σ d (x i) - d (y i) < = 1
Chúng tôi biết theo định nghĩa của chúng ta về neighbor_nodes(x)
rằng hai nút hàng xóm x, y có thể có ít nhất vị trí của một hình vuông khác nhau, có nghĩa là trong khoản tiền của chúng tôi thuật ngữ
d (x i) - d (y i) = 0
cho tất cả trừ 1 giá trị i. Cho phép nói mà không mất tính tổng quát, điều này đúng với i = k. Hơn nữa, chúng tôi biết rằng đối với i = k, nút đã chuyển tối đa là một nơi, vì vậy khoảng cách của nó để trạng thái mục tiêu phải có ít nhất một trong hơn ở trạng thái trước đó như sau:
Σ d (x i) - d (y i) = d (x k) - d (y k) < = 1
thấy đơn điệu. Điều này cho thấy những gì cần thiết để được thể hiện, do đó chứng minh thuật toán này sẽ tối ưu (theo ký hiệu lớn hoặc cách tiệm cận.)
Lưu ý rằng tôi đã thể hiện sự tối ưu về ký hiệu big-O nhưng có vẫn còn rất nhiều phòng để chơi trong điều chỉnh các heuristic.Bạn có thể thêm các dấu xoắn bổ sung vào nó để ước tính gần đúng khoảng cách thực tế với trạng thái mục tiêu, tuy nhiên bạn phải thực hiện chắc chắn rằng heuristic luôn là số đánh giá thấp nếu không bạn mất tối ưu!
Tôi không tin rằng luôn có giải pháp. Được cho là Erno Rubik (nhà phát minh ra khối lập phương của Rubik) bán được 15 câu đố (lưới 4x4) với các số từ 1 đến 15, với số 14 và 15 đổi chỗ. Ông đã cung cấp một phần thưởng đáng kể cho những người có thể giải quyết nó. Anh ta, tất nhiên, biết điều đó là không thể. – Eric
Bạn có đang đọc http://thedailywtf.com/Articles/Sliding-Around.aspx bằng bất kỳ cơ hội nào không? – voyager
@Eric - Vâng, vâng, nó có thể là không thể nếu con số được rút ra ngẫu nhiên và được đặt trở lại vì nó di chuyển theo cách không thể trong giải pháp. Nhưng, nếu các con số được sắp xếp theo thứ tự và sau đó trộn lẫn (AKA, dịch chuyển xung quanh), thì có thể "làm việc ngược" để giải quyết vấn đề. Tôi giả định đây là một giả định an toàn để thực hiện ở đây. Tôi cũng tò mò, nếu có giải pháp hiệu quả. – JasCav