Professional Documents
Culture Documents
Tham lam và A* đều thuộc dạng thuật toán tìm kiếm có thông tin:
- Sử dụng kiến thức cụ thể của vấn đề/bài toán đưa ra nhằm tìm ra giải pháp.
- Sử dụng một hàm heuristic tạo điều kiện cho việc truyền đạt kiến thức bổ sung về
vấn đề cho thuật toán.
So sánh với tìm kiếm mù/không có thông tin ở các thuật toán trước:
Giống nhau ở chỗ cả hai phương pháp tìm kiếm đều phải lấy thông tin từ đề bài/vấn
đề.
CĂN BẢN Vận dụng kiến thức để tìm ra Chỉ sử dụng thông số/thông tin
hàm heuristic => các bước giải kỹ thuật theo phát biểu bài toán
và một quy luật cho trước
HIỆU QUẢ Cao (vì tiêu tốn ít thời gian và chi Trung gian
phí hơn)
THUẬT TOÁN - Tham lam (kết quả đầu tiên tốt - Tìm kiếm theo chiều sâu (DFS)
nhất)
- Tìm kiếm theo chiều rộng
- A* (BFS)
Lấy ví dụ là giờ mẹ các bạn cho các bạn 1 tờ 200k hay 2 tờ 100k, bạn sẽ chọn
tờ 200k, dù giá trị của 2 lựa chọn này là như nhau. Đó là thuật toán tham lam.
- Khái niệm: Lựa chọn tối ưu ở mỗi bước đi để hi vọng tìm ra lời giải tối ưu toàn cục.
- Tính chất:
+ Chọn giải pháp tốt nhất ở thời điểm hiện tại và giải bài toán con nảy sinh từ
lựa chọn. Các lựa chọn sau phụ thuộc vào lựa chọn trước đó nhưng không phụ thuộc
vào lựa chọn trong tương lai hay lời giải của bài toán con.
+ Quyết định từng lựa chọn sớm và thay đổi hướng đi của giải thuật theo các
lựa chọn đó.
+ Từng quyết định chỉ được duyệt 1 lần. Không bao giờ xét lại các quyết định
cũ.
- Nguyên lý:
Giả sử nghiệm của bài toán có thể biểu diễn dưới dạng một vector (x1, x2, ...,
xn), mỗi thành phần xi (i=1, 2, ..., n) được chọn ra từ tập Si.
Mỗi nghiệm của bài toán X = (x1, x2 , ... , x n) được xác định "độ tốt" bằng một
hàm ƒ(X)
=> Mục tiêu cần tìm nghiệm có giá trị ƒ(X) tối ưu (lớn/nhỏ nhát có thể)
Tư tưởng:
Xây dựng vector nghiệm X từng bước, bắt đầu từ vector không ( ).
Giả sử đã xây dựng được (k-1) thành phần (x1 x2, ..., xk-1) của nghiệm và khi
mở rộng nghiệm ta sẽ chọn xk "tốt nhất" trong các ứng cử viên trong tập Sk để được
(x1, x2, ..., xk). Việc lựa chọn như vậy được thực hiện bởi một hàm chọn. Cứ tiếp tục
như vậy cho đến khi xây dưng xong hết tất cả các thành phần của nghiệm.
- Đánh giá:
+ Ưu điểm:
Độ “phức tạp” rõ ràng – Phân tích thời gian chạy dễ dàng hơn
Nếu một thuật toán tham lam có thể chứng minh là tối ưu, nó sẽ thường được sử
dụng
+ Nhược điểm
Kể cả khi kết quả cho ra đã tối ưu thì chứng minh một thuật toán tham lam tối
ưu là rất khó. Chứng minh một giải thuật tham lam là đúng là cả một nghệ thuật hơn là
một khoa học, vì nó đòi hỏi rất nhiều sự sáng tạo.
Nếu không cẩn thận bài toán sẽ rơi vào vòng lặp vô hạn => Không có lời giải
- Ví dụ bài toán:
Yêu cầu: Lựa chọn số lượng đồng tiền nhỏ nhất có thể sao cho tổng mệnh giá
của các đồng tiền này bằng với một lượng tiền cho trước.
TH1.
Tiền đồng có các mệnh giá:1, 2, 5, và 10 xu
TH2.
Các đồng tiền có mệnh giá: 1, 7 và 10 xu
Ví dụ
cụ thể như ở
dưới Bậc 3 Bậc 1
Bậc 2
Bậc 3
Bậc 1
Kết luận: Đỉnh 1 và 4 được tô màu 1-red, đỉnh 5 và đỉnh 2 được tô màu 2-blue,
đỉnh 3 được tô màu 3-Green.
Số màu cần thiết phải sử dụng là i =3 màu.
A*
- Khái niệm: Thuật toán tìm đường đi trong đồ thị từ 1 điểm đến điểm đích, sử dụng
hàm heuristic ước lượng khoàng cách
- Tính chất:
+ Xây dựng đường đi tới đích bằng hàm heuristic đánh giá khoảng cách (có thể
là đánh giá bằng đường chim bay)
+ Từng quyết định chưa hoàn thành sẽ được lưu lại (không như thuật tham
lam), tránh xem xét các nhánh đã xác định đến thời điểm hiện tại có chi phí cao.
+ Có tính đầy đủ: Nếu bài toán có lời giải thì thuật toán chắc chắn tìm được 1
lời giải.
+ Có tính hiệu quả tối ưu với mọi hàm heuristic h (các thuật toán khác chỉ cần
mở rộng ít hơn A* chứ không phải sử dụng hàm h đó)
+ Không phải lúc nào cũng tối ưu. A* chỉ tối ưu khi:
- Tập ban đầu là tập đóng + Hàm heuristic thu nạp được
- Tập ban đầu không đóng + Hàm heuristic đơn điệu/nhất quán
- Nguyên lý:
Từng quyết định lựa chọn sẽ được lưu lại trong một hàng đợi (queue).
Thứ tự ưu tiên trong queue được quyết định bởi hàm tính chi phí
f ( x )=g ( x ) +h ( x )
g ( x ) = chi phí đường đi cho đến thời điểm hiện tại (tổng trọng số của các cạnh
đã đi qua)
h ( x ) = hàm đánh giá heuristic về chi phí nhỏ nhất để đến đích từ x
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)
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.
- Đánh giá
+ Ưu điểm
+ Nhược điểm
- Ví dụ bài toán
Cơ bản:
64
Nâng cao
Cho một bàn cờ với kích thước cho trước và 2 điểm 〇, △ nằm ở 2 vị trí bất kì.
Hãy tìm đường đi ngắn nhất từ 〇 đến △ biết rằng
Khi di chuyển qua mỗi ô thì giá trị của ô sẽ tăng lên 1 đơn vị => Xác định g(x)s
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.
P ( 2,0 )=5,4 là giá trị gần với giá trị 8.6 nhất => P(2,0) được chọn làm giá trị xét
tiếp theo.