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 1,2K 8

Đ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

Định dạng
Số trang 94
Dung lượng 649,54 KB

Nội dung

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 1

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ố trongbất kỳ công trình khoa học nào khác

Trang 2

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

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

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

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

MỞ ĐẦ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 7

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

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ệ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 9

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

bà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 11

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, đ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 12

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

phả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 14

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

Do 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 16

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

Kế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 19

Có 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 20

Phươ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 21

Begin 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 22

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;

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 24

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

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 25

13

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 26

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:

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 27

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ứ 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 28

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ứ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 29

cá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 30

Hì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 31

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à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 32

Cá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 33

trướ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 34

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

writeln(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 36

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ữ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 37

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ê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 38

từ 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 39

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

3.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 :

Ngày đăng: 17/01/2019, 17:23

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

TÀI LIỆU LIÊN QUAN

w