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 1NGUYỄ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 2NGUYỄ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 3LỜ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 4MỤ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 52.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 7MỞ ĐẦ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 82 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 9CHƯƠ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 10thá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 11Giả 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 là
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 12cô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 140( ) 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 15trong 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 161.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 19KẾ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 20CHƯƠ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 222.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 23Ví 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 24Bắ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 25Cá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 286 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 292.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 30Bà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 31Ta 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 32vớ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 34Nhƣ vậy F(1,3) = 21 khi k = 1 nên S(1,3) = 1
Trang 36Cho 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 37Ví 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 38kế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 đó