Như chúng ta thấy trong chương 2, các thuật toán “chia để trị” chia bài toán thành nhiều bài toán con độc lập, giải quyết các bài toán này một bằng đệ quy, và sau đó kết hợp các giải phá
Trang 1QUY HOẠCH ĐỘNG Tổng quan
Quy hoạch động, giống như phương pháp “chia để trị”, giải quyết các bài toán bằng cách kết hợp các giải pháp cho các bài toán con với nhau (“Quy hoạch” trong ngữ cảnh này nói đến một phương pháp biểu bảng, không phải là viết code máy tính.) Như chúng ta thấy trong chương 2, các thuật toán “chia để trị” chia bài toán thành nhiều bài toán con độc lập, giải quyết các bài toán này một bằng đệ quy, và sau đó kết hợp các giải pháp của chúng lại để giải quyết bài toán gốc Trong sự trái ngược, quy hoạch động cũng có thể ứng dụng được khi các bài toán con là không độc lập với nhau, điều đó xảy ra khi các bài toán con chia sẻ các bài toán con của các bài toán con Trong ngữ cảnh này, thuật toán “chia để trị” làm việc tốt hơn cả mức cần thiết, giải quyết các bài toán con của các bài toán con lặp đi lặp lại nhiều lần Một thuật toán quy hoạch động giải quyết mọi bài toán con của bài toán con chỉ một lần và sau đó lưu lại câu trả lời của nó vào trong một bảng, do đó ngăn chặn được công việc tính toán lại câu trả lời mỗi khi bài toán con của bài toán con được bắt gặp
Quy hoạch động điển hình là được ứng dụng cho các bài toán tối ưu Như là các bài toán mà nó có thể có nhiều giải pháp có khả năng Mỗi giải pháp có một giá trị, và chúng ta ao ước tìm thấy được một giải pháp với giá trị tối ưu (cực tiểu hay cực đại) Chúng ta gọi giải pháp đó là giải pháp tối ưu cho một bài toán (chưa xác định trước), đối nghịch với một giải pháp tối ưu (biết rõ ràng), vì vậy có thể có vài giải pháp mà chúng đạt được giá trị tối ưu
Sự trình bày của quy hoạch động có thể được chia thành một chuỗi bốn bước sau:
Các bước từ 1 đến 3 tạo ra nền tảng của một giải pháp quy hoạch động cho một bài toán Bước 4 có thể được bỏ qua nếu chỉ một giá trị của một giải pháp tối ưu được yêu cầu Khi chúng ta tiến hành bước 4, thỉnh thoảng chúng ta lưu trữ dữ liệu thêm vào trong suốt quá trình tính toán bước thứ 3, để dễ dàng xây dựng một giải pháp tối ưu.Các mục trong chương sử dụng phương pháp quy hoạch động để giải quyết vài bài toán tối ưu Mục 15.1 khảo sát một bài toán trong việc lập trình cho 2 dây chuyền sản xuất ô-tô, nơi mà sau mỗi trạm, việc xây dựng dưới ô-tô có thể ở lại trên cùng một dây chuyền hoặc vận chuyển sang dây chuyền khác Mục 15.2 yêu cầu cách nào chúng
ta có thể nhân một chuỗi các ma trận sao cho tổng số các phép nhân vô hướng ít nhất được thực hiện Cho trước các ví dụ này của quy hoạch động, mục 15.3 thảo luận đến
2 đặc tính cốt yếu mà một bài toán phải có để quy hoạch động là một giải pháp kỹ thuật có thể thực hiện được Mục 15.4 sau đó trình bày cách để tìm xâu con chung dài nhất của 2 xâu Cuối cùng, mục 15.5 sử dụng quy hoạch động để xây dựng các cây nhị phân tìm kiếm mà chúng là tối ưu, cho một sự phân bố được biết trước của các khóa
để được tìm kiếm
15.1 Lập trình cho dây chuyền lắp ráp.
Ví dụ quy hoạch động đầu tiên của chúng ta là giải quyết bài toán sản xuất Tập
Trang 2được trình bày trong hình 15.1 Một khung gầm ô-tô đưa vào mỗi dây chuyền lắp ráp,
có các bộ phận được thêm vào nó tại một số lượng các trạm, và một chiếc ô-tô được hoàn tất đưa ra tại cuối dây chuyền Mỗi dây chuyền lắp ráp có n trạm, được đánh số j
= 1, 2, , n Chúng ta biểu thị trạm thứ j trên dây chuyền i (với i bằng 1 hoặc 2) bằng
Si,j Trạm thứ j trên dây chuyền 1 (S1,j) thực hiện chức năng tương tự như trạm thứ j trên dây chuyền 2 (S2,j) Các trạm được lập nên tại các thời điểm khác nhau và với các
kỹ thuật khác nhau, tuy nhiên, quá nhiều thời gian được yêu cầu tại mỗi biến trạm, thậm chí giữa các trạm tại vị trí tương tự trên 2 dây chuyền khác nhau Chúng ta biểu thị thời gian lắp ráp được yêu cầu tại trạm Si,j bằng ai,j Như hình 15.1 hiển thị, một khung gầm đưa vào trạm 1 của một trong hai dây chuyền lắp ráp, và nó tiến hành từ mỗi trạm cho tới trạm tiếp theo Ta cũng có một thời gian đưa vào là ei cho mỗi khung gầm để đưa vào dây chuyền lắp ráp i và thời gian đưa ra là xi cho một chiếc ô-tô hoàn tất để đưa ra dây chuyền lắp ráp i
Hình 15.1
Hình 15.1: Bài toán sản xuất tìm cách nhanh nhất thông qua một nhà máy Có 2 dây chuyền lắp ráp, mỗi dây chuyền có n trạm; trạm thứ j của dây chuyền i được biểu thị là Si,j và thời gian lắp ráp tại mỗi trạm là ai,j Một khung gầm xe ô-tô đưa vào nhà máy, và đi vào dây chuyền i (với i bằng 1 hoặc 2) mất ei thời gian Sau khi đi qua trạm thứ j của một dây chuyền, khung gầm xe đi tới trạm thứ j+1 trên dây chuyền kia Không có chi phí vận chuyển nếu nó nằm trên cùng một dây chuyền, nhưng mất thời gian ti,j để vận chuyển tới một dây chuyền khác sau trạm Si,j Sau khi đi ra trạm thứ n trên một dây chuyền, nó tốn mất xi thời gian cho một ô-tô được hoàn tất để đưa ra nhà máy Bài toán này là xác định các trạm nào được chọn trên dây chuyền 1 và các trạm nào được chọn trên dây chuyền 2 để cực tiểu hóa tổng thời gian đi qua nhà máy cho một chiếc ô-tô
Thông thường, một khung gầm ô-tô đưa vào một dây chuyền lắp ráp, nó đi qua chỉ dây chuyền đó mà thôi Thời gian để đi từ một trạm đến trạm tiếp theo trong cùng một dây chuyền lắp ráp là không đáng kể Thỉnh thoảng một đơn đặt dồn lên đột ngột đặc biệt đưa đến, và khách hàng muốn xe ô-tô được sản xuất càng nhanh trong mức có thể Với các đơn đặt dàng dồn lên đột ngột, khung gầm xe vẫn đi qua n trạm theo thứ thự, nhưng người quản lý nhà máy có thể chuyển ô-tô hoàn tất bộ phận từ một dây chuyền lắp ráp này sang một dây chuyền lắp ráp khác sau bất kỳ trạm nào Thời gian
để vận chuyển một khung gầm xe ra khỏi từ dây chuyền lắp ráp i sau khi đã đi qua trạm Si,j là ti,j, với i = 1, 2 và j = 1, 2, , n-1 (vì sau trạm thứ n, việc lắp ráp đã hoàn tất) Bài toán này là xác định các trạm nào được chọn từ dây chuyền 1 và trạm nào được chọn trên dây chuyền 2 để cực tiểu hóa tổng thời gian đi qua nhà máy cho một
Trang 3chiếc ô-tô Trong ví dụ ở hình 15.2(a), tổng thời gian nhanh nhất từ việc chọn các trạm
1, 3 và 6 từ dây chuyền 1 và các trạm 2, 4 và 5 từ dây chuyền 2
Hình 15.2Hình 15.2: (a) Một ví dụ cho bài toán dây chuyền lắp ráp với các chi phí ei, ai,j, ti,j
(b) Giá trị của fi[j], f*, li[j], và l* với ví dụ trong phần (a)
Rõ ràng rằng, cách “brute force” (sức mạnh tàn bạo) của việc cực tiểu hóa thời gian đi qua nhà máy là không thể làm được khi có quá nhiều trạm Nếu chúng ta có trước một danh sách các trạm mà chúng được dùng trong dây chuyền 1 và các trạm được dùng trong dây chuyền 2, thì điều đó thật dễ dàng để tính toán với Θ(n) thời gian
cách có thể để chọn các trạm, mà chúng ta có thể xem xét bằng cách nhìn tập các trạm được sử dụng trong dây chuyền 1 như là một tập con của {1, 2, , n} và lưu ý rằng có
bằng cách liệt kê tất cả các cách có thể và tính toán phải mất bao lâu để mỗi trường hợp sẽ đòi hỏi Ω(2n) thời gian, điều này là không thể làm được khi n là lớn
Bước 1: Cấu trúc của cách nhanh nhất đi qua nhà máy.
Bước đầu tiên của mô hình quy hoạch động là mô tả cấu trúc của một giải pháp tối ưu Với bái toán lập trình cho dây chuyền lắp ráp, chúng ta có thể biểu diễn bước này theo cách sau Chúng ta hãy tính cách nhanh nhất có thể cho một khung gầm xe để
xe có thể được đưa vào, và vì vậy thật dễ dàng để xác định phải mất bao lâu để nó đi qua trạm S1,j Tuy nhiên, với j = 2, 3, , n, thì có 2 lựa chọn: khung gầm xe có thể được đưa đến từ trạm S1,j-1 và sau đó đi trực tiếp đến S1,j, thời gian cho việc đi từ trạm j-1 đến trạm j trên cùng một dây chuyền là không đáng kể Một sự lựa chọn khác,
Trang 4S1,j, thời gian vận chuyển là t2,j-1 Chúng ta sẽ tính toán 2 cách có thể này một cách riêng biệt, mặc dù chúng ta sẽ thấy rằng chúng có rất nhiều điểm chung.
trạm S1,j-1, chúng ta có thể thay thế cách nhanh hơn này để sinh ra một cách nhanh hơn
đi qua trạm S1,j: mâu thuẫn
trạm S2,j-1 Bây giờ chúng ta thấy rằng khung gầm xe phải thu được cách nhanh nhất từ điểm bắt đầu qua trạm S2,j-1 Lý do tương tự: nếu có cách nhanh hơn để đi qua trạm S2,j-
S1,j, điều này cũng sẽ là mâu thuẫn
Tóm lại, chúng ta có thể nói rằng với việc lập trình cho dây chuyền lắp ráp, một giải pháp tối ưu cho bài toán (tìm cách nhanh nhất đi qua trạm Si,j) bao gồm một giải pháp tối ưu cho các bài toán con (tìm cách nhanh nhất đi qua hoặc là trạm S1,j-1 hoặc là trạm S2,j-1) trong phạm vi của nó Chúng ta quy đặc tính này là cấu trúc con tối ưu, và
nó là một trong các tiêu chuẩn của quy hoạch động có thể dùng được, mà chúng ta sẽ xem xét ở mục 15.3
Chúng ta sử dụng cấu trúc con tối ưu để chỉ ra rằng chúng ta có thể xây dựng một giải pháp tối ưu cho một bài toán từ các giải pháp tối ưu cho các bài toán con Với việc lập trình cho dây chuyền lắp ráp, chúng ta lý giải theo cách sau Nếu chúng ta thấy cách nhanh nhất đi qua trạm S1,j, thì nó phải đi qua trạm j-1 trên dây chuyền 1 hoặc là trên dây chuyền 2 Theo cách đó, cách nhanh nhất đi qua trạm S1,j là:
•Hoặc là cách nhanh nhất đi qua trạm S1,j-1 và sau đó đi trực tiếp qua trạm
S1,j
sang dây chuyền 1, và sau đó đi qua trạm S1,j
Sử dụng lập luận đối xứng, cách nhanh nhất đi qua trạm S2,j là:
•Hoặc là cách nhanh nhất đi qua trạm S2,j-1 và sau đó đi trực tiếp qua trạm
Theo cách đó, chúng ta có thể xây dựng một giải pháp tối ưu cho ví dụ bài toán lập trình cho dây chuyền lắp ráp bằng cách xây dựng các giải pháp tối ưu cho các bài toán con
Bước 2: Giải pháp đệ quy.
Bước thứ 2 của mô hình quy hoạch động là xác định giá trị của giải pháp tối ưu
đệ với các số hạng của các giải pháp tối ưu cho các bài toán con Với bài toán lập trình cho dây chuyền lắp ráp, chúng ta chọn các bài toán con của chúng ta, các bài toán của việc tìm cách nhanh nhất đi qua trạm j trên cả 2 dây chuyền, với j = 1, 2, , n fi[j] để
Trang 5biểu thị thời gian nhanh nhất có thể để đưa khung gầm xe từ điểm bắt đầu đi qua trạm
Si,j
Mục đích cuối cùng của chúng ta là xác định thời gian nhanh nhất để đưa một
gầm xe phải đưa vào tất cả các cách qua trạm n hoặc là trên dây chuyền 1 hoặc là trên dây chuyền 2 và sau đó đưa ra khỏi nhà máy Vì cách nhanh hơn của các cách đó là cách nhanh nhất đi qua toàn bộ nhà máy, chúng ta có:
Bây giờ chúng ta hãy tính xem bằng cách nào để tính fi[j], với j = 2, 3, , n (và i
= 1, 2) Tiêu điểm là f1[j], chúng ta nhớ lại rằng cách nhanh nhất qua trạm S1,j là cách nhanh nhất qua trạm S1,j-1 và sau đó trực tiếp qua trạm S1,j, hoặc là cách nhanh nhất qua trạm S2,j-1, vận chuyển từ dây chuyền 2 sang dây chuyền 1, và sau đó qua trạm S1,j Trong trường hợp đầu tiên, chúng ta có f1[j] = f1[j-1] + a1,j, và trong trường hợp sau là
Các giá trị fi[j] mang lại các giá trị của các giải pháp tối ưu cho các bài toán con
Để trợ giúp chúng ta lưu giữ dấu vết của cách xây dựng một giải pháp tối ưu, chúng ta
cách nhanh nhất đi qua trạm Si,j Ở đây, i = 1, 2 và j = 2, 3, , n (Chúng ta ngăn ngừa
dùng trong cách nhanh nhất đi qua toàn bộ nhà máy Các giá trị li[j] trợ giúp chúng ta truy lại được cách nhanh nhất Việc sử dụng các giá trị của l* và li[j] được trình bày trong hình 15.2(b), chúng ta sẽ truy lại được cách nhanh nhất đi qua nhà máy trong phần (a) theo cách này Bắt đầu với l* = 1, chúng ta sử dụng trạm S1,6 Bây giờ chúng ta thấy l1[6], nó bằng 2, và vì vậy chúng ta sử dụng trạm S2,5 Tiếp tục, chúng ta thấy l2[5]
= 2 (sử dụng trạm S2,4), l2[4] = 1 (trạm S1,3), l1[3] = 2 (trạm S2,2), và l2[2] = 1 (trạm S1,1)
Trang 6Tại điểm này, nó sẽ là một nội dung đơn giản để viết một thuật toán đệ quy được dựa vào phương trình (15.1) và các phép truy toán (15.6) và (15.7) để tính cách nhanh nhất đi qua nhà máy Có một bài toán với một thuật toán đệ quy: thời gian chạy của nó
được tạo bởi fi[j] trong một thuật toán đệ quy, từ phương trình (15.1) chúng ta có
(15.8) r1(n) = r2(n) = 1
Từ các phép truy toán (15.6) và (15.7) chúng ta có
(15.9) r1(j) = r2(j) = r1(j-1) + r2(j-1)
Với j = 1, 2, , n-1 Như bài tập 15.1-2 yêu cầu bạn chỉ ra, ri(j) = 2n-j Theo cách
đó, chỉ một mình f1[1] được tham chiếu 2n-1 thời gian! Như bài tập 15.1-3 yêu cầu bạn chỉ ra tổng số lượng các tham chiếu đến tất cả các giá trị fi[j] là Θ(2n)
khác biệt từ cách đệ quy Để ý rằng với j ≥ 2, mỗi giá trị của fi[j] chỉ phụ thuộc vào các giá trị của f1[j-1] và f2[j-1] Bằng cách tính các giá trị của fi[j] theo thứ tự tăng dần các
số j trạm – từ trái qua phải trong hình 15.2(b) – chúng ta có thể tính được cách nhanh nhất đi qua nhà máy, và thời gian mà nó tiêu tốn, trong Θ(n) thời gian Thủ tục FASTEST-WAY lấy đầu vào như là các giá trị ai,j, ti,j, ei, xi, cũng như là n, số lượng các trạm của mỗi dây chuyền
và f2[1] sử dụng các phương trình (15.2) và (15.3) Sau đó vòng for của các hàng 3 tới
13 tính fi[j] và li[j] với i = 1, 2 và j = 2, 3, , n Các dòng 4 đến 8 tính f1[j] và l1[j] sử dụng phương trình (15.4), và các dòng 9 đến 13 tính f2[j] và l2[j] sử dụng phương trình (15.5) Cuối cùng, các hàng 14 đến 18 tính f* và l* sử dụng phương trình (15.1) Bởi vì các hàng 1 đến 2 và 14 đến 18 thu được hằng số thời gian và mỗi cái của n-1 sự tính
Trang 7lặp của vòng for ở hàng 3 đến 13 thu được hằng số thời gian, toàn bộ thủ tục tốn mất
Θ(n) thời gian
Một cách để thấy quá trình tính toán các giá trị của fi[j] và li[j] là chúng ta đang điền vào các mục nhập bảng Tham chiếu hình 15.2(b), chúng ta điền vào bảng bao gồm các giá trị fi[j] và li[j] từ trái qua phải (và từ trên xuống dưới với mỗi cột) Để điền vào một mục nhật fi[j], chúng ta cần các giá trị f1[j-1] và f2[j-1], và biết rằng chúng ta
đã tính toán và lưu trữ chúng, chúng ta xác định các giá trị này một cách đơn giản bằng việc tìm chúng ở trong bảng
Bước 4: Việc xây dựng cách nhanh nhất đi qua nhà máy.
Đã tính toán được các giá trị fi[j], f*, li[j], và l*, chúng ta cần xây dựng chuỗi các trạm được sử dụng trong cách nhanh nhất đi qua nhà máy Chúng ta đã bàn luận ở trên cách nào để làm được như ví dụ ở hình 15.2
Theo thủ tục in ra các trạm được sử dụng, theo thứ tự giảm dần số của trạm Bài tập 15.1-1 yêu cầu bạn chỉnh sửa nó để in ra các trạm theo thứ tự tăng dần số của trạm
5 print “line ” i “, station ” j-1
Trong ví dụ của hình 15.2, PRINT-STATIONS sẽ cho ra kết quả là
15.1-2: Hãy sử dụng các phương trình (15.8) và (15.9) và phương pháp thay thế
để chỉ ra rằng ri(j), số lượng các tham chiếu được tạo ra từ fi[j] trong thuật toán đệ quy, bằng 2n-j
15.1-3: Sử dụng kết quả của bài tập 15.1-2, hãy chỉ ra rằng tổng số lượng các tham chiếu cho tất cả các giá trị fi[j], hoặc ∑=
2 1
i ∑ =
n
j 1 ri(j) , bằng chính xác 2n+1 – 2.15.1-4: Kết hợp với, các giá trị fi[j] và li[j] trong bảng chứa bao gồm một tổng của 4n–2 các mục nhập Hãy chỉ ra cách làm giảm các yêu cầu khoảng cách tới một
trạm trong cách nhanh nhất đi qua nhà máy
15.1-5: Giáo sư Canty phỏng đoán rằng phải tồn tại một vài giá trị ei, ai,j và ti,j
mà với chúng FASTEST-WAY sinh ra các giá trị li[j] như là l1[j] = 2 và l2[j] = 1 với
Trang 8vài số của trạm j Giả sử rằng tất cả các chi phí vận chuyển ti,j là không âm, hãy chỉ ra rằng giáo sư sai.
15.2 Phép nhân tổ hợp ma trận:
Ví dụ tiếp theo của quy hoạch động là một thuật toán giải quyết bài toán nhân
tổ hợp nhiều ma trận
Cho một dãy các ma trận A1, A2, …, An, ta cần tính A1.A2…An (1)
Ta có thể định lượng biểu thức (1) sử dụng thuật toán chuẩn để nhân lần lượt từng cặp
ma trận được đặt trong ngoặc đơn lại với nhau Một kết quả của phép nhân các ma trận
là một cách đặt các dấu ngoặc đơn trong phép nhân, là ngoặc đơn cho một ma trận với một phép nhân hoặc một cặp hai ma trận nhân với nhau Nhân nhiều ma trận là phép kết hợp, tất cả các cách kết hợp đều cho một ma trận kết quả
Ví dụ tổ hợp các ma trận đã cho là A1, A2, A3, A4, thì kết quả có thể thu được từ cách đặt dấu ngoặc trong phép nhân, có 5 cách như sau:
2 then error "chiều không thích hợp"
3 else for i 1 to rows[A]
Ta có thể nhân hai ma trận A và B nếu số cột của ma trận A bằng số hàng của
ma trận B Nếu ma trận A có kích thước là p.q, ma trận B có kích thước là q.r thì ma trận kết quả C có kích thước là p.r Thời gian để tính toán ma trận C được thể hiện bằng số các phép nhân vô hướng, là pqr Trong thuật toán trên, được thể hiện ở dòng 7
Để biểu thị giá của phép nhân ma trận với cách đặt các cách đặt ngoặc đơn khác nhau, ta xét bài toán với 3 ma trận A1, A2, A3 Giả sử rằng, các ma trận có kích thước tương ứng là: 10 × 100, 100 × 5, và 5 × 50
A1 với A2, 10.5.50 = 2500 phép nhân để nhân ma trận kết quả với A3, tổng cộng là 7500 phép nhân, tức là giá của phép nhân này là 7500
Trang 9- Nếu ta thực hiện (A1 (A2 A3)), ta cần thực hiện 100·5·50 = 25000 phép
tức là giá của phép nhân này là 75000
Đối chiếu hai cách trên, ta thấy cách thứ nhất nhanh hơn 10 lần so với cách thứ
2
Bài tốn nhân tổ hợp ma trận cĩ thể được phát biểu như sau:
Cho một tổ hợp các ma trận A1, A2, …., An Ma trận Ai cĩ chiều là pi-1×pi, hãy xác định cách thực hiện phép nhân A1.A2…An sao cho số phép nhân là ít nhất
Chú ý rằng trong bài tốn nhân tổ hợp ma trận, chúng ta thực sự khơng đi nhân ma trận, mà vấn đề là ta xác định trật tự của việc nhân ma trận sao cho chi phí thu được là nhỏ nhất.
Đếm số cách đặt dấu ngoặc đơn:
Trước khi giải quyết bài tốn nhân tổ hợp nhiều ma trận bằng quy hoạch động, chúng ta kiểm tra xem cĩ bao nhiêu cách đặt ngoặc đơn cĩ thể cần để thực hiện phép tính Biểu diễn số cách đặt ngoặc đơn để nhân n ma trận là P(n) Ta cĩ:
P
1
)1()
(
1)
(
Các bước giải quyết bài tốn nhân tổ hợp nhiều ma trận:
Bước 1: Cấu trúc của một tổ hợp dấu ngoặc tối ưu:
Bước 1 của phương pháp dynamic programming là:
• Xác định tính chất cấu trúc con tối ưu.
• Dựa vào đó xây dựng lời giải tối ưu cho bài toán từ các lời giải tối ưu cho các bài toán con
Ở đây:
Gọi Ai j là ma trận có được từ tích Ai Ai+1 ××× Aj.
Nhận xét: Một đóng ngoặc tối ưu bất kỳ của tích Ai Ai+1×××Aj đều có thể tách nó
giữa Ak và Ak+1, với k nào đó thõa i ≤ k < j :
(Ai Ai+1 ××× Ak )(Ak+1 ××× Aj )
Nghĩa là đầu tiên ta tính tích các ma trận Ai k và Ak+1 j , sau đó ta nhân chúng với nhau để có tích cuối cùng Ai j Do đó phí tổn để tính tích từ đóng ngoặc tối ưu là phí tổn để tính Ai k , cộng phí tổn để tính Ak+1 j , cộng phí
tổn để nhân chúng với nhau
° Cấu trúc con tối ưu
Nếu n = 1, Nếu n ≥ 2
Trang 10— Đóng ngoặc của chuỗi con “tiền tố” Ai Ai+1 ××× Ak có được từ đóng ngoặc tối ưu của Ai Ai+1 ××× Aj phải là một đóng ngoặc tối ưu của Ai
Ai+1 ××× Ak (Chứng minh bằng phản chứng).
— Tương tự, đóng ngoặc của chuỗi con còn lại Ak+1 Ak+2 ××× Aj có được từ đóng ngoặc tối ưu của Ai Ai+1 ××× Aj phải là một đóng ngoặc tối ưu của Ak+1 Ak+2 ××× Aj
Để cho gọn, sẽ nói “phí tổn của một đóng ngoặc” thay vì nói “phí tổn để tính tích từ một đóng ngoặc”
° Xây dựng lời giải tối ưu
— Chia bài toán thành hai bài toán con
— Tìm lời giải tối ưu cho mỗi bài toán con
— Kết hợp các lời giải tìm được ở trên
Cần tìm vị trí thích hợp (trị của k) để tách chuỗi ma trận Ai Ai+1 ××× Aj !
Bước 2: Giải đệ quy:
° Bước 2 của phương pháp quy hoạch động là:
— Định nghĩa đệ quy phí tổn của một lời giải tối ưu tùy theo các lời giải tối ưu của các bài toán con
° Bài toán con ở đây là : Xác định phí tổn tối thiểu cho một đóng ngoặc của
chuỗi ma trận Ai Ai+1××× Aj với 1 ≤ i ≤ j ≤ n.
° Định nghĩa m[i, j] là số phép nhân vô hướng tối thiểu để tính ma trận Ai j
Phân biệt hai trường hợp:
— Nếu i = j thì Ai Ai+1×××Aj = Ai Vậy, với i = 1, , n,
,
[
1 k j i
j k
Trang 11m[i, j] = m[i, k] + m[k + 1, j] + p i−1 p k p j
Bước 3: Tính các chi phí tối ưu
° Bước 3 của phương pháp dynamic programming là tính chi phí tối ưu bằng một phương pháp từ dưới lên (bottom-up) và dùng bảng
° Nhận xét :
— Có thể viết được ngay một giải thuật đệ quy (dựa trên hàm đệ quy đã
tìm được) để tính phí tổn tối ưu m[1, n] cho tính tích A1A2 ××× An
Nhưng sau này chúng ta sẽ thấy là giải thuật này chạy trong thời gian lũy thừa
Ma trận Ai có chiều là p i− 1× p i , với i = 1, 2, , n
Input: là một chuỗi p = < p0 , p1, , p n>
Output: Giải thuật trả về hai bảng m[1 n, 1 n] và s[1 n, 1 n].
1 n ¬ length[p] − 1
2 for i ¬ 1 to n
3 do m[i, i] ¬ 0
4 for l ¬ 2 to n { duyệt l, độ dài của Ai j}
° Thời gian chạy của MATRIX-CHAIN-ORDER là O(n3):
— Giải thuật có 3 vòng lặp lồng vào nhau, mỗi chỉ số của vòng lặp (l, i, và k) có thể có đến n trị.
° Giải thuật cần bộ nhớ Θ(n2) cho các bảng m và s
Trang 12Chạy MATRIX-CHAIN-ORDER với đầu vào:
Input:
Output: bảng m và s như hình dưới:
° Quay các bảng m và s một góc 45 độ ngược chiều kim đồng hồ
15,1 25
15,7 50 0
7,87 5
7,12 5 4,37 5
10,5 00
0
2,62 5
2,50 0 750
5,37 5
0
1,00 0 0
3,50 0 5,00 0
3
11
33
3
2
33
34
55
Trang 13Bước 4: Xây dựng một lời giải tối ưu
° Bảng s[1 n, 1 n] trữ một cách đóng ngoặc tối ưu do
MATRIX-CHAIN-ORDER tìm ra
° Thủ tục sau, MATRIX-CHAIN-MULTIPLY, trả về tích của chuỗi ma trận
Ai j khi cho A = 〈A1 , A2 , A3 , , An〉, bảng s, và các chỉ số i và j.
Trong bài toán tổng quát, chỉ cần gọi MATRIX-CHAIN-MULTIPLY(A, s, 1,
n) để tính tích của chuỗi ma trận A.
15.3 Các thành phần của quy hoạch động.
Mặc dầu chúng ta đi sâu tìm hiểu với 2 ví dụ của phương pháp quy hoạch động, nhưng ắt hẳn bạn sẽ suy nghĩ là khi nào sẽ ứng dụng phương pháp này Từ một gĩc độ khoa học, khi nào thì chúng ta nên tìm kiếm một giải pháp quy hoạch động cho một bài tốn? Trong mục này, chúng ta xem xét 2 vấn đề cốt yếu mà bài tốn tối ưu phải cĩ
để cho chương trình quy hoạch động cĩ thể áp dụng được: tối ưu cấu trúc con và độ thích hợp của các bài tốn con Chúng ta cũng phải xem xét một phương pháp biến, được gọi là memoization (1), chọn sự thuận lợi của thuộc tính tương thích giữa các bài tốn con
Cấu trúc con tối ưu.
Bước đầu tiên trong việc giải quyết một bài tốn tối ưu bằng quy hoạch động là
mơ tả cấu trúc của một giải pháp tối ưu Hãy nhớ lại một bài tốn đưa ra cấu trúc con
tối ưu nếu một giải pháp tối ưu cho một bài tốn bao gồm các giải pháp tối ưu cho các
bài tốn con trong phạm vi của nĩ Cứ mỗi khi một bài tốn đưa ra cấu trúc con tối ưu, thì nĩ là một tư tưởng (manh mối) tốt mà quy hoạch động cĩ thể áp dụng (Nĩ cũng cĩ nghĩa rằng chiến lược tham lam được áp dụng Xem Chương 16) Trong quy hoạch động, chúng ta xây dựng một giải pháp tối ưu cho một bài tốn từ các giải pháp tối ưu cho các bài tốn con Do đĩ, chúng ta phải thật cẩn thận để chắc chắn rằng dãy các bài tốn con mà chúng ta tính tốn đến chúng được sử dụng trong một giải pháp tối ưu
Chúng ta đã khám phá cấu trúc con tối ưu trong cả 2 mặt của các bài tốn mà chúng ta xem xét trong chương này ở một mức độ nhất định mà thơi Trong mục 15.1, chúng ta đã xem xét cách nhanh nhất qua trạm thứ j của 2 dây chuyền bao gồm cách nhanh nhất thơng qua trạm thứ j-1 trên 1 dây chuyền trong phạm vi của nĩ Trong mục 15.2, chúng ta đã xem xét việc đặt dấu ngoặc đơn tối ưu của dãy Ai Ai+1 Aj mà nĩ tách sản phẩm giữa Ak và Ak+1 bao gồm các giải pháp tối ưu cho các bài tốn của việc đặt dấu ngoặc đơn 2 dãy con Ai Ai+1 Ak và Ak Ak+1 Aj
Trang 14Bạn sẽ tìm chính bản thân bạn theo một mẫu chung trong việc khám phá cấu trúc con tối ưu:
giống như là chọn một trạm cho trước trên dây chuyền lắp ráp hoặc là chọn một chỉ mục (hoặc vị trí) mà tại đó ta cắt chuỗi ma trận Việc lựa chọn này tạo ra một hoặc nhiều bài toán con để được giải quyết
chọn mà nó dẫn đến một giải pháp tối ưu Bạn không cần bận tâm tới bằng cách nào xác định lựa chọn đó Bạn chỉ giả bộ rằng nó đã được đưa cho bạn
đó và cách để mô tả tốt nhất kết quả khoảng cách của các bài toán con
sử dụng trong giải pháp tối ưu cho bài toán mà bản thân chúng là phải tối ưu, bằng cách sử dụng một kỹ thuật “cắt và dán” Rồi bạn làm tiếp tục bằng cách giả định rằng mỗi giải pháp của một bài toán con không phải là tối ưu và sau đó lại xuất phát một mâu thuẫn Nói tóm lại, bằng cách “cắt ra” giải pháp bài toán con không tối ưu và “dán vào” giải pháp bài toán con tối ưu, bạn trình bày rằng bạn có thể có được một giải pháp tốt hơn cho một bài toán gốc, với việc phủ định giả định của bạn như vậy bạn đã có một giải pháp tối ưu Nếu có nhiều hơn một bài toán con, thì chúng là điển hình tương tự nhau mà luận cứ cắt và dán cho một bài toán con có thể được chỉnh sửa cho các bài toán con khác với
sự nỗ lực nhỏ
Để mô tả khoảng cách của các bài toán con, một quy tắt tốt đầu tiên là cố gắng giữ khoảng cách đó càng đơn giản có thể, và sau đó nới rộng nó khi cần thiết Ví dụ, khoảng cách giữa các bài toán con mà chúng ta tính toán đến cho việc lập chương trình
và S2,j Khoảng cách bài toán con đó đã làm việc tốt, và không cần phải thử lại một lần nữa khoảng cách tổng quát của các bài toán con
Ngược lại, giả định rằng chúng ta đã cố gắng ràng buộc khoảng cách bài toán con của chúng ta cho bài toán nhân các ma trận thành các sản phẩm ma trận theo mẫu
giữa Ak và Ak+1 trong đó 1≤ k ≤ j Nếu chúng ta không đảm bảo rằng k luôn luôn bằng j-1, thì chúng ta sẽ tìm thấy rằng chúng ta đã có các bài toán con theo mẫu A1 A2 Ak và
Ak+1 Ak+2 Aj, và bài toán con sau đó không phải là mẫu A1 A2 Aj Với bài toán này, điều cần thiết cho phép các bài toán con của chúng ta biến đổi tại “cả 2 điểm cuối”, điều đó có nghĩa là cho phép cả i và j để biến đổi trong bài toán con Ai Ai+1 Aj
Cấu trúc con tối ưu biến thiên giữa các vùng bài toán theo 2 cách:
ưu cho một bài toán gốc, và
định bài toán con nào sử dụng trong một giải pháp tối ưu
Trong bài toán lập trình cho dây chuyền lắp ráp, một giải pháp tối ưu chỉ dùng cho 1 bài toán con, nhưng chúng ta phải tính toán đến 2 lựa chọn để xác định một giải pháp tối ưu Để tìm cách nhanh nhất thông qua trạm Si,j, chúng ta sử dụng hoặc là cách
Trang 15nhanh nhất thông qua S1,j-1 hoặc là cách nhanh nhất thông qua S2,j-1, với mỗi cách ta trình bày một bài toán con mà chúng ta phải giải quyết một cách tối ưu Bài toán nhân chuỗi các ma trận với chuỗi con Ai Ai+1 Aj cung cấp như một ví dụ với 2 bài toán con
chúng ta có 2 bài toán con – đặt dấu ngoặc đơn cho Ai Ai+1 Ak và đặt dấu ngoặc đơn cho Ak Ak+1 Aj – và chúng ta phải giải quyết cả 2 bài toán này một cách tối ưu Một lần nữa chúng ta xác định các giải pháp tối ưu cho các bài toán con, chúng ta sẽ chọn các
vị trí thích hợp trong khoảng j-i cho chỉ mục k
Thông thường, thời gian chạy của một thuật toán quy hoạch động dựa vào sản phẩm của 2 nhân tố: số lượng tất cả các bài toán con và có bao nhiêu lựa chọn mà chúng ta tìm thấy cho mỗi bài toán con Trong bài toán lập trình cho dây chuyền lắp ráp, chúng ta có Θ (n) tất cả các bài toán con, và chỉ có 2 lựa chọn để xem xét mỗi bài toán con đó, sinh ra một Θ (n) thời gian chạy Với bài toán nhân chuỗi các ma trận, có
Θ (n2) tất cả các bài toán con, và trong mỗi bài toán con đó chúng ta có nhiều nhất n-1 lựa chọn, cho ra Θ (n3) thời gian chạy
Quy hoạch động dùng cấu trúc con tối ưu theo dạng từ dưới lên Điều đó có nghĩa là, đầu tiên chúng ta tìm thấy các giải pháp tối ưu cho các bài toán con, và giải quyết các bài toán con đó, rồi chúng ta tìm giải pháp tối ưu cho bài toán Việc tìm ra một giải pháp tối ưu cho bài toán đòi hỏi một sự lựa chọn giữa các bài toán con để chúng ta có thể sử dụng các bài toán con đó để giải quyết bài toán Chi phí của một giải pháp bài toán thường là các chi phí của bài toán con cộng với một chi phí mà có thể quy trực tiếp cho sự lựa chọn chính nó Trong bài toán lập trình cho dây chuyền lắp ráp, ví dụ, đầu tiên chúng ta giải quyết các bài toán con của việc tìm cách nhanh nhất thông qua trạm S1,j-1 và S2,j-1, rồi sau đó chúng ta chọn một trong các trạm đó như một
có lựa chọn các dòng giữa j-1 và j hay không; chi phí này là ai,j nếu chúng ta đứng trên cùng một dây chuyền và nếu chúng ta đứng trên hai dây chuyền khác nhau, i khác i', thì chi phí là ti’,j-1 + ai,j Trong bài toán nhân chuỗi các ma trận, chúng ta xác định những việc đặt dấu ngoặc đơn tối ưu cho các chuỗi con Ai Ai+1 Aj, rồi sau đó chúng ta
thân nó là số hạng pi-1 pk pj
Trong chương 16, chúng ta sẽ nghiên cứu “các thuật toán tham lam”, chúng có nhiều điểm tương tự với quy hoạch động Nói tóm lại, các bài toán áp dụng các thuật toán tham lam có cấu trúc con tối ưu Một điểm khác biệt nổi bật giữa các thuật toán
và quy hoạch động là trong các thuật toán tham lam, chúng ta sử dụng cấu trúc con tối
ưu theo dạng từ trên xuống Thay vì đầu tiên tìm các giải pháp tối ưu cho các bài toán con rồi sau đó lựa chọn, thì các thuật toán tham lam đầu tiên lại lựa chọn – lựa chọn được xem là tốt nhất tại thời điểm đó – rồi sau đó giải quyết một đáp số của bài toán con
Các điểm tinh tế.
Thứ nhất nên cẩn thận không giả định rằng bài toán con tối ưu được áp dụng khi không phải là nó Hãy tính toán theo 2 bài toán mà chúng ta được cho trong một đồ thị có hướng G = (V, E) và các đỉnh u,v ϵ V
đỉnh u đến đỉnh v sao cho ít cạnh nhất Như một đường đi phải đơn giản, lúc
Trang 16đó bỏ đi một chu trình từ một đường đi kéo dài tới một đường đi với ít cạnh hơn.
- Đường đi đơn giản dài nhất không trọng số: tìm một đường đi
đơn giản từ đỉnh u đến đỉnh v sao cho nhiều cạnh nhất Chúng ta cần tính đến yêu cầu của tính đơn giản bởi vì nếu không thì chúng ta có thể đi qua một chu trình càng nhiều lần mà chúng ta muốn để tạo các đường đi với một
số lượng lớn một cách tùy tiện của các cạnh
Bài toán đường đi ngắn nhất không trọng số trình bày theo cấu trúc con tối ưu Giả định rằng u ≠ v, thì bài toán này này không đáng kể Sau đó bất kỳ đường đi p từ u đến v phải chứa một đỉnh trung gian, gọi là w (Chú ý rằng w có thể là u hoặc v.) Theo
Rõ rang rằng, số lượng các cạnh trong p là bằng tổng số các cạnh trong p1 với các cạnh trong p2 Chúng ta khẳng định rằng nếu p là một đường đi (i.e., ngắn nhất) tối ưu từ u đến v, thì p1 phải là đường đi ngắn nhất từ u tới w Tại sao như
tới w với số cạnh ít hơn p1 thì chúng ta có thể cắt p1 ra và dán vào p’1 để sinh ra một
Tương tự, p2 cũng phải là đường đi ngắn nhất từ w đến v Như vậy, chúng ta có thể tìm một đường đi ngắn nhất từ u đến v bằng cách tính đến tất cả các đỉnh trung gian w, việc tìm một đường đi ngắn nhất từ u tới w và đường đi ngắn nhất từ w tới v, và việc chọn một đỉnh trung gian w mà nó sinh ra toàn bộ đường đi ngắn nhất Trong mục 25.2, chúng ta sử dụng một biến của tọa độ đó của cấu trúc con tối ưu để tìm một đường đi ngắn nhất giữa mỗi cặp của các đỉnh trên một đồ thị có hướng có trọng số
Thật là lôi cuốn để giả định rằng bài toán của việc tìm đường đi đơn giản dài nhất không trọng số trình bày theo cấu trúc con tối ưu cũng được Xét cho cùng, nếu
, thì có phải p1 là đường đi đơn giản dài nhất từ u tới w, và có phải p2
là đường đi đơn giản dài nhất từ w tới v hay không? Câu trả lời là không! Hình 15.4 là một ví dụ Hãy tính đường đi q r t, là đường đi đơn giản dài nhất từ q đến t Có phải q r là đường đi đơn giản dài nhất từ q tới r hay không? Không phải, cho đường
đi q s t r là đường đi đơn giản thì nó dài hơn Vậy thì có phải r t là đường
đi đơn giản dài nhất từ r tới t hay không? Cũng không, cho đường đi r q s t là đường đi đơn giản thì nó dài hơn
Hình 15.4
Trang 17Hình 15.4: Một đồ thì có hướng cho thấy rằng bài toán tìm đường đi đơn giản dài nhất trong đồ thị có hướng không trọng số không có cấu trúc con tối ưu Đường đi
q r t là đường đi đơn giản dài nhất từ q đến t, nhưng đường đi con q r không phải là đường đi đơn giản dài nhất từ q đến r, và cũng không phải đường đi con r t
là đường đi đơn giản dài nhất từ r đến t
Thí dụ này cho thấy với các đường đi đơn giản dài nhất, không chỉ là thiếu cấu trúc con tối ưu, mà chúng ta còn không thể thu thập một cách tất yếu một giải pháp
“hợp lệ” cho bài toán từ các giải pháp cho các bài toán con Nếu chúng ta kết hợp các đường đi đơn giản dài nhất q s t r và r q s t, chúng ta thu được đường đi q s t r q s t, nó không phải là đơn giản Thật vậy, bài toán tìm một đường đi đơn giản dài nhất không trọng số không xuất hiện để có bất kỳ phần nào cấu trúc con tối ưu Thuật toán quy hoạch động không hiệu quả với bài toán này
đã được thấy Thực tế là, bài toán này là NP-đầy đủ, - chúng ta sẽ xem ở chương 34 -
có nghĩa là nó không chắc rằng nó có thể được giải quyết trong đa thức thời gian
Vậy cái gì thật sự khác nhau giữa cấu trúc con của đường đi đơn giản dài nhất với cấu trúc con của đường đi ngắn nhất? Mặc dầu hai bài toán con được sử dụng trong một giải pháp cho một bài toán cho cả hai đường đi ngắn nhất và dài nhất, thì các bài toán con trong việc tìm đường đi đơn giản dài nhất là không độc lập, trong khi
đó với các đường đi ngắn nhất thì chúng lại độc lập Cái gì mà chúng ta nghĩ rằng các bài toán con là độc lập? Chúng ta nghĩ rằng giải pháp cho một bài toán con không ảnh hưởng đến bài toán con khác của cùng một bài toán Ví dụ của hình 15.4, chúng ta có bài toán tìm đường đi đơn giản dài nhất từ q tới t với hai bài toán con: tìm các đường
đi đơn giản dài nhất từ q đến r và từ r đến t Với bài đầu tiên của các bài toán con này
là chúng ta chọn đường đi q s t r, và chúng ta cũng sử dụng các đỉnh s và t Chúng ta có thể không sử dụng các đỉnh này trong bài toán thứ hai, từ đó sự phối hợp của hai giải pháp cho các bài toán con sẽ sinh ra một đường đi mà đường đi đó không phải là đơn giản Nếu chúng ta không thể dùng đỉnh t trong bài toán thứ hai, thì sau đó chúng ta sẽ không thể giải quyết được nó tất cả, vì t được yêu cầu phải nằm trên đường
đi mà chúng ta tìm, và nó không phải là đỉnh mà tại đó chúng ta “ghép nối” các giải pháp bài toán con lại với nhau (đỉnh đó là r) việc sử dụng các đỉnh s và t của chúng ta trong một giải pháp bài toán con ngăn cản chúng được sử dụng trong giải pháp bài toán con khác Chúng ta phải dùng ít nhất một trong số chúng để giải quyết bài toán con khác, tuy nhiên, chúng ta phải dùng cả hai để giải quyết nó một cách tối ưu Vì vậy chúng ta nói rằng các bài toán con là không độc lập Hãy xem xét một cách khác, việc sử dụng các tài nguyên của chúng ta trong việc giải quyết một bài toán con (những tài nguyên đó là các đỉnh) đã làm cho (hoàn trả) chúng không dùng được cho bài toán con khác
Vậy thì tại sao các bài toán con lại độc lập với việc tìm đường đi ngắn nhất? Câu trả lời đó là hiển nhiên, vì các bài toán con không chia sẻ các tài nguyên Chúng ta khẳng định rằng nếu một đỉnh w là một đường đi ngắn nhất p từ u tới v, thì chúng ta có
nào với nhau để sinh ra một đường đi ngắn nhất từ u đến v Chúng ta được đảm bảo rằng, ngoài w, không có đỉnh nào có thể xuất hiện trong cả hai đường đi p1 và
p2 Tại sao vậy? Giả sử rằng có đỉnh x≠w xuất hiện trong cả hai đường đi p1 lẫn p2,
Trang 18Bằng cấu trúc con tối ưu của bài toán này, đường đi p có càng nhiều cạnh p1 và p2 với nhau; chúng ta nói rằng p có e cạnh Bây giờ chúng ta hãy xây dựng một đường đi
từ u đến v Đường đi này có nhiều nhất e-2 cạnh, mà chúng mâu thuẫn với giả thiết rằng p là đường đi ngắn nhất Như vậy, chúng ta được đảm bảo rằng các bài toán con của bài toán tìm đường đi ngắn nhất là độc lập
Cả hai bài toán đã xem xét trong mục 15.1 và 15.2 có các bài toán con độc lập Trong chuỗi ma trận cấp nhân, các bài toán con là các chuỗi con cấp nhân Ai Ai+1 Ak
và Ak+1 Ak+2 Aj Các chuỗi con này bị tách rời ra, vì vậy không có ma trận nào có thể chứa đựng được cả hai trong chúng Trong việc lập trình đường thẳng hội tụ, để quyết
qua các trạm S1,j-1 và S2,j-1 Bởi vì giải pháp cho cách nhanh nhất thông qua trạm Si,j của chúng ta sẽ bao gồm chỉ một trong các giải pháp bài toán con này, bài toán con đó là độc lập một cách tự nhiên với tất cả các bài toán con khác được sử dụng trong giải pháp đó
Sự chồng lấp của các bài toán con (Các bài toán con gối nhau)
Thành phần thứ hai mà một bài toán tối ưu phải có để quy hoạch động có thể ứng dụng được là khoảng cách của các bài toán con phải là “nhỏ” trong ngữ cảnh mà một thuật toán đệ quy cho một bài toán giải quyết các bài toán con tương tự lặp đi lặp lại, hơn thế nữa thường phát sinh ra các bài toán con mới Điển hình, tổng số lượng của sự khác biệt của các bài toán con là một đa thức trong kích thước đầu vào Khi một thuật toán đệ quy giải quyết lại một bài toán tương tự lặp đi lặp lại lần nữa, chúng ta gọi bài toán tối ưu đó có sự chồng lấp của các bài toán con (3) Ngược lại, một bài toán
mà nó thích hợp với phương pháp “chia để trị” thường sinh ra các bài toán mới tại mỗi bước của đệ quy Các thuật toán quy hoạch động mang lại thuận lợi của sự chồng lấp của các bài toán con bằng cách giải quyết mỗi bài toán con một lần và sau đó lưu trữ giải pháp đó trong một bảng nơi mà nó có thể được tìm thấy khi cần thiết, sử dụng hằng số thời gian cho mỗi sự tìm kiếm
Trong mục 15.1, chúng ta đã khảo sát một cách ngắn gọn cách mà một giải pháp đệ quy cho lập trình dây chuyền lắp ráp tạo ra 2n-j tham chiếu tới fi[j] với j=1,
2, , n Giải pháp dạng bảng của chúng ta làm cho thuật toán đệ quy với thời gian số
mũ xuống còn thời gian đường thẳng
Để minh họa thuộc tính của sự chồng lấp của các bài toán con một cách chi tiết hơn, chúng ta hãy xem xét lại bài toán nhân chuỗi các ma trận Tham chiếu lại hình 15.3, để ý rằng thủ tục MATRIX- CHAIN-ORDER lặp đi lặp lại việc tìm kiếm giải pháp cho các bài toán con ở các hàng thấp hơn khi giải quyết các bài toán con ở các hàng cao hơn Ví dụ, mục m[3,4] được tham chiếu tại 4 thời điểm: trong suốt sự tính toán của m[2,4], m[1,4], m[3,5], và m[3,6] Nếu m[3,4] được tính toán lại tại mỗi thời điểm, hơn thế nữa chỉ được tìm kiếm, thì sự tăng trưởng của thời gian chạy sẽ gây nên đột biến Để thấy điều này, tính toán theo thủ tục đệ quy (không hiệu quả) xác định m[i,j], số lượng nhỏ nhất của các phép nhân vô hướng cần thiết để tính toán sản phẩm chuỗi ma trận Ai j= Ai Ai+1 Aj Thủ tục này trực tiếp dựa vào phép truy hồi (15.12)
RECURSIVE-MATRIX-CHAIN (p, i, j)
1 if i = j
Trang 19MATRIX-Hình 15.5 hiển thị cây đệ quy đã được xử lý bởi lời gọi MATRIX-CHAIN(p,1,4) Mỗi nút được gán nhãn bởi các giá trị của các tham số i và j Quan sát thấy rằng một vài cặp các giá trị xuất hiện nhiều lần.
RECURSIVE-Nói tóm lại, chúng ta có thể thấy rằng thời gian để tính m[1,n] bằng thủ tục đệ quy này ít nhất là hàm số mũ với n Gọi T(n) là thời gian được tạo bởi RECURSIVE-MATRIX-CHAIN để tính toán việc đặt dấu ngoặc đơn tối ưu của một chuỗi của n ma trận Nếu chúng ta giả định rằng sự thực hiện của dòng 1-2 và của dòng 6-7 tạo ra ít nhất mỗi một đơn vị thời gian, thì sau đó sự kiểm tra của thủ tục sinh ra phép truy hồi
n-1
T(n) ≥ 2 ∑ T(i) + n (15.3)
i=1