Tải bản đầy đủ (.ppt) (57 trang)

CHƯƠNG 5 - CÁC CHIẾN LƯỢC THIẾT KẾ GIẢI THUẬT pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (754.77 KB, 57 trang )

CÁC CHIẾN LƯỢC
THIẾT KẾ GIẢI
THUẬT
1
CHƯƠNG 5
Nội dung

Qui hoạch động

Giải thuật tham lam

Giải thuật quay lui (backtracking)

Giải thuật nhánh và cận
2

Giải thuật quay lui (backtracking)

Ý tưởng phương pháp

Lược đồ giải thuật

Các ví dụ
Giải thuật quay lui

Kĩ thuật quay lui (backtracking) như là một quá trình
phân tích đi xuống và quay lui trở lại theo con đường đã
đi qua.

Tại mỗi bước phân tích chúng ta chưa giải quyết được
vấn đề do còn thiếu cứ liệu nên cứ phải phân tích cho


tới các điểm dừng, nơi chúng ta xác định được lời giải
của chúng hoặc là xác định được là không thể (hoặc
không nên) tiếp tục theo hướng này.

Từ các điểm dừng này chúng ta quay ngược trở lại
theo con đường mà chúng ta đã đi qua để giải quyết
các vấn đề còn tồn đọng và cuối cùng ta sẽ giải quyết
được vấn đề ban đầu.
Giải thuật quay lui
Ba kĩ thuật quay lui là:

“vét cạn” là kĩ thuật phải đi tới tất cả các điểm dừng rồi
mới quay lui.

“Cắt tỉa Alpha-Beta” và “Nhánh-Cận” là hai kĩ thuật cho
phép chúng ta không cần thiết phải đi tới tất cả các
điểm dừng, mà chỉ cần đi đến một số điểm nào đó và
dựa vào một số suy luận để có thể quay lui sớm.
Giải thuật quay lui
Ví dụ kĩ thuật quay lui “vét cạn”
Biểu thức 5 + 2 * 3 - 4
Trị của nút gốc chính là trị của biểu thức.
Để định trị cho nút gốc, chúng ta phải định trị cho hai con
của nó, đối với mỗi con ta xem nó có phải là nút lá hay
không, nếu không phải ta lại phải xét hai con của nút
đó.
Quá trình cứ tiếp tục như vậy cho tới khi gặp các nút lá
mà giá trị của chúng đã được biết, quay lui để định trị
cho các nút cha của các nút lá và cứ như thế mà định
trị cho tổ tiên của chúng.

Ý tưởng phương pháp

Thử từng khả năng cho đến khi tìm thấy lời giải đúng. Đó là một
quá trình tìm kiếm theo độ sâu trong một tập hợp các lời giải.

Trong quá trình tìm kiếm, nếu ta gặp một hướng lựa chọn không
thỏa mãn, ta quay lui về điểm lựa chọn nơi có các hướng khác
và thử hướng lựa chọn tiếp theo.

Khi đã thử hết các lựa chọn xuất phát từ điểm lựa chọn đó, ta
quay lại điểm lựa chọn trước đó và thử hướng lựa chọn tiếp theo
tại đó. Quá trình tìm kiếm thất bại khi không còn điểm lựa chọn
nào nữa.

Quy trình đó thường được cài đặt bằng một hàm đệ quy mà
trong đó mỗi thể hiện của hàm lấy thêm một biến và lần lượt gán
tất cả các giá trị có thể cho biến đó, với mỗi lần gán trị lại gọi
chuỗi đệ quy tiếp theo để thử các biến tiếp theo.
Ý tưởng phương pháp

Chiến lược quay lui tương tự với tìm kiếm theo độ sâu nhưng sử
dụng ít không gian bộ nhớ hơn, nó chỉ lưu giữ trạng thái của một
lời giải hiện tại và cập nhật nó.

Để tăng tốc quá trình tìm kiếm, khi một giá trị được chọn, trước
khi thực hiện lời gọi đệ quy, thuật toán thường xóa bỏ giá trị đó
khỏi miền xác định của các biến có mâu thuẫn chưa được gán
(kiểm tra tiến - forward checking) và kiểm tra tất cả các hằng số
để tìm các giá trị khác đã bị loại trừ bởi giá trị vừa được gán (lan
truyền ràng buộc - constraint propagation).

Phương pháp

Có thể xem nghiệm bài toán là một vector x =
(x
1
, x
2
, , x
n
) mà x
i
được chọn trong A
i
nào đó

Giả sử đã chọn được k-1 thành phần x
1
, x
2
, ,
x
k-1
của x

Lúc đó chọn thành phần x
k
bằng cách duyệt
mọi khả năng có thể (trong A
k
) để đề cử cho x

k
Ý tưởng phương pháp

Với mỗi khả năng j, kiểm tra xem có chấp nhận đươc
không, có 2 trường hợp

Nếu chấp nhận j thì xác định x
k
theo j, khi k = n thì có
một lời giải, ngược thì tiếp tục xác định x
k+1

Nếu thử tất cả các khả năng x
k
A∈
k
mà không có khả
năng nào được chấp nhận thì quay lui lại bước trước
để xác định lại x
k-1
Lưu ý
• Tại mỗi bước đi qua, khi xác định x
k
, cần phải ghi nhớ những khả
năng nào đã được thử để tránh trùng lặp
• Có thể sử dụng một stack để ghi nhớ những khả năng đã được
thử dùng kỹ thuật đệ qui để thiết kế thuật toán⇒
Lược đồ thuật giải
Back_Tracking(k) // xác định xk, k nguyên
1 for j 1 ← to n

k
// chọn khả năng j, trong nk khả năng
2 do if accepting j
3 then <computing x
k
from j>
4 if k = n
5 then< recording 1 solution >//có 1 lời giải
6 else Back_Tracking(k+1)
Lược đồ thuật giải
Nhận xét
• Cần chỉ rõ tập khả năng {1, …, n
k
} và kiểm tra <accepting
j>
• Nói chung, ngoài sự phụ thuộc vào j, các x
i
còn phụ thuộc
vào việc chọn các thành phần ở các bước trước
• Vì vậy, có thể phải ghi nhớ trạng thái của quá trình tìm
kiếm sau khi xác định x
k
theo j và trả lại trạng thái cũ sau
lời gọi Back_Tracking(k+1)
• Các trạng thái được ghi nhận bởi biến toàn cục
Ví dụ

Sử dụng chiến lược quay lui dùng để giải bài toán liệt kê các
cấu hình. Mỗi cấu hình được xây dựng bằng cách xây dựng
từng phần tử, mỗi phần tử được chọn bằng cách thử tất cả các

khả năng.
Lược đồ thuật giải
1. Xét tất cả các giá trị x
1
có thể nhận,
thử cho x
1
nhận lần lượt các giá trị
đó. Với mỗi giá trị thử cho x
1
ta sẽ:
2. Xét tất cả các giá trị x
2
có thể nhận,
lại thử cho x
2
nhận lần lượt các giá
trị đó. Với mỗi giá trị thử gán cho x
2

lại xét tiếp các khả năng chọn x
3

cứ tiếp tục như vậy đến bước:
n. Xét tất cả các giá trị x
n
có thể nhận,
thử cho x
n
nhận lần lượt các giá trị

đó, thông báo cấu hình tìm được
(x
1
,x
2
, ,x
n
).
Giả thiết cấu hình cần liệt kê có dạng (x
1
,x
2
, ,x
n
). Khi đó thuật toán quay lui
được thực hiện qua các bước sau:
Thuật toán quay lui (pseudocode)
//Thủ tục thử cho
x
i
nhận lần lượt các giá trị mà nó có thể nhận
procedure
Try
(i: Integer);
begin
for (mọi giá trị có thể gán cho
x
i
) do
begin

<Thử cho
x
i
:= V>;
if (
x
i
là phần tử cuối cùng trong cấu hình) then
<Thông báo cấu hình tìm được>
else
begin
<Ghi nhận việc cho
x
i
nhận giá trị V (Nếu cần)>;

Try
(i + 1); //Gọi đệ qui để chọn tiếp
x
i
+ 1
<Nếu cần, bỏ ghi nhận việc thử
x
i
:= V, để thử giá trị khác>;
end;
end;
end;
Quá trình tìm kiếm lời giải của thuật
toán quay lui

Ví Dụ: Liệt kê các xâu nhị phân độ dài n
Liệt kê các xâu nhị phân độ dài n
Giải

Biểu diễn xâu nhị phân dạng
b = (b1, b2, , bn), b
i
= 0,1

Back_Tracking(k) xác định b
k
với các giá trị được đề cử
thuộc A
k
= {0,1}

Các đề cử mặc nhiên đươc
chấp nhận vì không có bất kỳ
điều kiện ràng buộc nào khác
Banary_Back_Tracking(k)
1 for j ←0 to 1
2 do
3 b[k] ←j
4 if k = n
5 then Print(b)
6 else
return
Banary_Back_Tracking(k+1)
VD n=3: 000, 001, 010, 011, 100, 101, 110, 111
Các Ví Dụ

Liệt kê các xâu nhị phân độ dài n
Ví Dụ: Liệt kê các xâu nhị phân độ dài n
Liệt kê các xâu nhị phân độ dài n
Ví Dụ: Liệt kê các xâu nhị phân độ dài n
Ví Dụ:Liệt kê các hoán vị của n phần tử từ tập A = {1, 2, , n}
Giải

Biểu diễn mỗi hoán vị như là một vector p = (p1, p2, ,
p
n
) trong đó p
i
A và p∈
i
≠p
j

p
k
nhận giá trị j =1, 2, , n ≠p
1
, p
2
, , p
k-1

Dùng biến logic b
j
(j =1, , n) để ghi nhận j đã được gán
cho một p

i
trong hoán vị

Các b
j
được khởi tạo là true và được gán bằng false
nếu đã sử dụng j
1 Permutation_Back_Tracking(k)
2 for j←1 to n
3 do if b[j] = true // accepting j
4 then p[k] ←j
5 b[j] ←false;// saving new status
6 if k = n
7 then Print_result(p)
else
8 return Permutation_Back_Tracking (k+1)
9 b[j] ←true; // return old status
VD tập {1,2,3}
Hoán vị : {1,2,3}, {1,3,2}, {2,1,3}, {2,3,1}, {3,1,2}, {3,2,1}
Tham khảo gt Secure trang 17
Ví Dụ:Liệt kê các hoán vị của n phần tử từ tập A = {1, 2, , n}
Ví Dụ:Trò chơi CARO_Tham khảo giáo trình NgVanLinh_Tr70

Xét trò chơi carô có 9 ô. Hai người thay phiên nhau đi X
hoặc O. Người nào đi được 3 ô thẳng hàng (ngang,
dọc, chéo) thì thắng cuộc. Nếu đã hết ô đi mà chưa
phân thắng bại thì hai đấu thủ hòa nhau. Một phần của
trò chơi này được biểu diễn bởi cây sau:
Ví Dụ:Trò chơi CARO_Tham khảo giáo trình NgVanLinh_Tr70
Một phần của cây trò chơi carô 9 ô


Cho một bàn cờ n × n với n
2
ô. Một con hiệp sĩ – được di
chuyển tuân theo luật chơi cờ vua – được đặt trên bàn cờ
tại ô đầu tiên có tọa độ x
0
, y
0
.

Vấn đề là tìm một lộ trình gồm n
2
–1 bước sao cho phủ
toàn bộ bàn cờ (mỗi ô được viếng đúng một lần).

Cách rõ ràng để thu giảm bài toán phủ n
2
ô là xét bài toán,
hoặc là
- thực hiện bước đi kế tiếp, hay
- phát hiện rằng không kiếm được bước đi hợp lệ nào.
Bài toán đường đi của con hiệp sĩ (The
Knight’s Tour Problem)
Bài toán đường đi của con hiệp sĩ

×