SKKN Ứng dụng thuật toán quay lui giải bài toán liệt kê

45 587 1
SKKN Ứng dụng thuật toán quay lui giải bài toán liệt kê

Đ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

SKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kêSKKN Ứng dụng thuật toán quay lui giải bài toán liệt kê

MỤC LỤC Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê PHẦN I MỞ ĐẦU 1.1 Lý chọn đề tài: Với tốn Tin học thường có nhiều phương pháp giải, tìm phương pháp giải tối ưu khơng phải vấn đề đơn giản Để giải tốn thường phải xác định được: - Bài tốn thuộc lớp tốn - Sử dụng phương pháp tối ưu để giải Có tốn u cầu phải liệt kê nghiệm theo điều kiện Với lớp tốn sử dụng thuật tốn quay lui để giải dễ dàng đơn giản phương pháp khác (phương pháp “sinh” giải số tốn liệt kê cấu hình) Vì vậy, tơi đề xuất sáng kiến “Ứng dụng thuật tốn quay lui giải tốn liệt kê” Tuy “thuật tốn quay lui” khơng mới, khơng tối ưu việc giải số tốn mà phương pháp khác giải được, có nhiều tốn mà có thuật tốn giải cách dễ dàng Những tốn dùng phương pháp quay lui để giải gặp nhiều kỳ thi học sinh giỏi tỉnh, Tin học trẻ khơng chun học sinh giỏi quốc gia nhiều năm Ý tưởng “thuật tốn quay lui” liệt kê hết tất khả có thể, hay gọi phương pháp vét cạn, duyệt hết cấu hình 1.2 Mục đích, nhiệm vụ việc thực đề tài nghiên cứu: Nhằm giúp giáo viên học sinh đứng trước tốn, xác định tốn áp dụng thuật tốn quay lui hay khơng? Và cách giải cụ thể nào? Từ tơi đề mục đích, nhiệm vụ việc thực đề tài sau: - Giới thiệu khái niệm “thuật tốn quay lui (Backtracking)”, ưu điểm, hạn chế thuật tốn - Giới thiệu số tốn điển hình lớp tốn Vì sáng kiến có nội dung sau: Trường THPT Chuyên Bảo Lộc Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê Mục Phương pháp quay lui (backtracking) Mục Dạng 1: Tìm tất nghiệm Mục Dạng 2: Tìm nghiệm Mục Dạng 3: Tìm nghiệm tối ưu thoả mãn điều kiện Với dạng có ví dụ điển hình, ý tưởng chương trình tham khảo 1.3 Đối tượng, thời gian phương pháp nghiên cứu: 1.3.1 Đối tượng nghiên cứu: Sáng kiến kinh nghiệm “Ứng dụng thuật tốn quay lui giải tốn liệt kê” có đối tượng nghiên cứu tốn giải thuật tốn quay lui 1.3.2 Thời gian nghiên cứu: “Thuật tốn quay lui” nghiên cứu q trình học tập giảng dạy, bồi dưỡng đội tuyển học sinh giỏi 1.3.3 Phương pháp nghiên cứu: Chủ yếu nghiên cứu đề tài, tham khảo tài liệu, ý kiến đóng góp đồng nghiệp qua thực tiễn giảng dạy Trường THPT Chuyên Bảo Lộc Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê PHẦN II NỘI DUNG 2.1 Phương pháp (thuật tốn quay lui Backtracking) Trong kỹ thuật để thiết kế thuật tốn, quay lui kỹ thuật quan trọng cho phép giải lớp tốn lớn có dạng tổng qt sau: Tìm (hoặc tất cả) nghiệm (x1, x2, , xn) thỏa mãn điều kiện F đó, thành phần xi chọn từ tập hữu hạn Di với i = 1, 2, , n Tư tưởng phương pháp quay lui sau : - Ta xây dựng nghiệm bước, thành phần nghiệm x1 chọn giá trị S1 = D1 - Giả sử chọn thành phần x1, x2, , xi-1, từ điều kiện tốn ta xác định tập S i gồm giá trị chọn cho thành phần nghiệm x i Tập Si tập Di phụ thuộc vào thành phần x1, x2, , xi-1 chọn Chọn phần tử xi thuộc Si thành phần nghiệm Từ (x1, x2, , xi) lặp lại q trình để tiếp tục mở rộng nghiệm cho thành phần x i+1 Nếu khơng chọn thành phần xi+1 (do Si+1 rỗng) ta quay lại chọn phần tử khác Si làm thành phần nghiệm xi (ý nghĩa quay lui bước này) - Trong q trình mở rộng nghiệm ta ln kiểm tra nghiệm thành phần có phải nghiệm tốn hay khơng Nếu cần nghiệm ta dừng lại, cần tìm tất nghiệm q trình tìm nghiệm dừng tất khả chọn thành phần nghiệm vét cạn Quay lui phương pháp vét cạn giá trị nghiệm chọn khơng thực cách duyệt tuyến tính Điểm tốt thuật tốn quay lui so với vét cạn tuyến tính hạn chế bớt nhánh phải duyệt mà theo nhánh khơng tìm lời giải thể việc xây dựng tập giá trị S i tìm thành phần nghiệm xi quay lui khơng mở rộng thành phần nghiệm xi+1 Trường THPT Chuyên Bảo Lộc Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê Tuy nhiên hạn chế phương pháp phải duyệt qua nhiều khả nên độ phức tạp chương trình thường mức giai thừa hay hàm mũ nên tốc độ tính tốn lâu trường hợp kích thước liệu vào lớn Để khắc phục hạn chế người ta tìm cách hạn chế khả khơng đưa đến kết phương pháp nhánh cận, nhiên lớp tốn dùng phương pháp khơng nhiều Đa số tốn vét cạn sử dụng phương pháp duyệt đệ quy để xét hết khả có nghiệm theo ngun tắc "thử sai" quay lui Về tư tưởng, thuật tốn vét cạn đơn giản ứng dụng vào việc giải tốn cần có kỹ thuật định Để giải tốn thuật tốn quay lui cần thực cơng việc quan trọng sau: * Tìm cách biểu diễn nghiệm tốn dạng dãy đối tượng chọn dần bước (x1, x2, , xn) * Xác định tập Si khả chọn làm thành phần thứ i nghiệm Chọn cách thích hợp để biểu diễn Si * Tìm điều kiện để nghiệm chọn nghiệm tốn Một số lưu ý xây dựng thuật tốn quay lui: * Phải duyệt qua phương án tốn chứa nghiệm (vét cạn) * Tránh trường hợp duyệt trùng lặp khả duyệt Để giải tốn thuật tốn quay lui, thơng thường ta thường dùng thủ tục đệ quy Try(i : Integer) để chọn thành phần nghiệm xi Có ba dạng thuật tốn quay lui: Dạng 1: Tìm tất nghiệm Dạng 2: Tìm nghiệm Dạng 3: Tìm nghiệm tối ưu thỏa mãn điều kiện Ta xét cách giải dạng phương pháp quay lui: 2.2 Dạng 1: Tìm tất nghiệm Mơ hình thuật tốn quay lui mơ tả sau: Procedure Try(i: Integer); {Thủ tục thử cho xi nhận giá trị mà nhận} Trường THPT Chuyên Bảo Lộc Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê Begin for Begin ; If then Else Begin ; Try(i + 1); {Gọi đệ quy để chọn tiếp xi+1} ; End; End; End; Thuật tốn quay lui thường bắt đầu lời gọi Try(1) ****************************************************************** VÍ DỤ LIỆT KÊ DÃY NHỊ PHÂN ĐỘ DÀI N Input: file văn NHIPHAN.INP chứa số ngun dương N (N2->4->1 1) Hành trình cần tìm có dạng (x1 = 1, x2, , xn, xn+1 = 1) xi xi+1: hai thành phố liên tiếp hành trình phải có đường trực tiếp (Cij ≠ +∞) ngoại trừ thành phố 1, khơng thành phố lặp lại hai lần Có nghĩa dãy (x1, x2, , xn) lập thành hốn vị (1, 2, , n) 2) Duyệt quay lui: x2 chọn thành phố mà x1 có đường tới (trực tiếp), với cách thử chọn x2 x3 chọn thành phố mà x2 có đường tới (ngồi x1) Tổng qt: xi (1 ≤ i ≤ n) chọn thành phố chưa qua mà từ xi-1 có đường trực tiếp tới 3) Nhánh cận: Khởi tạo cấu hình CAUHINH có chi phí = +∞ Với bước thử chọn xi xem chi phí đường lúc có < Chi phí cấu hình CAUHINH ? khơng nhỏ thử giá trị khác có tiếp tốn thêm Khi thử giá trị xn ta kiểm tra xem xn có đường trực tiếp khơng? Nếu có đánh giá chi phí từ thành phố đến thành phố xn cộng với chi phí từ xn trực tiếp 1, nhỏ chi phí đường CAUHINH cập nhật lại CAUHINH cách 4) Sau thủ tục tìm kiếm quay lui mà chi phí CAUHINH +∞ có nghĩa khơng tìm thấy hành trình thoả mãn điều kiện đề để cập nhật CAUHINH, tốn khơng có lời giải, chi phí CAUHINH < +∞ in cấu hình CAUHINH - hành trình tốn tìm Trường THPT Chuyên Bảo Lộc 34 Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê Chương trình: Program dulich; Const max = 20; maxC = 20 * 100 + 1; {Khởi tạo chi phí lớn nhất} Var C: array[1 max, max] of Integer; {Mảng chi phí} X, BW: array[1 max + 1] of Integer; {X để thử khả năng, BW để ghi nhận nghiệm} T: array[1 max + 1] of Integer; {Ti để lưu chi phí từ X1 đến Xi} Free: array[1 max] of Boolean; {Free để đánh dấu, Freei = True chưa qua i} m, n: Integer; Chiphi: Integer; {Chi phí hành trình tối ưu} {=================================} Procedure Nhap; Var i, j, k: Integer; Begin Readln(n, m); for i := to n {Khởi tạo bảng chi phí ban đầu} for j := to n If i = j then C[i, j] := Else C[i, j] := maxC; for k := to m Begin Readln(i, j, C[i, j]); C[j, i] := C[i, j]; {Chi phí chiều} End; End; {=================================} Trường THPT Chuyên Bảo Lộc 35 Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê Procedure Khoitao; Begin FillChar(Free, n, True); Free[1] := False; {Các thành phố chưa qua ngoại trừ thành phố 1} X[1] := 1; {Xuất phát từ thành phố 1} T[1] := 0; {Chi phí thành phố xuất phát 0} Chiphi := maxC; End; {=================================} Procedure Try(i: Integer); Var j: Integer; Begin for j := to n If Free[j] then {Thử thành phố từ đến n} {Nếu gặp thành phố chưa qua} Begin X[i] := j; T[i] := T[i - 1] + C[x[i - 1], j]; {Chi phí := Chi phí bước trước + chi phí đường trực tiếp} If T[i] < Chiphi then {Hiển nhiên có điều C[x[i - 1], j] < lớn nhất} If i < n then Begin Free[j] := False; Try(i + 1); Free[j] := True; End Else If T[n] + C[x[n], 1] < Chiphi then {Từ xn quay lại tốn chi phí trước} Trường THPT Chuyên Bảo Lộc 36 Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê Begin {Cập nhật CAUHINH} BW := X; Chiphi := T[n] + C[x[n], 1]; End; End; End; {=================================} Procedure Incauhinh; Var i: Integer; Begin If Chiphi = maxC then Writeln(f,‘khong co duong di’) Else for i := to n Write(f,BW[i], '->'); Writeln(f,1); Writeln(f, Chiphi); End; {=================================} Begin Assign(Input, 'TOURISM.INP'); Reset(Input); Assign(Output, 'TOURISM.OUT'); ReWrite(Output); Nhap; Khoitao; Try(2); Incauhinh; Close(Input); Close(Output); End {=================================} VÍ DỤ BÀI TỐN MÁY RÚT TIỀN TỰ ĐỘNG ATM Trường THPT Chuyên Bảo Lộc 37 Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê Một máy ATM có n (n ≤ 20) tờ tiền có mệnh giá t1, t2, t3,…., tn Hãy tìm cách trả tờ với số tiền s Input: Tệp ATM.INP có dạng: - Dòng đầu hai số n s - Dòng thứ hai gồm n số t1, t2, t3,…., tn Output: Tệp ATM.OUT có dạng: Nếu trả s đưa số tờ cần trả đưa cách trả, khơng ghi -1 ATM.INP 11 390 ATM.OUT 20 200 10 20 20 50 50 50 50 100 200 20 20 50 100 100 Ý tưởng: Như ta biết nghiệm tốn dãy nhị phân độ dài n, giả sử xây dựng k thành phần (x1, x2, , xk ), trả tong sử dụng c tờ Để đánh giá nghiệm mở rộng (x1, x2, , xk ), ta nhận thấy: - Còn phải trả s-tong; - Gọi tmax[k] giá cao tờ tiền lại (tmax[k]= MAX{t k+1, …,tn}) - Thì cần sử dụng thêm  s − tong   t max[k ]  tờ    s − tong   mà lớn số tờ cách trả tốt có  t max[k ]  Do đó, c+  khơng cần mở rộng nghiệm (x1, x2, , xk ) Chương trình: Program ATM2; Const max=50; type Mang=array[1 max]of Longint; Var t,tmax,x,a:Mang; N,s,tong,cmin,c:Longint; kt:Boolean; Trường THPT Chuyên Bảo Lộc 38 Trương Nguyễn Nha Trang Tên đề tài: Ứng dụng thuật toán quay lui giải toán liệt kê {===================================} Procedure nhap; Var f:text; i:Longint; Begin Assign(f,'ATM.INP'); Reset(f); Readln(f,n,s); For i:=1 to n Read(f,t[i]); Close(f); End; {===================================} Procedure khoitao; Var i:Longint; Begin tmax[n]:=t[n]; for i:=n-1 downto Begin tmax[i]:=tmax[i+1]; If tmax[i]

Ngày đăng: 27/10/2017, 23:39

Hình ảnh liên quan

3) Nhánh cận: Khởi tạo cấu hình CAUHINH cĩ chi phí = +∞. Với mỗi bước thử chọn xi   xem chi phí đường đi cho tới lúc đĩ cĩ &lt; Chi phí của cấu hình CAUHINH ? nếu khơng nhỏ hơn thì thử giá trị khác ngay bởi cĩ đi tiếp cũng chỉ tốn thêm - SKKN Ứng dụng thuật toán quay lui giải bài toán liệt kê

3.

Nhánh cận: Khởi tạo cấu hình CAUHINH cĩ chi phí = +∞. Với mỗi bước thử chọn xi xem chi phí đường đi cho tới lúc đĩ cĩ &lt; Chi phí của cấu hình CAUHINH ? nếu khơng nhỏ hơn thì thử giá trị khác ngay bởi cĩ đi tiếp cũng chỉ tốn thêm Xem tại trang 35 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan