Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 38 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
38
Dung lượng
619 KB
Nội dung
Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 QUY 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: 1. Mô tả cấu trúc của giải pháp tối ưu. 2. Định nghĩa giá trị của một giải pháp tối ưu theo cách đệ quy. 3. Tính toán giá trị của một giải pháp tối ưu theo kiểu từ dưới lên. 4. Xây dựng một giải pháp tối ưu từ các dữ liệu đã tính toán. 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 đoàn Motors Colonel sản xuất ô-tô trong một nhà máy mà nó có 2 dây chuyền lắp ráp, Trang 1 Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 đượ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 S i,j . Trạm thứ j trên dây chuyền 1 (S 1,j ) thực hiện chức năng tương tự như trạm thứ j trên dây chuyền 2 (S 2,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 S i,j bằng a i,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à e i 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à x i 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à S i,j và thời gian lắp ráp tại mỗi trạm là a i,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 e i 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 t i,j để vận chuyển tới một dây chuyền khác sau trạm S i,j . Sau khi đi ra trạm thứ n trên một dây chuyền, nó tốn mất x i 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 S i,j là t i,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 2 Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 chiế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.2 Hì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í e i , a i,j , t i,j và x i được biểu thị. Đường đi in bóng đậm biểu thị cách nhanh nhất đi qua nhà máy. (b) Giá trị của f i [j], f * , l i [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 phải mất bao lâu để nó đưa một khung gầm xe đi qua nhà máy. Thậy không may, có 2 n 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ó 2 n các tập con như vậy. Theo cách đó, việc xác định cách nhanh nhất đi qua nhà máy 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 Ω(2 n ) 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 để đưa vào từ điểm bắt đầu thông qua trạm S 1,j . Nếu j = 1, chỉ có một cách mà khung gầm 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 S 1,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 S 1,j-1 và sau đó đi trực tiếp đến S 1,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, khung gầm xe có thể được đưa đến từ trạm S 2,j-1 và sau đó được vận chuyển đế trạm Trang 3 Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 S 1,j , thời gian vận chuyển là t 2,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. Đầu tiên, chúng ta giả sử rằng cách nhanh nhất qua trạm S 1,j là thông qua trạm S 1,j-1 . Điều mấu chốt của sự quan sát là khung gầm xe phải thu được cách nhanh nhất từ điểm bắt đầu thông qua trạm S 1,j-1 . Tại sao như vậy? Nếu có cách nhanh hơn để đi qua trạm S 1,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 S 1,j : mâu thuẫn. Tương tự, bây giờ chúng ta giả sử rằng cách nhanh nhất đi qua trạm S 1,j là qua trạm S 2,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 S 2,j-1 . Lý do tương tự: nếu có cách nhanh hơn để đi qua trạm S 2,j- 1 , chúng ta có thể thay thế cách nhanh hơn này để sinh ra cách nhanh hơn đi qua trạm S 1,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 S i,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 S 1,j-1 hoặc là trạm S 2,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 S 1,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 S 1,j là: •Hoặc là cách nhanh nhất đi qua trạm S 1,j-1 và sau đó đi trực tiếp qua trạm S 1,j . •Hoặc là cách nhanh nhất đi qua trạm S 2,j-1 , vận chuyển từ dây chuyền 2 sang dây chuyền 1, và sau đó đi qua trạm S 1,j . Sử dụng lập luận đối xứng, cách nhanh nhất đi qua trạm S 2,j là: •Hoặc là cách nhanh nhất đi qua trạm S 2,j-1 và sau đó đi trực tiếp qua trạm S 2,j . •Hoặc là cách nhanh nhất đi qua trạm S 1,j-1 , vận chuyển từ dây chuyền một sang dây chuyền 2, và sau đó đi qua trạm S 2,j . Để giải quyết bài toán của việc tìm cách nhanh nhất qua trạm j của 1 trong 2 dây chuyền, chúng ta giải quyết các bài toán con của việc tìm các cách nhanh nhất đi qua trạm j-1 on cả 2 dây chuyền. 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. f i [j] để Trang 4 Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 biể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 S i,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 khung gầm xe vào tất cả các cách đi qua nhà máy, mà chúng ta biểu thị bằng f * . Khung 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ó: (15.1) f * = min(f 1 [n] + x 1 , f 2 [n] + x 2 ) Điều này cũng dễ dàng để lý giải về f 1 [1] và f 2 [1]. Để đưa qua trạm 1 trên một trong 2 dây chuyền, một khung gầm xe phải đi trực tiếp đến trạm đó. Theo cách đó, (15.2) f 1 [1] = e 1 + a 1,1 (15.3) f 1 [1] = e 2 + a 2,1 Bây giờ chúng ta hãy tính xem bằng cách nào để tính f i [j], với j = 2, 3, , n (và i = 1, 2). Tiêu điểm là f 1 [j], chúng ta nhớ lại rằng cách nhanh nhất qua trạm S 1,j là cách nhanh nhất qua trạm S 1,j-1 và sau đó trực tiếp qua trạm S 1,j , hoặc là cách nhanh nhất qua trạm S 2,j-1 , vận chuyển từ dây chuyền 2 sang dây chuyền 1, và sau đó qua trạm S 1,j . Trong trường hợp đầu tiên, chúng ta có f 1 [j] = f 1 [j-1] + a 1,j , và trong trường hợp sau là f 1 [j] = f 2 [j-1] + t 2,j-1 + a 1,j . Theo cách đó, (15.4) f 1 [j] = min(f 1 [j-1] + a 1,j , f 2 [j-1] + t 2,j-1 + a 1,j ) Với j = 2, 3, , n. Đối xứng, chúng ta có (15.5) f 2 [j] = min(f 2 [j-1] + a 2,j , f 1 [j-1] + t 1,j-1 + a 2,j ) Với j = 2, 3, , n. Phối hợp 2 phương trình (15.2)-(15.5), chúng ta thu được các phương trình đệ quy: Hình 15.2(b) cho thấy các giá trị f i [j] cho ví dụ của phần (a), được tính toán bằng các phương trình (15.6) và (15.7), dọc theo với các giá trị của f * . Các giá trị f i [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 định nghĩa l i [j] là số dây chuyền, 1 hoặc 2, mà các trạm của chúng được dùng trong cách nhanh nhất đi qua trạm S i,j . Ở đây, i = 1, 2 và j = 2, 3, , n. (Chúng ta ngăn ngừa việc định nghĩa l i [1] bởi vì không có trạm nào trước trạm 1 trên một trong 2 dây chuyền). Chúng ta cũng định nghĩa l * là một dây chuyền mà trạm n của chúng được dùng trong cách nhanh nhất đi qua toàn bộ nhà máy. Các giá trị l i [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à l i [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 S 1,6 . Bây giờ chúng ta thấy l 1 [6], nó bằng 2, và vì vậy chúng ta sử dụng trạm S 2,5 . Tiếp tục, chúng ta thấy l 2 [5] = 2 (sử dụng trạm S 2,4 ), l 2 [4] = 1 (trạm S 1,3 ), l 1 [3] = 2 (trạm S 2,2 ), và l 2 [2] = 1 (trạm S 1,1 ). Bước 3: Tính toán các thời gian nhanh nhất. Trang 5 Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 Tạ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ó là một hàm mũ với n. Để thấy tại sao, hãy xem r i (j) là số lượng của các tham chiếu được tạo bởi f i [j] trong một thuật toán đệ quy, từ phương trình (15.1) chúng ta có (15.8) r 1 (n) = r 2 (n) = 1 Từ các phép truy toán (15.6) và (15.7) chúng ta có (15.9) r 1 (j) = r 2 (j) = r 1 (j-1) + r 2 (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, r i (j) = 2 n-j . Theo cách đó, chỉ một mình f 1 [1] được tham chiếu 2 n-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ị f i [j] là Θ(2 n ). Chúng ta có thể làm tốt hơn nếu chúng ta tính các giá trị f i [j] theo một thứ tự khác biệt từ cách đệ quy. Để ý rằng với j ≥ 2, mỗi giá trị của f i [j] chỉ phụ thuộc vào các giá trị của f 1 [j-1] và f 2 [j-1]. Bằng cách tính các giá trị của f i [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ị a i,j , t i,j , e i , x i , cũng như là n, số lượng các trạm của mỗi dây chuyền. FASTEST-WAY (a, t, e, x, n) 1 f 1 [1] e 1 + a 1,1 2 f 2 [2] e 2 + a 2,1 3 for j 2 to n do 4 if f 1 [j-1] + a 1,j ≤ f 2 [j-1] + t 2,j-1 + a 1,j 5 then f 1 [j] f 1 [j-1] + a 1,j 6 l 1 [j] 1 7 else f 1 [j] f 2 [j-1] + t 2,j-1 + a 1,j 8 l 1 [j] 2 9 if f 2 [j-1] + a 1,j ≤ f 1 [j-1] + t 2,j-1 + a 1,j 10 then f 2 [j] f 2 [j-1] + a 1,j 11 l 2 [j] 2 12 else f 2 [j] f 1 [j-1] + t 2,j-1 + a 1,j 13 l 2 [j] 1 14 if f 1 [n] + x 1 ≤ f 2 [n] + x 2 15 then f * = f 1 [n] + x 1 16 l * = 1 17 else f * = f 2 [n] + x 2 16 l * = 2 Thủ tục FASTEST-WAY làm việc theo cách sau. Các dây chuyền 1-2 tính f 1 [1] và f 2 [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 f i [j] và l i [j] với i = 1, 2 và j = 2, 3, , n. Các dòng 4 đến 8 tính f 1 [j] và l 1 [j] sử dụng phương trình (15.4), và các dòng 9 đến 13 tính f 2 [j] và l 2 [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 6 Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 lặ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 f i [j] và l i [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ị f i [j] và l i [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 f i [j], chúng ta cần các giá trị f 1 [j-1] và f 2 [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ị f i [j], f * , l i [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. PRINT-STATIONS (l, n) 1 i l * 2 print “line” i “, station ” n 3 for j n downto 2 4 do i l i [j] 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à Line 1, station 6 Line 2, station 5 Line 2, station 4 Line 1, station 3 Line 2, station 2 Line 1, station 1 Bài tập: 15.1-1: Hãy trình bày cách chỉnh sửa thủ tục PRINT-STATIONS để in ra các trạm theo thứ tự tăng dần số của trạm. (Gợi ý: sử đụng đệ quy) 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 r i (j), số lượng các tham chiếu được tạo ra từ f i [j] trong thuật toán đệ quy, bằng 2 n-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ị f i [j], hoặc ∑ = 2 1i ∑ = n j 1 r i (j) , bằng chính xác 2 n+1 – 2. 15.1-4: Kết hợp với, các giá trị f i [j] và l i [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 tổng của 2n+2 các mục nhập, trong khi vẫn tính được f * và vẫn có thể in tất cả các 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ị e i , a i,j và t i,j mà với chúng FASTEST-WAY sinh ra các giá trị l i [j] như là l 1 [j] = 2 và l 2 [j] = 1 với Trang 7 Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_________________________________Nhóm 3 vài số của trạm j. Giả sử rằng tất cả các chi phí vận chuyển t i,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 A 1 , A 2 , …, A n , ta cần tính A 1 .A 2 …A n . (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à A 1 , A 2 , A 3 , A 4 , 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: (A 1 (A 2 (A 3 A 4 ))) , (A 1 ((A 2 A 3 ) A 4 )) , ((A 1 A 2 ) (A 3 A 4 )) , ((A 1 (A 2 A 3 )) A 4 ) , (((A 1 A 2 ) A 3 ) A 4 ). Mỗi cách mà chúng ta đặt các ma trận trong dấu ngoặc đơn có thể ảnh hưởng đến kết quả tính toán (số phép tính). Đầu tiên để ý đến cái giá thu được khi nhân hai ma trận. Thuật toán chuẩn được cho bởi đoạn mã giả sau, trong đó rows[A] là số hàng của ma trận A, columns[A] là số cột của ma trận A. MATRIX-MULTIPLY(A, B) 1 if columns[A] ≠ rows[B] 2 then error "chiều không thích hợp" 3 else for i 1 to rows[A] 4 do for j 1 to columns[B] 5 do C[i, j] 0 6 for k 1 to columns[A] 7 do C[i, j] C[i, j] + A[i, k] · B[k, j] 8 return C 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 A 1 , A 2 , A 3 . 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. - Nếu thực hiện ((A 1 A 2 ) A 3 ), ta cần 10.100.5 = 5000 phép nhân để nhân A 1 với A 2 , 10.5.50 = 2500 phép nhân để nhân ma trận kết quả với A 3 , 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 8 Tiểu luận PT&TKTT: Thuật tốn Quy hoạch động_________________________________Nhóm 3 - Nếu ta thực hiện (A 1 (A 2 A 3 )), ta cần thực hiện 100·5·50 = 25000 phép nhân để nhân A 2 với A 3 , thêm vào đó là 10·100·50 = 50000 phép nhân để nhân A 1 với ma trận tích trên, và có tổng cộng là 75000 phép nhân, 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 A 1 , A 2 , …., A n . Ma trận A i có chiều là p i-1 ×p i , hãy xác định cách thực hiện phép nhân A 1 .A 2 …A n 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ó: − = ∑ = n k kPkP nP 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 A i j là ma trận có được từ tích A i A i+1 ××× A j. Nhận xét: Một đóng ngoặc tối ưu bất kỳ của tích A i A i+1 ×××A j đều có thể tách nó giữa A k và A k+1 , với k nào đó thõa i ≤ k < j : (A i A i+1 ××× A k )(A k+1 ××× A j ) Nghóa là đầu tiên ta tính tích các ma trận A i k và A k+1 j , sau đó ta nhân chúng với nhau để có tích cuối cùng A i j . Do đó phí tổn để tính tích từ đóng ngoặc tối ưu là phí tổn để tính A i k , cộng phí tổn để tính A k+1 j , cộng phí tổn để nhân chúng với nhau. ° Cấu trúc con tối ưu Trang 9 Nếu n = 1, Nếu n ≥ 2. Tiểu luận PT&TKTT: Thuật tốn Quy hoạch động_________________________________Nhóm 3 — Đóng ngoặc của chuỗi con “tiền tố” A i A i+1 ××× A k có được từ đóng ngoặc tối ưu của A i A i+1 ××× A j phải là một đóng ngoặc tối ưu của A i A i+1 ××× A k . (Chứng minh bằng phản chứng). — Tương tự, đóng ngoặc của chuỗi con còn lại A k+1 A k+2 ××× A j có được từ đóng ngoặc tối ưu của A i A i+1 ××× A j phải là một đóng ngoặc tối ưu của A k+1 A k+2 ××× A j . Để 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 A i A i+1 ××× A j ! 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 A i A i+ 1 ××× A j 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 A i j . Phân biệt hai trường hợp: — Nếu i = j thì A i A i+ 1 ×××A j = A i . Vậy, với i = 1, , n, m[i, i] = 0. — Nếu i < j thì từ bước 1 ta có: m[i, j] = m[i, k] + m[k + 1, j] + p i − 1 p k p j Vậy, ta có: Để ghi lại cách xây dựng lời giải tối ưu ta đònh nghóa s[i, j] là trò của k xác đònh nơi tách chuỗi A i A i +1 ××× A j để có một đóng ngoặc tối ưu. Nghóa là s[i, j] là một trò k mà Trang 10 +++ = − <≤ }],1[],[{min 0 ],[ 1 jki jki pppjkmkim jim Nếu i=j, Nếu i<j. [...]... 1, n) ít nhất là hàm số mũ với n So sánh thuật tốn đệ quy từ dưới lên này với thuật tốn quy hoạch động từ dưới lên Thuật tốn sau hiệu quả hơn bởi vì nó mang lại sự thuật lợi của thuộc tính sự chồng lấp của các bài tốn con Chỉ có Θ(n 2) bài tốn con khác nhau, thuật tốn quy hoạch động giải quy t một cách chính xác mỗi một bài tốn con đó Mặt khác, thuật tốn đệ quy chỉ giải một cách lặp đi lặp lại mỗi... 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 11 Tiểu luận PT&TKTT: Thuật tốn Quy hoạch động _Nhóm 3 Chạy MATRIX-CHAIN-ORDER với đầu vào: ma trận A1 A2 A3 A4 A5 A6 Input: chiều 30 × 35 35 × 15 15 × 5 5 × 10 10 × 20 20 × 25 Output: bảng m và s như hình dưới: ° Quay các bảng m và s... “các thuật tố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 tốn áp dụng các thuật tố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 tốn và quy hoạch động là trong các thuật tố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 tốn con rồi sau đó lựa chọn, thì các thuật. .. nối kết bất kỳ đường dẫn ngắn nhất và bất kỳ đường đi ngắn nhất 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, ngồi w, khơng có đỉnh nào có thể xuất hiện trong cả hai đường đi p 1 và p2 Tại sao vậy? Giả sử rằng có đỉnh x≠w xuất hiện trong cả hai đường đi p 1 lẫn p2, chúng ta có thể phân tích p1 thành Trang 17 và p2 thành Tiểu luận PT&TKTT: Thuật tốn Quy hoạch động. .. return Ai 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?... 20 Tiểu luận PT&TKTT: Thuật tốn Quy hoạch động _Nhóm 3 chọn với một giải pháp cho một bài tốn cho trước Bằng cách lưu trữ trong s[i, j] chỉ số của ma trận mà tại đó chúng ta chia tách sản phẩm A i Ai+1 Aj, chúng ta có thể tái thiết mỗi lựa chọn với O(1) thời gian Memoization (lưu trữ) Có một biến của quy hoạch động mà biến đó thường đưa ra hiệu quả của hướng tiếp cận quy hoạch động thơng... khơng hiệu quả với thuật tốn đệ quy Do trong quy hoạch động, chúng ta sử dụng một bảng với các giải pháp bài tốn con, nhưng cấu trúc điều khiển cho việc điền vào bảng là giống với thuật tốn đệ quy hơn Một thuật tốn đệ quy lưu trữ sử dụng việc nhập vào bảng với giải pháp cho mỗi bài tốn con Mỗi một mục nhập bảng ban đầu chứa một giá trị đặc biệt để chỉ ra rằng mục nhập chưa được nhập vào Khi một bài tốn... (lưu trữ), thuật tốn đệ quy tự nhiên chạy với hàm số mũ thời gian, vì vậy các bài tốn con đã giải quy t được giải quy t lặp đi lặp lại nhiều lần Trong thực tế nói chung, nếu tất cả các bài tốn con phải được giải quy t ít nhất đúng 1 lần, thì thuật tốn quy hoạch động từ dưới lên thường làm tốt hơn thuật tốn lưu trữ từ trên xuống bằng một thừa số khơng đổi, bởi vì nó khơng có liên quan với đệ quy và ít liên... GIẢI MỘT SỐ BÀI TỐN QUY HOẠCH ĐỘNG Bài 1:Giải quy t bài tốn người bán hàng ( bài tốn Bitonic) Giải quy t bài tốn người bán hang di động bài tốn người bán hành lưu động là theo một chu trình khép kín, với chuyến đi là kết nối một điểm cho sẵn của n điểm trên một mặt phẳng Hình 15.9 (a) chỉ vấn đề giải quy t đến một điểm số 7 vấn đề chung là hồn thành NP và nó giải quy t trước khi giả thiết đòi hỏi thêm... dòng 1-3 khởi tạo các giá trị e[i,i-1] và w[i,i-1] Vòng for ở dòng 4-13 sử dụng cơng thức đã có (15.19) và (15.20) để tính e[i,j] và w[i,j] với 1 ≤ i ≤ j ≤ n Trang 31 Tiểu luận PT&TKTT: Thuật tốn Quy hoạch động _Nhóm 3 Trong vòng lặp đầu, khi l = 1, vòng lặp tính e[i,i] và w[i,i] với i = 1, 2, …, n Trong vòng lặp thứ hai, với l = 2, tính e[i, i+1] và w[i, i+1] với i = 1, 2, …, n-1 Ở vòng . Tiểu luận PT&TKTT: Thuật toán Quy hoạch động_ ________________________________Nhóm 3 QUY 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. 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. n. So sánh thuật toán đệ quy từ dưới lên này với thuật toán quy hoạch động từ dưới lên. Thuật toán sau hiệu quả hơn bởi vì nó mang lại sự thuật lợi của thuộc tính sự chồng lấp của các bài toán con.