PDA

View Full Version : Đã ai nghe nói đến BEST-FIRST-SEARCH chưa vậy?



truongngocdai
03-04-2005, 20:42
Không biết đã ai nghe nói đến thuật toán: Tìm kiếm ưu tiên tối ưu (best-first search) chưa vậy.
Nó có 3 thuật giải con dựa vào nó:
1. Thuật giải AT
2. Thuật giải AKT
3. Thuật giải A*



Ưu điểm của tìm kiếm theo chiều sâu là không phải quan tâm đến sự mở rộng của tất cả các nhánh. Ưu điểm của tìm kiếm chiều rộng là không bị sa vào các đường dẫn bế tắc (các nhánh cụt). Tìm kiếm ưu tiên tối ưu sẽ kết hợp 2 phương pháp trên cho phép ta đi theo một con đường duy nhất tại một thời điểm, nhưng đồng thời vẫn "quan sát" được những hướng khác. Nếu con đường đang đi "có vẻ" không triển vọng bằng những con đường ta đang "quan sát" ta sẽ chuyển sang đi theo một trong số các con đường này. Để tiện lợi ta sẽ dùng chữ viết tắt BFS thay cho tên gọi tìm kiếm ưu tiên tối ưu.
Một cách cụ thể, tại mỗi bước của tìm kiếm BFS, ta chọn đi theo trạng thái có khả năng cao nhất trong số các trạng thái đã được xét cho đến thời điểm đó. (khác với leo đồi dốc đứng là chỉ chọn trạng thái có khả năng cao nhất trong số các trạng thái kế tiếp có thể đến được từ trạng thái hiện tại). Như vậy, với tiếp cận này, ta sẽ ưu tiên đi vào những nhánh tìm kiếm có khả năng nhất (giống tìm kiếm leo đồi dốc đứng), nhưng ta sẽ không bị lẩn quẩn trong các nhánh này vì nếu càng đi sâu vào một hướng mà ta phát hiện ra rằng hướng này càng đi thì càng tệ, đến mức nó xấu hơn cả những hướng mà ta chưa đi, thì ta sẽ không đi tiếp hướng hiện tại nữa mà chọn đi theo một hướng tốt nhất trong số những hướng chưa đi. Đó là tư tưởng chủ đạo của tìm kiếm Best First Search.

Cách cài đặt thuật giải Best First Search


Để cài đặt các thuật giải theo kiểu tìm kiếm BFS, người ta thường cần dùng 2 tập hợp sau :
OPEN : tập chứa các trạng thái đã được sinh ra nhưng chưa được xét đến (vì ta đã chọn một trạng thái khác). Thực ra, OPEN là một loại hàng đợi ưu tiên (priority queue) mà trong đó, phần tử có độ ưu tiên cao nhất là phần tử tốt nhất. Người ta thường cài đặt hàng đợi ưu tiên bằng Heap. Các bạn có thể tham khảo thêm trong các tài liệu về Cấu trúc dữ liệu về loại dữ liệu này.
CLOSE : tập chứa các trạng thái đã được xét đến. Chúng ta cần lưu trữ những trạng thái này trong bộ nhớ để đề phòng trường hợp khi một trạng thái mới được tạo ra lại trùng với một trạng thái mà ta đã xét đến trước đó. Trong trường hợp không gian tìm kiếm có dạng cây thì không cần dùng tập này.

Thuật giải BEST-FIRST SEARCH
1. Đặt OPEN chứa trạng thái khởi đầu.
2. Cho đến khi tìm được trạng thái đích hoặc không còn nút nào trong OPEN, thực hiện :
2.a. Chọn trạng thái tốt nhất (Tmax) trong OPEN (và xóa Tmax khỏi OPEN)
2.b. Nếu Tmax là trạng thái kết thúc thì thoát.
2.c. Ngược lại, tạo ra các trạng thái kế tiếp Tk có thể có từ trạng thái Tmax. Đối với mỗi trạng thái kế tiếp Tk thực hiện :
Tính f(Tk); Thêm Tk vào OPEN
BFS khá đơn giản. Tuy vậy, trên thực tế, cũng như tìm kiếm chiều sâu và chiều rộng, hiếm khi ta dùng BFS một cách trực tiếp. Thông thường, người ta thường dùng các phiên bản của BFS là AT, AKT và A*

Thuật giải AT nè


Thuật giải AT là một phương pháp tìm kiếm theo kiểu BFS với độ tốt của nút là giá trị hàm g – tổng chiều dài con đường đã đi từ trạng thái bắt đầu đến trạng thái hiện tại.
Thuật giải AT
1. Đặt OPEN chứa trạng thái khởi đầu.
2. Cho đến khi tìm được trạng thái đích hoặc không còn nút nào trong OPEN, thực hiện :
2.a. Chọn trạng thái (Tmax) có giá trị g nhỏ nhất trong OPEN (và xóa Tmax khỏi OPEN)
2.b. Nếu Tmax là trạng thái kết thúc thì thoát.
2.c. Ngược lại, tạo ra các trạng thái kế tiếp Tk có thể có từ trạng thái Tmax. Đối với mỗi trạng thái kế tiếp Tk thực hiện :
g(Tk) = g(Tmax) + cost(Tmax, Tk);
Thêm Tk vào OPEN.
* Vì chỉ sử dụng hàm g (mà không dùng hàm ước lượng h’) fsđể đánh giá độ tốt của một trạng thái nên ta cũng có thể xem AT chỉ là một thuật toán.

Thuật giải AKT nè


(Algorithm for Knowlegeable Tree Search)
Thuật giải AKT mở rộng AT bằng cách sử dụng thêm thông tin ước lượng h’. Độ tốt của một trạng thái f là tổng của hai hàm g và h’.
Thuật giải AKT
1. Đặt OPEN chứa trạng thái khởi đầu.
2. Cho đến khi tìm được trạng thái đích hoặc không còn nút nào trong OPEN, thực hiện :
2.a. Chọn trạng thái (Tmax) có giá trị f nhỏ nhất trong OPEN (và xóa Tmax khỏi OPEN)
2.b. Nếu Tmax là trạng thái kết thúc thì thoát.
2.c. Ngược lại, tạo ra các trạng thái kế tiếp Tk có thể có từ trạng thái Tmax. Đối với mỗi trạng thái kế tiếp Tk thực hiện :
g(Tk) = g(Tmax) + cost(Tmax, Tk);
Tính h’(Tk)
f(Tk) = g(Tk) + h’(Tk);
Thêm Tk vào OPEN.

Thuật giải A* nè


A* là một phiên bản đặc biệt của AKT áp dụng cho trường hợp đồ thị. Thuật giải A* có sử dụng thêm tập hợp CLOSE để lưu trữ những trường hợp đã được xét đến. A* mở rộng AKT bằng cách bổ sung cách giải quyết trường hợp khi "mở" một nút mà nút này đã có sẵn trong OPEN hoặc CLOSE. Khi xét đến một trạng thái Ti bên cạnh việc lưu trữ 3 giá trị cơ bản g,h’, f’ để phản ánh độ tốt của trạng thái đó, A* còn lưu trữ thêm hai thông số sau :
1. Trạng thái cha của trạng thái Ti (ký hiệu là Cha(Ti) : cho biết trạng thái dẫn đến trạng thái Ti. Trong trường hợp có nhiều trạng thái dẫn đến Ti thì chọn Cha(Ti) sao cho chi phí đi từ trạng thái khởi đầu đến Ti là thấp nhất, nghĩa là :
g(Ti) = g(Tcha) + cost(Tcha, Ti) là thấp nhất.
2. Danh sách các trạng thái kế tiếp của Ti : danh sách này lưu trữ các trạng thái kế tiếp Tk của Ti sao cho chi phí đến Tk thông qua Ti từ trạng thái ban đầu là thấp nhất. Thực chất thì danh sách này có thể được tính ra từ thuộc tính Cha của các trạng thái được lưu trữ. Tuy nhiên, việc tính toán này có thể mất nhiều thời gian (khi tập OPEN, CLOSE được mở rộng) nên người ta thường lưu trữ ra một danh sách riêng. Trong thuật toán sau đây, chúng ta sẽ không đề cập đến việc lưu trữ danh sách này. Sau khi hiểu rõ thuật toán, bạn đọc có thể dễ dàng điều chỉnh lại thuật toán để lưu trữ thêm thuộc tính này.

1. Đặt OPEN chỉ chứa T0. Đặt g(T0) = 0, h’(T0) = 0 và f’(T0) = 0.
Đặt CLOSE là tập hợp rỗng.
2. Lặp lại các bước sau cho đến khi gặp điều kiện dừng.
2.a. Nếu OPEN rỗng : bài toán vô nghiệm, thoát.
2.b. Ngược lại, chọn Tmax trong OPEN sao cho f’(Tmax) là nhỏ nhất
2.b.1. Lấy Tmax ra khỏi OPEN và đưa Tmax vào CLOSE.
2.b.2. Nếu Tmax chính là TG thì thoát và thông báo lời giải là Tmax.
2.b.3. Nếu Tmax không phải là TG. Tạo ra danh sách tất cả các trạng thái kế tiếp của Tmax. Gọi một trạng thái này là Tk. Với mỗi Tk, làm các bước sau :
2.b.3.1. Tính g(Tk) = g(Tmax) + cost(Tmax, Tk).
2.b.3.2. Nếu tồn tại Tk’ trong OPEN trùng với Tk.
Nếu g(Tk) < g(Tk’) thì
Đặt g(Tk’) = g(Tk)
Tính lại f’(Tk’)
Đặt Cha(Tk’) = Tmax
2.b.3.3. Nếu tồn tại Tk’ trong CLOSE trùng với Tk.
Nếu g(Tk) < g(Tk’) thì
Đặt g(Tk’) = g(Tk)
Tính lại f’(Tk’)
Đặt Cha(Tk’) = Tmax
Lan truyền sự thay đổi giá trị g, f’ cho tất cả các trạng thái kế tiếp của Ti (ở tất cả các cấp) đã được lưu trữ trong CLOSE và OPEN.
2.b.3.4. Nếu Tk chưa xuất hiện trong cả OPEN lẫn CLOSE thì :
Thêm Tk vào OPEN
Tính : f' (Tk) = g(Tk)+h’(Tk).
Có một số điểm cần giải thích trong thuật giải này. Đầu tiên là việc sau khi đã tìm thấy trạng thái đích TG, làm sao để xây dựng lại được "con đường" từ T0 đến TG. Rất đơn giản, bạn chỉ cần lần ngược theo thuộc tính Cha của các trạng thái đã được lưu trữ trong CLOSE cho đến khi đạt đến T0. Đó chính là "con đường" tối ưu đi từ TG đến T0 (hay nói cách khác là từ T0 đến TG).
Điểm thứ hai là thao tác cập nhật lại g(Tk’) , f’(Tk’) và Cha(Tk’) trong bước 2.b.3.2 và 2.b.3.3. Các thao tác này thể hiện tư tưởng : "luôn chọn con đường tối ưu nhất". Như chúng ta đã biết, giá trị g(Tk’) nhằm lưu trữ chi phí tối ưu thực sự tính từ T0 đến Tk’. Do đó, nếu chúng ta phát hiện thấy một "con đường" khác tốt hơn thông qua Tk (có chi phí nhỏ hơn) con đường hiện tại được lưu trữ thì ta phải chọn "con đường" mới tốt hơn này. Trường hợp 2.b.3.3 phức tạp hơn. Vì từ Tk’ nằm trong tập CLOSE nên từ Tk’ ta đã lưu trữ các trạng thái con kế tiếp xuất phát từ Tk’. Nhưng g(Tk’) thay đổi dẫn đến giá trị g của các trạng thái con này cũng phải thay đổi theo. Và đến lượt các trạng thái con này lại có thể có các các trạng thái con tiếp theo của chúng và cứ thế cho đến khi mỗi nhánh kết thúc với một trạng thái trong OPEN (nghĩa là không có trạng thái con nào nữa). Để thực hiện quá trình cập nhật này, ta hãy thực hiện quá trình duyệt theo chiều sâu với điểm khởi đầu là Tk’. Duyệt đến đâu, ta cập nhật lại g của các trạng thái đến đó ( dùng công thức g(T) = g(Cha(T)) +cost(Cha(T), T) ) và vì thế giá trị f’ của các trạng thái này cũng thay đổi theo.
Một lần nữa, xin nhắc lại rằng, bạn có thể cho rằng tập OPEN lưu trữ các trạng thái "sẽ được xem xét đến sau" còn tập CLOSE lưu trữ các trạng thái "đã được xét đến rồi".

Chà chà, Best First Search có vẻ hay đấy chứ
(Bài viết này có đính kèm 1 file .rar trong đó có bài viết về Best First Search mà tôi tìm được. Nếu ai có hứng thú về Best First Search thì cùng vào đây trao đổi)

truongngocdai
03-04-2005, 20:47
đây là 1 bài bàn luận về thuật toán A*
[quote]
Đến đây, có lẽ bạn đã hiểu được thuật giải này. Ta có một vài nhận xét khá thú vị về A*. Đầu tiên là vai trò của g trong việc giúp chúng ta lựa chọn đường đi. Nó cho chúng ta khả năng lựa chọn trạng thái nào để mở rộng tiếp theo, không chỉ dựa trên việc trạng thái đó tốt như thế nào (thể hiện bởi giá trị h’) mà còn trên cơ sở con đường từ trạng thái khởi đầu đến trạng thái hiện tại đó tốt ra sao. Điều này sẽ rất hữu ích nếu ta không chỉ quan tâm việc tìm ra lời giải hay không mà còn quan tâm đến hiệu quả của con đường dẫn đến lời giải. Chẳng hạn như trong bài toán tìm đường đi ngắn nhất giữa hai điểm. Bên cạnh việc tìm ra đường đi giữa hai điểm, ta còn phải tìm ra một con đường ngắn nhất. Tuy nhiên, nếu ta chỉ quan tâm đến việc tìm được lời giải (mà không quan tâm đến hiệu quả của con đường đến lời giải), chúng ta có thể đặt g=0 ở mọi trạng thái. Điều này sẽ giúp ta luôn chọn đi theo trạng thái có vẻ gần nhất với trạng thái kết thúc (vì lúc này f’ chỉ phụ thuộc vào h’ là hàm ước lượng "khoảng cách" gần nhất để tới đích). Lúc này thuật giải có dáng dấp của tìm kiếm chiều sâu theo nguyên lý hướng đích kết hợp với lần ngược.
Ngược lại, nếu ta muốn tìm ra kết quả với số bước ít nhất (đạt được trạng thái đích với số trạng thái trung gian ít nhất), thì ta đặt giá trị để đi từ một trạng thái đến các trạng thái con kế tiếp của nó luôn là hằng số, thường là 1 Nghĩa đặt cost(Ti-1, Ti) = 1 (và vẫn dùng một hàm ước lượng h’ như bình thường). Còn ngược lại, nếu muốn tìm chi phí rẻ nhất thì ta phải đặt giá trị hàm cost chính xác (phản ánh đúng ghi phí thực sự).
Đến đây, chắc bạn đọc đã có thể bắt đầu cảm nhận được rằng thuật giải A* không hoàn toàn là một thuật giải tối ưu tuyệt đối. Nói đúng hơn, A* chỉ là một thuật giải linh động và cho chúng ta khá nhiều tùy chọn. Tùy theo bài toán mà ta sẽ có một bộ thông số thích hợp cho A* để thuật giải hoạt động hiệu quả nhất.
Điểm quan tâm thứ hai là về giá trị h’ – sự ước lượng khoảng cách (chi phí) từ một trạng thái đến trạng thái đích. Nếu h’ chính là h (đánh giá tuyệt đối chính xác) thì A* sẽ đi một mạch từ trạng thái đầu đến trạng thái kết thúc mà không cần phải thực hiện bất kỳ một thao tác đổi hướng nào!. Dĩ nhiên, trên thực tế, hầu như chẳng bao giờ ta tìm thấy một đánh giá tuyệt đối chính xác. Tuy nhiên, điều đáng quan tâm ở đây là h’ được ước lượng càng gần với h, quá trình tìm kiếm càng ít bị sai sót, ít bị rẽ vào những nhánh cụt hơn. Hay nói ngắn gọn là càng nhanh chóng tìm thấy lời giải hơn.
Nếu h’ luôn bằng 0 ở mọi trạng thái (trở về thuật giải AT) thì quá trình tìm kiếm sẽ được điều khiển hoàn toàn bởi giá trị g. Nghĩa là thuật giải sẽ chọn đi theo những hướng mà sẽ tốn ít chi phí/bước đi nhất (chi phí tính từ trạng thái đầu tiên đến trạng thái hiện đang xét) bất chấp việc đi theo hướng đó có khả năng dẫn đến lời giải hay không. Đây chính là hình ảnh của nguyên lý tham lam (Greedy).
Nếu chi phí từ trạng thái sang trạng thái khác luôn là hằng số (dĩ nhiên lúc này h’ luôn bằng 0) thì thuật giải A* trở thành thuật giải tìm kiếm theo chiều rộng! Lý do là vì tất cả những trạng thái cách trạng thái khởi đầu n bước đều có cùng giá trị g và vì thế đều có cùng f’ và giá trị này sẽ nhỏ hơn tất cả các trạng thái cách trạng thái khởi đầu n+1 bước. Và nếu g luôn bằng 0 và h’ cũng luôn bằng 0, mọi trạng thái đang xét đều tương đương nhau. Ta chỉ có thể chọn bằng trạng thái kế tiếp bằng ngẫu nhiên !
Còn nếu như h’ không thể tuyệt đối chính xác (nghĩa là không bằng đúng h) và cũng không luôn bằng 0 thì sao? Có điều gì thú vị về cách xử lý của quá trình tìm kiếm hay không? Câu trả lời là có. Nếu như bằng một cách nào đó, ta có thể chắc chắn rằng, ước lượng h’ luôn nhỏ hơn h (đối với mọi trạng thái) thì thuật giải A* sẽ thường tìm ra con đường tối ưu (xác định bởi g) để đi đến đích, nếu đường dẫn đó tồn tại và quá trình tìm kiếm sẽ ít khi bị sa lầy vào những con đường quá dở. Còn nếu vì một lý do nào đó, ước lượng h’ lại lớn hơn h thì thuật giải sẽ dễ dàng bị vướng vào những hướng tìm kiếm vô ích. Thậm chí nó lại có khuynh hướng tìm kiếm ở những hướng đi vô ích trước! Điều này có thể thấy một cách dễ dàng từ vài ví dụ.
Đến đây chúng ta đã kết thúc việc bàn luận về thuật giải A*, một thuật giải linh động, tổng quát, trong đó hàm chứa cả tìm kiếm chiều sâu, tìm kiếm chiều rộng và những nguyên lý Heuristic khác. Chính vì thế mà người ta thường nói, A* chính là thuật giải tiêu biểu cho Heuristic.
A* rất linh động nhưng vẫn gặp một khuyết điểm cơ bản – giống như chiến lược tìm kiếm chiều rộng – đó là tốn khá nhiều bộ nhớ để lưu lại những trạng thái đã đi qua – nếu chúng ta muốn nó chắc chắn tìm thấy lời giải tối ưu. Với những không gian tìm kiếm lớn nhỏ thì đây không phải là một điểm đáng quan tâm. Tuy nhiên, với những không gian tìm kiếm khổng lồ (chẳng hạn tìm đường đi trên một ma trận kích thước cỡ 106 x 106) thì không gian lưu trữ là cả một vấn đề hóc búa. Các nhà nghiên cứu đã đưa ra khá nhiều các hướng tiếp cận lai để giải quyết vấn đề này. Chúng ta sẽ tìm hiểu một số phương án nhưng quan trọng nhất, ta cần phải nắm rõ vị trí của A* so với những thuật giải khác.
[/code]

noname.cpp
29-01-2007, 22:59
đây là 1 bài bàn luận về thuật toán A*
Nếu như bằng một cách nào đó, ta có thể chắc chắn rằng, ước lượng h’ luôn nhỏ hơn h (đối với mọi trạng thái) thì thuật giải A* sẽ thườngtìm ra con đường tối ưu (xác định bởi g) để đi đến đích, nếu đường dẫn đó tồn tại và quá trình tìm kiếm sẽ ít khi bị sa lầy vào những con đường quá dở.

Khi h' thỏa mãn điều kiện là luôn luôn không lớn hơn đường đi ngắn nhất dẫn tới đích ( hàm h' lúc này được gọi là thỏa mãn được) thì người ta chứng minh được rằng thuật toán A* sẽluôn cho kết quả chính xác.
Điều này rất quan trọng vì khi có một hàm h' như vậy,hiệu quả tìm kiếm tăng lên nhưng vẫn cho kết quả đúng.
Ví dụ như bài toán tìm đường đi ngắn nhất trên mạng giao thông,chọn hàm h' là khoảng cách đường chim bay giữa nút hiện tại và nút đích thì h' là thỏa mãn được và thuật toán A* lúc này sẽ cho kết quả tối ưu.

truongngocdai
30-01-2007, 11:34
Cảm ơn noname.cpp nhiều

jiSh@n
30-01-2007, 16:42
Nếu nhớ ko lầm thì mấy cái này được dạy trong môn Trí tuệ Nhân tạo thì phải.

quockhanh81
08-04-2007, 23:20
hehe không nhầm đâu. Đúng y chang là nó rồi đó. Làm trò chơi caro thì nên dựa vào môn này đó.

hoanglantham
31-05-2007, 11:02
Nhưng mà các bạn ơi bạn nào có chương trình của thuật toán này kô.Mình đã phân tích thuật toán này rồi nhưng vẫn găp vấn đề khi cài đặt.Cảm ơn nhìu

thanhphi_84
19-04-2008, 22:31
Toàn là lý thuyết suông cả diển đàn mà chẳng có cái code nào cả. Mấy cái lý thuyết đó search cả đống thiếu gì. Cái quan trọng là cài đặt nhứ thế nào chư.

muopdang281
16-05-2008, 22:04
Bạn cũng là thành viên của diễn đàn mà.Vậy hãy giúp mọi người đi.Bạn làm đi và chia sẻ trên diễn đàn.Vậy có phải tốt ko.

[=========> Bổ sung bài viết <=========]


Toàn là lý thuyết suông cả diển đàn mà chẳng có cái code nào cả. Mấy cái lý thuyết đó search cả đống thiếu gì. Cái quan trọng là cài đặt nhứ thế nào chư.
Vậy bạn hãy làm rồi share lên đi, cho diễn đàn mình có code đi.

baochi810
20-05-2008, 16:07
P/S truongngocdai : Breadth First Search sư huynh ơi, Best First Search nào đâu đây. Tên thuật mà cũng nói sai nữa

jiSh@n
21-05-2008, 16:46
P/S truongngocdai : Breadth First Search sư huynh ơi, Best First Search nào đâu đây. Tên thuật mà cũng nói sai nữa

Mới học Lý thuyết đồ thị thì cũng nên đọc xem người ta viết gì cái đã ;) Cái này là tìm kiếm tối ưu chứ ko phải tìm kiếm theo chiều rộng.

tieuthantien86
02-06-2008, 08:45
Bạn nào có code source của thuật toán heuristic thì gửi vào email cho mình nhé, địa chỉ email :thanhtamk3a.ictu@gmail.com. Mình đang làm đề tài thực tập về" tìm hiểu không gian trạng thái trong trí tuệ nhân tạo và ứng dụng" .Phần cài đặt thuật toán Heuristic mình ko biết làm. Help me , quikly.Thanks and be happy!

Mr.Goemon
31-07-2008, 22:34
Vừa làm xong cái Demo giải trò chơi 8 puzzle cho môn Trí tuệ nhân tạo, gởi lên để mọi người tham khảo. Tặng luôn source code nhưng hãy có xài lại nhớ để thông tin tham khảo rõ ràng nhé.
http://www.dvdsanhdieu.com/Bai_tap_TTNT_DO_9_SO.rar

còn đây là cái slide báo cáo của tui:
http://www.dvdsanhdieu.com/ThuatGiaiAstar.ppt

namhoang
05-08-2008, 09:13
@Mr.Goemon Khá quá! Mình chẳng biết toi gì về AI. Đọc thấy thích thú quá.
Khen thật đấy!

ithuyloi
16-03-2010, 22:56
Vừa làm xong cái Demo giải trò chơi 8 puzzle cho môn Trí tuệ nhân tạo, gởi lên để mọi người tham khảo. Tặng luôn source code nhưng hãy có xài lại nhớ để thông tin tham khảo rõ ràng nhé.
http://www.dvdsanhdieu.com/Bai_tap_TTNT_DO_9_SO.rar

còn đây là cái slide báo cáo của tui:
http://www.dvdsanhdieu.com/ThuatGiaiAstar.ppt

Bạn còn giữ tài liệu này không share cho mình với, link này die ui`, thanks trc nhe!

nvhungmt1k3
03-11-2010, 21:34
Hm, file đính kèm ở bài viết đầu tiên ko còn nữa à :(

kiakaku
15-11-2010, 22:42
tại sao A* lại so sánh g(n) mà không phải là f(n) thế các bác

nhoc.ecstasy
21-11-2010, 19:24
@Mr.Goemon Bạn có thể share cho mọi người tham khảo đc k? Thanks!

trivtn
06-01-2011, 17:58
Như y trong sách rồi ! mình cũng dựa vô nó mà làm cái Demo A* chạy Map2D nè :
http://www.youtube.com/watch?v=CdrHnbwpX7U