BỘ GIÁO DỤC VÀ ĐÀO TẠO DAI HOC HUE
TRUONG DAI HOC KHOA HOC
PHAM THI ANH DAO
UNG DUNG PHUONG PHAP QUY HOACH DONG TRONG BOI DUONG HOC SINH
GIOI TIN TRUNG HOC PHO THONG
CHUYEN NGANH © : KHOA HOC MAY TINH MA SO : 60 48 01 01
LUAN VAN THAC SI KHOA HOC DINH HUONG NGHIEN CUU
NGUOI HUONG DAN KHOA HOC PGS.TS HOANG QUANG
Thừa Thiên Huế, 2018
Trang 2LỜI CAM ĐOAN
Tôi xin cam đoan đây là công trình nghiên cứu của riêng cá nhân tôi, dưới sự hướng dẫn khoa học của PGS.TS Hoàng Quang
Các kết quả nêu trong luận văn là trung thực và chưa từng được công bố trong bất kỳ công trình khoa học nào khác
Thừa Thiên Huế, ngày 24 tháng 04 năm 2018 Học viên
Trang 3LỜI CẢM ƠN
Lời đầu tiên, tôi xin gởi lời cảm ơn chân thành sâu sắc đến Quý thầy cô giáo
Khoa Công nghệ thông tin - Trường Đại học Khoa học Huế đã tận tình hướng dẫn, truyền đạt kiến thức, tạo điều kiện thuận lợi trong quá trình học tập và thực hiện
luận văn tốt nghiệp
Tôi xin chân thành gửi lời biết ơn đến PGS.TS Hoàng Quang, người thầy đã hướng dẫn tận tỉnh và có những góp ý sâu sắc, hướng dẫn rất quý báu cho tôi trong suốt quá trình nghiên cứu, kịp thời cho tôi nhiều lời động viên cũng như những nhận xét đúng đắn để tôi có thê hoàn thành tốt được đề tài này
Trong quá trình thực hiện dé tài, xin chân thành gửi lời cảm ơn đến sự giúp đỡ, những lời động viên từ phía gia đình, đồng nghiệp, bạn bè là động lực to lớn giúp tôi hoàn thành tốt dé tài nghiên cứu của mỉnh Tôi cũng gửi lời cảm ơn đến trường
THPT Đông Hà, nơi tôi đang công tác đã tạo điều kiện đi học và thực hiện đề tài
nghiên cứu này
Bản thân tôi đã cố gắng hết sức trong quá trình thực hiện để tài này nhưng chắc chắn sẽ không tránh khỏi những thiếu sót Kính mong quý thầy cô và các bạn tận tình góp ý, chỉ bảo
Xin chan thanh cam on!
Thừa Thiên Huế, ngày 24 tháng 04 năm 2018 Học viên
Phạm Thị Anh Đào
Trang 4MỤC LỤC Trang LỚI GAM ĐO AT tang non hit 000 SỰ GI130 HE GEN HUY GEREDƯGHHHIHPQJ8Hãtigiilgiatiraggtuagazaai i 0009901912 .ÔỎ ii h9 nƯờg,7 iii DANH MỤC CÁC HÌNH 5555522 EEEE.EEEEiEErrrrrrrrrrrkee Vv ) 97000157 - , )HD,HHA 1 Chương 1 CƠ SỞ LÝ THUYÉT VỀ PHƯƠNG PHÁP QUY HOẠCH ĐỌNG 3
1.1.MỘT SÓ KHÁI NIỆM CƠ BẢN VỀ PHƯƠNG PHÁP QUY HOẠCH
ĐỘNG 2202 22222122112211221121121121121121222222112122222222 re 3
1.1.1 Phương pháp quy hoạch động - - c St S2 Series 3 1.1.2 Các bài toán con gối nhau 222 2s 22222212212112211221122122122 te 3
1.1.3 Cấu trúc con tối ưu -s- s22 2212E12Et21 E121 re 5
1.1.4 Hai cách tiếp cận quy hoạch động thường ding 0 cece 7
1:]1:5 Nguyên lý:của phương PhẨP serene 8
1.2 CAC BUGC THỰC HIỆN GIẢI BÀI TOÁN QUY HOACH DONG 8 1.2.1 Các bước thực hiện .- - L2 1 22211111211 11221 1111121111501 1 1111 1k1 x ky 9 1.2.2 Một số ví đụ 52 22222222122112211121112111211211221222212222 re 11 1.3 TIỂU KÉT CHƯƠNG l 2222222221222121122121121121222222 xe 17 Chương 2 MÓI QUAN HỆ GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỌNG VÀ MỌT SÓ PHƯƠNG PHÁP KHÁC 5©©25°©5+ScseExteEreetreerreerrerrreee 18 2.1 SỰ KHÁC NHAU GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ PHƯƠNG PHÁP ĐỆ QUY 5c 51 2211221121 21222112121 e ray 18 2.2 MÓI QUAN HỆ GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ
PHƯƠNG PHÁP VÉT CẠN -25222222212212211211212222222 re 20 2.2.1 Giới thiệu về thuật toán vét cạn - 552222 221222122222222 re 20
Trang 52.3 MÓI QUAN HỆ GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ
PHƯƠNG PHÁP THAM LAM -©22-22222221122211222112121211 11 1E.e.ye 25
2.3.1 Giới thiệu về thuật toán tham lam -222222212221221222121 2222 xee 25
2.3.2 Phương pháp quy hoạch động và phương pháp tham lam 26
2.4 TIỂU KÉT CHƯƠNG 2 222222 2212221221221122112112211221222222 re 30 Chương 3 PHÂN LOẠI MỘT SỐ BÀI TOÁN GIẢI BẰNG PHƯƠNG PHÁP
9)060:09(0:E0 c7 ẽ ‹-(-‹-ägAH,H.HDH , 31
Trang 6DANH MỤC CÁC HÌNH
Hình 1.1 Đồ thị bài toán con cho đấy Fibonđe6i 52 5s 222 1221121121121122 e5 4 Hình 1.2 Tìm đường đi ngắn nhất sử dụng cấu trúc con tối ưu, một đường lượn sóng đại điện cho một đường đi ngắn nhất giữa hai đỉnh mà nó nổi Š Hình 1.3 Đồ thị có hướng của bài toán tìu đường đi dài nhất 5s s5s eee 6 Tình 2.1 Tam giác PdSCAdÏ, à ST tt Tnhh HH Hà Hot tết 19 Hình 2.2 Cây biểu diễn không gian ứng viên của bài toán cái giá với n=3 24 Hình 3.1 Bài toán cái Đa lÔ SE TH HHHHHuHe 32
Trang 8thi đều có giới hạn về thời gian, cũng như bộ nhớ của chương trình, nên một thuật
toán hiệu quả là cực kỳ cần thiết Và trong những trường hợp như vậy, quy hoạch động là một trong những thuật toán phù hợp Chỉ cần làm được những bài này là học sinh gần như có giải Tuy nhiên việc làm cho các em học sinh phổ thông có thể sử dụng thành thạo phương pháp này trong lập trình không phải là vấn đề dễ dàng Hiểu rõ các thuật toán là bước đầu giúp các em học sinh tự tin đồng thời phân tích bài toán và xác định phương pháp giải đúng đắn sẽ giúp các em có thành tích tốt hơn Biết được mối quan hệ giữa quy hoạch động và các phương pháp khác sẽ giúp việc giải các bài toán để dàng và nhanh chóng hơn
Là một giáo viên giảng dạy bộ môn Tin học ở trường trung học phô thông, việc bồi dưỡng học sinh giỏi là nhiệm vụ vô cùng quan trọng, tôi nhận thấy việc ứng dụng phương pháp quy hoạch động trong thiết kế thuật toán là một mảng kiến thức rất cần thiết đối với học sinh tham gia bồi dưỡng học sinh giỏi
Vì vậy, tôi chọn để tài “Ứng dụng phương pháp Quy hoạch động trong bi dưỡng học sinh giỏi Tìn — Trung học phổ thông" để làm đề tài nghiên cứu Hy vọng đây sẽ là một tư liệu hữu ích cho các giáo viên, học sinh và những người quan tâm đến phương pháp này
Luận văn này bao gồm ba chương Chương l giới thiệu cho chúng ta có cái nhìn khái quát về thuật toán quy hoạch động Chương 2 giới thiệu về mối quan hệ giữa phương pháp quy hoạch động và một số phương pháp khác: đệ quy, vét cạn, tham lam Chương 3 phân loại một số bài toán giải bằng phương pháp quy hoạch động
Phần phu lục là dùng Pascal để cài đặt, giải bài toán được giới thiệu ở chương 3
bằng phương pháp quy hoạch động Bởi vì hiện nay thi học sinh giỏi THPT chủ yếu
là sử dụng ngôn ngữ lập trình Pascal nên tồn bộ các thuật tốn sẽ được cài đặt bằng Pascal Việc này sẽ thuận tiện hơn cho các em học sinh và giáo viên trong việc học
tập và giảng dạy
Mặc dù bản thân tôi luôn cố gắng hết sức trong quá trình thực hiện đề tài này
nhưng chắc chắn sẽ không tránh khỏi những thiếu sót, kính mong quý thầy cô và các
Trang 9Chương I CƠ SỞ LÝ THUYÉT VÈ PHƯƠNG PHÁP QUY HOẠCH ĐỘNG
Quy hoạch động mặc đù không nằm trong nội dung chương trình tin học phổ thông nhưng là một trong những kỹ thuật lập trình thường được sử dụng trong các kỳ thị học sinh giỏi, Olympic, tin học trẻ
Chương này sẽ giới thiệu về thuật toán quy hoạch động, bao gồm các phần: những khái niệm cơ bản về quy hoạch động, các bước để giải bài toán bằng quy
hoạch động và một số ví dụ minh hoạ
11 MỘT SÓ KHÁI NIỆM CƠ BAN VE PHƯƠNG PHÁP QUY HOẠCH ĐỘNG
1.1.1 Phương pháp quy hoạch động
Trong ngành khoa học máy tính, gwy hoạch động là một phương pháp giảm thời gian chạy của các thuật toán thể hiện các tính chất của các bài foán con gối nhau (overlapping subproblem) và cấu trúc con toi uu (optimal substructure) [7]
Nhà toán học Richard Bellman (1920-1984) đã phát minh phương pháp quy hoạch động vào năm 1953 Phương pháp này đã được xây đựng như là một chủ đề
về kỹ thuật và phân tích bài toán đã được tô chức IEEE thừa nhận [2]
Phương pháp quy hoạch động bắt đầu từ việc giải tất cả các bài toán nhỏ nhất (bài toán cơ sở) để từ đó từng bước giải quyết những bài toán lớn hơn cho tới khi giải được bài toán lớn nhất (bài toán ban đầu) Ý tưởng cơ bản của phương pháp quy hoạch động là tránh tính toán lại các bài toán con đã xét, nói cách khác phương pháp quy hoạch động đã thể hiện sức mạnh của nguyên lý chia đề trị đến cao độ
1.1.2 Các bài toán con gối nhau
Tương tự như thuật toán chia để trị, quy hoạch động cũng chia bài toán lớn thành các bài toán con nhỏ hơn Quy hoạch động được sử dụng khi các bài toán con
Trang 10var vt:byte; begin if r<s then begin ifSi-1; VEC:=k[r,s]z x[i]:=vt; TimVT(r,vt)z TimVT (vt+1,s); end; end; procedure tonghop; var k:byte; begin writeln('So phep tinh * toi thieu la:',1l[1,n]); i:=n; THVT eH)
Trang 11Đặc điểm của lời giải đệ quy: thực hiện bài toán từ việc phân tích ở mức cao
xuống mức thấp.Và quy hoạch động chính là một trong số những phương pháp có thê giúp chúng ta tối ưu hóa quá trình tính toán này Mỗi bài toán con (số Ƒ) sẽ
được lưu lại trước khi tính những bài toán con lớn hơn Nhờ đó, mà việc tính toán
giảm đi đáng kể, mỗi bài toán con chỉ cần tính đúng một lần
Một ví dụ quy hoạch động với bài toán này bằng cách giải quyết từ mức thấp
lên mức cao ta có thuật toán sau:
Function F(n: integer): integer;
var i: integer; a: array[1 100] of integer; Begin For i:=3 to n do ali]:=a[i-l]t+a[i-2]; E:= a[n]; End;
D6 phic tap: O(n)
Đặc điểm của lời giải bài toán theo phương pháp quy hoạch động: giải quyết bài toán đệ quy từ mức thấp trước, lời giải của chúng được lưu lại và được sử dụng
để tìm lời giải của các bài toán ở mức cao hơn [7]
1.1.3 Cấu trúc con tối ưu
Trang 12
Cẩm trúc con tối ưu có nghĩa là các lời giải tối ưu cho các bài toán con có thể
được sử dụng để tìm các lời giải tối ưu cho bài tốn tồn cục [7]
Vi du, đường đi ngắn nhất tới một đỉnh trong một đỗ thị có thể được tìm thấy
bằng cách: trước hết tính đường đi ngắn nhất tới đích từ tất cả các đỉnh kề nó, rồi dùng kết quả này để chọn đường đi toàn cục tốt nhất, như trong hình 1.2
Nói chung, ta có thể giải một bài toán với cấu trúc con tối ưu bằng một quy
trình ba bước:
1 Chia bài toán thành các bài toán con nhỏ hơn
2 Giải các bài toán này một cách tối ưu bằng cách sử dụng đệ quy quy trình ba bước này
3 Sử dụng các kết quả tối ưu đó để xây dựng một lời giải tối ưu
cho bài toán ban dau
Các bài toán con được giải bằng cách chia chúng thành các bài toán nhỏ hơn, và cứ tiếp tục như thế, cho đến khi ta đến được trường hợp đơn giản dễ tìm lời giải
Tính chất cấu trúc con tối ưu rất quan trọng Nó cho phép chúng ta giải bài toán lớn dựa vào các bài toán con đã giải được Nếu không có tính chất này, chúng ta không thể áp dụng quy hoạch động được Không phải bài toán nào cũng có tính chất
câu trúc con tôi ưu này Ví dụ với đồ thị sau:
Hình 1.3 Đồ thị có hướng của bài toán tìm đường đi dài nhất
Đường đi dài nhất từ g -> /sẽ là g -> r > thodc q -> s -> t Nhung không
giống như bài toán tìm đường đi ngắn nhất, đường đi dài nhất không phải là tổ hợp
Trang 13Ví dụ, đường g -> r-> ? không phải là tổ hợp của đường đi dài nhất từ ø -> z và
đường đi dài nhất từ r -> / Bởi vì, đường đi dài nhất g > r phai la g >> s -> f >> r và đường đi dài nhất từ z -> / phải là r -> q -> s => f
1.1.4 Hai cách tiếp cận quy hoạch động thường dùng
a Botfom-up (7ừ đưới lên): cách này còn được gọi là quy hoạch động kiểu
“ngược”
Ngược ở đây không phải là chúng ta duyệt các bài toán con từ lớn ngược về nhỏ Mà quy trình sẽ như thế này: Duyệt qua tất cả các bài toán con (từ nhỏ đến lớn), với mỗi bài toán đó, chúng ta tính toán kết quả dựa vào bài toán con trước đó Tất nhiên, bài toán con phía trước đã được giải theo quy trình duyệt, và với mỗi bài toán, chúng ta phải “nhin ngược lại” bài toán trước đó, nên cách làm này gọi là quy hoạch động kiêu “ngược”
Phương pháp quy hoạch động ngược này được sử dụng rộng rãi, vì nó khá tương ứng với suy nghĩ tự nhiên của chúng ta Chúng ta doc dé bai, suy nghĩ cách giải cho nó Cách giải đó yêu cầu phải giải những bài toán nhỏ hơn, như kiểu làm toán phải chứng minh các bổ đề vậy Chúng ta tiếp tục suy nghĩ cho những bài toán con này, rồi tổng hợp để tìm ra lời giải cho bài toán lớn Quá trình cứ tiếp tục như vậy, và quy hoạch động kiểu “ngược” này đang được xây dựng đúng như vậy
Ngoài ra, về mặt lập trình, kiểu quy hoạch động này có mối quan hệ tương đối gần gũi với đệ quy Một bài toán lớn được giải dựa vào các bài toán con tương tự nhau (và tương tự bài toán lớn) thì việc áp dụng đệ quy có thê là một phương pháp dễ đàng để code Vì vậy, nhiều trường hợp, có thể coi quy hoạch động là một cách để tối ưu phương pháp đệ quy đề giải một bài toán [7]
b Top-down (7? rên xuống): kiêu quy hoạch động “xuôi”
Trang 14hơn Nghĩa là, với mỗi bài toán con, chúng ta sẽ nhìn về phía trước để xem phải giải bài toán tiếp theo như thế này từ bài toán hiện tại
Phương pháp này khó áp dụng hơn phương pháp ngược kia, và cũng không phải bài toán nào cũng áp dụng được Với mỗi bài toán, việc xác định bước tiếp theo tương đối khó khăn, thậm chí việc kiểm tra tính đúng sai của phương pháp cũng
không hẻ để dàng
Thông thường, mỗi bài toán cần phải giải bằng cách tổng hợp kết quả từ một vài bài toán con trước đó Vì vậy, cách quy hoạch động xuôi này chỉ sử dụng một bài toán con dé tính toán trước bài toán tiếp theo sẽ chỉ cho ra một phần của kết quả chứ không phải kết quả cuối cùng Vì vậy, dé thực hiện quy hoạch động xuôi, việc điển sẵn một mảng các giá trị trung tính là điều bắt buộc (sau đó chúng ta sẽ cộng đồn kết quả vào mỗi khi giải được một bài toán con mới) [7]
1.1.5 Nguyên lý của phương pháp
Quy hoạch động thường dùng dé giải bai toán tối ưu- bài toán yêu cầu tìm một giải pháp tốt nhất trong các giải pháp có thể tìm được Cơ sở của quy hoạch động trong bài toán tối ưu là nguyên lý tối ưu Bellman
Nguyên lý tối ưu Bellman dwoc phat biéu nhu sau: “Day toi ưu các quyết định trong một quá trình quyết định nhiễu giai đoạn có thuộc tính là đù trạng thái và các quyết định ban đầu bất kể như thể nào, những quyết định còn lại phải tạo thành một cách giải quyết tối tu không phụ thuộc vào trạng thái được sinh ra từ những quyết định ban đầu ”
Hay nói cách khác: “7rong một đấy tối ưu của các lựa chọn thì một đấy con của nó cũng là tối wu.”
Do vậy khi giải bài toán theo quy hoạch động nếu dùng một phương pháp gồm nhiều bước tiến hành thì điều kiện cần để giải pháp này tối ưu là nó được xây dựng từ nghiệm tối ưu của những bước trước [7]
Trang 151.2.1 Các bước thực hiện
Trong phương pháp đệ quy, để thiết lập một lời giải đệ quy người lập trình cần
xây đựng ba bước đề thiết kế một lời giải là:
Bước 1: Tham số hoá bài toán
Bước 2: Phân tích trường hợp đệ quy Bước 3: Xác định trường hợp suy biến
Một cách tương tự, với đa số các bài toán về quy hoạch động, chúng ta có thể
thực hiện theo quy trình sau Buwéc 1 Phân tích bài toán
Ta tìm cách đưa bài toán về dạng giải được bằng quy hoạch động, nghĩa là
biểu diễn bài toán dưới dạng một bài toán nhiều mức, nhiều gia đoạn có quan hệ
khẳng khít với nhau
Từ bài toán đã cho đưa nó về các bài toán con đồng dạng
Tương tự với tham số hoá bài toán trong đệ quy Cần lựa chọn và xác định những tham số cân thiết, các đại lượng là rời rạc
Xét ví dụ về dãy Fibonaci đã trình bày ở 1.2.2: sử dụng đệ quy ta xây dựng hàm F có một tham số thuộc kiểu số nguyên Phân tích bài toán theo phương pháp quy hoạch động ta thấy để tính được Ƒ{?) cần dựa tinh F(i-1) va F(i-2) 1a các bài toán con đồng dạng Vì vậy ta cũng xây dựng hàm # có I tham số nguyên là ø
Function F(n: integer): integer;
Bước 2 Xây dựng giải pháp đệ quy
Đây là bước thiết lập mối quan hệ giữa các giai đoạn với nhau
Trang 16Đối với bài toán dãy Fibonacci từ thơng tin bài tốn là (1) = F(2) = 1 va tứ?E F(m-l) + F(-2) ta có được giải pháp đệ quy sau:
F(n — 1) + F(n — 2) nếu n > 2 1 niễu n = 1 hoặc r = 2
F( =|
Bước 3 Lập bảng
Dựa vào công thức truy hồi để tìm lời giải của các bài toán tương ứng với các giai đoạn đã chia Các giá trị này sẽ được lưu trữ vào bảng Bảng có thê thiết lập như mảng l chiều, 2 chiều, Thông thường nếu tham số hình thức là 1 tham số thì dùng mảng I chiều, nếu 2 tham số thì đùng mảng 2 chiều Thứ tự điền vào bảng cũng chính là thứ tự giải các bài toán từ thấp đến cao nhưng phải đảm bảo sao cho các kết quả điền vào bảng cuối cùng sẽ cho ta giá trị tối ưu của bài toán ban đầu và phương án tối ưu của giai đoạn cuối
Với bài toán Fibonacci, ta thấy có l tham số hình thức nên sử dụng mảng 1 chiéu a (array [1 max] of integer) dé tinh:
ali] = F(@i) voii=1 n
a[1] = a[2] vaa[i] = afi—1] + ali-2];véii=3 n Các gid tri sé duge dién vao theo tht ty tir a[1] đến a[n]
Bước 4 Tổng hợp kết quả
Đây là bước kiến tạo một lời giải cho bài toán từ các thơng tin đã tính tốn Từ trạng thái cuối cùng ta biết được phương án tối ưu của giai đoạn cuối và do đó biết được trạng thái tối ưu của giai đoạn ngay trước nó Cứ tiếp tục như vậy ta biết được toàn bộ phương án tối ưu của từng giai đoạn từ đầu đến cuối
Với bài toán Fibonacci Phương án cuối cùng là z[z] nên bước tổng hợp kết
qua la: F(n) = a[n];
Trang 17Từ bốn bước phân tích trên ta có chương trình tính phần tử thứ n của dãy Fibonacci theo phuong phap quy hoạch động như sau:
Function F(n: integer): integer;
var i: integer; a: array[1 100] of integer; Begin For i:=3 to n do a[1]:=a[i-1]+a[i-2]; E:= a[n]; End; 1.2.2 Một số ví dụ 122.1 Bài toán tính tổ hợp
Tinh CE: té hop chập & của ø
Thực hiện các bước theo phương pháp quy hoạch động
vx_ Phân tích bài toán: Xây dựng hàm:
Function C(k, n: byte): longint; {gia thiét k<=n}
Trang 18Ví đụ: Tính Cỷ = C(3, 5); Ta có bang dé tính các phần tử a[i, j] ¡| 0 1 |2 | 3 j 1 1 0 fil 1 4 T 1 1 |!11 iyi + I it 1 t1 4 2 1/112 J4 lạ 1 3 |ilr|!13/|13 2/11 L |} ÿ |Ú z|ị L iJ E7 | Í 4 | T [iA Dị T Y Dị! s [yl |Ý5 Yo | "to Việc điển các giá trị vào bảng được tiến hành theo thứ tự giải các bài toán tử thấp đến cao
Kết quả điển vào bảng cuối cùng là 2[3,5] cho ta giá trị tối ưu của bài toán ban
đầu và phương án tối ưu của giai đoạn cuối là Cỷ = a[3,5] = 10
s* Chương trình
Function C(k, n: byte): longint;
Var a: array [0 100; 0 100] of longint; 1, Js byte;
Begin
For i:=0 to k do
For j:=1 to n do
TẾ (i=0) or (i=j) then a[li,j]:=1
Else a[i,j]:= a[i-1,j-1] + ali, j-1];
C:= a[k,n];
End;
Trang 19Lưu ý: Nếu ở hàm trên chúng ta thêm câu lệnh ¡f n-k<k then k:=n-k;
{nghĩa là k = min(k,m: — k)} thì độ phức tạp của thuậ toán sẽ là O(l * „0)ới Ì =
min(k,n — k) < k
Nhận xét: Đối với những bài toán khi thực hiện tính một hàm bằng phương pháp đệ quy mà có thể chỉ ra hướng tính những giá trị sau dựa vào giá trị đã tính trước đó thì ta có thể sử dụng phương pháp quy hoạch động Có thể sử dụng mảng
để tính toán và lưu các gia tri, số chiều của mảng phụ thuộc vào số lượng tham SỐ
Chẳng hạn ví đụ sau có thê sử dụng quy hoạch động tương tự bài tốn tính tơ hợp
Tính giá trị xác suất P(i, j) (i, j: byte) Biét rang:
1 nếu ¡ = 0 tà j > 0
cu P(— 1,J)+ P(L,j — 1
PG,j)= Pon eps POI» néui>Ovaj>0
0 niếu ngược lại
Trang 20else if (k>0) and (1>0) then a[k,1l]:=(a[k-1,l]t+a[k,1-1])/2 else a[k,1]:=0; P:=a[i,j]; end; BEGIN writeln('Gia tri P[',i,',',j,' la:',P(i,j)); readin; END 1.2.2.2 bài toán du lịch Một người đi từ thành phố 0 đến thành phố ø và có thể đi qua n-1 thành phố khác 1, 2, , m-1, theo lộ trình: 0 —> ï —> 7› —> „—> m, trong đó: Ư <ï< z< < đ„ <n Giá vé của xe đi từ thành phố ¡ đến thành phố 7 là c[z7] Tìm một lộ trình từ
thành phố 0 đến thành phố ø sao cho tổng chỉ phí về giá vé đạt cực tiều Phương pháp thực hiện, sử dụng phương pháp quy hoạch động vx Phân tích bài toản
© Goi P(r) la bài toán du lich dé đi từ thành phố 0 đến thành phố r (bài todn ban dau 1a P(n))
Các giá trị cần tìm:
đ[r]: chỉ phí cực tiểu của bài toan P(r)
Trang 21o Néur=1: " dr] =c[0,1] " If]=0 v Ldap bang Procedure LapBang; Begin For r:=1 to n do Tính d[r] và llr]; End; D6 phite tap tinh toan: O(n’) v_ Tổng hợp kẾt quả Procedure TongHop,; Begin tome Oguz si mye While r > 0 do
Begin i := itl;x[iJ:= li[rl-r := x[i];end;
writeln( Thứ tự các thành phố trung gian phải đi qua:’);
Trang 23end;
writeln('Thu tu cua cac thanh pho trung gian phai đi qua la:');
for k:=i-1 downto 1 do write(x[k],'');
writeln('Tong chi phi thap nhat la', d[n]:1); end; procedure dongtep; begin close(input); close(output); end; BEGIN nhapdl,; lapbang; tonghop; dongtep; END
1.3 TIEU KET CHUONG 1
Chương này đã đề cập đến các nội dung cơ bản về hiện trạng bồi đưỡng HSG
tin học hiện nay và thuật toán quy hoạch động như: khái niệm về quy hoạch động,
bài toán con gối nhau, cấu trúc con tối ưu, hai cách tiếp cận phương pháp thường dùng, nguyên lý của phương pháp, cách thực hiện và một số ví dụ minh hoạ
Ở chương tiếp theo, ta sẽ tìm hiểu về mối quan hệ giữa phương pháp quy hoạch động và một số phương pháp khác
Trang 24Chuong 2 MOI QUAN HE GIU'A PHƯƠNG PHÁP QUY HOẠCH DONG VA MOT SO PHUONG PHAP KHAC
Hiện nay, trong các kỳ thi học sinh giỏi tin học, các lớp bài tốn về tối ưu hố
ln được ưu tiên lựa chọn vì tính ứng dụng vào thực tiễn cao
Có rất nhiều phương pháp để giải quyết lớp các bài toán tối ưu Tuỳ từng bài
toán cụ thể mà ta lựa chọn một phương pháp để áp dụng nhằm đạt được hiệu quả
(về tốc độ, về bộ nhớ) Trong đó phương pháp quy hoạch động luôn được ưu tiên lựa chọn vì tính hiệu quả của nó cao hơn các phương pháp khác trong đại đa số các bài toán về tối ưu hoá Để hiểu rõ hơn về phương pháp quy hoạch động, ở chương này sẽ tìm hiểu về mối quan hệ giữa phương pháp quy hoạch động và một số phương pháp khác là phương pháp đệ quy, phương pháp vét cạn và phương pháp
tham lam
2.1 SỰ KHÁC NHAU GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG
VÀ PHƯƠNG PHÁP ĐỆ QUY
Về mặt nguyên tắc phương pháp quy hoạch động rất giỗng với phương pháp đệ quy Cả hai phương pháp đều sử dụng lời giải của các bài toán có kích thước bé hơn, đồng dạng với bài toán ban đầu để đưa ra lời giải của bài toán ban đầu Tuy
nhiên, nếu đệ quy gọi thực hiện các bài toán có kích thước lớn trước rồi đến các bài
toán có kích thước bé hay thực hiện các bài toán từ tầng cao đến tầng thấp, các kết quả trung gian phải tính đi tính lại nhiều lần thì ngược lại, quy hoạch động lại gọi
thực hiện các bài toán có kích thước bé trước rồi lưu lại kết quả để giải các bài toán
có kích thước lớn hơn Như vậy, phương pháp quy hoạch động đã tránh được việc tính toán các giá trị trung gian nhiều lần mà chỉ tính một lần góp phần làm giảm độ phức tạp của thuật toán
Trang 25Ví dụ: Tam giác Pascal
Tam giác Pascal là một mô hình dùng để đưa ra các hệ số của khai triển nhị thức Newton bậc X (x+l}Ỷ Vi du: trong khai triển (+1)? = x? + 2x +1 có các hệ số lài 2 1 Trong khai triển (x+l) = x + 3x2 + 3x + 1 có các hệ sốlài 3 3 1 Yêu cầu: Hãy tìm các hệ số trong khai triển nhị thức Newton (x + 1)”
Chương trình đệ quy như sau:
Hình 2.1 Tam giác Pascal Program TamgiacP; Var i, N: integer; Function PC(h, c: integer): integer; Begin TẾ (h=0) and (c=0) then PC:=1 Else If (h=c) or (c<=0) then PC:=1 Else PCraPc (he lpe@) + ĐỂ (heal; 1) End; Begin Glf#sÐ#z
Write (‘Nhap N:’); Readln(N);
Write (‘Cac he so trong khai trien: 7); For i:=0 to N do Write (PC(N,i):5); Readln;
End
Trang 26Việc tính toán sẽ rất lang phi thoi gian cia may Do PC(h-1, c) va PC(h-1, c-
1) được tính một cách độc lập! Số lần gọi cần để tính PCứ,, c) la số lần gọi để tính PCŒ-1, e) cộng với số lần goi dé tinh PC(h-1, c-1)
Nếu tính toán như trên, chúng ta có rất nhiều bài toán con sẽ được tính đi tính
lại Đề khắc phục điều này ta giải bằng phương pháp quy hoạch động: Program TamgiacP,; Var i, N: integer; L: array[0 100;0 100]; Begin Glf#sÐ#z Write (‘Nhap N:’); Readln(N); L[O,0] = 1; L[1,1] = 1; L[1,2] = 1; For i:= 2 to N do Begin L[i, 1] :=1; For j:=2 to i+l do Lili, Jj] = L[i-1, j1] + L[i-1, jl; End;
Write (‘Cac he so trong khai trien: 7); For i:=0 to N do Write (L[N,i]:5); Readln;
Eng:
2.2 MOI QUAN HỆ GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ
PHƯƠNG PHÁP VÉT CẠN
2.2.1 Giới thiệu về thuật toán vét cạn
Trang 27Một thuật toán vét cạn để tìm các ước số của một số tự nhiên n sẽ đếm tất cả
các số nguyên từ l đến n, và kiểm tra xem mỗi số trong số chúng có chia hết n
không Cách tiếp cận vét cạn của bài toán tám quân hậu có thể xem xét tất cả các sự
sắp xếp có thể có của 8 quân cờ trên bàn cờ 64 ô, và, cho mỗi lần sắp xếp, kiểm tra xem mỗi quân hậu có thê tấn công bất cứ ai khác
Mặc dù việc dùng thuật toán vét cạn rất đơn giản, và sẽ luôn tìm ra giải pháp nếu nó tổn tai, chi phi của nó tỷ lệ thuận với số lượng các giải pháp ứng viên - trong nhiều vấn để thực tế có xu hướng phát triển rất nhanh chóng khi kích thước của vấn
đề gia tăng Do đó, thuật toán vét cạn thường được sử dụng khi kích thước vấn để bị hạn chế, hoặc khi có các heuristics cụ thể theo từng vấn để có thể được sử dụng để
giảm các giải pháp ứng cử cho một kích thước có thể quản lý được Phương pháp
này cũng được sử dụng khi tính đơn giản của việc thực hiện quan trọng hơn tốc độ
2.2.2 Phương pháp quy hoạch động và phương pháp vét cạn
Vét cạn là một trong những thuật toán giải bài toán tối ưu Thuật toán vét cạn
là thuật toán tìm phương án tối ưu của bài toán bằng cách lựa chọn một phương án trong tập hợp tất cả các phương án của bài toán để tìm ra phương án tối ưu Trong nhiều bài tốn, khơng gian các phương án quá lớn Vét cạn giúp tìm ra kết quả tối ưu nhưng độ phức tạp lớn, thường là hàm mũ trong khi phương pháp quy hoạch
động độ phức tạp là đa thức Do vậy, khi áp dụng thuật tốn vét cạn khơng đảm bảo
về thời gian cũng như kĩ thuật
Vét cạn là xét toàn bộ trường hợp, rồi tìm ra kết quả Quy hoạch động là tìm
một kĩ thuật tìm kết quả trước thông qua một kết quả có sẵn hoặc được tìm thấy
Ưu điểm của vét cạn là chắc chắn tìm ra lời giải (nếu có), nhưng nhược điểm
của nó là có thể chạy quá lâu, vượt mức thời gian cho phép Còn quy hoạnh động có
ưu điểm là chạy rất nhanh nhưng nhược điểm của nó là rất khó tìm ra thuật toán, với
một số bài tốn có thể sẽ khơng có thuật toán quy hoạch động
Vét cạn theo nghĩa thông thường là xét hết mọi đối tượng hay mọi trường hợp Trong lập trình, vét cạn là phương pháp được dùng khi không còn phương pháp nào
Trang 28hiệu quả hơn có thể sử dụng được
Vấn để trong phương pháp vét cạn là làm sao để liệt kê được tất cả các ứng
viên Một khi đã liệt kê được các ứng viên, việc chấm điểm cho từng ứng viên và
chọn ra ứng viên có điểm cao nhất chỉ còn là việc làm đơn giản
Một phương pháp hay được dùng đề liệt kê các ứng viên là tổ chức không gian ứng viên theo một cấu trúc cây, mỗi ứng viên trên một nút (thường là lá) của cây Đặc điểm của cây biểu điễn không gian ứng viên là các ứng viên trên các nút có
quan hệ cha-con hoặc anh-em giống nhau ở một bộ phận nào đó Một khi cấu trúc
cây biểu diễn không gian ứng viên được thiết lập, chúng ta có thể áp dụng thủ tục duyệt cây (theo chiều rộng hoặc theo chiều sâu) để liệt kê các ứng viên Cây biểu diễn không gian ứng viên có thể rất lớn và sẽ mất nhiều thời gian để tạo cũng như yêu cầu nhiều không gian để lưu trữ Tuy nhiên, cây này chỉ mang tính trừu tượng,
làm cơ sở cho việc duyệt (chọn nút tiếp theo được thăm), mà không phải được tạo ra
và lưu trữ tất cả
Các bước thiết lập cây biểu diễn không gian ứng viên được mô tả chung như sau:
1 Xác định các tính chất của ứng viên dùng để phân loại ứng viên
2 Với tính chất thứ nhất, phân hoạch các ứng viên theo tính chất này, nghĩa là chia tập ứng viên thành các tập con theo đó các phần tử thuộc cùng một tập con giống nhau ở tính chất thứ nhất, hai phần tử thuộc hai tập con khác nhau sẽ khác nhau ở tính chất thứ nhất Tạo các cây con từ gốc, mỗi cây con tương ứng với một
tập con vừa nhận được
3 Với mỗi tập con, sử dụng tính chất thứ hai để phân hoạch tập con này Kết quả thu được là các tập con nhỏ hơn Từ gốc của cây con tương ứng với tập con đang xét, tạo các nhánh tương ứng với các tập con nhỏ hơn
4 Quá trình cứ tiếp tục như vậy cho đến khi chúng ta xét hết các tính chất của ứng viên và thu được một cây biểu diễn không gian ứng viên
Trang 29Ví dụ Cái giá (còn có tên là Knapsack 0/1)
Bài toán: Cho ø đỗ vật có khối lượng 1an lvot 1a wi, w2, ., Wn va một cái gia
chịu khối lượng tối đa là J Hãy để các đồ vật lên giá sao cho tổng khối lượng các
đồ vật được đề trên giá là lớn nhất có thé
Ví dụ với 3 vật có khối lượng lần lượt là 6, 4, 3 và một cái giá có thể chịu khối lượng tối da la 8, phương án tốt nhất là dé hai vật có khối lượng 4 và 3 lên giá
Để giải bài toán này bằng phương pháp vét cạn, trước hết chúng ta phải xác định định dạng của ứng viên và hàm đánh giá ứng viên Mỗi một tập con (bao gồm
các vật được chọn đề đặt lên giá) của tập tất cả các vật là một ứng viên Ta có thể
biểu diễn mỗi ứng viên bằng một xâu nhị phân e = xị 12 x„ với ý nghĩa vật thứ i được để trên giá nếu x;= l và không được để trên giá nếu x;= 0 Hàm đánh giá ứng
viên được xác định như sau: n ƒ(%¡#¿ x„) = 0 nếu > x *w, >W, i=1 n n › x; *w, néu › X¡ *W¡ < W ¡=1 ¡=1
Trong ví dụ trên, tập các ứng viên là C= {000, 001, 010, 011, 100, 101,110, 111}, điểm đánh giá các ứng viên lần lượt là 0, 3, 4, 7, 6, 0, 0, và 0; ứng viên được chọn là 011
Tiếp theo, chúng ta cần thiết lập cây biểu diễn không gian ứng viên Chúng ta sử dụng n tính chất đê phân hoạch các ứng viên đó là: vật thứ nhất được đưa lên giá
(xi1), vật thứ hai được đưa lên giá (xz=l), ., vật thứ z được đưa lên giá (x„= Ì)
Với n tính chất này, thực hiện thủ tục thiết lập cây biểu diễn không gian ứng viên
được mô tả ở trên, chúng ta thu được một cây nhị phân đầy đủ có chiều cao n, bao
gồm 2ø lá, mỗi lá biểu diễn một ứng viên Trong ví dụ trên, cây biểu diễn không gian ứng viên có dạng như sau:
Trang 30
Hình 2.2 Cây biêu diễn không gian ứng viên của bài toán cái giá với „=3
Cuối cùng, chúng ta áp dụng thủ tục duyệt cây theo chiều sâu (không nên sử dụng duyệt theo chiều rộng trong trường hợp này vì phải lưu trữ nhiều thông tin đồng thời) để tìm ứng viên tốt nhất (phương án đặt vật lên giá tốt nhất) Thủ tục duyệt được mô tả đệ quy như sau: ungvienDuocChon := }*0 07 diemCaonhat := 0 đuyet(1, }*) procedure duyet(i, c) if 1 = fel then m <= £ (te) if m >diemCaonhat then diemCaonhat :=m ungvienDuocChon := c else duyet(itl, c & *1’) duyet(itl, c & *0’)
Tóm lại: Vét cạn, duyệt, quay lui là một số tên gọi tuy không đồng nghĩa nhưng cùng chỉ một phương pháp rất đơn giản trong tin học: tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có thê Đối với con người phương pháp này thường là không khả thi vì số phương án cần kiểm tra quá lớn Tuy nhiên đối với máy tính, nhờ tốc độ xử lí nhanh, máy tính có thể giải rất nhiều bài toán bằng phương pháp vét cạn
Trang 31Ưu điểm lớn nhất của phương pháp vét cạn là luôn đảm bảo tìm ra nghiệm chính xác (nếu có) Ngoài ra phương pháp vét cạn còn có một số ưu điểm so với các phương pháp khác là đòi hỏi rất ít bộ nhớ và cài đặt đơn giản Hạn chế duy nhất của phương pháp này là thời gian thực thi rất lớn, độ phức tạp thường ở bậc mũ Do đó vét cạn thường chỉ áp dụng tốt với các bài toán có kích thước nhỏ
Vét cạn là cơ sở cho hai phương pháp khác là quay lui và nhánh cận Cả vét cạn, quay lui và nhánh cận đều thực hiện duyệt cấu trúc cây biểu diễn không gian ứng viên
Điểm phân biệt giữa vét cạn, quay lui và nhánh cận là trong quá trình duyệt (theo chiều sâu) cây, phương pháp quay lui sử dụng một hàm điều kiện, tại mỗi nút
nếu hàm điều kiện không thỏa mãn, toàn bộ cây con có gốc tại nút hiện tại được bỏ
qua; phương pháp nhánh cận sử dụng một hàm tính cận để tính trước điểm tối đa
(cận) có thể đạt được đối với các ứng viên thuộc cây con có gốc tại nút hiện tại, nếu
cận này không cao hơn điểm của ứng viên đã biết thì toàn bộ cây con có gốc tại nút
hiện tại được bỏ qua
2.3 MÓI QUAN HỆ GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ PHƯƠNG PHÁP THAM LAM
2.3.1 Giới thiệu về thuật toán tham lam
Thuật toán tham lam (Greedy algorithm) là một thuật toán giải quyết một
bài toán theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu địa phương ở mỗi bước
đi với hy vọng tìm được tối ưu toàn cục [10] Chẳng hạn áp dụng giải thuật tham lam với bài toán hành trình của người bán hàng ta có giải thuật sau: "Ở mỗi bước
hãy đi đến thành phố gần thành phố hiện tại nhất"
Thuật toán tham lam được hiểu một cách dân gian là: trong một mâm có nhiều
món ăn, món nào ngon nhất ta sẽ ăn trước và ăn cho hết món đó thì chuyển sang món ngon thứ hai, lại ăn hết món ngon thứ hai này và chuyên sang món ngon thứ ba Phương pháp tham lam luôn chọn phương án tốt nhất vào thời điểm hiện tại
Nó chọn tối ưu cục bộ với hy vọng rằng lựa chọn này sẽ dẫn đến một kết quả tối ưu
Trang 32toàn cục Phương pháp tham lam không phải lúc nào cũng mang lại các kết quả tối ưu, nhưng có nhiều bài toán nó có thể giải quyết được một cách tối ưu
Các thuật toán ứng dụng phương pháp tham lam thường điễn ra qua nhiễu giai đoạn và tại mỗi giai đoạn chúng ta thường khơng biết thơng tin tồn bộ dữ liệu của cả quá trình mà chỉ biết tình trạng hiện tại và thông tin cho bước đi kế tiếp Ÿ tưởng chính của phương pháp tham lam là chúng ta không cần quan tâm tới đữ liệu tổng thê mà chỉ từ những đữ liệu tại từng giai đoạn để chọn ra giải pháp tối ưu tại mỗi giai đoạn đó với hy vọng là tổng hợp những giải pháp tối ưu cục bộ sẽ mang lại một giải pháp tối ưu cho tổng thê Từ ý tưởng đó cho thấy, kết quả có được từ thuật toán tham lam chỉ mang tính tối ưu tương đối, thông thường giải pháp cuối cùng có thể chưa là tối ưu mà chỉ là tiệm cận với phương án tối ưu Tuy nhiên với những điều kiện, thông tin thường không mấy rõ ràng của đầu vào, và cách tiếp cận vấn đề khá “trong sáng” của mình, phương pháp tham lam thường đưa ra giải pháp tương đối
tốt trong giới hạn có thể chấp nhận và đặc biệt có tốc độ tính toán nhanh (giảm độ
phức tạp tính toán của các thuật toán) Các thuật toán tham lam nói chung là đơn giản và hiệu quả (vì các tính toán để tìm ra quyết định tối ưu địa phương thường là đơn giản) Tuy nhiên, các thuật toán tham lam có thể không tìm được nghiệm tối ưu mà cho ra nghiệm tiệm cận tối ưu (nghiệm tương đối tốt), nhưng thông thường lại giúp giảm độ phức tạp thuật toán của các thuật toán một cách đáng kể Bên cạnh đó
cũng có nhiễu thuật toán được thiết kế theo kỹ thuật tham lam van cho ta nghiệm tối
ưu, chẳng hạn thuật toán Dijkstra tìm đường đi ngắn nhất từ một đỉnh tới các đỉnh
còn lại trong dé thị định hướng, các thuật toán Prim và Kruskal tìm cây bao trùm
ngắn nhất trong đồ thị vô hướng
2.3.2 Phương pháp quy hoạch động và phương pháp tham lam Có hai thành phần quyết định nhất tới quyết định tham lam:
e Tinh chat lua chon tham lam
Chúng ta có thê lựa chọn giải pháp nào được cho là tốt nhất ở thời điểm hiện
Trang 33của thuật toán tham lam có thể phu thuộc vào các lựa chọn trước đó Nhưng nó không thể phụ thuộc vào một lựa chọn nảo trong tương lai hay phụ thuộc vào lời giải của các bài toán con Thuật toán tiến triển theo kiểu thực hiện các chọn lựa theo một vòng lặp, cùng lúc đó thu nhỏ bài toán đã cho về một bài toán con nhỏ hơn
Đấy là khác biệt giữa thuật toán này và giải thuật quy hoạch động Giải thuật quy
hoạch động duyệt hết và luôn đảm bảo tìm thấy lời giải Tại mỗi bước của thuật
toán, quy hoạch động đưa ra quyết định dựa trên các quyết định của bước trước, và có thê xét lại đường đi của bước trước hướng tới lời giải Giải thuật tham lam quyết định sớm và thay đổi đường đi thuật toán theo quyết định đó, và không bao giờ xét
lại các quyết định cũ Đối với một số bài toán, đây có thể là một thuật tốn khơng
chính xác
©_ Cấu tric con téi wu
Một bài toán được gọi là "có cấu trúc tối ưu", nếu một lời giải tối ưu của bài
toán con chứa lời giải tối ưu của bài toán lớn hơn
Dé hiểu rõ hơn, ta xét bài toán đơn giản nhưng thể hiện được sức mạnh của
phương pháp tham lam trong tìm kiếm lời giải tối ưu: bài toán Chọn hoạt động Bài toán sắp xếp lịch cho nhiều hoạt động đề có thể sử đụng chung một tài nguyên (mỗi thời điểm chỉ có một hoạt động sử dụng tài nguyên chung) Mục tiêu là sắp xếp sao cho càng có nhiều hoạt động sử đụng tài nguyên càng tốt
Bài toán: Có n cuộc họp, cuộc họp thứ 7 bắt đầu vào thời điểm ø; và kết thúc ở thời điểm ø; Do chỉ có một phòng hội thảo nên 2 cuộc họp bất kì sẽ được cùng bố
trí phục vụ nếu khoảng thời gian làm việc của chúng chỉ giao nhau tại đầu mút Hãy
bồ trí phòng họp để phục vụ được nhiều cuộc họp nhất Nướng dân bằng Quy hoạch động:
Sắp xếp các cuộc họp tăng dần theo thời điểm kết thúc (;) Thế thì cuộc hop i sẽ bố trí được sau cuộc họp j nếu và chỉ nếu 7<7 và ð/<=a, Yêu cầu bố trí được nhiều
cuộc họp nhất có thể đưa về việc tìm dãy các cuộc họp dài nhất thoả mãn điều kiện
Trang 34trên Độ phức tạp thời gian Ø(?) (Phân tích cụ thể bằng quy hoạch động ở phần 3.3.5.1 của chương 3)
Thuật toán Tham lam:
_ trưởng: Kết thúc sớm thì lựa chọn trước
— Thuật toán greedy: Sắp xếp các cuộc họp theo thứ tự không giảm của thời
điển kết thúc Bắt đầu từ tập S la tap rong, ta lần lượt bổ sung các cuộc họp theo thứ
tự đã sắp xếp vào Š nếu nó không bị trùng với bất cứ cuộc hop nao trong S Độ phức tạp thời gian ÓŒogn)
Người ta đã chứng minh được rằng thuật toán Tham lam trên đưa ra lời giải tối
ưu Như vậy, cùng một mục đích là tìm ra lời giải tối ưu, thuật toán Tham lam chạy còn nhanh hơn cả thuật toán Quy hoạch động
Giải thích: Tham lam là kỹ thuật fìm kiếm dựa vào tri thức (còn được biết
đến với cái tên: Tìm kiếm kinh nghiệm) Còn thuật toán Quy hoạch động được dùng
trong trường hợp này vẫn chỉ là Tìm kiếm mù
Cái khó của thuật toán Tham lam là: Sau khi bạn xây dựng thuật toán Bạn
phải chứng minh thuật toán bạn xây đựng hoạt động đúng Đôi khi điều này là rất khó
Sau đây là code chương trình của thuật toán Tham lam
const finp = "SELECT.INP';
font = 2 2c) 900L
maxn = 200; type int = integer;
Trang 35for i := 1 ton do readln(f, a[i], b[l]); end; procedure writeOutput; var £ : text; i : int; begin assign(f, fout); rewrite(f); writeln(f, for i := 1 to m do weitveln(f, œ[gs[il],„ * 'y bisfi] lis close(f£); end; procedure swap(var x, y : int); var tg » imt; begin te t= 8í R i= Vi y i= tg: end; procedure sapxep; var dap] : stmbỹ begin for i :=1 to n do Cli] := i; for i:=2 to n do for j:=n downto i do if bij] < b[j-1] then begin swap(b[j], bij-1]); swap(aljl, swap(€[j], Clj-1]); end; end; procedure Greedy; close(f); var i: int; begin
{Da co C duoc sap xep tang dan theo dau mut phai} m := 0; {Khoi tao nghiem bang rong}
for i:= 1 to n do
if (i=1) or ( (i31) and (a[i] > b[s[m]]))
29
Trang 36end; Begin readInput; Sapxep; Greedy; writeOutput; End
Tóm lại: Quy hoạch động xét tất cả các trường hợp và luôn tìm thấy lời giải,
còn thuật toán tham lam giải quyết bài toán bằng cách lựa chọn tối ưu cục bộ Các
bài toán điển hình có thể giải bằng thuật toán tham lam được tối ưu là bài toán tìm
cây khung nhỏ nhất bằng thuật toán Prim, Kruskal, Dijktra, bài toán lập lịch có số
như bài toán phủ vector, bài toán chia bánh Ai Cập Một số bài toán không thích
hợp với thuật toán tham lam như bài toán rút tiền tự động ở máy ATM, bài toán
Knapsack 0/1
2.4 TIỂU KÉT CHƯƠNG 2
Chương này đã để cập đến các nội dung cơ bản về mối quan hệ giữa phương pháp quy hoạch động và các phương pháp đệ quy, tham lam và vét cạn
Không có một phương pháp nào là tốt nhất cho tất cả các bài toán Phương pháp tốt nhất dé giải quyết mọi bài toán trong tin học là biết sử dụng và phối hợp uyên chuyển nhiều thuật toán Tùy thuộc vào yêu cầu của bài toán và khả năng cho phép mà ta có thể lựa chọn hay phối hợp các phương pháp khác nhau để tìm kiếm lời giải tốt nhất Việc nắm rõ các phương pháp sẽ giúp chúng ta nhận biết các bài
toan dé dang hon Chang hạn nếu bộ nhớ hạn hẹp thì ta có thể dùng vét cạn với bộ
dữ liệu nhỏ và tham lam với bộ dữ liệu lớn, hoặc dùng phương pháp tham lam để
xác định một số cận cho vét cạn Còn nếu bộ nhớ rộng rãi hơn thì có thể phối hợp
quy hoạch động và tham lam
Trang 37Chương 3 PHÂN LOẠI MỘT SÓ BÀI TOÁN GIẢI BẰNG PHƯƠNG PHÁP QUY HOẠCH ĐỘNG
Khi nào thì chúng ta cần đến quy hoạch động? Đó là một câu hỏi rất khó trả lời Không có một công thức nào cho các bài toán như vậy Tuy nhiên, có một số tính chất của bài toán mà người ta có thê nghĩ đến quy hoạch động Dưới đây là hai tính chất nỗi bật nhất trong số chúng:
« Bài tốn có các bài toán con gối nhau « Bài tốn có cầu trúc con tối ưu
Thường thì một bài toán có đủ cả hai tính chất này, chúng ta có thể dùng quy
hoạch động được Các bài toán trên thực tế có muôn hình muôn vẻ, không thể đưa ra một cách thức chung để tìm giải thuật cho mọi bài toán Đề có thể hiểu rõ và sử
dụng phương pháp quy hoạch động, chúng ta chỉ có thể khảo sát các bài toán cụ thé
và học cách nghĩ, cách tiếp cận vấn đề, cách thiết kế giải thuật Từ đó rèn luyện kỹ
năng linh hoạt khi giải các bài toán thực tế
Phần lớn các bài toán quy hoạch động có thể chia làm hai loại: bài toán sử dụng quy hoạch động để tối ưu hoá và bài toán có thể quy về việc tính tổ hợp Bài toán tối ưu yêu cầu chúng ta phải tìm đáp án tốt nhất từ mục tiêu của bài toán Còn bài toán tổ hợp thường yêu cầu chúng ta tìm ra số cách khác nhau để thực hiện một việc gì đó
Ở chương này sẽ phân loại các bài toán sử dụng phương pháp quy hoạch động
dựa vào việc giới thiệu, phân tích, cách giải bài toán và một số bài toán được xem là
tương tự Theo đó, luận văn này đã phân loại thành các lớp bài toán sau: > Bài tốn xếp Ba lơ (Knapsack)
> Bài toán dãy con đơn điệu dài nhất
> Bài toán biến đổi xâu > Bài Toán nhân ma trận
> Bài toán ghép cặp > Bài toán di chuyên
Trang 38Điều quan trọng của bài toán giải bằng phương pháp quy hoạch động là phải xác định được giải pháp đệ quy (công thức truy hổi) Từ giải pháp đệ quy ta dễ dàng thiết lập bảng và tổng hợp kết quả Do đó luận văn chỉ phân tích bài toán và giải pháp đệ quy đối với một số bài toán tương tự trong các lớp bài toán
3.1 BÀI TỐN XÉP BA LƠ (KNAPSACK) aa ?
Bài toán xếp ba lô (còn được biết đến với tên
gọi bài toán cái túi) là một bài toán tối ưu hóa tổ IẾBB
hợp Bài toán được đặt tên tử van dé chon những gi tr
quan trọng có thể nhét vừa vào trong một cái túi (với
giới hạn khôi lượng) để mang theo trong một Hình 3.1 Bài tốn cái ba lơ chun đi
Dạng bài toán quyết định của bài toán xếp ba lô là câu hỏi "có thể đạt được một giá trị ít nhất là bao nhiêu theo phát biểu của bài toán"
3.1.1 Bài toán xếp ba lô không bị chặn
Bài xếp ba lô không bị chặn không có một hạn chế nào về số lượng dé vat
Đây là bài tốn tối ưu: chọn khơng giới hạn số lượng
3.1.1.1 Phét biểu bài toán
Một cái kho chứa n loại đồ vật có kích thước và giá trị khác nhau Cụ thể:
Loại đồ vật 7 (7= 1 n) có: - kích cỡ m[7] e N* - gía trị c[7] e
- số lượng: không hạn chế
Một tên trộm mang theo cái túi có kích cỡ là p € N* Vay hắn phải chọn lựa
một danh sách các đồ vật sẽ mang đi như thế nào để cho tổng giá trị lấy cắp được là
lớn nhất Tức: Tìm x[1] x[2] x[z] (với x[7] e N : số lượng loại đồ vật thứ z cần
lấy) sao cho: X_; x[f] * m[i] < p va YL, x[i] * c[f] đạt giá trị cực đại
Trang 39> Input: +m: số loại đồ vật khác nhau +p: kích cỡ cái ba lô + m[ï]: kích cỡ đồ vật thứ 7 #=1 m) + c[ï]: giá trị đồ vật thứ i (=1 n)
} Output: x[7]: số lượng loại đồ vật thứ ? cần lấy (=1 ø) sao cho : 7 x[i] * m[i] < p va Y, x[i] * c[i] đạt giá trị cực đại
3.1.1.2 Các bước thực hiện:
> Bước 1: Phân tích bài toán
o_ Gọi ®Œ, s) là bài toán chiếc túi xách, với:
" re Ä*: kích cỡ chiếc túi
" 5 & N*: s6 cdc loại đồ vật khác nhau (bài toán ban đầu là P(p, n))
o Cae giá trị cần tìm:
" j[, s]: giá trị cực đại >7; x[í] * c[f] của bài toán (7, s)
Trang 40=" /[r, ]]—=r điv mịl] = Ir, 1] =uafr, 1]*c[1] > Bước 3: Lập bảng Procedure LapBang; Begin For s:=1 to n do For r:=0 to p do
Tf s=1 then Tinh u[r, 1] va l[r, 1] else Tinh u[r, s] va l[r, s]; End; D6 phitc tap tinh toan: O(mp”) > Bước 4: Tổng hợp kết quả Procedure TongHop; Begin ci=p; For s:=n downto 1 do Begin x[s]:= u[r,s];r:= r — x[s].m[s];end; End; Độ phức tạp tính toán: ÓŒ?)
3.1.1.3 Một số bài toán tương tw
a Bài toán đổi tiền
A Phát biểu bài toán
Ở đất nước Omega người ta chỉ tiêu tiền xu Có X loại tiền xu, loại thứ 7 có
mệnh giá là z; đồng Một người khách du lịch đến Omega du lịch với số tiền p đồng Ông ta muốn đổi số tiền đó ra tiền xu Omega đề tiện tiêu dùng Ông ta cũng
muốn số đồng tiền đổi được là ít nhất (cho túi tiền đỡ nặng khi đi đây đi đó) Bạn