1. Trang chủ
  2. » Luận Văn - Báo Cáo

Ứ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

94 3 0
Tài liệu được quét OCR, nội dung có thể không chính xác

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Ứ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
Tác giả Phạm Thị Anh Đào
Người hướng dẫn PGS.TS. Hoàng Quang
Trường học Đại học Huế
Chuyên ngành Khoa học máy tính
Thể loại luận văn thạc sĩ
Năm xuất bản 2018
Thành phố Thừa Thiên Huế
Định dạng
Số trang 94
Dung lượng 28,94 MB

Nội dung

Trang 1

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 2

LỜ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 3

LỜ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 4

MỤ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 5

2.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 6

DANH 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 8

thi đề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 9

Chươ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 10

var 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 13

Ví 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 14

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á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 15

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ậ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 17

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 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 18

Ví đụ: 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 19

Lư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 20

else 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 21

o 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 23

end;

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 24

Chuong 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 25

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 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 26

Việ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 27

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ẽ đế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 28

hiệ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 29

Ví 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 32

toà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 33

củ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 34

trê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 35

for 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 36

end; 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 37

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ấ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

Ngày đăng: 11/01/2024, 22:49

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN