✨Giải thuật tìm kiếm A*

Giải thuật tìm kiếm A*

Trong khoa học máy tính, **A** (đọc là A sao) là thuật toán tìm kiếm trong đồ thị. Thuật toán này tìm một đường đi từ một nút khởi đầu tới một nút đích cho trước (hoặc tới một nút thỏa mãn một điều kiện đích). Thuật toán này sử dụng một "đánh giá heuristic" để xếp loại từng nút theo ước lượng về tuyến đường tốt nhất đi qua nút đó. Thuật toán này duyệt các nút theo thứ tự của đánh giá heuristic này. Do đó, thuật toán A là một ví dụ của tìm kiếm theo lựa chọn tốt nhất (best-first search).

Thuật toán A được mô tả lần đầu vào năm 1968 bởi Peter Hart, Nils Nilsson, và Bertram Raphael. Trong bài báo của họ, thuật toán được gọi là thuật toán A; khi sử dụng thuật toán này với một đánh giá heuristic thích hợp sẽ thu được hoạt động tối ưu, do đó mà có tên A.

Năm 1964, Nils Nilsson phát minh ra một phương pháp tiếp cận dựa trên khám phá để tăng tốc độ của thuật toán Dijkstra. Thuật toán này được gọi là A1. Năm 1967 Bertram Raphael đã cải thiện đáng kể thuật toán này, nhưng không thể hiển thị tối ưu. Ông gọi thuật toán này là A2. Sau đó, trong năm 1968 Peter E. Hart đã giới thiệu một đối số chứng minh A2 là tối ưu khi sử dụng thuật toán này với một đánh giá heuristic thích hợp sẽ thu được hoạt động tối ưu. Chứng minh của ông về thuật toán cũng bao gồm một phần cho thấy rằng các thuật toán A2 mới là thuật toán tốt nhất có thể được đưa ra các điều kiện. Do đó ông đặt tên cho thuật toán mới là A *(A sao, A-star).

Ý tưởng trực quan

Xét bài toán tìm đường - bài toán mà A thường được dùng để giải. A xây dựng tăng dần tất cả các tuyến đường từ điểm xuất phát cho tới khi nó tìm thấy một đường đi chạm tới đích. Tuy nhiên, cũng như tất cả các thuật toán tìm kiếm có thông tin (informed search algorithm), nó chỉ xây dựng các tuyến đường "có vẻ" dẫn về phía đích.

Để biết những tuyến đường nào có khả năng sẽ dẫn tới đích, A* sử dụng một "đánh giá heuristic" về khoảng cách từ điểm bất kỳ cho trước tới đích. Trong trường hợp tìm đường đi, đánh giá này có thể là khoảng cách đường chim bay - một đánh giá xấp xỉ thường dùng cho khoảng cách của đường giao thông.

Điểm khác biệt của A đối với tìm kiếm theo lựa chọn tốt nhất là nó còn tính đến khoảng cách đã đi qua. Điều đó làm cho A "đầy đủ" và "tối ưu", nghĩa là, A sẽ luôn luôn tìm thấy đường đi ngắn nhất nếu tồn tại một đường đi như vậy. A không đảm bảo sẽ chạy nhanh hơn các thuật toán tìm kiếm đơn giản hơn. Trong một môi trường dạng mê cung, cách duy nhất để đến đích có thể là trước hết phải đi về phía xa đích và cuối cùng mới quay lại. Trong trường hợp đó, việc thử các nút theo thứ tự "gần đích hơn thì được thử trước" có thể gây tốn thời gian.

Mô tả thuật toán

frame|Mô phỏng thuật toán tìm kiếm A ứng dụng trong tìm đường đi từ một nút bắt đầu đến một nút mục tiêu trong chuyển động robot. Các vòng rỗng đại diện cho các nút trong tập mở, nghĩa là những nút đợi, và những vòng tròn tô màu là thuộc tập đóng. Màu trên mỗi nút tô màu tượng trưng cho khoảng cách từ nút đó đến điểm xuất phát: càng xanh thì càng xa. Đầu tiên ta có thể thấy A di chuyển theo hướng thẳng đến mục tiêu, sau khi gặp vật cản, nó sẽ tìm các đường thay thế từ các nút chờ trong tập mở. A* lưu giữ một tập các lời giải chưa hoàn chỉnh, nghĩa là các đường đi qua đồ thị, bắt đầu từ nút xuất phát. Tập lời giải này được lưu trong một hàng đợi ưu tiên (priority queue). Thứ tự ưu tiên gán cho một đường đi x được quyết định bởi hàm f(x) = g(x) + h(x).

Trong đó, g(x) là chi phí của đường đi cho đến thời điểm hiện tại, nghĩa là tổng trọng số của các cạnh đã đi qua. h(x) là hàm đánh giá heuristic về chi phí nhỏ nhất để đến đích từ x. Ví dụ, nếu "chi phí" được tính là khoảng cách đã đi qua, khoảng cách đường chim bay giữa hai điểm trên một bản đồ là một đánh giá heuristic cho khoảng cách còn phải đi tiếp.

Hàm f(x) có giá trị càng thấp thì độ ưu tiên của x'' càng cao (do đó có thể sử dụng một cấu trúc heap tối thiểu để cài đặt hàng đợi ưu tiên này)

function A*(điểm_xuất_phát,đích) var đóng:= tập rỗng var q:= tạo_hàng_đợi(tạo_đường_đi(điểm_xuất_phát)) while q không phải tập rỗng var p:= lấy_phần_tử_đầu_tiên(q) var x:= nút cuối cùng của p if x in đóng continue if x = đích return p bổ sung x vào tập đóng foreach y in các_đường_đi_tiếp_theo(p) đưa_vào_hàng_đợi(q, y) return failure

Trong đó, các_đường_đi_tiếp_theo(p) trả về tập hợp các đường đi tạo bởi việc kéo dài p thêm một nút kề cạnh. Giả thiết rằng hàng đợi được sắp xếp tự động bởi giá trị của hàm f.

"Tập hợp đóng" (đóng) lưu giữ tất cả các nút cuối cùng của p (các nút mà các đường đi mới đã được mở rộng tại đó) để tránh việc lặp lại các chu trình (việc này cho ra thuật toán tìm kiếm theo đồ thị). Đôi khi hàng đợi được gọi một cách tương ứng là "tập mở". Tập đóng có thể được bỏ qua (ta thu được thuật toán tìm kiếm theo cây) nếu ta đảm bảo được rằng tồn tại một lời giải hoặc nếu hàm các_đường_đi_tiếp_theo được chỉnh để loại bỏ các chu trình.

Các tính chất

Cũng như tìm kiếm theo chiều rộng (breadth-first search), A* là thuật toán đầy đủ (complete) theo nghĩa rằng nó sẽ luôn luôn tìm thấy một lời giải nếu bài toán có lời giải.

Nếu hàm heuristic h có tính chất thu nạp được (admissible), nghĩa là nó không bao giờ đánh giá cao hơn chi phí nhỏ nhất thực sự của việc đi tới đích, thì bản thân A có tính chất thu nạp được (hay tối ưu) nếu sử dụng một tập đóng. Nếu không sử dụng tập đóng thì hàm h phải có tính chất đơn điệu (hay nhất quán) thì A mới có tính chất tối ưu. Nghĩa là nó không bao giờ đánh giá chi phí đi từ một nút tới một nút kề nó cao hơn chi phí thực. Phát biểu một cách hình thức, với mọi nút x,y trong đó y là nút tiếp theo của x:

:h(x) \le g(y) - g(x) + h(y)

A còn có tính chất hiệu quả một cách tối ưu (optimally efficient) với mọi hàm heuristic h, có nghĩa là không có thuật toán nào cũng sử dụng hàm heuristic đó mà chỉ phải mở rộng ít nút hơn A, trừ khi có một số lời giải chưa đầy đủ mà tại đó h dự đoán chính xác chi phí của đường đi tối ưu.

Bài toán minh họa

Cho một bàn cờ kích thước n x n. Hãy tìm đường đi ngắn nhất từ điểm 〇 đến điểm △ biết rằng

  • Các ô trắng là đường đi
  • Các ô đen là vật cản, không đi được
  • Tại một ô bất kỳ, chỉ có thể đi lên, xuông, trái, phải nếu không bị cản. Không được đi chéo Tập tin:A Star image1.png|Bàn cờ với kích thước 9*8 Trong bài toán trên ta thấy rằng đường đi ngắn nhất là đường chéo nối từ 〇 đến △

chiều dài đường chéo được tính bằng công thức h(x)=\sqrt {a^2 + b^2}=\sqrt {7^2 + 5^2}=8.6

Khi di chuyển qua mỗi ô thì giá trị của ô sẽ tăng lên 1 đơn vị Tập tin:A Star image3.png|g(x) Tập tin:A Star image2.png|h(x)=\sqrt {a^2 + b^2}

vì là f(x) = g(x) + h(x) nên ta có bảng như sau: Tập tin:A Star image4.png|f(x) = g(x) + h(x) Tiếp theo từ vị trí 0 sẽ duyệt các ô lân cận nó để tìm ra đường ngắn nhất

Ví dụ

Xét lại điểm P(0,0) thì có 2 điểm liên kề nó là bên phải P(1,0) và bên dưới P(0,1) và giá trị f(x) = g(x) + h(x)=3.2

vì 2 giá trị bằng nhau nên chọn điểm nào cũng được. Ở Step 2 thì đang chọn điểm P(1,0)

Điểm P(1,0) có 2 điểm liền kề có giá trị lần lượt là: P(2,0)=5.2, P(1,1)=4.8 công với P(0,1) đang có sẵn thì ta có 3 điểm P(0,1)=3.2, P(2,0)=5.2, P(1,1)=4.8

Theo mình, hàm đánh giá ở ví dụ trên tính sai và so sánh giữa 2 giá trị f(x) và h(x) là khác nhau nên việc so sánh 2 giá trị đó là sai. Đồng thời node cần di chuyển tới là node có giá trị hàm f(x) nhỏ nhất, chứ không phải gần giá trị f(x) của node đích (ở ví dụ trên là h(x) tại node đích là 8.6). Các bạn cần tham khảo thêm tài liệu, tránh sai sót khi chỉ tìm kiếm trên wikipedia. uet maidinh

Giá trị P(2,0)=5.2 là giá trị gần với giá trị 8.6 nhất. nên P(2,0) được chọn làm giá trị xét tiếp theo. tương tự các bước trên ta được bảng như dưới. Tập tin:A Star image5.png

Sau khi chạm được đến điểm △ thì ta được sơ đồ đường đi ngắn nhất như sau: Tập tin:A Star image6.png

Quan hệ với tìm kiếm chi phí đều (uniform-cost search)

Thuật toán Dijkstra là một trường hợp đặc biệt của A* trong đó đánh giá heuristic là một hàm hằng h(x) = 0 với mọi x.

Độ phức tạp thuật toán

Độ phức tạp thời gian của A* phụ thuộc vào đánh giá heuristic. Trong trường hợp xấu nhất, số nút được mở rộng theo hàm mũ của độ dài lời giải, nhưng nó sẽ là hàm đa thức khi hàm heuristic h thỏa mãn điều kiện sau:

:|h(x) - h^(x)| \le O(\log h^(x))

trong đó h^ là heuristic tối ưu, nghĩa là hàm cho kết quả là chi phí chính xác để đi từ x tới đích. Nói cách khác, sai số của h không nên tăng nhanh hơn lôgarit của "heuristic hoàn hảo" h^ - hàm trả về khoảng cách thực từ x tới đích (Russell và Norvig 2003, tr. 101).

Vấn đề sử dụng bộ nhớ của A còn rắc rối hơn độ phức tạp thời gian. Trong trường hợp xấu nhất, A phải ghi nhớ số lượng nút tăng theo hàm mũ. Một số biến thể của A đã được phát triển để đối phó với hiện tượng này, một trong số đó là A lặp sâu dần (iterative deepening A*), A bộ nhớ giới hạn (_memory-bounded A_ - MA) và A bộ nhớ giới hạn đơn giản (simplified memory bounded A*).

Một thuật toán tìm kiếm có thông tin khác cũng có tính chất tối ưu và đầy đủ nếu đánh giá heuristic của nó là thu nạp được (admissible). Đó là tìm kiếm đệ quy theo lựa chọn tốt nhất (recursive best-first search - RBFS).

👁️ 0 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Trong khoa học máy tính, **A*** (đọc là _A sao_) là thuật toán tìm kiếm trong đồ thị. Thuật toán này tìm một đường đi từ một nút khởi đầu tới một nút đích cho
Trong ngành khoa học máy tính, một **giải thuật tìm kiếm** là một thuật toán lấy đầu vào là một bài toán và trả về kết quả là một lời giải cho bài toán đó,
**Tìm kiếm theo lựa chọn tốt nhất** (tiếng Anh: _Best-first search_) là một thuật toán tìm kiếm tối ưu hóa tìm kiếm theo chiều rộng bằng cách mở rộng nút hứa hẹn nhất được chọn
Trong khoa học máy tính, **tìm kiếm nhị phân** (), còn gọi là **tìm kiếm nửa khoảng** (_half-interval search_), **tìm kiếm logarit** (_logarithmic search_), hay **chặt nhị phân** (_binary chop_), là một thuật toán tìm
**Tìm kiếm ưu tiên chiều sâu** hay **tìm kiếm theo chiều sâu** () là một thuật toán duyệt hoặc tìm kiếm trên một cây hoặc một
Trong Khoa học máy tính **tìm kiếm tuần tự** (tiếng Anh _Sequential search_) hay **tìm kiếm tuyến tính** (tiếng Anh _linear search_) là một phương pháp tìm kiếm một phần tử cho trước trong một
nhỏ|310x310px|Mô phỏng tìm kiếm trên cây tìm kiếm theo thuật toán tìm kiếm theo chiều rộng Trong lý thuyết đồ thị, **tìm kiếm theo chiều rộng** (**BFS**) là một thuật toán tìm kiếm trong đồ
Trong khoa học máy tính, **tìm kiếm chi phí đều** (hay còn gọi là _tìm kiếm chi phí cực tiểu_ hoặc _tìm kiếm theo giá thành thống nhất_, viết tắt tiếng Anh là UCS) là
**Phân tích tìm kiếm** (Search analytics) là việc phân tích các truy vấn tìm kiếm được nhập bởi người dùng của một công cụ tìm kiếm (Search tool) cụ thể (Ví dụ: Google, Bing, Wolfram
**Search Engine Optimization - Tối ưu hóa công cụ tìm kiếm (SEO)** là quá trình tăng chất lượng và lưu lượng truy cập website bằng cách tăng khả năng hiển thị của website hoặc webpage
** Thuật toán so khớp chuỗi Knuth–Morris–Pratt** (hay **thuật toán KMP**) tìm kiếm sự xuất hiện của một "từ" W trong một "xâu văn bản" S bằng cách tiếp tục quá trình tìm kiếm khi
**Cốc Cốc** là công cụ tìm kiếm mặc đị ## Lịch sử ### Những ngày đầu Cốc Cốc khởi đầu là một dự án của ba sinh viên Việt Nam khi đang theo học Đại
**Thuật toán Dijkstra**, mang tên của nhà khoa học máy tính người Hà Lan Edsger Dijkstra vào năm 1956 và ấn bản năm 1959, là một thuật toán giải quyết bài toán đường đi ngắn
**Giải thuật Euclid mở rộng** được sử dụng để giải một phương trình vô định nguyên (còn được gọi là phương trình Đi-ô-phăng) có dạng
ax + by =c
Trong đó a, b, c
nhỏ Trong lý thuyết đồ thị, **bài toán đường đi ngắn nhất nguồn đơn** là bài toán tìm một đường đi giữa hai đỉnh sao cho tổng các trọng số của các cạnh tạo nên
Bài viết này là **danh sách các thuật toán** cùng một mô tả ngắn cho mỗi thuật toán. ## Thuật toán tổ hợp ### Thuật toán tổ hợp tổng quát * Thuật toán Brent: tìm
**Minimax** (còn gọi là **minmax**) là một phương pháp trong lý thuyết quyết định có mục đích là tối thiểu hóa (_mini_mize) tổn thất vốn được dự tính có thể là "tối đa" (_max_imize). Có
Trong tài chính, **phân tích kỹ thuật** là một phương pháp phân tích chứng khoán dự báo hướng của giá cả thông qua việc nghiên cứu các dữ liệu thị trường quá khứ, chủ yếu
**Thuật toán Ford- Fulkerson** (đặt theo L. R. Ford và D. R. Fulkerson) tính toán luồng cực đại trong một mạng vận tải. Tên Ford-Fulkerson cũng thường được sử dụng cho thuật toán Edmonds-Karp, một
**Thuật toán Bellman–Ford** hay **Giải thuật Bellman–Ford** là một thuật toán tính các đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng có trọng số (trong đó một số cung có thể
**Cây tìm kiếm nhị phân** (viết tắt tiếng Anh: BST - _Binary Search Tree_) là một cấu trúc dữ liệu rất thuận lợi cho bài toán tìm kiếm. Mỗi cây tìm kiếm nhị phân đều
Lễ trao giải tháng 12 năm 2023 tại Nhà hát Hồ Gươm **VinFuture** là giải thưởng khoa học và công nghệ toàn cầu, thành lập ngày 20 tháng 12 năm 2020 với sứ mệnh "tạo
Trong khoa học máy tính và lý thuyết đồ thị, **thuật toán Edmonds–Karp** là một trường hợp đặc biệt của thuật toán Ford–Fulkerson cho việc tìm luồng cực đại trong mạng. Nó có độ phức
**Thuật toán Dinitz** là một thuật toán thời gian đa thức mạnh cho việc tìm luồng cực đại trên đồ thị luồng, tìm ra năm 1970 bởi nhà nghiên cứu khoa học máy tính người
**_Tìm kiếm tài năng châu Á (Asia's Got Talent)_** là một chương trình truyền hình tương tác mua lại bản quyền của _Got Talent_ phát sóng trên kênh AXN. Đây là một cuộc thi tài
phải|nhỏ|[[Lưu đồ thuật toán (thuật toán Euclid) để tính ước số chung lớn nhất (ưcln) của hai số _a_ và _b_ ở các vị trí có tên A và B. Thuật toán tiến hành bằng
**_Thư kiếm ân cừu lục_** (書劍恩仇錄) là một tiểu thuyết võ hiệp của nhà văn Kim Dung, được đăng trên _Tân vãn báo_ của Hồng Kông từ ngày 8 tháng 2 năm 1955 đến ngày
Bộ light novel và anime _Date A Live_ gồm dàn nhân vật phong phú được sáng tạo bởi Tachibana Kōshi và thiết kế bởi Tsunako. ## Nhân vật chính ### Itsuka Shido Lồng tiếng: Nobunaga
Bài này nói về từ điển các chủ đề trong toán học. ## 0-9 * -0 * 0 * 6174 ## A * AES * ARCH * ARMA * Ada Lovelace * Adrien-Marie Legendre *
nhỏ| Để tìm kiếm một mục đã cho trong một danh sách theo thứ tự nhất định, có thể sử dụng cả thuật toán [[Tìm kiếm tuần tự|tìm kiếm nhị phân và tuyến tính (bỏ
thumb|[[Vincent van Gogh, tháng 7 năm 1890, _Đồng lúa và những con quạ_.]] **Tâm lý học mỹ thuật** là một lĩnh vực liên ngành nghiên cứu về quan niệm, nhận thức và đặc điểm của
phải|Một trung tâm kế hoạch hoá gia đình tại Kuala Terengganu, [[Malaysia.]] **Kiểm soát sinh sản** là một chế độ gồm việc tuân theo một hay nhiều hành động, cách thức, các thực hiện tình
**Thuật toán Shor** là một thuật toán lượng tử giúp phân tích nhân tử một số nguyên ở dạng _N_ = _p_._q_, với _p_ và _q_ là các số nguyên tố, tức là tìm ra
Một **công dân kỹ thuật số** () là người có kỹ năng sử dụng công nghệ thông tin để giao tiếp với người khác, tham gia vào các hoạt động xã hội, kinh doanh và
**Who Wants to Be a Millionaire** (_Ai muốn trở thành triệu phú?_, viết tắt là WWTBAM, đôi khi còn được gọi với cái tên **Millionaire**, ở Việt Nam chương trình được biết tới với tên
nhỏ|phải|Tôn giả A-nan-đà, nổi danh là người "nghe và nhớ nhiều nhất", được xem là Nhị tổ [[Thiền tông Ấn Độ]] **A-nan-đà** (Ānanda, zh. 阿難陀, sa., pi. _ānanda_, bo. _kun dga` bo_ ཀུན་དགའ་བོ་), thường viết
**_Cosmos: A Spacetime Odyssey_** ( Vũ trụ: Chuyến du hành không-thời gian) là một bộ phim tài liệu khoa học nước Mỹ, được trình chiếu vào năm 2014. Chương trình này dựa theo phim tài
**Ả Rập Xê Út** (, "thuộc về Nhà Saud", cũng được viết là **Ả Rập Saudi**, **Arab Saudi**, **Saudi Arabia**), tên gọi chính thức là **Vương quốc Ả Rập Xê Út** , "Vương quốc Ả
thumb|upright|[[Wilhelm Röntgen (1845–1923), người đầu tiên nhận giải Nobel Vật lý.]] Mặt sau huy chương giải Nobel vật lý **Giải Nobel Vật lý** là giải thưởng hàng năm do Viện Hàn lâm Khoa học Hoàng
**Trận chung kết môn Bóng đá nam tại Đại hội Thể thao Đông Nam Á 2023** là trận tranh huy chương vàng giữa hai đội tuyển bóng đá U-22 quốc gia Indonesia và Thái Lan,
**_Sinh vật huyền bí và nơi tìm ra chúng_** (tên gốc tiếng Anh: **_Fantastic Beasts and Where to Find Them_**) là một phim điện ảnh kỳ ảo do David Yates đạo diễn. Đây là bộ
**Trình độ kỹ thuật số** (hay còn gọi _trình độ số_, _năng lực công nghệ số_ **)** đề cập đến khả năng sử dụng thông tin và công nghệ kỹ thuật số để tìm kiếm,
**Trượt băng nghệ thuật** (tiếng Anh: _figure skating_) là môn thể thao trong đó các cá nhân, đôi hoặc nhóm biểu diễn bằng giày trượt băng trên sân băng. Đây là môn thể thao mùa
**Kiểm tra tính nguyên tố** (tiếng Anh: _primality test_) là bài toán kiểm tra xem một số tự nhiên n có phải là số nguyên tố hay không. Bài toán này đặc biệt trở nên
**Nai sừng tấm Á-Âu** (Danh pháp khoa học: _Alces alces_) là một loài thú trong phân họ Capreolinae thuộc họ hươu nai (Cervidae). Đây là loài thú to lớn nhất và nặng nhất còn tồn
ASEAN tại đại lộ Jalan Sisingamangaraja No.70A, [[Jakarta|Nam Jakarta, Indonesia.]] nhỏ|Quốc kỳ của 10 nước thành viên ASEAN. Từ phải qua: [[Brunei, Campuchia, Indonesia, Lào, Malaysia, Myanmar, Philippines, Singapore, Thái Lan, Việt Nam|298x298px]] **Hiệp hội
Quốc hội Trung Quốc đã bỏ phiếu cho các luật về kiểm duyệt thông tin trên mạng Internet. Với luật này, chính quyền Trung Quốc đã sử dụng nhiều biện pháp khác nhau để thực
**_Nước Mỹ một thời như thế_** (tiếng Anh_: **Once Upon a Time in America**_, tiếng Ý: _**C'era una volta in America)**_ là một phim tội phạm sử thi năm 1984 do nhà làm phim người
Kem Phục Hồi Và Tái Tạo Da Sau Khi Laser - Epitheliale A.H DUO Ultra Repairing Cream 15mlDa bạn sau quá trình bị thủy đậu, sau các thủ thuật da liễu như sinh thiết, cắt
**Truyền hình kỹ thuật số** (tiếng Anh: **Digital television** - **DTV**) là một hệ thống viễn thông phát và nhận tín hiệu hình ảnh và âm thanh bằng các tín hiệu kỹ thuật số, trái