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

Áp dụng kỹ thuật quy hoạch động giải các bài toán tối ưu

76 26 0

Đ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 76
Dung lượng 1,17 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Quy hoạch động có những nét giống như phương pháp “Chia để trị”, nó đòi hỏi việc chia bài toán thành những bài toán con kích thước nhỏ hơn, phương pháp chia để trị chia bài toán cần giải

Trang 1

NGUYỄN MẠNH HUY

ÁP DỤNG KỸ THUẬT QUY HOẠCH ĐỘNG

GIẢI CÁC BÀI TOÁN TỐI ƢU

LUẬN VĂN THẠC SĨ KHOA HỌC

Đà Nẵng – Năm 2015

Trang 2

NGUYỄN MẠNH HUY

ÁP DỤNG KỸ THUẬT QUY HOẠCH ĐỘNG

GIẢI CÁC BÀI TOÁN TỐI ƯU

Chuyên ngành: Phương pháp Toán sơ cấp

Mã số: 60.46.40

LUẬN VĂN THẠC SĨ KHOA HỌC

Người hướng dẫn khoa học: PGS.TSKH Trần Quốc Chiến

Đà Nẵng – Năm 2015

Trang 3

LỜI CAM ĐOAN

Tôi xin cam đoan đây là công trình nghiên cứu của riêng tôi

Các số liệu, kết quả nêu trong luận văn là trung thực và chƣa từng đƣợc

ai công bố trong bất kỳ công trình nào khác

Tác giả luận văn

Nguyễn Mạnh Huy

Trang 4

MỤC LỤC

MỞ ĐẦU 1

1.Lý do chọn đề tài 1

2.Mục đích nghiên cứu 2

3.Phương pháp nghiên cứu 2

4.Đối tượng và phạm vi nghiên cứu 2

5.Bố cục đề tài 2

CHƯƠNG 1:KỸ THUẬT QUY HOẠCH ĐỘNG 3

1.1 TỔNG QUAN VÀ MỘT SỐ KHÁI NIỆM CHUNG 3

1.2 KỸ THUẬT QUY HOẠCH ĐỘNG 5

1.3 MỘT SỐ BÀI TOÁN VÍ DỤ 7

1.3.1 Bài toán dãy Fibonacci 7

1.3.2 Bài toán tính các hệ số trong khai triển của nhị thức newtơn (a+b)n 10

KẾT LUẬN CHƯƠNG 1 13

CHƯƠNG 2:CÁC BÀI TOÁN TỐI ƯU TỔ HỢP 14

2.1 BÀI TOÁN BA LÔ (DẠNG 0-1) 14

2.1.1 Bài toán 14

2.1.2 Phân tích bài toán 14

2.1.3 Thuật toán 16

2.2 BÀI TOÁN BA LÔ (DẠNG 0-n) 18

2.2.1 Bài toán 18

2.2.2 Phân tích bài toán 19

2.2.3 Thuật toán 19

2.3 BÀI TOÁN NHÂN TỔ HỢP MA TRẬN 23

2.3.1 Bài toán 23

2.3.2 Phân tích bài toán 23

Trang 5

2.3.3 Thuật toán 25

2.4 DÃY CON ĐƠN ĐIỆU DÀI NHẤT 30

2.4.1 Bài toán 30

2.4.2 Phân tích bài toán 31

2.4.3 Thuật toán 32

2.5 CHUỖI CON CHUNG DÀI NHẤT CỦA 2 CHUỖI 35

2.5.1 Bài toán 35

2.5.2 Phân tích bài toán 35

2.5.3 Thuật toán 36

2.6 BÀI TOÁN CON KIẾN 38

2.6.1 Bài toán 38

2.6.2 Phân tích bài toán 39

2.6.3 Thuật toán 39

CHƯƠNG 3:CÀI ĐẶT CHƯƠNG TRÌNH 42

3.1 NGÔN NGỮ LẬP TRÌNH PASCAL 42

3.2 CÀI ĐẶT CHƯƠNG TRÌNH VÀ KẾT QUẢ THỰC HIỆN 42

3.2.1 Bài toán “khai triển nhị thức newtơn” 43

3.2.2 Bài toán ba lô 44

3.2.3 Bài toán nhân tổ hợp dãy ma trận 45

3.2.4 Dãy con đơn điệu tăng dài nhất 46

3.2.5 Chuỗi con chung dài nhất của hai chuỗi 46

3.2.6 Bài toán con kiến 48

PHỤLỤC 50

KẾT LUẬN 68

TÀI LIỆU THAM KHẢO 70

Trang 7

MỞ ĐẦU

1 Lý do chọn đề tài

Trong quá trình học tập, chúng ta gặp rất nhiều các bài tập về Tin Các bài tập dạng này rất phong phú và đa dạng Thực tế chưa có thuật toán hoàn chỉnh có thể áp dụng cho mọi bài toán Tuy nhiên người ta đã tìm

Toán-ra một số thuật toán chung như chia để trị, tham lam, quay lui, Các thuật toán này có thể áp dụng để giải một lớp khá rộng các bài toán hay gặp trong thực tế Quy hoạch động có những nét giống như phương pháp “Chia để trị”,

nó đòi hỏi việc chia bài toán thành những bài toán con kích thước nhỏ hơn, phương pháp chia để trị chia bài toán cần giải ra thành các bài toán con độc lập, sau đó các bài toán con này được giải một cách đệ quy, và cuối cùng tổng hợp các lời giải của các bài toán con ta thu được lời giải của bài toán đặt ra Điểm khác cơ bản của quy hoạch động với phương pháp chia để trị là các bài toán con là không độc lập với nhau, nghĩa là các bài toán con cùng có chung các bài toán con nhỏ hơn Trong tình huống đó, phương pháp chia để trị sẽ tỏ

ra không hiệu quả, khi nó phải lặp đi lặp lại việc giải các bài toán con chung

đó Quy hoạch động sẽ giải một bài toán con một lần và lời giải của các bài toán con sẽ được ghi nhận, để tránh việc giải lại bài toán con mỗi khi ta gọi lại lời giải của nó

Quy hoạch động thường được áp dụng để giải các bài toán tối ưu Trong các bài toán tối ưu, ta có một tập các lời giải, mà mỗi lời giải như vậy được gán với một giá trị số Ta cần tìm lời giải với giá trị số tối ưu (nhỏ nhất hoặc lớn nhất) Lời giải như vậy ta sẽ gọi là lời giải tối ưu

Vì những lý do trên tôi xin chọn đề tài “ÁP DỤNG KỸ THUẬT QUY

HOẠCH ĐỘNG GIẢI CÁC BÀI TOÁN TỐI ƯU”

Trang 8

2 Mục đích nghiên cứu

Nghiên cứu, tổng hợp lý thuyết về Quy hoạch động

Phân tích các bài toán tối ưu tổ hợp

Áp dụng kỹ thuật Quy hoạch động giải các bài toán tối ưu

3 Phương pháp nghiên cứu

Thu thập, phân tích các tài liệu và thông tin liên quan đến quy hoạch động

Lựa chọn một số thuật toán quy hoạch động để giải quyết vấn đề

Trao đổi, thảo luận với giáo viên hướng dẫn để thực hiện đề tài

4 Đối tượng và phạm vi nghiên cứu

Đối tượng nghiên cứu: Kỹ thuật quy hoạch động và các bài toán ứng dụng Quy hoạch động

Phạm vi nghiên cứu: Các bài toán tối ưu có thể giải được bằng kỹ thuật quy hoạch động

5 Bố cục đề tài

Ngoài phần lời cảm ơn, mục lục, bảng biểu và tài liệu tham khảo đề tài gồm có 3 chương:

Chương 1: Kỹ thuật Quy hoạch động

Chương 2: Các bài toán tối ưu tổ hợp

Chương 3: Cài đặt chương trình

Trang 9

CHƯƠNG 1

KỸ THUẬT QUY HOẠCH ĐỘNG

1.1 TỔNG QUAN VÀ MỘT SỐ KHÁI NIỆM CHUNG

Có những bài toán mà quyết định ở bước thứ i phụ thuộc vào quyết

định ở các bước trước đó Nếu ta xác định được hệ thức diễn đạt mối tương

quan của quyết định ở bước thứ i với quyết định ở bước trước đó thì ta có thể

triển khai chương trình theo hệ thức đã tìm được

Khi đó việc giải các bài toán có kích thước lớn sẽ được chuyển về việc giải các bài toán cùng kiểu có kích thước nhỏ hơn.Các thuật toán này thường được thể hiện bằng các chương trình con đệ quy Tuy nhiên, với kỹ thuật chia

để trị thì nhiều bài toán con phải tính lại nhiều lần

Vậy ý tưởng cơ bản của quy hoạch động đó là: Tránh tính toán lại các bài toán con nhiều lần, mà lưu giữ kết quả đã tìm kiếm được vào một bảng làm giá trị giả thiết cho việc tìm kết quả của trường hợp sau Chúng ta sẽ lấp đầy dần các giá trị của bảng này bởi các kết quả của những trường hợp trước

đã được giải Kết quả cuối cùng chính là kết quả của bài toán cần giải

Phương pháp quy hoạch động cùng nguyên lý tối ưu được nhà toán học

Mỹ R.Bellman đề xuất vào những năm 50 của thế kỷ 20 Phương pháp này đã được áp dụng để giải hàng loạt bài toán thực tế trong các quá trình kỹ thuật của công nghệ, tổ chức sản xuất, kế hoạch hoá kinh tế… Tuy nhiên cần lưu ý rằng có một số bài toán giải bằng quy hoạch động tỏ ra không thích hợp

Trong thực tế, ta thường gặp một số bài toán tối ưu loại sau: Có một đại

lượng g hình thành trong một quá trình gồm nhiều giai đoạn và ta chỉ quan tâm đến kết quả cuối cùng là giá trị của g phải lớn nhất hoặc nhỏ nhất, ta gọi chung là giá trị tối ưu của g Giá trị của g phụ thuộc vào những đại lượng

xuất hiện trong bài toán mà mỗi bộ giá trị của chúng được gọi là một trạng

Trang 10

thái của hệ thống và cũng phụ thuộc vào cách thức đạt được giá trị g trong từng giai đoạn mà mỗi cách thức được gọi là điều khiển Đại lượng g thường được gọi là hàm mục tiêu và quá trình đạt được giá trị tối ưu của g được gọi là

quá trình điều khiển tối ưu

Bellman phát biểu nguyên lý tối ưu (cũng gọi là nguyên lý Bellman)

mà ý tưởng cơ bản là như sau: "Với mỗi quá trình điều khiển tối ưu, đối với

trạng thái ban đầu A 0 , với mọi trạng thái A trong quá trình đó, phần quá trình

kể từ trạng thái A xem như trạng thái bắt đầu cũng là tối ưu"

Chú ý rằng nguyên lý này được thừa nhận mà không chứng minh Phương pháp tìm điều khiển tối ưu theo nguyên lý Bellman thường

được gọi là quy hoạch động Thuật ngữ này nói lên thực chất của quá trình

điều khiển là động:Có thể trong số bước đầu tiên lựa chọn điều khiển tối ưu dường như không tốt nhưng chung cả quá trình lại là tốt nhất

Vậ ý tưởng cơ bản của quy hoạch động thật đơn giản: tránh tính

toán lại mọi thứ hai lần, mà lưu giữ kết quả đã tìm kiếm được vào một bảng làm giá trị giả thiết cho việc tìm kết quả của trường hợp sau Chúng ta sẽ lấp đầy các giá trị của bảng này bởi các kết quả của những trường hợp trước đã được giải Kết quả cuối cùng chính là kết quả của bài toán cần giải Nói cách khác kỹ thuật quy hoạch động đã thể hiện sức mạnh của nguyên lý chia để trị đến cao độ

Ta có thể giải thích ý này qua bài toán sau: Cho một dãy số nguyên

A 1 ,A 2 ,….A n Hãy tìm cách xóa đi một số ít nhất số hạng để dãy còn lại là dãy

đơn điệu hay nói cách khác hãy chọn một số nhiều nhất các số sao cho dãy B gồm các số hạng đó theo trình tự xuất hiện trong dãy A là đơn điệu

Quá trình chọn dãy B được điều khiển qua i giai đoạn để đạt được mục tiêu là số lượng số hạng của dãy B là nhiều nhất, điều khiển ở giai đoạn i thể hiện việc chọn hay không chọn dãy A i vào dãy B

Trang 11

Giả sử dãy đã cho là 1 8 10 2 4 6 7 Nếu ta chọn lần lượt 1, 8, 10 thì chỉ chọn được 3 số hạng nhưng nếu bỏ qua 8 và 10 thì ta chọn được 5 số hạng 1,

2, 4, 6, 7

Khi giải một số bài toán bằng cách "chia để trị", chuyển việc giải bài toán kích thước lớn về việc giải nhiều bài toán cùng kiểu có kích thước nhỏ hơn thì các thuật toán này thường được thể hiện bằng các chương trình con đệ quy Khi đó, trên thực tế, nhiều kết quả trung gian phải được tính nhiều lần Nói các 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 độ

Trong một số trường hợp, khi giải một bài toán A, trước hết ta tìm họ bài toán A(p) phụ thuộc tham số p (có thể là một vectơ) mà A(p 0 )=A với p 0

trạng thái ban đầu của bài toán A Sau đó tìm cách giải họ bài toán A(p) với tham số p bằng cách áp dụng nguyên lý tối ưu của Bellman Cuối cùng cho

p=p 0 sẽ nhận được kết quả của bài toán A ban đầu

Các thuật ngữ dùng trong quy hoạch động:

- Bài toán giải theo kỹ thuật quy hoạch động gọi là bài toán quy

hoạch động

- Công thức phối hợp nghiệm của các bài toán con để có nghiệm của

bài toán lớn gọi là công thức truy hồi của quy hoạch động

- Tập các bài toán có ngay lời giải để từ đó giải quyết các bài toán lớn hơn gọi là cơ sở quy hoạch động

- Không gian lưu trữ lời giải các bài toán con để tìm cách phối hợp

chúng gọi là bảng phương án của quy hoạch động

1.2 KỸ THUẬT QUY HOẠCH ĐỘNG

Để giải bài toán bằng quy hoạch động, ta cần phải tiến hành các bước sau:

Bước 1: Lập hệ thức (tìm nghiệm của bài toán con đơn giản và tìm ra

Trang 12

công thức xây dựng nghiệm của bài toán con thông qua nghiệm của các bài toán con cỡ nhỏ hơn)

Dựa vào nguyên lý tối ưu tìm cách chia quá trình giải bài toán thành từng giai đoạn, sau đó tìm hệ thức biểu diễn tương quan quyết định của bước

xử lý với các bước đã xử l ý trước đó Hoặc tìm cách phân rã bài toán thành các "bài toán con" tương tự có kích thước nhỏ hơn, tìm hệ thức nêu quan hệ giữa kết quả bài toán kích thước đã cho với các kết quả của các "bài toán con" cùng kiểu có kích thước nhỏ hơn của nó nhằm xây dựng công phương trình truy toán (dạng hàm hoặc thủ tục đệ quy)

Cách xây dựng công thức truy toán: Ta chia việc giải bài toán thành n giai đoạn Mỗi giai đoạn i có trạng thái ban đầu là t(i) và chịu tác động điều khiển d(i) sẽ biến thành trạng thái tiếp theo t(i+1) của giai đoạn i+1

(i=1,2,…n-1) Theo nguyên lý tối ưu của Bellman thì việc tối ưu giai đoạn

cuối cùng không làm ảnh hưởng đến kết quả toàn bài toán Với trạng thái ban đầu là r(n) sau khi làm giai đoạn n tốt nhất ta có trạng thái ban đầu của giai

đoạn n-1 là t(n-1) và tác động điều khiển của giai đoạn n-1 là d(n-1), ta có thể tiếp tục xét đến giai đoạn n-1 Sau khi tối ưu giai đoạn n-1 ta lại có thể tiến hành tối ưu giai đoạn n-2… cho đến khi các giai đoạn từ n giảm đến 1 được

tối ưu thì coi như hoàn thành bài toán Gọi giá trị tối ưu của bài toán tính đến giai đoạn k là Gk, giá trị tối ưu của bài toán tính riêng ở giai đoạn k là T k thì

G k = G k-1 + T k

Bước 2: Tổ chức dữ liệu

Tổ chức dữ liệu sao cho đạt được các yêu cầu sau :

a.Dữ liệu được tính toán dần theo từng bước

b.Dữ liệu được lưu trữ để giảm lượng tính toán lặp lại

c.Kích thước miền nhớ dành cho lưu trữ dữ liệu càng nhỏ càng tốt, kiểu dữ liệu được chọn phù hợp, nên chọn đơn giản dễ truy cập

Trang 13

 Dựa vào công thức, phương trình truy toán và các giá trị đã có trong bảng để tìm dần đến các giá trị còn lại của bảng

 Ngoài ra còn cần mảng lưu trữ nghiệm tương ứng với giá trị tối ưu trong từng giai đoạn

 Dựa vào bảng lưu trữ nghiệm và bảng giá trị tối ưu từng giai đoạn

đã xây dựng, tìm ra kết quả bài toán

Bước 3: Truy vết

Làm tốt thuật toán bằng cách thu gọn hệ thức và giảm kích thước miền nhớ Thường dùng mảng một chiều thay cho mảng hai chiều nếu giá trị một dòng (hoặc cột) của mảng hai chiều chỉ phụ thuộc một dòng (hoặc cột) kề trước

Trong một số trường hợp có thể thay thế mảng hai chiều với các giá trị phần tử chỉ nhận giá trị 0,1 bởi mảng hai chiều mới dùng kỹ thuật quản lý bit

Trong phần một số bài toán ví dụ chúng ta sẽ nghiên cứu để hiểu rõ hơn

về quy hoạch động qua những bài toán cụ thể

1.3 MỘT SỐ BÀI TOÁN VÍ DỤ

1.3.1 Bài toán dãy Fibonacci

Tìm số hạng thứ N của dãy Fibonacci

Dãy Fibonacci là dãy vô hạn các số tự nhiên bắt đầu bằng hai phần tử 0

và 1, các phần tử sau đó được thiết lập theo quy tắc mỗi phần tử luôn bằngtổng hai phần tử trước nó Công thức truy hồi của dãy Fibonacci là

Trang 14

0( ) 1

( 1) ( 2)

khi n=0khi n=1khi n>1

Sơ đồ gọi đệ quy với bài toán tính F(5):

Hình 1.1: Tính số hạng thứ 5 trong dãy Fibonacci

Do đó nếu dùng cách tiếp cận từ trên xuống ( top- down) (sử dụng ghi nhớ) và dùng mảng một chiều A để lưu lại các giá trị các số đã tính được

2 lần tính F(3) 3 lần tính F(2)

Trang 15

trong dãy Fibonacci thì độ phức tạp trung bình của thuật toán là O(n) đã thay cho thời gian hàm mũ

Kỹ thuật này lưu các giá trị đã tính nên gọi là kỹ thuật ghi nhớ đồng thời đây là tiếp cận từ đỉnh xuống nghĩa là từ một bài toán ban đầu chúng ta

„tách‟ dần nó thành các bài toán con sau đó tính và lưu lại giá trị tính được tương ứng với các bài toán con này

Dùng tiếp cận bottom – up Có thể giảm bớt kích thước bộ nhớ dành cho các lời gọi hàm fib() Mặt khác do chỉ cần tính số hạng thứ N, nên không cần dùng mảng A lưu kết quả tính được của các số hạng Vì vậy có thể dùng cách tiếp cận từ dưới lên: Trước hết là tính các giá trị nhỏ nhất của dãy Fibonacci sau đó tính giá trị lớn hơn Mỗi khi tính một số hạng ( kể từ số hạng thứ ba trở đi) chỉ cần dựa vào hai số hạng liền trước nó Chúng ta chỉ cần dùng 3 biến đơn để lưu giữ 3 giá trị của số hạng hiện thời (currentFib), số hạng trước (previousFib) và số hạng mới (newFib)

Cho previousFib:=1 và currentFib:=1

Cho biến i chạy từ 1 đến n và thực hiện lần lượt các phép tính các biến cho mỗi lần i như sau

newFib= previousFib + currentFib;

previousFib= currentFib;

currentFib= newFib;

Số Fibonacci cần tính sẽ là currentFib

Độ phức tạp trung bình của thuật toán là O(n) và dùng rất ít không gian

bộ nhớ thể hiện cách tiếp cận này là hiệu quả với bài toán đang xét

Tức là khi sử dụng kỹ thuật quy hoạch động chia nhỏ bài toán và giải các bài toán con trước thì ta chỉ tính F(2) một lần, rồi sử dụng nó để tính cả F(4) và F(3), thay vì tính nó mỗi lần khi cần tính F(4) hay F(3)

Trang 16

1.3.2 Bài toán tính các hệ số trong khai triển của nhị thức newtơn (a+b) n

Phân tích bài toán

Nhị thức Newtơn được triển khai theo công thức sau:

0

n k

với ( 1) ( 1) !

( 1)! !( )!

k n

Công thức cho phép tính tổ hợp chập k của n như sau

Dựa vào công thức trên ta có thể sử dụng giải thuật đệ quy tính k

n

C như sau:

Nếu (k=0) hoặc (k=n) thì C:= 1

ngược lại C:= C(n-1,k-1)+C(n-1,k)

Theo thuật toán trên, chương trình vẫn cho ra kết quả đúng nhưng xét tính hiệu quả thì rõ ràng không đạt yêu cầu vì thời gian thực hiện sẽ rất lớn do phải nhiều lần tính đi tính lại giá trị C(i,j) (i≤n) (j≤k)

Ngược lại nếu sử dụng bảng chứa các kết quả trung gian (bảng có dạng tam giác Pascal) chúng ta sẽ đạt được một thuật toán hiệu suất hơn Bảng sẽ được làm đầy dần theo từng dòng

Trang 17

+ C[i,j] đƣợc tính bởi công thức:

nÕu j=0 hay j=i[

nÕu j>1

1, ]

Ví dụ minh họa

Áp dụng thuật toán quy hoạch động tính C n k với n = 8 , k = 5

Trang 19

KẾT LUẬN CHƯƠNG 1

Bài toán tối ưu thường có nhiều phương pháp giải quyết, tuy nhiên dùng kỹ thuật quy hoạch động để giải thì giảm đi rất nhiều số lượng thao tác cần thực hiện nên làm giảm độ phức tạp của bài toán Đặc biệt, nếu các phương pháp khác giải bài toán có độ phức tạp là hàm mũ thì lúc đó chọn kỹ thuật quy hoạch động để giải bài toán

Trang 20

CHƯƠNG 2

CÁC BÀI TOÁN TỐI ƯU TỔ HỢP

2.1 BÀI TOÁN BA LÔ (DẠNG 0-1)

2.1.1 Bài toán

Một tên trộm tìm thấy n gói đồ vật, gói thứ i có khối lượng là m i, có giá

trị là c i (mi, ci∈N), nhưng cái ba lô của anh ta chỉ có thể mang được khối lượng tối đa là M (M∈N) Tìm cách nhét đầy ba lô sao cho tổng giá trị của ba

lô lớn nhất? Mỗi gói đồ vật chỉ có thể lấy nguyên vẹn từng gói hoặc không lấy

Ví dụ, Cho n=5 gói hàng và M=13 là tổng khối lượng tối đa và các khối lượng, giá trị của từng món hàng cho bởi bảng sau:

2.1.2.Phân tích bài toán

Ta có thể chia bài toán thành các bài toán con: thay vì xét i đồ vật ta xét

Trang 21

- Nếu trọng lượng còn lại hiện tại v của ba lô nhỏ hơn mi thì ba lô không thể chứa đồ vật thứ i

- Ngược lại v>m i thì có hai trường hợp xảy ra:

+ Trường hợp 1: Không thêm đồ vật i vào ba lô, chỉ sử dụng các dồ vật

max{F(i 1, v);F(i 1, v )

neáu m} neáu m

- Sử dụng đồ vật i nếu cho tổng giá trị ba lô lớn nhất, khi đó xét các đồ

vật 1 i-1 với trọng lượng còn lại của ba lô là v –m i

Lưu ý rằng F(i,v) = 0 nếu i = 0 Vậy công thức đầy đủ tính F(i,v) là

Trang 22

2.1.3 Thuật toán

Lập công thức truy hồi:

 Gọi F(i, v) là tổng giá trị lớn nhất của các gói hàng được chọn trong i gói hàng sao cho tổng khối lượng không lớn hơn v

F(i, v) = Max{ F(i -1, v); F(i -1, v – m i ) + c i ) }, 1≤ i ≤ n

 Bài toán nhỏ nhất ứng với i = 0ta có: F(0, v) = 0

Xây dựng bảng phương án

 Cấu trúc bảng phương án:

 Dùng bảng n+1 dòng và M+1 cột chứa giá trị của các F(i, v)

 Điền số 0 cho các ô trên dòng 0 (F(0,v)=0)

 Sử dụng công thức đệ qui và giá trị trên dòng (i -1) để tính dòng i

 Trường hợp m i > v: F(i, v) = F(i -1, v)

 Trường hợp m i ≤ v:

F(i, v) = Max{ F(i -1, v); F(i -1, v – m i ) + c i )},1≤ i ≤ n

Truy vết tìm lại các gói hàng đã chọn

Bắt đầu từ ô F(n,M) trên dòng n ta dò ngược về dòng 0 theo nguyên tắc:

 Nếu F( i, v)≠ F(i–1, v) thì gói thứ i được chọn, ta truy tiếp ô 1,v-mi)

F(i- Nếu F( i, v) = F(i–1, v) thì gói thứ i không được chọn, ta truy tiếp

ô F(i-1,v)

Trang 23

Ví dụ minh họa:Cho 4 đồ vật có khối lượng và giá trị tương ứng với 4

bộ số sau (2;3) (3;4) (4;5) (5;6), trọng lượng tối đa của ba lô có thể chứa là 5 Tìm cách nhét đầy ba lô sao cho tổng giá trị của ba lô là lớn nhất

Ta lập bảng phương án dựa vào các nguyên tắc sau:

 Điền số 0 cho các ô trên dòng 0 (F(0,v)=0)

 Sử dụng công thức đệ qui và giá trị trên dòng (i -1) để tính dòng i

Trang 24

Bắt đầu từ ô F(4, 5) trên dòng 4 ta dò ngƣợc về dòng 0 theo nguyên tắc:

Ta có F(4,5)=7 = F(3,5) nên gói hàng thứ 4 không đƣợc chọn ,ta truy vết tiếp đến ô F(3,5)

Ta có F(3,5)=7 = F(2,5)= nên gói hàng thứ 3 không đƣợc chọn ,ta truy vết tiếp đến ô F(2,5)

Ta có F(2,5)=7 ≠ F(1,5) =3 nên gói hàng thứ 2 đƣợc chọn ,ta truy vết tiếp đến ô F(1,5-3)=F(1,2)

Ta có F(1,2)=3 ≠ F(0,2) =0 nên gói hàng thứ 1 đƣợc chọn ,ta truy vết tiếp đến ô F(0,2-2)=F(0,0)

Trang 25

Các món được chọn:

1 gói hàng loại 1 có khối lượng 3 và giá trị 4

5 gói hàng loại 4 có khối lượng 2 và giá trị 3

2.2.2 Phân tích bài toán

Gọi F(i, v) là tổng giá trị lớn nhất của các món hàng được chọn có tổng khối lượng nhỏ hơn hoặc bằng v trong i loại hàng đầu tiên

- Nếu chọn 2 mặt hàng loại i ( trong điều kiện v ≥ 2.mi) thì tổng khối lượng còn lại cho việc chọn i-1 loại hàng đầu tiên là v-2mi và tương ứng tổng giá trị lớn nhất trong 2 hàng loại i và i-1 loại hàng khác là F(i-1,v -2.mi)

Từ đó ta xây dựng được các công thức truy hồi sau:

2.2.3 Thuật toán

Xác định công thức truy hồi:

Gọi F(i, v) là tổng giá trị lớn nhất của các món hàng được chọncho tổng khối lượng <= v trong i loại hàng

 Trường hợp mi> v: F(i, v) = F(i-1, v)

 Trường hợp mi≤ v:

Trang 26

 Nếu loại hàng i không được chọn thì: F(i, v) = F(i-1, v)

 Nếu có k món hàng loại i được chọn: (1 ≤ k ≤ v/mi )

F(i, v) = F(i-1, v – km i ) +kc i

Do đó:F(i, v) = Max{F(i-1, v – k.m i ) + k.c i }, k [0, v/m i ]

 Bài toán nhỏ nhất ứng với i = 0 hay v=0 ta có: F(0, v) = 0

 Vậy công thức đầy đủ tính F(i,v) là

 Nếu F(i, v) = F(i - 1, v) thì S(i, v) = 0

 Ngược lại S(i, v) = k

Cách tính giá trị trên bảng phương án:

– Điền số 0 cho các ô trên dòng 0 và cột 0 của bảng F

– Sử dụng công thức truy hồi để tính các giá trị bảng F và giá trị k tương ứng cho bảng S

Truy vết tìm lại các gói hàng đã chọn

Bắt đầu từ ô S(n, M) trên dòng n ta dò ngược về dòng 1 theo nguyên tắc:

 Nếu S(i, v) ≠ 0 thì :

- Loại hàng i được chọn với số lượng là S(i, v)

- Truy tiếp ô S(i-1, v – S(i, v).mi)

Trang 27

 Nếu S(i, v)= 0 thì :

- Loại hàng i không đƣợc chọn,

- Truy tiếp ô S(i-1, v)

Ví dụ minh họa: Cho 5 gói hàng với tổng khối lƣợng tối đa của ba lô

có thể chứa là M=13 Khối lƣợng và giá trị của từng gói hàng đƣợc cho ở bảng sau:

Trang 28

6 5 3 0 0 0 0 0 0 0 1 0 0 0 0 0

3 2 4 0 0 0 0 1 0 2 1 3 2 4 3 5

1 1 5 0 1 0 1 0 0 0 0 0 0 0 0 0

Bảng S(n,M) Truy vết tìm phương án tối ưu

Bắt đầu từ ô S(5,13) trên dòng 5 ta dò ngược về dòng 1 theo nguyên tắc sau:

Vì S(5,13)= 0 nên loại hàng thứ 5 không được chọn,

Ta truy tiếp ô S(4,13) =5 nên loại hàng thứ 4 được chọn với số lượng

là 5

Ta truy tiếp ô S(i -1, v – S(i,v).mi) = S(3,13 – 5.2)=S(3,3) = 0 nên loại hàng thứ 3 không được chọn

Ta truy tiếp ô S(i-1,v)=S(2,3)= 0 nên loại hàng thứ 2 không được chọn

Ta truy tiếp ô S(i-1,v) = S(1,3) = 1 nên loại hàng thứ 1 được chọn với

số lượng là 1

Kết quả sau khi truy vết ta được

Chọn 5 loại hàng thứ 4 (có khối lượng là 2 và giá trị là 3)

Chọn 1 loại hàng thứ 1 (cókhối lượng là 3 và giá trị là 4)

Vậy tổng giá trị của ba lô lúc này là 5.3+1.4 = 19

Trang 29

2.3.BÀI TOÁN NHÂN TỔ HỢP MA TRẬN

Ví dụ: Cho 4 ma trận M1(2 5), M2 (5 4), M3 (4 3), M4 (3 7).Tìm cách tính tối ưu cho tích của bốn ma trận này có số phép nhân là tối thiểu

Kết quả số phép nhân tối thiểu cho tích các ma trận là 106 tương ứng với tổ hợp các ma trận là(M1(M2 M3))M4

2.3.2 Phân tích bài toán

Ta biết rằng phép nhân ma trận không có tính chất giao hoán nhưng có tính kết hợp (A.B).C = A.(B.C)

Trang 30

Bài toán đặt ra là cần tìm số phép nhân ít nhất trong mỗi tổ hợp tích các

Trang 31

Ta xây dựng bảngF(n,n) với F(i,j) là số phép nhân số học tối thiểu cần thực hiện để nhân đoạn ma trận liên tiếp Mi… Mj với i  j

P(n-k) cách

Trang 32

với i k < j

Với một cách kết hợp (phụ thuộc vào vị trí k), số phép toán tối thiểu phải thực hiện là: F(i,k) ( số phép nhân tối thiểu để tính Mi….Mk) + F(k+1, j) ( số phép nhân tối thiểu để tính Mk+1…Mj) + di-1.dk .dj ( số phép nhân của tích hai ma trận tích Mi…Mk và Mk+1….Mj)

Từ đó suy ra: vì có nhiều cách kết hợp mà ta cần chọn cách kết hợp để

có số phép nhân là thấp nhất nên ta cực tiểu hóa F(i,j)

Mỗi F(i,j) được tính theo công thức truy hồi:

1

0( , )

min ( , ) ( 1, )

neáu i=j{ i k j} neáu i<j

1

0( , )

min ( , ) ( 1, )

neáu i=j{ i k j} neáu i<j

 Ta cần phải xây dựng bảng phụ S(n,n) để ghi nhớ vị trí k tại ô

S(i,j)tương ứng với giá trị F(i,j) có số phép nhân nhỏ nhất

Truy vết kết quả từ các bảng phương án:

Sau khi lập hai bảng F(n,n) và S(n,n) Giá trị mỗi phần tử của bảng F nằm phía trên đường chéo chính (F(i,j) với i  j) chính là số phép nhân tối thiểu khi thực hiện nhân đoạn ma trận Mi…Mj Như vậy F(1,n) chính là số phép nhân tối thiểu khi thực hiện nhân dãy ma trận từ M1…Mn, đây chính là

số phép nhân tối thiểu cần tìm

Trang 33

- Để đƣa ra phép kết hợp tối ƣu để nhân ai…aj ta có thể đƣa ra cách kết hợp để nhân ai…ak và ak….aj( có kèm theo dấu đóng ngoặc, mở ngoặc để xác định thứ tự ƣu tiên) và viết thêm dấu “.” vào giữa hai biểu thức đó

- Từ bảng S ta xác định giá trị k ở ô S(1,n) rồi truy vết đến ô S(1,k) và ô S(k,n) Tiếp tục xác định giá trị k ở các ô S(1,k) và S(k,n) để truy vết cho đến khi k bằng 0 thì đƣa ra các vị trí k để kết hợp n ma trận

Trang 34

Nhƣ vậy F(1,3) = 21 khi k = 1 nên S(1,3) = 1

Trang 36

Cho dãy A gồm n số nguyên, ký hiệu [a1, , a n] Tìm một dãy con đơn

điệu tăng dài nhất của dãy A, biết một dãy con của A là dãy có đƣợc từ A bằng cách xóa đi một số phân tử của A

Trang 37

Ví dụ: dãy [1, 5, 9, 2, 3, 11, 8, 10, 4] có dãy con đơn điệu tăng dài nhất

là [1, 2, 3, 8, 10]

2.4.2.Phân tích bài toán

Chúng ta có thể xem mỗi dãy con a của A tương ứng với một chuỗi nhị phân b độ dài n, trong đó, b i = 0 nghĩa là a i không thuộc a và ngược lại b i = 1

nghĩa là a i thuộc a Ví dụ nếu A= [1, 3, 2, 3] thì dãy con tương ứng với chuỗi nhị phân b = 1010là[1, 3] Như vậy, số dãy con của A cũng chính là số chuỗi

nhị phân có độ dài n chính là 2n Mặc dù có thể với 2 chuỗi nhị phân khác

nhau sẽ tương ứng với cùng một dãy con (với mảng A = [1, 3, 2, 3], hai chuỗi

1100 và 1001cùng tương ứng với dãy con [1, 3]), nhưng nếu lập trình bình

thường để duyệt tất cả các dãy con của A thì phải duyệt 2n

n phần tử trong dãy A Gọi Bt(k), với k<n, là bài toán tìm dãy con đơn điệu

tăng dài nhất của k phần tử đầu tiên trong dãy A mà dãy con này có chứa phần

tử a k Có thể tìm ra ngay kết quả của Bt(k) - chỉ đơn giản là dãy con gồm 1 phần tử: a1 (cơ sở quy hoạch động)

Tìm cách "ghép" các bài toán nhỏ để giải bài toán lớn hơn

Giả sử đã giải được k bài toán đầu tiên Bt(1), Bt(2), ,Bt(k) Làm sao

sử dụng các kết quả này để giải được bài toán Bt(k+1)? Một cách đơn giản là

sẽ thử cho a k lần lượt "kết hợp" với tất cả các kết quả tối ưu của k bài toán

này, sau đó chọn phương án kết hợp tối ưu nhất (cho dãy con dài nhất) Việc

Trang 38

kết hợp a k với 1 dãy con phía trước chỉ đơn giản là: nếu a k lớn hơn hoặc bằng

phần tử cuối cùng của dãy thì a k sẽ được "gắn" vào, còn nếu ngược lại thì a k

không thể "gắn" vào

Ví dụ với dãy A[1, 5, 9, 2, 3, 11, 8, 10, 4], giả sử đã có được: Bt(1) → [1],Bt(2) → [1, 5],Bt(3) → [1, 5, 9] Với k = 4, Bt(4) → [?] Rõ ràng không thể ghép a4 sau [1, 5, 9] vì a4 = 2 < 9 Ta chỉ có thể ghép a4 sau [1] Như vậy,

Bt(4) → [1, 2]

Xuất phát từ Bt(1), theo cách "ghép" trên, ta cứ lần lượt tìm kết quả cho các bài toán Bt(2), Bt(3), , Bt(n) Kết quả của Bt(n) chưa chắc là kết quả

cuối cùng của bài toán vì dãy con đơn điệu tăng dài nhất của A chưa chắc đã

chứa a n Do vậy, để tìm dãy con đơn điệu tăng dài nhất của A, ta phải duyệt

tất cả n bài toán con vừa giải để chọn ra dãy con dài nhất

Với ví dụ trên, ta có một số nhận xét sau:

Bt(6) có thể có một kết quả khác tương đương: [1, 2, 3, 11], nghĩa là

dù kết quả nào được chọn cũng không ảnh hưởng đến kết quả cuối cùng của bài toán

Kết quả của Bt(9) không phải là kết quả tối ưu, mà là kết quả của

Bt(8)

2.4.3.Thuật toán

Công thức truy hồi

Gọi L(i) là độ dài dãy con dài nhất trong dãy từ a1, , a n và có a i làphần

tử cuối dãy con dài nhất đó

Ngày đăng: 21/05/2021, 21:56

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Trần Quốc Chiến (2002),Lý thuyết đồ thị, Đại học Đà Nẵng Sách, tạp chí
Tiêu đề: Lý thuyết đồ thị
Tác giả: Trần Quốc Chiến
Năm: 2002
[2] Lê Minh Hoàng (2002), Giải thuật và lập trình, Đại học sƣ phạm Hà Nội Sách, tạp chí
Tiêu đề: Giải thuật và lập trình
Tác giả: Lê Minh Hoàng
Năm: 2002
[4] Nguyễn Xuân Huy (1987), Thuật toán, Nxb Giáo dục , Hà Nội Sách, tạp chí
Tiêu đề: Thuật toán
Tác giả: Nguyễn Xuân Huy
Nhà XB: Nxb Giáo dục
Năm: 1987
[5] Đỗ Xuân Lôi (1998), Cấu trúc dữ liệu và giải thuật, Nxb khoa học và kỹ thuật.Tiếng Anh Sách, tạp chí
Tiêu đề: Cấu trúc dữ liệu và giải thuật
Tác giả: Đỗ Xuân Lôi
Nhà XB: Nxb khoa học và kỹ thuật. Tiếng Anh
Năm: 1998
[6] N.Wirth (1976), Algorithms + Data Structures = Programs, Nxb Prentice Hall.Trang web Sách, tạp chí
Tiêu đề: Algorithms + Data Structures = Programs
Tác giả: N.Wirth
Nhà XB: Nxb Prentice Hall. Trang web
Năm: 1976
[3] Trần Đỗ Hùng (2007),Chuyên đề bồi dưỡng học sinh giỏi tin học trung học phổ thông – bài tập quy hoạch động Khác

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm