Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
882,5 KB
Nội dung
MỘT SỐ ĐỊNH HƯỚNG CHO VIỆC ĐỊNH NGHĨA BÀI TOÁN CON VÀ XÁC ĐỊNH CẤU TRÚC CON TỐI ƯU TRONG Q TRÌNH GIẢI CÁC BÀI TỐN BẰNG PHƯƠNG PHÁP QUY HOẠCH ĐỘNG Nguyễn Văn Minh Trường PTTH Chuyên Lê Quý Đôn - Quảng Trị Làm cho học sinh PTTH tiếp cận lời giải tốn với kỹ thuật lập trình đặc trưng phương pháp quy hoạch động trăn trở nhiều giáo viên trình giảng dạy phương pháp Tìm tốn phù hợp cho tốn giải cơng việc phụ thuộc nhiều kinh nghiệm sáng tạo người giải Tuy nhiên, có số định nghĩa lặp lại toán quy hoạch động Bài viết đề cập đến bốn định hướng cho việc định nghĩa toán xác định cấu trúc tối ưu định nghĩa I MỞ ĐẦU Phương pháp quy hoạch động thường dùng để giải tốn tối ưu có chất đệ quy, tức việc tìm lời giải tối ưu cho tốn đưa việc tìm lời giải tối ưu số hữu hạn tốn Thơng thường giải toán phương pháp quy hoạch động cần thực bước sau: Xác định cấu trúc lời giải tối ưu • Tìm cách chia tốn thành tốn • Xác định cấu trúc tối ưu, tức lời giải tối ưu toán đem lại lời giải tối ưu cho toán ban đầu Định nghĩa đệ quy cho giá trị lời giải tối ưu dựa giá trị có từ tốn Tính giá trị lời giải tối ưu từ lên • Tính giá trị lời giải tối ưu, xuất phát từ toán nhỏ lưu giá trị lại theo cách • Ở bước sau dùng giá trị lưu từ bước trước Xây dựng lời giải tối ưu từ thông tin lưu lại Bài viết xin phép trao đổi số vấn đề liên quan đến bước nêu trên, bước định cho việc giải hồn chỉnh tốn quy hoạch động Có nhiều định hướng khác cho việc định nghĩa tốn con, từ cho phép xác định cấu trúc tối ưu toán Bốn định hướng sau cho phép tiếp cận lớp tốn phổ biến giải phương pháp quy hoạch động II ĐỊNH NGHĨA CÁC BÀI TOÁN CON VÀ XÁC ĐỊNH CẤU TRÚC CON TỐI ƯU II Dạng tiền tố (hậu tố) Định nghĩa toán Bài toán dạng với đầu vào (input) thường dãy gồm n thành phần x1, x2, …, xn Khi việc phân chia tốn thành toán dạng tiền tố là: x1, x2, …, xi, với i ≤ n Các toán dạng hậu tố là: xi, x2, …, xn, với i ≥ Khi phân chia toán ban đầu thành toán dạng tiền tố ta có mơ sau: Hình 1: Mơ hình dạng tiền tố Cấu trúc tối ưu: Trường hợp 1: Cấu trúc tối ưu toán phụ thuộc số toán xác định (khơng cần phải tìm kiếm) Cấu trúc đệ quy dạng nhị phân, tam phân, … Bài toán 1: Cho dãy số nguyên dương a1, a2, …an Hãy chọn số số hạng dãy không chọn số hạng liền nhau, cho tổng giá trị số hạng chọn lớn Ví dụ: A = (6, 10, 13, 9, 8, 1), chọn (6, 13, 9, 1) cách chọn có tổng giá trị 29, chọn (6, 10, 9, 8) cách chọn có tổng giá trị 33 cách chọn có tổng giá trị lớn Bài toán thứ i gồm thành phần tứ đến i Có thể phát biểu lại tốn sau: Hãy chọn số hạng từ đến i, không chọn số hạng liền nhau, cho tổng giá trị số hạng chọn lớn Bài toán thứ n tốn ban đầu Với cách chia ta có: + Với tốn 1, có quà nên tổng giá trị thu a1, giá trị tối ưu cho toán a1 + Với tốn vậy, có quà nên tổng giá trị thu a1+a2, giá trị tối ưu cho toán a1+a2 + Với tốn có cách chọn thỏa mãn yêu cầu toán: (a1, a2), (a1, a3), (a2, a3) với tổng giá trị là: a1+a2, a1+a3, a2+a3 Từ giá trị tối ưu cho toán giá trị lớn cách chọn: max{a1+a2, a1+a3, a2+a3} + Với tốn ta có cách chọn: (a1, a2), (a1, a3), (a1, a4), (a2, a3), (a2, a4), (a3, a4), (a1, a2, a4), (a1, a3, a4) Từ giá trị tối ưu cho toán là: max{a1+a2, a1+a3, a1+a4, a2+a3, a2+a4, a3+a4, a1+a2+a4, a1+a3+a4} = max{max{a1+a2, a1+a3, a2+a3}, max{a1+a4, a2+a4, a1+a2+a4}, max{a1+a3+a4, a3+a4}} = max{max{a1+a2, a1+a3, a2+a3}, (a1+a2)+a4, (a1)+a3+a4} BT BT -2- BT (Do a1, a2, a3, a4 nguyên dương nên: max{a1+a4, a2+a4, a1+a2+a4} = a1+a2+a4 max{a1+a3+a4, a3+a4} = a1+a3+a4) Có thể thấy lời giải tối ưu toán thứ tư phụ thuộc lời giải tối ưu toán 1, Hay toán có cấu trúc tối ưu: lời giải tối ưu toán thứ i-1, i-2 i-3 cho lời giải tối ưu cho toán thứ i, lời giải tối ưu toán thứ n-1, n-2 n-3 cho lời giải tối ưu cho toán thứ n – toán ban đầu Gọi f(i) giá trị tối ưu toán thứ i, tổng giá trị lớn chọn quà từ quà thứ đến quà thứ i Ta có: f(1)=a1 f(2)=a1+a2 f(3)=max{a1+a2, a1+a3, a2+a3} f(4)=max{max{a1+a2, a1+a3, a2+a3}, (a1+a2+a4), (a1)+a3+a4} =max{f(3), f(2)+a4, f(1))+a3+a4} … f(i)=max{f(i-1), f(i-2)+ai, f(i-3)+ai-1+ai} Từ ta có cơng thức: Gọi mãng a[1 N] lưu dãy đầu vào (input) Ta có đoạn chương trình đệ quy tính giá trị tối ưu f(n) cho tốn function f(i : longint) : longint; begin if i = then f ≔ a[1] else if i = then f ≔ a[1] + a[2] else if i = then f ≔ max(a[1] + a[2], a[1] + a[3], a[2] + a[3]) else f := max(f(i - 1), f(i - 2) + a[i], f(i - 3) + a[i - 1] + a[i]); end; BEGIN … write(f(n)); … END Trường hợp 2: Cấu trúc tối ưu toán phụ thuộc số toán chưa xác định (cần phải tìm kiếm) Cấu trúc đệ quy tốn thường dạng tuyến tính Bài toán 2: Dãy đơn điệu tăng dài Cho dãy số nguyên A, a1, a2, …, an Một dãy dãy A dãy thu cách chọn từ A số phần tử giữ nguyên thứ tự chúng Hãy tìm dãy đơn điệu tăng A có độ dài lớn a1 Ví dụ: với A = (5, 2, 8, 6, 3, 6, 9, 7) (2, 3, 6, 9) dãy đơn điệu tăng dài A -3- Bài toán thứ i gồm phần tử từ đến i dãy A Có thể phát biểu lại tốn sau: Hãy tìm dãy đơn điệu dài dãy gồm phần tử từ đến i Bài toán thứ n toán ban đầu Với cách phân chia ta có: + Với tốn thứ nhất, có phần tử a1 nên dãy đơn điệu tăng độ dài (lớn nhất) + Khi xét toán thứ i, ta cần xem phần tử aj tốn j từ đến i-1 xem chúng có thỏa mãn aj < không? Điều đảm bảo cho ta ghép thêm vào cuối dãy đơn điệu tăng kết thúc j tốn j Trong trường hợp có nhiều dãy (của toán con) chọn dãy dài nhằm bảo đảm tính dài tốn Đó cấu trúc tối ưu toán: lời giải tối ưu toán thứ i phụ thuộc vào lời giải tối ưu toán số toán từ toán j (1 ≤ j ≤ i - 1) mà aj < Từ phân tích trên, gọi f(i) giá trị tối ưu toán thứ i, tức độ dài dãy đơn điệu tăng có từ dãy gồm phần tử từ a1 đến thì: f(i) = max{f(j)+1| ≤ j < i aj < ai} Từ ta có cơng thức sau: Gọi mãng a[1 N] lưu dãy đầu vào, để đơn giản thấy rõ cấu trúc tối ưu ta thiết kế chương trình đệ quy tính giá trị tối ưu toán thứ i: f(i) Việc cập nhật giá trị tối ưu cho toán ban đầu: max{f(i)|∀i = 1, 2, …, N} thực tách rời function f(i : longint) : longint; var j, tmp : longint; begin if i = then f ≔ else begin tmp ≔ for j := to i – if a[j] < a[i] then tmp := max(tmp, f(j) + 1); f ≔ tmp; end; end; BEGIN … MaxLenSeq ≔ 0; for i ≔ to N begin tmp ≔ f(i); if MaxLenSeq < tmp then MaxLenSeq ≔ tmp; end; write(MaxLenSeq); … END II Dạng hai hay nhiều tiền tố (hậu tố) -4- Bài toán dạng với đầu vào (input) thường hai hay nhiều dãy số thành phần dãy khác Ta xét dãy sau X = x1, x2, …, xn Y = y1, y2, …, ym tốn dạng tiền tố X Y x1, x2, …, xi, với i ≤ n y1, y2, …, yj, với j ≤ m Khi phân chia toán ban đầu thành toán dạng tiền tố ta có mơ sau: Hình 2: Mơ hình toán Cấu trúc tối ưu: tương ứng với quan hệ tiền tố Thông thường số toán xác định Bài toán 3: Dãy chung dài (LCS) Cho X = x1, x2, …, xm Y = y1, y2, …, yn Hãy tìm dãy chung Z X Y Ví dụ: Bài tốn (i, j) tiền tố x1, x2, …, xi, với i ≤ m y1, y2, …, yj, với j ≤ n dãy X Y Có thể phát biểu lại tốn sau: Hãy tìm dãy chung dài dãy x1, x2, …, xi y1, y2, …, yj Với cách chia ta có + Với tốn (1, 1) x1 = y1 độ dài dãy Z 1, ngược lại + Với toán (i, j) thì: - x1 = y1 độ dài dãy Z độ dài dãy chung dài thu từ toán (i – 1, j - 1) thêm phần tử chung - x1 ≠ y1 độ dài dãy Z, độ dài dãy chung dài thu từ toán (i – 1, j) từ toán (i, j - 1), dãy dài chọn -5- Gọi f(i, j) giá trị tối ưu tốn (i, j), ta có công thức sau: Gọi x[1 m], y[1 n] dãy đầu vào, đoạn chương trình đệ quy sau thực tìm độ dài dãy chung dài x y function f(i, j : longint) : longint; begin if (i = 0) or (j = 0) then f ≔ else if x[i] = y[j] then f ≔ f(i – 1, j – 1) + else f := max(f(i, j - 1), f(i - 1, j)); end; BEGIN … writeln(f(m, n)); … END Bài toán 4: Bài toán đổi tiền Cho tập D gồm n loại tiền có mệnh giá d1, d2, …, dn, tìm cách đổi S đồng gồm loại tiền cho số tờ tiền cần đổi Nghĩa tìm tập K = (k1, k2, …, kn (ki ≥ với i) cho k1d1 + k2d2 + … + kndn = S tổng k1 + k2 + … + kn nhỏ Biết số loại tiền khơng hạn chế Ví dụ: D = (1, 2, 4), S = 35 K = (1, 1, 8) Tổng số tờ tiền cần đổi 10 tờ Xem X tập D Y tập gồm tất số từ đến S Bài toán ( i, j) tiền tố d1, d2, …, di, với i ≤ n 0, 1, 2, …, j, với j ≤ S Có thể phát biểu lại tốn sau: Tìm cách đổi j đồng gồm loại tiền d1, d2, …, di cho số tờ tiền cần đổi Bài tốn (n, S) toán ban đầu Với toán (i, j): + toán (i, 0) có giá trị tối ưu với i + toán (1, j) mà j < d1 đổi nên giá trị tối ưu toán ta quy ước ∞ + toán (1, j) mà j > d1 ta đổi giá trị tối ưu toán tương ứng giá trị tối ưu toán (1, j – d1) + + toán (i, j) mà j < di với i = 2, 3, …, n; rõ ràng không đổi giá trị tối ưu (i, j) giá trị tối ưu toán (i – 1, j) + trường hợp lại ta đổi, nhiên ta chọn việc đổi hay không - không dùng tờ tiền loại i để đổi giá trị tối ưu (i, j) giá trị tối ưu toán (i – 1, j) -6- - dùng tờ loại i để đổi số tiền lại cần đổi j – di hay giá trị tối ưu (i, j) giá trị tối ưu (số tờ tiền nhất) toán (i, j – di) thêm tờ (di) Gọi f(i, j) giá trị tối ưu tốn (i, j), ta có cơng thức: Gọi d[1 n] mãng lưu đầu vào, ta có đoạn chương trình đệ quy sau: const inf = maxlongint; function f(i, j:integer): integer; begin if j = then f :=0 else if (i = 1) and (j < d[1]) then f := inf else if i = then f := + f(1, j - d[1]) else if j < d[i] then f := f(i - 1, j) else f := min(f(i-1, j), + f(i, j-d[i])); end; BEGIN … writeln(f(n, S)); … END II Dạng dãy Định nghĩa toán Bài toán dạng với đầu vào dãy gồm n thành phần x1, x2, …, xn Khi việc phân chia thành toán dạng dãy là: xi, x2, …, xj, với ≤ i < j ≤ n Hình 3: Mơ hình dạng dãy Cấu trúc tối ưu: Trường hợp 1: Cấu trúc tối ưu toán phụ thuộc số tốn xác định (khơng cần phải tìm kiếm) Bài tốn 5: PalinDrome Dãy kí tự s gọi đối xứng (palindrome) phần tử cách đầu cuối giống Cho dãy s tạo n kí tự gồm chữ hoa thường phân biệt chữ số Một dãy s dãy thu sau bỏ số ký tự s giữ ngun thứ tự ký tự cịn lại Hãy tìm độ dài dãy đối xứng dài s -7- Ví dụ: với dãy s gồm kí tự, s = 'baeadbadb' sau xố kí tự thứ 5, 7, thu dãy đối xứng chiều dài baeab: baeadbadb → baeab Có thể có nhiều cách xố Tuy nhiên độ dài dãy đối xứng dài Do tính đối xứng ta chọn cách chia theo dạng dãy Với cách chia vậy, toán (i, j) gồm ký tự si, si+1, …, sj Gọi f(i, j) giá trị tối ưu toán – độ dài dãy đối xứng dài trích từ dãy si, si+1, …, sj Lời giải toán ban đầu (1, n) f(1, n) Xét toán (i, j) Ta có: Nếu i > j, số đầu trái lớn số đầu phải, ta quy ước đặt f(i, j)=0 Nếu i = j f(i, i) = 1, dãy khảo sát chứa kí tự nên đối xứng Nếu i < j si = sj f(i, j) = f(i + 1, j – 1) + Vì hai kí tự đầu cuối dãy si sj giống nên cần xác định chiều dài dãy đối xứng dài đoạn si+1 sj–1 (bài toán (i + 1, j – 1)) cộng thêm đơn vị ứng với hai kí tự đầu cuối dãy Hình Hình 4: Trường hợp si = sj Nếu i < j si ≠ sj, tức hai kí tự đầu cuối dãy si sj khác ta khảo sát hai dãy si sj–1 (bài toán (i, j – 1)) si+1 sj (bài toán (i+1, j)) để lấy chiều dài dãy đối xứng dài hai dãy làm kết quả, hình 5: f(i, j) = max{f(i, j-1),f(i+1, j)} Hình 5: Trường hợp si ≠ sj Vậy lời giải tối ưu toán (i, j) phụ thuộc vào tối ưu toán (i+1, j-1), (i, j-1) (i+1, j) Lời giải tối ưu toán ban đầu (1, n) phụ thuộc vào tối ưu toán (2, n-1), (1, n-1) (2, n) Ta có cơng thức sau: Ta có chương trình đệ quy sau: function f(i, j : longint) : longint; begin if i > j then f ≔ else if i = j then f ≔ else if s[i] = s[j] then f ≔ f(i + 1, j - 1) + else f := max(f(i, j - 1), f(i + 1, j); -8- end; BEGIN … write(f(1, n)); … END Trường hợp 2: Cấu trúc tối ưu toán phụ thuộc số toán chưa xác định (cần phải tìm kiếm) Bài tốn 6: Stones Có N đống sỏi xếp thành hàng, đống thứ i có viên sỏi Ta ghép hai đống kề thành đống chi phí tổng hai đống sỏi Hãy tìm cách ghép N đống sỏi thành đống với chi phí nhỏ Ví dụ có đống sỏi: n = 5, = (4, 1, 2, 7, 5) Hình 7: Cách ghép Hình 6: Cách ghép Với cách ghép hình 6, tổng chi phí 41 Hình 7, tổng chi phí 43 Bài tốn đặt dấu ưu tiên phép toán vào cặp toán hạng việc thực phép tốn dấu ưu tiên có chi phí tương ứng với giá trị phép toán vừa thực (bài tốn nhân ma trận) Như ví dụ hình cách đặt sau: ((4+(1+2))+(7+5)), hình (((4+1)+2)+(7+5)) Nếu tìm tất cách đặt móc có 4n cách đặt móc (số Catalan thứ n) Một cách tiếp cận khác ta chia toán điểm chia i dạng: (a1, a2, …, ai)(ai+1, ai+2, …, an) với ≤ i ≤ n Khi để tối ưu toán (a1, a2, …, an) ta cần tối ưu toán (a1, a2, …, ai) (ai+1, ai+2, …, an) Dễ thấy với điểm chia i ta có tốn tương ứng (cùng kiểu) Nếu tốn gồm đống, chi phí Nếu tốn có đống ta có kết Nếu tốn có đống ta dựa tốn đống đống để tìm kết quả, tiếp tục trình có N đống Bằng cách dùng điểm chia ta liệt kê tất cách ghép: (a1)( a2, …, an), (a1, a2)(a3, a4, …, an), (a1, a2, a3)(a4, a5, …, an), …, (a1, a2, …, ai-1)(an) tìm cách tối ưu chúng Do tính đối xứng phép đặt móc nên ta chia tốn theo mơ hình trên, tốn (i, j) gồm đống sỏi ai, ai+1, …, aj Bài toán (1, N) toán ban đầu Với cách chia toán ta thấy: lời giải tối ưu cho toán (i, j) tìm cách ghép đống sỏi từ đống thứ i tới đống thứ j với tổng chi phí nhỏ -9- • Với cách ghép phép ghép cuối ln có chi phí ai, ai+1, …, aj • Với điểm chia k (i ≤ k ≤ j), lời giải tối ưu toán (i, j) phụ thuộc vào lời giải tối ưu toán (i, k) (k+1, j) Hay nói cách khác phụ thuộc vào tất toán tạo từ điểm chia k: k=i k = i+1 … k=j (ai)( ai+1, …, aj) (ai, ai+1)(ai+2, ai+3, …, aj) … (ai, ai+1, …, aj-1)(aj) Gọi f(i, j) giá trị tối ưu toán (i, j), tương ứng tổng chi phí nhỏ để ghép đống sỏi từ đống i đến đống j thành đống Từ ta có cơng thức sau: Gọi sum[i] = a1+a2+…+ai Khi ta có ai, ai+1, …, aj = sum[j]-sum[i-1] Ta có hàm đệ quy tính giá trị tối ưu tốn (i, j) sau: function f(i, j : longint) : longint; var k, tmp : longint; begin if i = j then f ≔ else begin tmp ≔ maxlongint; for k ≔ i to j – tmp := min(tmp, f(i, k) + f(k + 1, j) + (sum[j] – sum[i - 1])); f ≔ tmp; end; end; BEGIN … Sum[0] ≔ 0; for i ≔ to N sum[i] ≔ sum[i - 1] + a[i]; write(f(1, n)); … END (Một số tốn tìm đường ngắn đồ thị có trọng số có cách tiếp cận dạng này) II Dạng (rooted subtree) Định nghĩa toán Bài toán dạng với đầu vào có gốc r Khi tốn tương ứng có gốc u - 10 - Hình 8: Mơ hình dạng Cấu trúc tối ưu: Cấu trúc tối ưu toán phụ thuộc vào số toán tương ứng số node Bài tốn 7: Tam giác số Cho tam giác số hình sau: 8 4 Tìm đường từ đỉnh đến đáy tam giác cho tổng tất số đường lớn nhất, bước đi chéo xuống phía trái chéo xuống phía phải Ví dụ: đường qua số in đậm + + + + = 30 Bài tốn mơ tả qua mơ hình 9, tách node chung ta có nhị phân đầy đủ Bởi toán dạng đơn giản nên ta mô tả đầu vào bảng, node tương ứng bảng (hình 10) 4 4 Hình 10: Bảng đầu vào Hình 9: Cây đầu vào Với cách chia trên, tốn (r, c) tương ứng tìm cách tối ưu để từ gốc (r, c) đến node Rõ ràng từ gốc (r, c) xuống hai node (r+1, c) (r+1, c+1) Hay nói cách khác tối ưu toán gốc (r, c) phụ thuộc tối ưu toán gốc (r+1, c) gốc (r+1, c+1) Gọi f(r, c) giá trị tối ưu toán (r, c) bảng t[1 N, N] lưu bảng đầu vào - 11 - Ta có cơng thức sau: Từ ta có đoạn chương trình đệ quy tìm giá trị tối ưu toán (r, c) toán ban đầu function f(r, c : longint) : longint; begin if r = N then f ≔ t[r, c] else f := max(f(r + 1, c), f(r+1, c + 1)) + t[r, c]); end; BEGIN … write(f(1, 1)); … END (Các tốn dạng tìm đường từ dịng (cột) đến dòng n “quy hoạch động cây” có cách tiếp cận dạng này) - 12 - III KẾT LUẬN Những mơ hình phân tích vừa trình bày mang tính chất định hướng cho q trình giải tốn quy hoạch động Định nghĩa toán xác định cấu trúc tối ưu phần q trình Việc giải hồn chỉnh tốn quy hoạch động cần nhiều vấn đề khác nữa, mong giúp phần cho người giải có định hướng tiếp cận tốt với lời giải toán Bài viết nhận xét tơi q trình giảng dạy phương pháp này, mong trao đổi dẫn thầy cô giáo, bạn đồng nghiệp em học sinh Tài liệu tham khảo Tài liệu giáo khoa chuyên Tin – Tập 1, Hồ Sĩ Đàm (chủ biên) Chuyên đề thuật tốn – Lê Minh Hồng Một số vấn đề chọn lọc Tin học – Tập 1, Nguyễn Xuân My (chủ biên) Bài tập Quy hoạch động – Trần Đỗ Hùng (chủ biên) - 13 - ... thấy lời giải tối ưu toán thứ tư phụ thuộc lời giải tối ưu toán 1, Hay tốn có cấu trúc tối ưu: lời giải tối ưu toán thứ i-1, i-2 i-3 cho lời giải tối ưu cho toán thứ i, lời giải tối ưu toán thứ...II ĐỊNH NGHĨA CÁC BÀI TOÁN CON VÀ XÁC ĐỊNH CẤU TRÚC CON TỐI ƯU II Dạng tiền tố (hậu tố) Định nghĩa toán Bài toán dạng với đầu vào (input) thường dãy gồm n thành phần x1, x2, …, xn Khi việc. .. dạng tiền tố Cấu trúc tối ưu: Trường hợp 1: Cấu trúc tối ưu toán phụ thuộc số tốn xác định (khơng cần phải tìm kiếm) Cấu trúc đệ quy dạng nhị phân, tam phân, … Bài toán 1: Cho dãy số nguyên dương