A* là một thuật toán Heuristic dựa trên thuật toán Dijsktra. Thế nên phải tìm hiểu kỹ thuật toán Dijsktra trước khi tìm hiểu thuật toán này.
Thuật toán Dijkstra, mang tên của nhà khoa học máy tính người Hà Lan Edsger Dijkstra, là một thuật toán giải quyết bài toán đường đi ngắn nhất trong một đồ thị có hướng không có cạnh mang trọng số âm.
a. Bài toán
Cho một đồ thị có hướng G=(V,E), một hàm trọng số w: E → [0, ∞) và một đỉnh nguồn s. Cần tính toán được đường đi ngắn nhất từ đỉnh nguồn s đến mỗi đỉnh của đồ thị. Ví dụ: Chúng ta dùng các đỉnh của đồ thị để mô hình các thành phố và các cạnh để mô hình các đường nối giữa chúng. Khi đó trọng số các cạnh có thể xem như độ dài của các con đường (và do đó là không âm). Chúng ta cần vận chuyển từ thành phố s đến thành phố t. Thuật toán Dijkstra sẽ giúp chỉ ra đường đi ngắn nhất chúng ta có thể đi. Trọng số không âm của
các cạnh của đồ thị mang tính tổng quát hơn khoảng cách hình học giữa hai đỉnh đầu mút của chúng. Ví dụ: với 3 đỉnh A, B, C đường đi A-B-C có thể ngắn hơn so với đường đi trực tiếp A-C.
b. Chứng minh
Ý tưởng của chứng minh như sau:
Chúng ta sẽ chỉ ra, khi một đỉnh v được bổ sung vào tập S, thì d[v] là giá trị của đường đi ngắn nhất từ nguồn s đến v.
Theo định nghĩa nhãn d, d[v] là giá trị của đường đi ngắn nhất trong các đường đi từ nguồn s, qua các đỉnh trong S, rồi theo một cạnh nối trực tiếp u-v đến v.
Giả sử tồn tại một đường đi từ s đến v có giá trị bé hơn d[v]. Như vậy trong đường đi, tồn tại đỉnh giữa s và v không thuộc S. Chọn w là đỉnh đầu tiên như vậy.
Đường đi của ta có dạng s - ... - w - ... - v. Nhưng do trọng số các cạnh không âm nên đoạn s - ... - w có độ dài không lớn hơn hơn toàn bộ đường đi, và do đó có giá trị bé hơn d[v].
Mặt khác, do cách chọn w của ta, nên độ dài của đoạn s - ... - w chính là d[w]. Như vậy d[w] < d[v], trái với cách chọn đỉnh v. Đây là điều mâu thuẫn. Vậy điều giả sử của ta là sai. Ta có điều phải chứng minh.
Trong khoa học máy tính, A* là một lựa chọn tốt nhất đồ thị tìm kiếm thuật toán mà tìm thấy đường dẫn chi phí ít nhất định ban đầu từ một nút tới một nút mục tiêu (trong một hoặc nhiều mục tiêu có thể). Nó sử dụng một khoảng cách, cộng với chi phí năng Heuristic (thường được ký hiệu là f (x))
để xác định thứ tự tìm kiếm thăm nút trong cây. Khoảng cách + giá Heuristic là một tổng của hai chức năng:
- Đường dẫn - chi phí hoạt động, đó là chi phí từ nút bắt đầu đến nút hiện tại (thường được ký hiệu là g (x)).
- Và một “Admissible Heuristic ước lượng” khoảng cách đến mục tiêu (thường được ký hiệu là h (x)).
H(x) là một phần của f (chức năng) x phải là một Admissible Heuristic; có nghĩa là, nó không được đánh giá cao khoảng cách đến mục tiêu. Vì thế cho một ứng dụng như định tuyến, h(x) có thể đại diện cho khoảng cách đường thẳng đến mục tiêu, vì đó là khoảng cách nhỏ nhất có thể giữa hai điểm.
Nếu h đáp ứng các điều kiện bổ sung h x d x, y h y cho cạnh mỗi x, y của đồ thị (d nghĩa là chiều dài của cạnh đó) sau đó được gọi là h không thay đổi hay nhất quán. Trong trường hợp này A* có thể được thực hiện hiệu quả hơn - khoảng nói, nút không cần phải được xử lý nhiều hơn một lần (xem đóng đặt dưới đây) - và trong thực tế, A* tương đương với chạy thuật toán Dijkstra's với chi phí giảm:
d'(x, y): = d(x,y) - h(x) + h(y)
Thuật toán này được mô tả lần đầu vào năm 1968 bởi Peter Hart, Nils Nilsson, và Bertram Raphael Thuật toán này đã được khái quát hóa thành một thuật toán tìm kiếm Heuristic hai chiều.
A* là sự lựa chọn phổ biến nhất, bởi vì nó khá linh hoạt và có thể được sử dụng trong nhiều hoàn cảnh.
A* là đồ thị như các thuật toán tìm kiếm khác nhưng khác ở chỗ nó có khả năng có thể tìm kiếm một khu vực rộng lớn của bản đồ. Nó giống như thuật toán Dijkstra trong đó nó có thể được sử dụng để tìm một con đường ngắn nhất. Nó giống như tham lam nhất ở chỗ nó có thể sử dụng một Heuristic để hướng dẫn chính nó.