Bài 4: Bài toán tối ưu tổ hợp BÀI 4: BÀI TOÁN TỐI ƯU TỔ HỢP Giới thiệu Bài học trình bày nội dung tốn tối ưu tổ hợp toán quan tâm đến cấu hình “tốt nhất” theo nghĩa Đây tốn có nhiều ứng dụng thực tiễn lý thuyết tổ hợp đóng góp phần đáng kể việc xây dựng thuật toán hữu hiệu Nội dung Mục tiêu Giới thiệu toán tối ưu tổ hợp Sau học này, bạn có thể: Nắm u cầu tốn tối ưu tổ hợp, số tốn điển hình Sử dụng phương pháp: Bài toàn người du lịch toán túi Phương pháp duyệt toàn Kỹ thuật đánh giá nhánh cận Phương pháp tham lam Duyệt toàn Bài tốn tìm lịch gia cơng hai máy Đánh giá nhánh cận thuật toán Johnson Tham lam việc giải toán tối ưu tổ hợp Thời lượng học tiết v1.0 83 Bài 4: Bài tốn tối ưu tổ hợp TÌNH HUỐNG DẪN NHẬP Tình huống: Bài tốn người du lịch Có n thành phố (đánh số từ đến n) Một người du lịch, xuất phát từ thành thành phố s, muốn thăm tất thành phố khác, thành phố lần, lại quay nơi xuất phát Giả thiết biết chi phí từ thành phố i đến thành phố j c(i, j), ≤ i, j ≤ n Câu hỏi Hãy tìm hành trình cho người du lịch cho chi phí hành trình nhỏ nhất! 84 v1.0 Bài 4: Bài toán tối ưu tổ hợp 4.1 Giới thiệu tốn Bài tốn tối ưu tổ hợp khơng quan tâm đến việc xây dựng tất cấu toán liệt kê mà nhằm xây dựng cấu hình “tốt” theo nghĩa Vì tốn có nhiều ý nghĩa thực tiễn Lời giải nó, giống tốn liệt kê, phải trình bày dạng thuật giải mà theo bước, ta xây dựng cấu hình cần tìm Việc thi hành giao cho máy tính chương trình thực thuật giải nêu Độ “tốt” cấu hình phụ thuộc vào mục tiêu toán người ta phải lượng hóa chúng để so sánh Một cách thường làm xây dựng hàm f, ứng cấu hình X xét với số, ký hiệu f(X) (gọi giá X) Khi đó, độ “tốt” cấu hình định nghĩa theo hai hướng: mục tiêu tốn chi phí cấu hình tốt giá nhỏ (như cấu hình tốt cấu hình có giá nhỏ nhất), mục tiêu hiệu cấu hình tốt giá lớn (như cấu hình tốt cấu hình có giá lớn nhất) Bài tốn thứ gọi tốn tìm min, tốn thứ hai gọi tốn tìm max Như vậy, tốn tối ưu tổ hợp phát biểu hình thức tốn học sau: Tìm X D : f (X) (max) D tập hữu hạn, gồm cấu hình thỏa mãn điều kiện toán Hàm f gọi hàm mục tiêu Tập hợp D gọi miền xác định hay miền phương án Mỗi phần tử D gọi phương án Phương án tốt gọi phương án tối ưu Giá phương án tối ưu gọi giá trị tối ưu Chú ý D hữu hạn nên phương án tối ưu tồn Có thể có nhiều phương án tối ưu, giá trị tối ưu Trong toán cụ thể, ta phải rõ điều kiện xác định D cách tính hàm f (hàm f tính cơng thức thủ tục) Mục giới thiệu hai tốn điển hình tối ưu tổ hợp toán người du lịch toán túi 4.2 Bài toán người du lịch toán túi 4.2.1 Bài toán người du lịch Bài toán người du lịch phát biểu sau: “Có n thành phố (đánh số từ đến n) Một người du lịch, xuất phát từ thành thành phố s, muốn thăm tất thành phố khác, thành phố lần, lại quay nơi xuất phát Giả thiết biết chi phí từ thành phố i đến thành phố j c(i, j), ≤ i, j ≤ n Hãy tìm hành trình cho người du lịch cho chi phí hành trình nhỏ nhất” Mỗi hành trình người du lịch biểu diễn hoán vị X = (x1, x2, , xn) {1, 2, , n} với x1 = s (hốn vị biểu diễn hành trình x1→ x2→ → xn−1→ xn→ x1) Chi phí hành trình X tính cơng thức c(x1, x2) + c(x2, x3) + + c (xn, x1) Như thế, mô hình tốn học tốn người du lịch là: Tìm X D : f (X) D tập hốn vị X = (x1, x2, , xn) {1, 2, , n} có x1 = s (cho trước) f(X) = c (x1, x2) + c (x2, x3) + + c(xn, x1) v1.0 85 Bài 4: Bài toán tối ưu tổ hợp Tên gọi tốn người du lịch mang tính chất tượng trưng, dùng để gọi chung cho tốn có mơ hình tốn học phát biểu có nội dung khác, chẳng hạn tốn tìm chu trình sản xuất cho nhà máy hóa chất cho chi phí xúc rửa thiết bị (như bể chứa, ống dẫn, ), chuyển từ loại hóa chất sang loại hóa chất khác chu trình, 4.2.2 Bài tốn túi Bài tốn túi phát biểu sau: “Có n đồ vật (đánh số từ đến n) Với đồ vật i, ta biết pi, vi trọng lượng giá trị vật (i = 1, 2, , n) Giả thiết có túi, sức chứa không w đơn vị trọng lượng Hãy tìm phương án chọn đồ vật bỏ vào túi để mang cho tổng giá trị vật mang lớn nhất” Một phương án chọn đồ vật tập tập {1, 2, , n}, biểu diễn phương án dãy nhị phân X = (x1, x2, , xn), xi = vật i chọn (i = 1, 2, , n) Tổng trọng lượng vật mang theo phương án p1x1 + p2x2 + + pnxn Điều kiện vật chọn mang điều kiện tổng không vượt w (sức chứa túi) Tổng giá trị vật mang theo phương án X v1x1 + v2x2 + + vnxn Từ ta nhận mơ hình tốn học tốn túi sau: Tìm X D : f (X) max D tập hợp dãy nhị phân X = (x1, x2, , xn) thỏa mãn bất đẳng thức p1x1 + p2x2 + + pnxn ≤ w f(X) = v1x1 + v2x2 + + vnxn Bài tốn túi có nội dung giống toán người leo núi trước thám hiểm: chọn vật đem theo cho sức mang với tổng giá trị sử dụng chuyến leo núi lớn nhất, tốn cịn có tên gọi khác tốn người leo núi Bài tốn người du lịch thí dụ cho toán tối ưu với mục tiêu chi phí, cịn tốn túi thí dụ cho toán tối ưu với mục tiêu hiệu Bạn đọc lấy nhiều thí dụ tốn thực tế Về phần này, bạn xem thêm tài liệu tham khảo [2] 4.3 Phương pháp duyệt toàn Do đặc tính hữu hạn miền phương án nên cách giải đơn giản (cũng tự nhiên nhất) toán tối ưu tổ hợp duyệt tất phương án để so sánh Sau duyệt xong, ta nhận phương án tốt (giống chọn cam nặng sọt cam cách so sánh một) Như toán tối ưu D giải sở liệt kê miền D Phương pháp giải toán tối ưu gọi duyệt toàn Để cụ thể, giả thiết tốn có mơ hình: Tìm X D : f (X) Gọi X phương án duyệt, Y phương án tốt thời điểm duyệt (gọi phương án kỷ lục) giá trị phương án (gọi giá trị kỷ lục), stop biến lôgic kiểm tra điều kiện kết thúc liệt kê Khi phương pháp duyệt tồn mơ tả sơ đồ khối hình vẽ 86 v1.0 Bài 4: Bài tốn tối ưu tổ hợp Vịng lặp sơ đồ vòng lặp liệt kê, lần lặp, phương án X duyệt Khi cần so sánh giá phương án với giá trị kỷ lục Nếu X tốt (phá kỷ lục) cần lưu lại X vào phương án kỷ lục Y ghi nhận kỷ lục vào Khi liệt kê kết thúc, ta nhận Y phương án tối ưu giá trị tối ưu Việc khởi động giá trị cực lớn trước liệt kê nhằm đảm bảo kỷ lục phá lần Với mơ hình tìm max, ta khởi động giá trị kỷ lục cực nhỏ (−∞) đảo chiều bất đẳng thức so sánh := +∞ đ stop Y phương án tối ưu giá trị tối ưu s X cấu hình duyệt v:= f(X) s v < đ Y := X := v Để cài đặt chương trình, ta dùng mơ hình quay lui cho vịng lặp liệt kê nêu thủ tục TRY(i) (xem 3) Trong thủ tục này, ta thay khối (ghi nhận cấu hình) khối (ghi nhận kỷ kục): Thuật toán quay lui cho vòng lặp liệt kê PROCEDURE TRY (i: INTEGER); VAR j: INTEGER; BEGIN FOR (j thuộc Si) DO IF (chấp nhận j) THEN BEGIN xi := j; (ghi nhận trạng thái mới); IF (i = n) THEN (ghi nhận kỷ kục) ELSE TRY(i+1); (trả trạng thái cũ); END; END; v1.0 87 Bài 4: Bài toán tối ưu tổ hợp Nội dung khối (ghi nhận kỷ kục) so sánh giá cấu hình duyệt với giá trị kỷ lục thời, giá tốt phải ghi nhận lại kỷ lục Nên thiết kế thủ tục riêng để thực nhiệm vụ Thí dụ, giải tốn người du lịch nêu 4.2.1, mơ hình quay lui dùng liệt kê hoán vị (xem mục 3.3.2, 3): Thuật toán quay lui giải toán người du lịch PROCEDURE TRY (i: INTEGER); VAR j: INTEGER; BEGIN FOR j := TO n DO IF (bj) THEN BEGIN xi := j; bj := FALSE; IF (i = n) THEN SCORE ELSE TRY(i+1); bj := TRUE; END; END; Trong thủ tục SCORE (ghi nhận kỷ lục) thay cho thủ tục OUT (đưa cấu hình tìm hình) Trong thủ tục INIT, cần nhập n (số thành phố), s (thành phố xuất phát), c (bảng chi phí) khởi tạo x1 s, khởi tạo bj TRUE ngoại trừ bs FALSE, khởi tạo giá trị lớn kiểu liệu (chẳng hạn số thực chọn giá trị 1037, số nguyên byte khơng dấu chọn giá trị 65535, ) Nội dung chương trình giống tốn liệt kê, thay lời gọi TRY(1) lời gọi TRY(2) (vì x1 biết) thêm vào thao tác đưa kết tìm (gồm phương án giá trị tối ưu) trước kết thúc Dưới kết chạy bước toán người du lịch với thành phố {1, 2, 3, 4}, xuất phát từ thành phố bảng chi phí: 3 5 3 2 4 Có 3! = hành trình duyệt, sau: 1) chi phí + + + = 14 2) chi phí + + + = 14 3) chi phí + + + = 11 4) chi phí + + + = 11 5) chi phí + + + = 12 6) chi phí + + + = 10 88 ghi nhận kỷ lục ghi nhận kỷ lục ghi nhận kỷ lục v1.0 Bài 4: Bài toán tối ưu tổ hợp Hành trình ứng với lần ghi kỷ lục cuối phương án tối ưu 2→4→3→1→2 với chi phí thấp 10 Cũng dễ nhận thấy hành trình khép kín qua thành phố nên vị trí xuất phát hành trình khơng quan trọng Bạn đọc giải tốn túi mục 4.2.2 cách dùng mơ hình quay lui liệt kê dãy nhị phân (xem mục 3.3.1, 3) Với dãy nhị phân (x1, x2, , xn) duyệt, cần thử lại bất đẳng thức p1x1 + p2x2 + + pnxn ≤ w cho phương án này, thỏa mãn thủ tục SCORE (ghi nhận kỷ lục) áp dụng Thuật toán quay lui giải toán túi PROCEDURE TRY (i: INTEGER); VAR j: INTEGER; BEGIN FOR j := TO DO BEGIN xi := j; IF (i = n) THEN BEGIN IF (p1x1+p2x2+ +pnxn ≤ w) THEN SCORE; END ELSE TRY(i+1); END; END; Cũng kiểm tra điều kiện mang lần xác định xi để bớt việc thử số nhánh không cần thiết cách tổ chức thêm tham số r cho thủ tục TRY để truyền vào thủ tục khả lại túi bước thử thứ i Khi điều kiện chấp nhận j cho xi r ≥ j thủ tục TRY có nội dung sau (khơng tính tổng qt, ta giả thiết trọng lượng vật số nguyên): PROCEDURE TRY (r, i: INTEGER); VAR j: INTEGER; BEGIN FOR j := TO DO IF (r >= j) THEN BEGIN xi := j; IF (i = n) THEN SCORE ELSE TRY(r >= j, i+1); END; END; Lời gọi khởi động thủ tục chương trình TRY(w, 1) (xác định vật chọn thứ với khả túi w) Thuật tốn duyệt tồn áp dụng cho tất toán tối ưu tổ hợp mà toán liệt kê phương án giải khơng phụ thuộc vào tính chất hàm v1.0 89 Bài 4: Bài tốn tối ưu tổ hợp mục tiêu Hạn chế phương pháp tính khả thi thấp số lượng phương án phải duyệt thường lớn Chẳng hạn với toán người du lịch 16 thành phố, số phương án phải duyệt 15! = 307 674 368 000 Giả thiết máy tính giây duyệt 10 triệu cấu hình, để duyệt hết, ta cần khoảng 130 764 giây, nghĩa khoảng 36 Tuy nhiên, việc có thuật tốn hiệu để giải tốn tối ưu khơng phải dễ dàng Nhiều tốn chưa có cách giải ngồi việc duyệt Vì để nâng cao hiệu cách giải này, người ta cố gắng tìm giải pháp để hạn chế khối lượng duyệt Một giải pháp thường dùng kỹ thuật đánh giá nhánh cận trình bày mục 4.4 Kỹ thuật đánh giá nhánh cận Trong mô hình duyệt tồn trình bày mục trước, phương án phải xây dựng xong tính giá phương án để so sánh Điều dẫn đến việc tính tốn nhiều Sở dĩ vậy, ta chưa khai thác đặc điểm hàm mục tiêu, mà để ý, phát phương án xây dựng chắn khơng tốt kỷ lục có, khẳng định điều này, ta chuyển sang xây dựng phương án khác, bỏ qua số nhánh tìm kiếm vơ ích Giả sử phương án xây dựng xong i thành phần x1, x2, , xi Dù chưa tính giá tồn phương án, cách đó, ta đánh giá giới hạn (cận) chung cho giá trị (đối với tốn tìm cận dưới, tốn tìm max cận trên) Nếu cận tính khơng tốt kỷ lục có (đối với tốn tìm khơng nhỏ hơn, tốn tìm max khơng lớn hơn) có nghĩa hướng phát triển nhánh tìm kiếm vơ ích, bỏ qua để xét giá trị khác cho xi Việc không xét giá trị xi giúp cho loại bỏ loạt nhánh tìm kiếm Vì kỹ thuật đánh giá có tên gọi đánh giá nhánh cận (tìm cận nhánh tìm kiếm) Để đánh giá nhánh cận, cần có xem xét kỹ tính chất hàm mục tiêu điều không đơn giản Thông thường, cận đánh giá cố gắng đạt hai tiêu chí: Càng sát với giá trị tối ưu toán tốt Việc tính cận đơn giản tốt Tiêu chí thứ giúp cho việc lùi sớm tìm kiếm, nghĩa cắt nhiều nhánh này, tiêu chí thứ hai làm giảm bớt phép tính vịng lặp đệ quy (mà số lượng lồng chúng lớn!) Trên thực tế hai tiêu chí thường xung đột lẫn nhau: để đánh giá cận sát, việc tính phức tạp Việc điều chỉnh hai tiêu chí cho phù hợp nghệ thuật, địi hỏi nhiều kinh nghiệm kiến thức việc đánh giá bất đẳng thức Bây giờ, giả sử g(x1, x2, , xi) cận tương ứng với bước thứ i tốn tìm Khi thủ tục TRY(i) mơ hình duyệt tồn bộ, trước gọi TRY(i +1), ta cần thử lại bất đẳng thức g(x1, x2, , xi) < (nghĩa tiến sang bước sau cận nhỏ kỷ lục thời): 90 v1.0 Bài 4: Bài toán tối ưu tổ hợp PROCEDURE TRY (i: INTEGER); VAR j: INTEGER; BEGIN FOR (j thuộc Si) DO IF (chấp nhận j) THEN BEGIN xi := j; (ghi nhận trạng thái mới); IF (i = n) THEN (ghi nhận kỷ kục) ELSE IF (g(x1, x2, , xi) < min) THEN TRY(i+1); (trả trạng thái cũ); END; END; Dưới thí dụ minh họa đánh giá nhánh cận việc giải tốn người du lịch Ví dụ: Giả sử bước thứ i hành trình người du lịch, chi phí hành trình tính đến bước hồn tồn xác định tính bằng: ti = c(x1, x2) + + c(xi − 1, xi) Từ bước đến lúc kết thúc hành trình cịn n − i + bước (n − i bước để đến thành phố cuối bước để quay lại thành phố xuất phát) Chi phí bước, lựa chọn có thể, khơng thể cmin giá trị nhỏ tồn bảng chi phí (trừ đường chéo c(i, i), i = 1, 2, , n giá trị khơng dùng) Từ nhận cận bước xét là: g(x1, x2, , xi) = ti + (n − i + 1).cmin Để tính ti bước, ta nên tổ chức thêm tham số t (ngoài tham số i) cho thủ tục đệ quy TRY để truyền giá trị bước trước vào Khi đó, việc đánh giá nhánh cận vừa trình bày, đưa vào thủ tục TRY toán người du lịch sau (giả thiết chi phí khai báo kiểu INTEGER): PROCEDURE TRY (t, i: INTEGER); VAR j: INTEGER; BEGIN FOR j := TO n DO IF (bj) THEN BEGIN xi := j; bj := FALSE; IF (i = n) THEN SCORE ELSE IF (t+c(xi-1, xi)+(n-i+1).cmin < min) THEN TRY(t+c(xi-1, xi), i+1); bj := TRUE; END; END; Lời gọi khởi động thủ tục chương trình TRY(0, 2) (xác định thành phố thứ hành trình với chi phí ban đầu 0) Đánh giá nhánh cận vừa trình bày cho toán người du lịch đơn giản dễ hiểu thô Để thực nâng cao v1.0 91 Bài 4: Bài toán tối ưu tổ hợp hiệu người ta cần phải đánh giá tinh vi (và việc cài đặt phức tạp hơn) Về phần này, bạn nên xem thêm tài liệu tham khảo [2], có trình bày việc đánh giá nhánh cận toán người du lịch theo cách khác, phức tạp hiệu Cuối nên ý rằng, trường hợp tồi nhất, việc đánh giá nhánh cận khơng khác (hoặc khác khơng đáng kể) so với việc duyệt tồn bộ, tình thơng thường với kích thước khơng lớn lắm, việc có đánh giá nhánh cận tỏ tốt nhiều so với việc khơng đánh giá Điều minh chứng việc viết chương trình chạy máy tính, có đếm số nhánh thực phải duyệt để so sánh Chẳng hạn xét toán người du lịch thành phố, xuất phát từ thành phố 1, với bảng chi phí đây: 8 9 8 4 9 3 Chương trình đánh giá nhánh cận trình bày (có kèm việc đếm số lượng duyệt) cho ta kết số nhánh thực phải duyệt 120 (so với tồn 325), số nhánh đến phương án đầy đủ 19 (so với toàn 120) nhận hành trình tối ưu 1→4→6→2→5→3→1 với chi phí 22 Điều đáng ý là, toán này, xuất phát khác nhau, ta nhận khối lượng duyệt theo nhánh cận khác Bạn đọc thử đưa cách đánh giá nhánh cận với toán túi viết chương trình theo mơ hình vừa trình bày để chạy thử máy tính Có thể nói thuật tốn hiệu giải tốn có nhiều ứng dụng thực tế Phần nhiều không tránh khỏi việc phải duyệt tồn giải tốn kỹ thuật đánh giá nhánh cận quan tâm đặc biệt Việc tìm đánh giá tốt cho mơ hình có nhiều ứng dụng giúp cho việc tìm kiếm lời giải cải thiện lên nhiều kết cống hiến đáng kể cho khoa học, thời kỳ máy tính dùng rộng rãi 4.5 Phương pháp tham lam Như nói mục trên, hầu hết tốn thực tế có mơ hình tối ưu tổ hợp, giải cách duyệt, dù có đưa đánh giá nhánh cận vào giảm thời gian tìm kiếm đến giới hạn định, thực tế, thời gian chờ đợi kết thường bị khống chế, vượt khoảng thời gian này, kết dù có tốt khơng cịn ý nghĩa (chẳng hạn tốn dự báo) Đấy chưa kể việc tìm đánh giá nhánh cận thỏa mãn hai tiêu chí (vừa sát, vừa đơn giản) điều không dễ dàng Vì thế, bên cạnh phương pháp cho lời giải đúng, người ta quan tâm đến cách giải gần đúng, nghiệm tìm tương đối tốt, chấp nhận được, thời gian tìm kiếm phải nhanh 92 v1.0 ... cho chi phí hành trình nhỏ nhất! 84 v1.0 Bài 4: Bài toán tối ưu tổ hợp 4.1 Giới thiệu tốn Bài tốn tối ưu tổ hợp khơng quan tâm đến việc xây dựng tất cấu toán liệt kê mà nhằm xây dựng cấu hình “tốt”... w) Thuật tốn duyệt tồn áp dụng cho tất toán tối ưu tổ hợp mà toán liệt kê phương án giải khơng phụ thuộc vào tính chất hàm v1.0 89 Bài 4: Bài tốn tối ưu tổ hợp mục tiêu Hạn chế phương pháp tính... án tối ưu, giá trị tối ưu Trong toán cụ thể, ta phải rõ điều kiện xác định D cách tính hàm f (hàm f tính cơng thức thủ tục) Mục giới thiệu hai tốn điển hình tối ưu tổ hợp toán người du lịch toán