Thuật toán tìm kiếm leo đồi
Trang 1Thuật toán tìm kiếm leo đồi
N.V.T
Trong lập trình giải toán, các thuật toán tìm kiếmđóng một vai trò cực kỳ quan trọng và rất quen thuộc đối với chúng ta Trongbài viết này, xin trình bày với bạn đọc một trong số các thuật toán tìm kiếmphổ biến: "Thuật toán leo đồi (Hill Climbing Search)
Trước hết, ta nghiên cứu bài toán sau: Trò chơi n2-1số (n N, n > 1)
kíchthước n x n Mỗi số đó được gọi là một quân cờ và lướiô đó được gọi là bàn cờ Có một vị trí của bàn cờ bỏ trống Mỗi lần di chuyểnquân, người chơi được phép chuyển một quân ở vị trí ô tiếp giáp cạnh với ôtrống vào ô trống
Yêucầu: Từ mộttrạng thái ban đầu (sự sắp xếp ban đầu của các quân trên bàn cờ), hãy
thực hiệncác nước đi hợp lệ để thu được trạng thái kết thúc (trạng thái đích cần đạtđược)
Vídụ: với trò chơi 8 số ta minh họa trạng thái ban đầu và trạng thái kết thúcqua các hình
vẽ dưới đây:
Đểgiải bài toán này, chúng ta sẽ nghĩ ngay tới việc xây dựng một cây tìm kiếm màgốc của cây tương ứng với trạng thái xuất phát của bàn cờ Các đỉnh khác củacây tương ứng với các trạng thái thu được do việc thực hiện các nước đi hợp lệ(các nước đi được phép thực hiện là: lên trên, xuống dưới, sang trái và sangphải) Với ví dụ trên, ta có cây tìm kiếm sau:
Trang 2Tiếpđó, ta chỉ việc áp dụng các thuật toán thông dụng như: thuật toán tìm kiếm theochiều rộng hoặc thuật toán tìm kiếmtheo chiều sâu để tìm ra lời giải
Việcsuy nghĩ như trên xem ra có tính khả thi (đơn giản, dễ cài đặt), tuy nhiên, dễnhận thấy rằng nếu số n lớn hơn, ta sẽ phải phát triển một số quá lớn các trạngthái trước khi phát hiện ra trạng thái đích Những hạn chế về mặt thời gian và dung lượng bộ nhớ không cho phépthực hiện điều đó
Trongthực tế, có nhiều bài toán mà số các trạng thái của nó là rất lớn (như cờ vua,cờ tướng ), thì việc giải bài toán chỉ có thể thực hiện nếu bằng một cách nàođó ta lược bỏ những trạng thái thừa, không cần thiết nhằm giảm số lượng trạngthái cần phát triển Để
làm được điều đó, phải sử dụng khéo léo các thông tin phản hồi nảy sinh trong quá
trìnhtìm kiếm (các thông tin này còn gọi là thông tin cảm tính: HeuristicInformation) Cách làm này được đưa ra nhằm mục đích lựa chọn được hướng tìmkiếm tốt nhất tại mỗi bước theo nghĩa: hướng đi đó nhanh dẫn tới trạng tháiđích nhất và nhằm giảm công sức tìm kiếm
Thuậttoán tìm kiếm leo đồi đã đáp ứng được yêu cầu trên Nội dung thuật toán được môtả như sau:
Bước 1: Nếu trạng thái đầu trùngvới trạng thái đích thì dừng ngay, ngược lại thì chuyển
sang bước 2
Bước 2: Sử dụng các quy tắc biến đổi để tạo ra 1 tập hợp các trạng tháitừ trạng thái hiện
thời (trong bài toán trên ta có 4 quy tắc biến đổi tương ứngvới 4 phép di chuyển quân)
Trang 3Bước 3: Với mỗi trạng thái trongtập hợp vừa tạo ra kiểm tra xem đó có phải là trạng thái
đích hay không? Nếuphải thì ngừng việc tìm kiếm, nếu không phải thì ta kiểm tra xem trạng thái mớinày có tốt hơn (gần trạng thái đích hơn) so với trạng thái đã có hay không? Nếuquả thật như vậy thì ghi nhận trạng thái này, ngược lại thì bỏ qua
Bước 4: Trong các trạng thái đượctạo ra (sau khi thực hiện các thao tác ở bước 3), ta ưu
tiên phát triển trạngthái tốt nhất (trạng thái tốt nhất là trạng thái có tiềm năng dẫn tới đíchnhanh nhất)
Bướcnày nhằm mục đích chuyển hướng tìm kiếm lời giải nhanh đến đích nhất
Bước 5: Lặp lại từ bước 2.
Đếnđây bạn đọc có thể nhận thấy thuật toán tìm kiếm leo đồi thực chất là thuậttoán tìm kiếm theo chiều sâu, song tại mỗi bước ta sẽ ưu tiên chọn một trạngthái có hứa hẹn nhanh
tới đích nhất để phát triển trước Vấn đề quan trọng là ởchỗ biết khai thác khéo léo thông tinphản hồi để xác định hướng đi tiếp và đẩy nhanh quá trình tìm kiếm.Thông
thường ta gắn mỗi trạng thái của bài toán với một số đo (1 hàm đánh giá)nào đó nhằm
đánh giá mức độ gần đíchcủa nó.
Nhưvậy: Nếu trạng thái hiện thời là u, theo bước 4 của thuật toán trên thì trạngthái v sẽ được phát triển tiếp theo nếu vẻ kề(u) và hàm đánh giá của vđạt gía trị max (hoặc min)
Phầntiếp theo sẽ trình bày cụ thể thuật toán để giải bài toán trên Trong bài toánnày, ta sẽ
sử dụng hàm đánh giá ký hiệu là h với ý nghĩa: h(u) cho biết số cácchữ số trong trạng thái
u không trùng với vị trí của nó trong trạng thái đích.Trạng thái có tiềm năng dẫn tới đích nhanh nhất (được ưu tiên phát triển trước)là trạng thái có hàm đánh giá h đạt giá trị min Thuậttoán cho trò chơi n2-1 số được mô tả như sau :
Trang 4Input: Trạng thái ban đầu u0và trạng thái đích ut
1 P:={u0} ;{P để lưu các trạng thái chờphát triển được tổ chức dưới dạng Stack } Q:=Φ ;{để lưu các trạng thái đãphát triển được tổ chức dưới dạng hàng đợi Queue} P:= Φ ;{P để lưu tạm thời các trạngthái kề với trạng thái đang xét}
found:=false;
2 While (P # y) and (not found) do
2.1.Loại bỏ trạng thái u ở đỉnh stack P và đặt nó vào hàng đợi Q:
Pop(P,u);
Ađ(u,Q);
2.2.if u=ut then found:= true
else
Trang 5For v ẻ kề (u) do
if(v ẽ P U Q) and (h(v)<= max {h(w)| w ờ P U Q } then
Begin
father (v):=u;
Ađ (v,P?);
End;
if P <> f then
Begin
Sắp xếp các trạng thái trong P theotrật tự tăng của hàm h;
Chuyển các trạng thái trong P vàođỉnh của stack P sao cho
trạng thái có giá trị hàm h nhỏ nhất ở đỉnh của P;
End;
Output: Nếu found = false thì bàitoán không có lời giải.
Nếu found = true thì lời giải là đường đi từu0 tới ut được xác định bằng cách sử
dụng hàm father
Chú ý:Saukhi chuyển các trạng thái từ P vào P thì P= f
h(v 1) ≤ h(v 2) ≤ ≤ h(vk)
Vớiví dụ trên, cây tìm kiếm được hình thành bởi tìm kiếm leo đồi có các trạng tháiđược phát triển như hình vẽ dưới (nét đậm thể hiện hướng tìm kiếm), các số ghicạnh mỗi đỉnh
là giá trị của hàm h tại đỉnh đó
Thuậttoán này có tên gọi là thuật toán tìm kiếm leo đồi, vì tư tưởng của nó tương tựnhư trường hợp: Một người ở vị trí chân đồi u0 và muốn leo lên đỉnhđồi tại vị trí ut Anh ta chọn một đỉnh cao nhất trong số các đỉnhmà anh ta có thể đến được (từ vị trí đang đứng)
Trang 6để leo lên, tại vị trí này anhta lại chọn một đỉnh cao nhất như bước trước để leo lên Quá trình cứ lặp lạinhư vậy cho đến khi tới được đích ut
Nhận xét: Thuật toán này đơn giản,dễ cài đặt và tỏ ra có nhiều hiệu quả Bạn đọc có thể
tự lập trình để giải bàitoán trên, kết quả khá tuyệt vời! Tuy nhiên, thuật toán này không
phù hợp vớicác bài toán có giá trị hàm đánh giá độtnhiên thay đổi khi đến ngưỡng nào
đó Một số hiện tượng sẽ nảy sinhtrong quá trình tìm kiếm được ghi nhận như sau:
*Có cực đại địa phương, là nơiđạt được lời giải tốt hơn các lời giải lân cận, nhưng chưa
phải là lời giải tốttrên tổng thể Như vậy phải có biện pháp ghi nhớ lại nhiều đường đi đề phòngkhi cần đi lại đường cũ
*Có vùng lời giải như cao nguyên bằngphẳng, không thể xác định được ngay hướng nào
tốt hơn nếu chỉ so sánhvùng lân cận (các trạng thái của bài toán có hàm đánh giá xấp xỉ bằng nhau).Khi đó cần có bước nhảy xa để thoát khỏi vùng bằng phẳng
Có đỉnh hình chóp, đó là trạng thái được lựa chọn tốt hơn vùnglân cận nhưng không
vượt qua được theo bất kỳ hướng nào Để xử lý hiện tượngnày, nên chuyển theo đồng thời vài hướng
Cực đại địa phương Cao nguyên Chóp
Minh họa cựctrị địa phương khi giải bài toán bằng thuật toán leo đồi.
Như vậy: Thuật toán này chỉ làphương pháp giải quyết cục bộ, để tăng tính tối ưu, có thể
sử dụng phối hợp nóvới các thuật toán tìm kiếm khác