Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 41 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
41
Dung lượng
1,89 MB
Nội dung
Backtracking algorithm
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
1
Nội dung
Tư tưởng giải thuật
Giải thuật tìm hoán vị
Giải thuật mã đi tuần
Giải thuật tám hậu
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
2
Backtracking algorithm
Là 1 giải thuật chung để tìm tất cả lời giải
cho 1 bài toán, bằng cách xây dựng từng
bước các ứng viên (candidate) cho lời
giải và loại bỏ ("backtracks") 1 ứng viên
nào đó ngay khi phát hiện ứng viên đó
không thể dẫn đến 1 lời giải hợp lệ.
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
3
Backtracking algorithm
Bài toán tiêu biểu:
Tám hậu eight queens puzzle: 1 ứng viên đáng kể
cho bài toán là sắp xếp k hậu vào k hàng đầu tiên
của bàn cờ trong những hàng và cột khác nhau sao
cho không có 2 hậu nào tấn công nhau. Bất kz lời
giải nào mà chứa 2 hậu có thể tấn công nhau đều
phải loại trừ ngay vì không thể nào đưa đến kết
quả cuối cùng được.
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
4
Ứng dụng của giải thuật Backtracking
Để giải quyết các bài toán thỏa mãn ràng buộc
(constraint satisfaction problems) như
crosswords, verbal arithmetic, Sudoku, ..
Để giải các bài toán tối ưu hóa tổ hợp
(combinatorial optimization problems) như
parsing, knapsack problem …
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
5
Ý tưởng phương pháp
Có thể xem nghiệm bài toán là một vector x
= (x1, x2, ... ,xn) mà xi được chọn trong Ai
nào đó
Giả sử đã chọn được k-1 thành phần x1, x2,
..., xk-1 của x
Kế đến chọn thành phần xk bằng cách duyệt
mọi khả năng có thể (trong Ak) để đề cử cho
xk
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
6
Ý 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 xk theo j, khi
k = n thì có một lời giải, ngược lại thì tiếp
tục xác định xk+1
ƒNếu thử tất cả các khả năng xk∈ Ak 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
xk-1
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
7
Ý tưởng phương pháp
Tại mỗi bước đi qua, khi xác định xk, 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
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
8
Lược đồ giải thuật
Back_Tracking(k) // xác định xk, k nguyên
1 For j ←1 to nk // chọn khả năng j, trong nk khả năng
2
3
4
5
6
do if accepting j
then
if k = n
then < recording 1 solution >
else Back_Tracking(k+1)
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
9
Nhận xét về lược đồ giải thuật
Cần chỉ rõ tập khả năng {1, …, nk} và kiểm tra
Nói chung, ngoài sự phụ thuộc vào j, các xi 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 xk 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
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
10
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
11
Đặc điểm của giải thuật backtracking
“Các bước trong giải thuật đều hướng về lời
giải đầy đủ và ghi lại thông tin mỗi bước mà
sau đó nó có thể bị tháo gỡ và xóa đi khi phát
hiện rằng bước này đã không dẫn đến lời giải
đầy đủ, tức là một bước đi dẫn đến “tình thế
bế tắc”(dead-end). (Hành vi này được gọi là
quay lui -bactracking.)
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
12
Ví dụ 1
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, ...,
pn) trong đó pi∈A và pi ≠ pj
ƒ
pk nhận giá trị j =1, 2, .., n và khác với p1, p2,..., pk-1
Dùng biến logic bj (j =1,..., n) để ghi nhận j đã được
gán cho một pi trong hoán vị
Các bj được khởi tạo là true và được gán bằng false
nếu đã sử dụng j
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
13
Ví dụ
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
14
Knight’s Tour Problem
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
15
Knight’s Tour Problem
Cho một bàn cờ n n với n2 ô. Quân mã – di
chuyển theo luật chơi cờ vua – được đặt trên bàn
cờ tại ô đầu tiên có tọa độ x0, y0.
Cần tìm một lộ trình gồm n2 –1 bước sao cho phủ
toàn bộ bàn cờ (mỗi ô được viếng đúng một lần).
Để tiến tới bài toán phủ n2 ô là xét bài toán:
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ệ kế tiếp
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
16
Ý tưởng giải thuật tìm bước đi kế tiếp
procedure try next move;
begin initialize selection of moves;
repeat
select next candidate from list of next moves;
if acceptable then
begin
record move;
if board not full then
begin
try next move;
if not successful then erase previous recording
end
end
until (move was successful) (no more candidates)
end
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
17
Cách biểu diễn dữ liệu
• Biểu diễn bàn cờ bằng ma trận h.
type index = 1..n ;
var h: array[index, index] of integer;
• Biểu diễn trạng thái các ô cờ
h[x, y] = 0: ô chưa hề được viếng
h[x, y] = i: ô đã được viếng tại bước
chuyển thứ i (1 i n2)
• Điều kiện “board not full” “i < n2”.
• Gọi u, v: tọa độ của ô sẽ chuyển đến.
• Điều kiện “acceptable” có thể được diễn tả bằng
(1un) (1vn) (h[u,v]=0)
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
18
Tinh chỉnh giải thuật
procedure try(i: integer; x,y : index; var q: boolean);
var u, v: integer; q1 : boolean;
begin initialize selection for moves;
repeat let u, v be the coordinates of the next move ;
if (1un) (1vn) (h[u,v]=0) then
begin h[u,v]:=i;
if i < sqr(n) then
begin
try(i + 1, u, v, q1); if q1 then h[u,v]:=0
end
else q1:= true
end
until q1 (no more candidates);
q:=q1
end
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
19
Cho tọa độ của ô hiện hành , có 8 khả năng để chọn ô kế
tiếp để đi tới. Chúng được đánh số từ 1 đến 8 như sau:
3
2
4
1
5
8
6
7
GV Phi Loan - BM HTTT Khoa CNTT - HUI
20
Sự tinh chế sau cùng
Cách đơn giản nhất để đạt được tọa độ u,
v từ x, y là bằng cách cộng độ sai biệt toạ
độ tại hai mảng a và b.
Và k được dùng để đánh số ứng viên
(candidate) kế tiếp . Có tối đa 8 ứng
viên cho 1 lần di chuyển
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
21
begin
s:=[1,2,3,4,5];
a[1]:= 2; b[1]:= 1;
a[2]:= 1; b[2]:= 2;
a[3]:= –1; b[3]:= 2;
a[4]:= –2; b[4]:=1;
a[5]:= –2; b[5]:= –1;
a[6]:= –1; b[6]:= –2;
a[7]:= 1; b[7]:= –2;
a[8]:= 2; b[8]:= –1;
for i:=1 to n do
for j:=1 to n do h[i,j]:=0;
h[1,1]:=1; try (2,1,1,q);
if q then
for i:=1 to n do
begin
for j:=1 to n do
write(h[i,j]:5);
writeln
end
else writeln (‘NO
SOLUTION’)
end.
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
22
Giải thuật mã đi tuần
program knightstour (output);
const n = 5; nsq = 25;
type index = 1..n
var i,j: index; q: boolean;
s: set of index;
a,b: array [1..8] of integer;
h: array [index, index] of integer;
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
23
procedure try (i: integer; x, y: index; var q:boolean);
var k,u,v : integer; q1: boolean;
begin k:=0;
repeat
k:=k+1; q1:=false; u:=x+a[k]; v:=y+b[k];
if (u in s) (v in s) then
if h[u,v]=0 then
begin
h[u,v]:=i;
if i < nsq then
begin
try(i+1, u,v,q1);
if q1 then h[u,v]:=0
end
else q1:=true
end
until q1 (k =8);
q:=q1
end {try};
GV Phi Loan - BM HTTT - Khoa CNTT - HUI
24
Thủ tục đệ quy được khởi
động bằng lệnh gọi với tọa
độ khởi đầu x0, y0 , từ đó mã
bắt đầu đi tuần.
H[x0,y0]:= 1;
try(2, x0, y0, q)
1
6
15
10
21
14
9
20
5
16
19
2
7
22
11
8
13
24
17
4
25
18
3
12
23
Kết quả mã đi tuần
với vị trí khởi đầu
[...]... luật chơi cờ vua – được đặt trên bàn cờ tại ô đầu tiên có tọa độ x0, y0 Cần tìm một lộ trình gồm n2 –1 bước sao cho phủ toàn bộ bàn cờ (mỗi ô được viếng đúng một lần) Để tiến tới bài toán phủ n2 ô là xét bài toán: 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ệ kế tiếp GV Phi Loan - BM HTTT - Khoa CNTT - HUI 16 Ý tưởng giải thuật tìm bước đi kế...GV Phi Loan - BM HTTT - Khoa CNTT - HUI 11 Đặc điểm của giải thuật backtracking “Các bước trong giải thuật đều hướng về lời giải đầy đủ và ghi lại thông tin mỗi bước mà sau đó nó có thể bị tháo gỡ và xóa đi khi phát hiện rằng bước này đã không dẫn đến lời... H[x0,y0]:= 1; try(2, x0, y0, q) 1 6 15 10 21 14 9 20 5 16 19 2 7 22 11 8 13 24 17 4 25 18 3 12 23 Kết quả mã đi tuần với vị trí khởi đầu