1. Trang chủ
  2. » Công Nghệ Thông Tin

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

57 568 3
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Các chiến lược thiết kế giải thuật
Trường học Đại Học Bách Khoa Hà Nội
Chuyên ngành Khoa Học Máy Tính
Thể loại Báo cáo môn học
Thành phố Hà Nội
Định dạng
Số trang 57
Dung lượng 2,44 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• 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

Trang 1

CÁC CHIẾN LƯỢC

THIẾT KẾ GIẢI THUẬT

1

CHƯƠNG 5

Trang 2

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

Trang 3

Giải thuật quay lui (backtracking)

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

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

 Các ví dụ

Trang 4

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

Trang 5

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

Trang 6

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

Trang 7

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

Trang 8

Ý 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).

Trang 11

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

Trang 12

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

• Các trạng thái được ghi nhận bởi biến toàn cục

Trang 13

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

Trang 14

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

1 Xét tất cả các giá trị x1 có thể nhận,

thử cho x1 nhận lần lượt các giá trị

đó Với mỗi giá trị thử cho x1 ta sẽ:

2 Xét tất cả các giá trị x2 có thể nhận,

lại thử cho x2 nhận lần lượt các giá

trị đó Với mỗi giá trị thử gán cho x2

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

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

(x1,x2, ,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:

Trang 15

Thuật toán quay lui (pseudocode)

//Thủ tục thử cho xi 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 xi) do

begin

<Thử cho xi := V>;

if ( xi 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 xi nhận giá trị V (Nếu cần)>;

Try(i + 1); //Gọi đệ qui để chọn tiếp xi + 1

<Nếu cần, bỏ ghi nhận việc thử xi := V, để thử giá trị khác>; end;

end;

end;

Trang 16

Quá trình tìm kiếm lời giải của thuật toán quay lui

Trang 17

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

Banary_Back_Tracking(k+1)

VD n=3: 000, 001, 010, 011, 100, 101, 110, 111

Trang 18

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

Trang 19

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

Trang 20

Ví Dụ:Liệt kê các hoán vị của n phần tử từ tập A = {1, 2, , n}

Trang 21

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}

Trang 22

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:

Trang 23

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 ô

Trang 24

• 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 n2 –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)

Trang 25

Bài toán đường đi của con hiệp sĩ

Trang 26

Hành trình của quân mã

Trang 27

Hành trình của quân mã tại x0,y0

Trang 28

procedure try next move;

begin initialize selection of moves;

try next move; (6.3.1)

if not successful then erase previous recording end

end

until (move was successful) ∨ (no more candidates)

end

Trang 29

Chúng ta diễn tả bàn cờ bằng một 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: ô <x,y> chưa hề được viếng h[x, y] = i: ô <x,y> đã được viếng tại bước chuyển thứ

i (1 i n 2 )

Điều kiện “board not full” có thể được diễn tả bằng “i < n 2 ”:

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)

Cách biểu diễn dữ liệu

Trang 30

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 ;

Trang 31

Cho tọa độ của ô hiện hành <x, y>, có 8 khả năng để

chọn ô kế tiếp <u, v> để đi tới Chúng được đánh số từ

Trang 32

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.

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;

Trang 33

procedure try (i: integer; x, y: index; var q:boolean); var k,u,v : integer; q1: boolean;

Trang 34

for j:=1 to n do write(h[i,j]:5);

writeln

end else writeln (‘NO

SOLUTION’)

end.

Sự tinh chế sau cùng

Trang 35

Thủ tục đệ quy được khởi động bằng lệnh gọi với tọa độ khởi đầu

x0, y0 , từ đó chuyến đi bắt đầu

Trang 36

Từ thí dụ trên ta đi đến với một kiểu “giải quyết vấn đề” mới:

Đặc điểm chính là

“bước hướng về lời giải đầy đủ và ghi lại thông tin về bước này 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.)

Nhận xét

Trang 37

try next step; (6.3.3)

if not successful then cancel recording

Trang 38

procedure try (i: integer);

var k : integer;

begin k:=0;

repeat k:=k+1; select k-th candidate;

if acceptable then begin

record it;

if i<n then begin

try (i+1); (6.3.4)

if not successful then cancel recording end

end until successful ∨ (k=m) end

Nếu tại mỗi bước,

số ứng viên phải

thử là cố định thì

kiểu mẫu trên có

thể biến đổi như :

Trang 39

• Bài toán này đã được C.F Gauss khảo sát năm 1850, nhưng ông ta không hoàn toàn giải quyết được

Hay nói cách khác là một cách xếp tám quân hậu trên bàn cờ sao cho không có hai quân nào đứng trên cùng hàng, hoặc cùng cột hoặc cùng đường chéo

nằm trên cùng 1 hàng, cùng 1 cột hay cùng 1 đường chéo trên bàn cờ.

Bài toán 8 con hậu

Trang 41

Làm cách nào để diễn tả 8 con hậu trên bàn cờ?

var x: array[1 8] of integer;

a: array[1 8] of Boolean;

b: array[b1 b2] of Boolean;

c: array[c1 c2] of Boolean;

với

x[i] chỉ vị trí của con hậu trên cột thứ i;

a[j] cho biết không có con hậu trên hàng thứ j;

b[k] cho biết không có con hậu trên đường chéo  thứ k; c[k] cho biết không có con hậu trên đường chéo  thứ k.

Cách biểu diễn dữ liệu

Trang 42

procedure try (i: integer);

Trang 43

Việc chọn trị cho các mốc b1, b2, c1, c2 được xác định bởi cách

mà các chỉ số của các mảng b và c được tính Hãy chú ý rằng trên cùng một đường chéo chiều  tất cả các ô sẽ có cùng giá trị của

tổng hai tọa độ i +j, và trên cùng một đường chép chiều 

diagonal, tất cả các ô sẽ có cùng giá trị của hiệu hai tọa độ (i – j ).

Như vậy, phát biểu setqueen được tinh chế như sau:

x[i]:=j; a[j]:=false; b[i+j]:=false;c[i-j]:=false;

Phát biểu removequeen được chi tiết hóa như sau:

a[j] = true; b[i+j] = true ; c[i-j] := true

Điều kiện safe được diễn tả như sau:

a[j] ∧ b[i+j] ∧ c[i-j]

Tinh chỉnh giải thuật

Trang 44

a[j]:=false; b[i+j]:=false;

c[i-j]:=false;

if i<8 then begin

try (i+1, q);

if ¬ q then begin

a[j]:=true; b[i+j]:=true; c[i-j]:=true

end end else q:=true end

until q ∨ (j=8) end {try};

Giải Thuật bài toán 8 con hậu

Trang 45

begin

for i:= 1 to 8 do a[i]:=true;

for i:= 2 to 16 do b[i]:=true;

for i:= –7 to 7 do c[i]:=true;

Một lời giải của bài toán 8 con hậu được cho ở hình vẽ sau:

Giải thuật bài toán 8 con hậu

Trang 46

H H

H H

H

H H

Trang 47

Sự mở rộng là tìm không chỉ một lời giải mà tất cả những lời giải của bài toán đã cho

Phương pháp: Một khi một lời giải được tìm thấy và ghi lại, ta tiếp tục xét ứng viên kế trong quá trình chọn ứng

Khuôn mẫu tổng quát được dẫn xuất từ (6.3.4) và được trình bày như sau:

Sự mở rộng: Tìm tất cả các lời giải

Trang 48

procedure try(i: integer);

Trang 49

Trong giải thuật mở rộng, để đơn giản hóa điều kiện dừng của quá

trình chọn, phát biểu repeat được thay thế bằng phát biểu for

if a[j] ∧ b[i+j] ∧ c[i-j] then

begin

x[i]:=j;

a[j]:=false; b[i+j]:= false;

c[i-j]:=false;

if i < 8 then try(i+1) else print;

a[j]:=true; b[i+j]:= true;

c[i-j]:= true;

end end {try};

Sự mở rộng: Tìm tất cả các lời giải

Trang 50

begin

for i:= 1 to 8 do a[i]:=true;

for i:= 2 to 16 do b[i]:=true;

for i:= –7 to 7 do c[i]:=true;

Trang 53

Mười hai lời giải đó được liệt kê trong bảng sau:

2 Những giá trị ở cột N chỉ số lần thử để tìm một ô an toàn Trung bình cần 8 6 1 3 5 7 4 336

161 phép thử trong 92 lời giải này.

Sự mở rộng: Tìm tất cả các lời giải

Trang 54

Cây không gian trạng thái

 Để tiện diễn tả giải thuật quay lui, ta xây dựng cấu trúc cây ghi những lựa chọn đã được thực hiện Cấu trúc cây này được gọi là cây không gian trạng thái (state space tree)

hay cây tìm kiếm (search tree)

 Nút rễ của cây diễn tả trạng thái đầu tiên trước khi quá trình tìm kiếm lời giải bắt đầu

 Các nút ở mức đầu tiên trong cây diễn tả những lựa chọn được làm ứng với thành phần đầu tiên của lời giải

 Các nút ở mức thứ haì trong cây diễn tả những lựa chọn được làm ứng với thành phần thứ hai của lời giải và các mức kế tiếp tương tự như thế

Trang 55

Một nút trên cây KGTT được gọi là triển vọng nếu nó tương ứng với lời giải bộ phận mà sẽ có thể dẫn đến lời giải đầy đủ; trái lại, nó được gọi là một lời giải không triển vọng Các nút lá diễn tả những trường hợp bế tắc (dead end) hay những lời giải đầy đủ.

Thí dụ: Cho một bài toán như sau:

Tập biến: X, Y, Z.

Gán trị từ tập {1,2} vào các biến sao cho thỏa mãn các ràng buộc: X = Y, X ≠ Z, Y > Z.

Hãy giải bài toán bằng một giải thuật quay lui.

Cây không gian trạng thái của bài toán này được cho ở hình

vẽ sau:

Cây không gian trạng thái

Trang 57

Độ phức tạp của giải thuật quay lui

• Thời gian tính toán của các giải thuật quay lui thường là hàm mũ (exponential).

• Nếu mỗi nút trên cây không gian trạng thái có trung bình α nút con, và chiều dài của lối đi lời

giải là N, thì số nút trên cây sẽ tỉ lệ với αN

• Thời gian tính toán của giải thuật đệ quy tương ứng với số nút trên cây không gian trạng thái nên

có độ phức tạp hàm mũ.

Ngày đăng: 25/07/2014, 16:20

HÌNH ẢNH LIÊN QUAN

Hình 6.3.1 trình bày một lời giải đạt được với vị trí  &lt;1,1&gt; với n = 5. - CHƯƠNG 5 - CÁC CHIẾN LƯỢC THIẾT KẾ GIẢI THUẬT pps
Hình 6.3.1 trình bày một lời giải đạt được với vị trí &lt;1,1&gt; với n = 5 (Trang 35)
Hình 6.9  Thí dụ về cây Không Gian Trạng Thái - CHƯƠNG 5 - CÁC CHIẾN LƯỢC THIẾT KẾ GIẢI THUẬT pps
Hình 6.9 Thí dụ về cây Không Gian Trạng Thái (Trang 56)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w