Luận văn này bao gồm ba chương. Chương 1 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 phụ 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 toàn bộ các thuật toá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.
Trang 1LỜ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ố trongbất kỳ công trình khoa học nào khác
Trang 2LỜ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áoKhoa 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ệnluậ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 trongsuố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ữngnhậ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 đề 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ớngiúp tôi hoàn thành tốt đề tài nghiên cứu của mình Tôi cũng gửi lời cảm ơn đếntrườ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ưngchắ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ạntận tình góp ý, chỉ bảo
Xin chân thành cám ơn!
Trang 3MỤC LỤC
Trang
LỜI CAM ĐOAN i
LỜI CẢM ƠN ii
MỤC LỤC iii
DANH MỤC CÁC HÌNH v
MỞ ĐẦU 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 3
1.1.1 Phương pháp quy hoạch động 3
1.1.2 Các bài toán con gối nhau 3
1.1.3 Cấu trúc con tối ưu 5
1.1.4 Hai cách tiếp cận quy hoạch động thường dùng 7
1.1.5 Nguyên lý của phương pháp 8
1.2 CÁC BƯỚC THỰC HIỆN GIẢI BÀI TOÁN QUY HOẠCH ĐỘNG 9
1.2.1 Các bước thực hiện 9
1.2.2 Một số ví dụ 11
1.3 TIỂU KẾT CHƯƠNG 1 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 18
2.1 SỰ KHÁC NHAU GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ PHƯƠNG PHÁP ĐỆ QUY 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 20
2.2.1 Giới thiệu về thuật toán vét cạn 20
2.2.2 Phương pháp quy hoạch động và phương pháp vét cạn 21
Trang 42.3 MỐI QUAN HỆ GIỮA PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ
PHƯƠNG PHÁP THAM LAM 25
2.3.1 Giới thiệu về thuật toán tham lam 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 30
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 31
3.1 BÀI TOÁN XẾP BA LÔ (KNAPSACK) 32
3.2 BÀI TOÁN DÃY CON ĐƠN ĐIỆU DÀI NHẤT 47
3.3 BÀI TOÁN BIẾN ĐỔI XÂU 53
3.4 BÀI TOÁN NHÂN MA TRẬN 61
3.5 BÀI TOÁN GHÉP CẶP 66
3.6 BÀI TOÁN DI CHUYỂN 69
3.7 TIỂU KẾT CHƯƠNG 3 72
KẾT LUẬN 73
TÀI LIỆU THAM KHẢO 75
PHỤ LỤC 1
Trang 5DANH MỤC CÁC HÌNH
Trang
Hình 1.1 Đồ thị bài toán con cho dãy Fibonacci 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 diện cho một đường đi ngắn nhất giữa hai đỉnh mà nó nối 5
Hình 1.3 Đồ thị có hướng của bài toán tìm đường đi dài nhất 6
Hình 2.1 Tam giác Pascal 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 ba lô 32
Hình 3.2 Trò chơi với băng số 52
Trang 6MỞ ĐẦU
Tại các trường Trung học phổ thông hiện nay, nhiệm vụ quan trọng là đàotạo một cách toàn diện đồng thời chú trọng bồi dưỡng năng lực của học sinh.Chính vì vậy một trong những tiêu chí đánh giá chất lượng giáo dục củatrường THPT là kết quả của việc thực hiện hoạt động bồi dưỡng học sinhgiỏi
Đối với mỗi giáo viên THPT, bồi dưỡng học sinh giỏi là một nhiệm vụquan trọng và khó khăn Nó đòi hỏi giáo viên phải tìm hiểu, học tập rất nhiềukiến thức về chuyên ngành và các phương pháp giảng dạy thích hợp
Đối với giáo viên bộ môn Tin học, bồi dưỡng học sinh giỏi đòi hỏi giáoviên phải hiểu biết về lập trình và cần có các phương pháp giảng dạy thuậttoán tốt giúp học sinh dễ dàng tiếp thu và vận dụng Học sinh muốn đạt kếtquả cao trong kỳ thi học sinh giỏi tỉnh và cao hơn cần phải có lượng kiếnthức lớn và sâu trong việc lập trình Những kiến thức này đối với chươngtrình phổ thông bình thường là không đủ đáp ứng Nhiệm vụ của giáo viên làcung cấp thêm cho các em kiến thức, phương pháp lập trình để học sinh đạtkết quả tốt trong kỳ thi
Có nhiều phương pháp được dùng để thiết kế thuật toán như: chia để trị(divide and conquer), vét cạn (exhaustivesearch), tham lam (greedyalgorithms), quy hoạch động (dynamic programming) Trong đó, mỗi thuậttoán chỉ áp dụng cho những lớp bài toán phù hợp
Trong ngành khoa học máy tính, quy hoạch động (Dynamic
Programming) 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 toán con gối nhau (overlapping subproblem) và cấu trúc con tối ưu (optimal substructure) [1] Phương pháp
quy hoạch động là một phương pháp hiệu quả trong việc giải bài toán tối ưuhoá rời rạc Có một số bài toán sử dụng phương pháp quy hoạch động lại chohiệu quả cao hơn so với các phương pháp khác
Trang 7Trong các kỳ thi học sinh giỏi tỉnh và cao hơn hiện nay, từ 30% đến 40%các bài thi cần đến quy hoạch động và đây là những bài toán khó, đòi hỏi họcsinh phải có tư duy lập trình cao Có thể có những cách khác để giải bài toán
đó Nhưng vì các cuộc thi đều có giới hạn về thời gian, cũng như bộ nhớ củachươ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ữngtrườ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ệclàm cho các em học sinh phổ thông có thể sử dụng thành thạo phương phápnà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úpviệc giải các bài toán dễ 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ấyviệc ứng dụng phương pháp quy hoạch động trong thiết kế thuật toán là mộtmả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 sinhgiỏi
Vì vậy, tôi chọn đề tài “Ứng dụng phương pháp Quy hoạch động trong
bồi dưỡng học sinh giỏi Tin – 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 1 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ốiquan 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ươngpháp quy hoạch động Phần phụ 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ệnnay thi học sinh giỏi THPT chủ yếu là sử dụng ngôn ngữ lập trình Pascal nên
Trang 8toàn bộ các thuật toán sẽ được cài đặt bằng Pascal Việc này sẽ thuận tiệnhơ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àinà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
Trang 9Chương 1 CƠ SỞ LÝ THUYẾT VỀ PHƯƠNG PHÁP QUY HOẠCH
ĐỘNG
Quy hoạch động mặc dù không nằm trong nội dung chương trình tinhọ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ỳ thi 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ácphần: những khái niệm cơ bản về quy hoạch động, các bước để giải bài toánbằng quy hoạch động và một số ví dụ minh hoạ
1.1 MỘT SỐ KHÁI NIỆM CƠ BẢN VỀ 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, quy 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 toán con gối nhau (overlapping subproblem) và cấu trúc con tối ưu (optimal substructure) [7].
Nhà toán học Richard Bellman (1920-1984) đã phát minh phươngpháp quy hoạch động vào năm 1953 Phương pháp này đã được xây dự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ừanhậ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ánnhỏ nhất (bài toán cơ sở) để từ đó từng bước giải quyết những bài toán lớnhơ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ảncủ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ủanguyê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ánlớn thành các bài toán con nhỏ hơn Quy hoạch động được sử dụng khi các
Trang 10bài toán con này được gọi đi gọi lại Phương pháp quy hoạch động sẽ lưu kếtquả của bài toán con này, và khi được gọi, nó sẽ không cần phải tính lại, do
đó làm giảm thời gian tính toán Quy hoạch động sẽ không thể áp dụng được(hoặc nói đúng hơn là áp dụng cũng không có tác dụng gì) khi các bài toáncon không gối nhau Ví dụ với thuật toán tìm kiếm nhị phân, quy hoạch độngcũng không thể tối ưu được gì cả, bởi vì mỗi khi chia nhỏ bài toán lớn thànhcác bài toán con, mỗi bài toán cũng chỉ cần giải một lần mà không bao giờđược gọi lại
Một ví dụ rất điển hình của bài toán con gối nhau là bài toán tính sốFibonacci
Việc thực hiện một thuật toán đệ quy có thể không tối ưu về mặt thờigian/không gian nhớ
Hình 1.1 Đồ thị bài toán con cho dãy Fibonacci
Đây không phải là một cấu trúc cây mà là một đồ thị có hướng phi chu trình mô tả quan hệ
giữa các bài toán con gối nhau
Ví dụ: Tính phần tử thứ n của dãy số Fibonaci
Function F(n: integer): integer;
Trang 11toá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, điển
hình là các số F(1) và F(2).
Đặ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ữngphươ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ố F) 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;
1.1.3 Cấu trúc con tối ưu
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
diện cho một đường đi ngắn nhất giữa hai đỉnh mà nó nối
Trang 12Cấu 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 toán toàn cục [7]
Ví dụ, đường đi ngắn nhất tới một đỉnh trong một đồ thị có thể đượctì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ộtquy 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 ưucho bài toán ban đầu
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ảibà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ấtnày, chúng ta không thể áp dụng quy hoạch động được Không phải bài toánnà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ừ q -> t sẽ là q -> r -> t hoặc q -> s -> t Nhưng
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
Trang 13phải là tổ hợp của những đường đi thành phần, do đó, bài toán này không cócấu trúc con tối ưu.
Ví dụ, đường q -> r -> t không phải là tổ hợp của đường đi dài nhất từ q -> r và đường đi dài nhất từ r -> t Bởi vì, đường đi dài nhất q -> r phải là q -
> s -> t -> r và đường đi dài nhất từ r -> t phải là r -> q -> s -> t.
1.1.4 Hai cách tiếp cận quy hoạch động thường dùng
a Bottom-up (Từ dướ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ớnngượ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àitoán con trước đó Tất nhiên, bài toán con phía trước đã được giải theo quytrình duyệt, và với mỗi bài toán, chúng ta phải “nhìn 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 đọc đề bài, suynghĩ 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áncon 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ễ dàng để code Vì vậy, nhiều trường hợp, có thể coi quyhoạ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 (Từ trên xuống): kiểu quy hoạch động “xuôi”
Trang 14Tuy không phổ biến, kiểu quy hoạch động xuôi cũng khá khó áp dụng,nhưng quy hoạch động “xuôi” mang đến cho chúng ta nhiều tiện lợi Kiểuxuôi này cũng cần duyệt qua các bài toán con từ nhỏ đến lớn, nhưng với mỗibài toán con, chúng ta tính toán kết quả và từ đó tìm cách thực hiện một sốphép tính để giải bài toán lớn hơ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ánhiện tại.
Phương pháp này khó áp dụng hơn phương pháp ngược kia, và cũngkhô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 địnhbước tiếp theo tương đối khó khăn, thậm chí việc kiểm tra tính đúng sai củaphương pháp cũng không hề dễ 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 để tính toán trước bài toán tiếp theo sẽ chỉ cho ra mộtphần của kết quả chứ không phải kết quả cuối cùng Vì vậy, để thực hiện quyhoạ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ắtbuộc (sau đó chúng ta sẽ cộng dồn kết quả vào mỗi khi giải được một bài toáncon mới) [7]
1.1.5 Nguyên lý của phương pháp
Quy hoạch động thường dùng để giải bài toán tối ưu- bài toán yêu cầu tìm mộtgiả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 độngtrong bài toán tối ưu là nguyên lý tối ưu Bellman
Nguyên lý tối ưu Bellman được phát biểu như sau: “Dãy tối ư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à dù 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 ưu 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: “Trong một dãy tối ưu của các lựa chọn thì một dãy con của nó cũng là tối ưu.”.
Trang 15Do vậy khi giải bài toán theo quy hoạch động nếu dùng một phương phápgồ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âydựng từ nghiệm tối ưu của những bước trước [7]
1.2 CÁC BƯỚC THỰC HIỆN GIẢI BÀI TOÁN QUY HOẠCH ĐỘNG
1.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ậptrình cần xây dự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
Bướ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ựnghà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 F(i) cần dựa tính F(i-1) và F(i-2) là các bài toán con đồng dạng Vì vậy ta cũng xây dựng hàm F có 1 tham số nguyên là n.
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 16Dựa vào các thông tin bài toán đã cho lập công thức truy hồi Phân tíchtrường hợp đệ quy bằng cách biểu diễn bài toán dưới dạng bài toán cùng loạinhưng khác phạm vi giải quyết và xác định trường hợp suy biến.
Đối với bài toán dãy Fibonacci từ thông tin bài toán là F(1) = F(2) = 1
và F(n)= F(n-1) + F(n-2) ta có được giải pháp đệ quy sau:
F (n )={F (n−1 )+F (n−2) nếu n>2 1 nếu n=1 hoặc n=2
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 ứngvớ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 1 chiều, 2 chiều, … Thông thường nếu tham số hìnhthức là 1 tham số thì dùng mảng 1 chiều, nếu 2 tham số thì dùng mảng 2chiề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ạncuối
Với bài toán Fibonacci, ta thấy có 1 tham số hình thức nên sử dụng
mảng 1 chiều a (array [1 max] of integer) để tính:
a[i]=F (i) với i=1 n
Cụ thể:
a[1]=a[2]và a[i]=a[i−1]+a[i−2]; với i=3 .n
Các giá trị sẽ được điền vào theo thứ tự từ 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ínhtoán Từ trạng thái cuối cùng ta biết được phương án tối ưu của giai đoạncuối và do đó biết được trạng thái tối ưu của giai đoạn ngay trước nó Cứ tiếptụ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à a[n] nên bước tổng hợp
kết quả là: F (n )=a [n ];
Trang 17Độ phức tạp tính toán: O(n)
Từ 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 phương pháp quy hoạch động như sau:
Function F(n: integer): integer;
var i: integer; a: array[1 100] of integer;
Thực hiện các bước theo phương pháp quy hoạch động
Phân tích bài toán: Xây dựng hàm:
Function C(k, n: byte): longint; {giả thiết k<=n}
Tổng hợp kết quả: C ( k ,n )=a [k , n]
Ví dụ: Tính C53 = C(3, 5); Ta có bảng để tính các phần tử a [i , j]
i j
0
Trang 18Kết quả điền vào bảng cuối cùng là a[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à C53=a[3,5]=¿ 10
Chương trình
Function C(k, n: byte): longint;
Var a: array [0 100; 0 100] of longint;
Ở chương trình này phép toán tích cực là (i =0) or (i=j) nằm trong hai
vòng for lồng nhau nên độ phức tạp là O(k∗n)
Lưu ý: Nếu ở hàm trên chúng ta thêm câu lệnh if n-k<k thenk:=n-k; {nghĩa là k ≔min (k , n−k )} thì độ phức tạp của thuậ toán sẽ là
O (l∗n) với l=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àogiá trị đã tính trước đó thì ta có thể sử dụng phương pháp quy hoạch động
Trang 19Có thể sử dụng mảng để tính toán và lưu các giá trị, số chiều của mảng phụthuộc vào số lượng tham số.
Chẳng hạn ví dụ sau có thể sử dụng quy hoạch động tương tự bài toántính tổ hợp
Tính giá trị xác suất P(i, j) (i, j: byte) Biết rằng:
P (i, j)={P (i−1 , j)+P (i , j−1) 1 n ế u i=0 v à j>0
2 n ế u i>0 v à j>0
0 n ế u ng ượ c l ạ i
Phương pháp thực hiện, sử dụng phương pháp quy hoạch động Thực
hiện theo 4 bước như bài toán tổ hợp từ đó ta có chương trình (i = 4, j = 5)
Trang 20Phương pháp thực hiện, sử dụng phương pháp quy hoạch động
Phân tích bài toán
o Gọi P(r ) là bài toán du lịch để đi từ thành phố 0 đến thành phố r
(bài toán ban đầu là P(n))
o Các giá trị cần tìm:
d[r]: chi phí cực tiểu của bài toán P(r )
l[r]: thành phố cuối cùng cần đến trước khi đến thành phố r của bài toán P(r )
Trang 21Begin i := i+1;x[i]:= l[r];r := x[i];end;
writeln(‘Thứ tự các thành phố trung gian phải đi qua:’);For k:=i downto 1 do writeln(x[i]);
Trang 22for 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;
Trang 23Ở chương tiếp theo, ta sẽ tìm hiểu về mối quan hệ giữa phương phápquy hoạch động và một số phương pháp khác.
Trang 24Chươ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
Hiện nay, trong các kỳ thi học sinh giỏi tin học, các lớp bài toán về tối
ưu hoá luôn đượ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ươngphá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ữaphươ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ươngphá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àitoá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ướclớ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ầnthì 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ị trunggian 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ậttoán
Do có sự khác biệt trên nên trong khi đệ quy dành phần lớn dung lượng
bộ nhớ để lưu trữ các chương trình con thì quy hoạch động lại dành phần lớn
bộ nhớ để lưu trữ các kết quả trung gian [3] Chính vì vậy đệ quy chiếm dunglượng bộ nhớ rất lớn, thông thường độ phức tạp là hàm mũ
Trang 2513
131
5 1
Ví 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
If (h=c) or (c<=0) then PC:=1Else
PC:=PC(h-1,c) + PC (h-1, c-1)End;
Begin
Clrscr;
Write (‘Nhap N:’); Readln(N);
Write (‘Cac he so trong khai trien: ’);
For i:=0 to N do Write (PC(N,i):5);
Readln;
End
Việc tính toán sẽ rất lãng phí thời gian của máy Do PC(h-1, c) và 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(h, c) là
số lần gọi để tính PC(h-1, c) cộng với số lần gọi để tính PC(h-1, c-1).
Hình 2.4 Tam giác Pascal
Trang 26Nế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:
L[i, 1] :=1;
For j:=2 to i+1 do
L[i, j] = L[i-1, j-1] + L[i-1, j];
End;
Write (‘Cac he so trong khai trien: ’);
For i:=0 to N do Write (L[N,i]:5);
Readln;
End
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
2.2.1 Giới thiệu về thuật toán vét cạn
Trong khoa học máy tính, thuật toán vét cạn (exhaustive hay
brute-force), còn được biết đến như là tạo ra và kiểm tra, là một kỹ thuật giải quyết
vấn đề tổng quát bao gồm việc liệt kê một cách có hệ thống tất cả các ứng cửviên có thể cho giải pháp và kiểm tra xem mỗi ứng viên có đáp ứng được yêucầu của vấn đề hay không [7]
Mộ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ẽ đếmtất cả các số nguyên từ 1 đế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à,
Trang 27cho 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ứ aikhá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ảipháp nếu nó tồn tại, chi phí của nó tỷ lệ thuận với số lượng các giải pháp ứngviên - trong nhiều vấn đề thực tế có xu hướng phát triển rất nhanh chóng khikí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ể theotừng vấn đề có thể được sử dụng để giảm các giải pháp ứng cử cho một kíchthước có thể quản lý được Phương pháp này cũng được sử dụng khi tính đơngiả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ánvé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ọnmộ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 raphương án tối ưu Trong nhiều bài toá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 toá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 đượctì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 quyhoạnh động có ưu điểm là chạy rất nhanh nhưng nhược điểm của nó là rấtkhó tìm ra thuật toán, với một số bài toán có thể sẽ không có thuật toán quyhoạ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ọitrường hợp Trong lập trình, vét cạn là phương pháp được dùng khi khôngcòn phương pháp nào hiệu quả hơn có thể sử dụng được
Trang 28Vấ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ứckhô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 diễ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 đượcthiết lập, chúng ta có thể áp dụng thủ tục duyệt cây (theo chiều rộng hoặctheo 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ônggian để lưu trữ Tuy nhiên, cây này chỉ mang tính trừu tượng, làm cơ sở choviệc duyệt (chọn nút tiếp theo được thăm), mà không phải được tạo ra và lưutrữ 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ả chungnhư 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ùngmột tập con giống nhau ở tính chất thứ nhất, hai phần tử thuộc hai tập conkhá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âycon 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 connà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 ứngvớ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ínhchất của ứng viên và thu được một cây biểu diễn không gian ứng viên
Chúng ta xét một ví dụ sau đây
Ví dụ Cái giá (còn có tên là Knapsack 0/1)
Bài toán: Cho n đồ vật có khối lượng lần lượt là w1, w2, …, wn và một
Trang 29cái giá chịu khối lượng tối đa là W.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 đa là 8, phương án tốt nhất là để 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ảixác định dạng của ứng viên và hàm đánh giá ứng viên Mỗi một tập con (baogồ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 c = x1 x2…xn với ý nghĩa vật thứ i được để trên giá nếu xi = 1 và không được để trên giá nếu xi =
0 Hàm đánh giá ứng viên được xác định như sau:
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á (x1=1), vật thứ hai được đưa lên giá (x2=1), …, vật
thứ n được đưa lên giá (xn=1) 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 2n 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 30Hình 2.5 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
Cuối cùng, chúng ta áp dụng thủ tục duyệt cây theo chiều sâu (khôngnê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ềuthông tin đồng thời) để tìm ứng viên tốt nhất (phương án đặt vật lên giá tốtnhất) Thủ tục duyệt được mô tả đệ quy như sau:
duyet(i+1, c & ‘1’)duyet(i+1, 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ìmnghiệ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ể Đốivới con người phương pháp này thường là không khả thi vì số phương án cầnkiểm tra quá lớn Tuy nhiên đối với máy tính, nhờ tốc độ xử lí nhanh, máytính có thể giải rất nhiều bài toán bằng phương pháp vét cạn
Ư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 ranghiệ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
Trang 31giả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àitoá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ễnkhô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ìnhduyệt (theo chiều sâu) cây, phương pháp quay lui sử dụng một hàm điềukiệ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ốctạ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ínhcận để tính trước điểm tối đa (cận) có thể đạt được đối với các ứng viênthuộ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ụnggiả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ảithuậ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ểnsang món ngon thứ ba… Phương pháp tham lam luôn chọn phương án tốtnhấ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ọnnày sẽ dẫn đến một kết quả tối ưu toàn cục Phương pháp tham lam khôngphả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
Trang 32Các thuật toán ứng dụng phương pháp tham lam thường diễn ra quanhiều giai đoạn và tại mỗi giai đoạn chúng ta thường không biết thông tintoà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 tincho bước đi kế tiếp Ý tưởng chính của phương pháp tham lam là chúng takhông cần quan tâm tới dữ liệu tổng thể mà chỉ từ những dữ 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ợpnhữ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ỉ mangtí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áptươ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ánnhanh (giảm độ phức tạp tính toán của các thuật toán) Các thuật toán thamlam nói chung là đơn giản và hiệu quả (vì các tính toán để tìm ra quyết địnhtố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ậttoá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ậttoán được thiết kế theo kỹ thuật tham lam vẫn cho ta nghiệm tối ưu, chẳnghạn thuật toán Dijkstra tìm đường đi ngắn nhất từ một đỉnh tới các đỉnh cònlại trong đồ thị định hướng, các thuật toán Prim và Kruskal tìm cây bao trùmngắ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:
Tính chất lựa chọn 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ểmhiện tại và sau đó giải bài toán con nảy sinh từ việc thực hiện lựa chọn vừarồi Lựa chọn của thuật toán tham lam có thể phụ thuộc vào các lựa chọn
Trang 33trước đó Nhưng nó không thể phụ thuộc vào một lựa chọn nào trong tươnglai 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 theokiể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ácquyết định cũ Đối với một số bài toán, đây có thể là một thuật toán khôngchính xác
Cấu trúc con tối ưu
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 ưucủ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
Để hiểu rõ hơn, ta xét bài toán đơn giản nhưng thể hiện được sức mạnhcủ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ử dụng chungmột tài nguyên (mỗi thời điểm chỉ có một hoạt động sử dụng tài nguyênchung) Mục tiêu là sắp xếp sao cho càng có nhiều hoạt động sử dụng tàinguyên càng tốt
Bài toán: Có n cuộc họp, cuộc họp thứ i bắt đầu vào thời điểm a i và kết thúc ở thời điểm bi 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ỉ giaonhau tại đầu mút Hãy bố trí phòng họp để phục vụ được nhiều cuộc họpnhất
Hướ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 (bi) Thế thì cuộc họp i sẽ bố trí được sau cuộc họp j nếu và chỉ nếu j<i và bj<=ai 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
Trang 34nhất thoả mãn điều kiện trên Độ phức tạp thời gian O(n2 ) (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:
– Ý tưở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 là tập rỗng, ta lần lượt bổ sung các cuộc họp theo thứ tự đã sắp xếp vào S nếu nó không bị trùng với bất cứ cuộc họp nào trong S.
Độ phức tạp thời gian O(nlogn).
Người ta đã chứng minh được rằng thuật toán Tham lam trên đưa ra lờigiả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ánTham 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 tì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 dựng hoạt động đúng Đôi khi điềunà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';
fout = 'SELECT.OUT';
maxn = 200;
type int = integer;
arrPoint = array[1 maxn] of int;
assign(f, finp); reset(f); readln(f, n);
for i := 1 to n do readln(f, a[i], b[i]); close(f);
Trang 35writeln(f, a[s[i]], ' ', b[s[i]]);
{Da co C duoc sap xep tang dan theo dau mut phai}
m := 0; {Khoi tao nghiem bang rong}
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 ưucụ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ố trễ hạn ít nhất Một số bài toán thuật toán tham lam chỉcho lời giải tiệm cận tối ưu như bài toán phủ vector, bài toán chia bánh AiCậ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ánrút tiền tự động ở máy ATM, bài toán Knapsack 0/1
Trang 362.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ữaphương pháp quy hoạch động và các phương pháp đệ quy, tham lam và vétcạ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 để 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àitoán và khả năng cho phép mà ta có thể lựa chọn hay phối hợp các phươngphá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 toán dễ dàng hơn Chẳng 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étcạ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
Ở chương tiếp theo, ta sẽ xét những bài toán cụ thể, cách giải quyết bàitoán bằng thuật toán quy hoạch động
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
Khi nào thì chúng ta cần đến quy hoạch động? Đó là một câu hỏi rấtkhó trả lời Không có một công thức nào cho các bài toán như vậy Tuynhiên, có một số tính chất của bài toán mà người ta có thể nghĩ đến quyhoạch động Dưới đây là hai tính chất nổi bật nhất trong số chúng:
Bài toán có các bài toán con gối nhau
Bài toá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ể
Trang 37khả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êucủ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áchkhá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 quyhoạ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áclớp bài toán sau:
Bài toá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
Đ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ântí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áclớp bài toán
3.1 BÀI TOÁN XẾP BA LÔ
(KNAPSACK)
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ổ hợp Bài toán được đặt tên
Trang 38từ vấn đề chọn những gì 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 chuyến đ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 đồ vật
Đây là bài toá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 i (i = 1 n) có: - kích cỡ m[i] Î N*
- gía trị c[i] Î R
- 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* Vậy 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[n] (với x[i] Î N : số lượng loại đồ vật thứ i cần
lấy) sao cho: ∑
x[i]∗c [i] đạt giá trị cực đại
Từ nội dung bài toán, ta thấy thông tin vào và ra của bài toán như sau:
Input:
+ n: số loại đồ vật khác nhau
+ p: kích cỡ cái ba lô
+ m[i]: kích cỡ đồ vật thứ i (i=1 n)
+ c[i]: giá trị đồ vật thứ i (i=1 n)
Output: x[i]: số lượng loại đồ vật thứ i cần lấy (i=1 n) sao cho :
x[i]∗c [i] đạt giá trị cực đại
Trang 393.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 P(r , s ) là bài toán chiếc túi xách, với:
x[i]∗c [i] của bài toán P(r , s )
u[r, s]: số lượng loại đồ vật s tối ưu cần lấy (tức: x[s]) của bài toán P(r , s )
Bước 2: Giải pháp đệ quy
Trang 403.1.1.3 Một số bài toán tương tự
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ó N loại tiền xu, loại thứ i có mệnh giá là ai đồ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ũngmuốn số đồng tiền đổi được là ít nhất (cho túi tiền đỡ nặng khi đi đây đi đó) Bạnhãy giúp ông ta tìm cách đổi tiền
Nhận xét: Bài toán này giống bài toán xếp balô (“khối lượng” là mệnh giá,
“giá trị” là 1), chỉ có một thay đổi nhỏ: tổng giá trị yêu cầu là nhỏ nhất.
Từ nội dung bài toán, ta thấy thông tin vào và ra của bài toán như sau:
Input:
+ n: số loại tiền xu
+ p: số tiền của người khách cần đổi
+ a[i]: mệnh giá loại tiền thứ i (i=1 n)
Output: x[i]: số lượng loại tiền thứ i cần lấy (i=1 n) sao cho :