3 BÀI TOÁN NGƯỜI DU LỊCH
3.2.2 Thủ tục phân nhánh
Giả sử ta cần phân nhỏ tập Sp ⊂ S0. Cách hay dùng là phân chia tập này thành hai tập con rời nhau S0p và S00p với
S0p = {x : x ∈ Sp, xrs = 0}, S00p = {x : x ∈ Sp, xrs = 1},
trong đó xrs là biến chưa cố định ở giá trị 0 hay 1 trong tập Sp. Cặp (r,s) dùng để phân nhánh được chọn sao cho tập S00p có nhiều khả năng chứa phương án tối ưu, cịn tập S0p thì khơng. Nói cách khác, (r,s) được chon sao cho hiệu số các cận dưới của S0p và S00p là lớn nhất có thể được.
Để giải quyết vấn đề này, ta chỉ xét tập các phương án ban đầu S0, vì mọi bài tốn con nhận được về sau có cùng cấu trúc như đối với bài tốn ban đầu. Giả sử ma trận chi phí C đã được rút gọn nghĩa là cij ≥ 0 với mọi i, j và trên mỗi hàng, mỗi cột của C đều có ít nhất một số 0. Tập Sp
được chia thành hai tập rời nhau S1 và S2 với
S1 = {x : x ∈ S0, xrs = 0}, S2 = {x : x ∈ S0, xrs = 1}
Trong tập S2 cấu trúc bài tốn khơng thay đổi, trừ ra hàng r và cột s bị loại vì đã đi từ r đến s khơng thể đi từ r đến bất cứ nơi nào khác, và cũng không được phép đi từ bất cứ đâu đến s. Các hàng và cột còn lại chỉ chứa các phần tử khơng âm, vì thế cận dưới đối với S2 là γ(S2) = crs.
Trong tập S1 do cố định xrs = 0 nên từ các điều kiện (3.2), (3.3) suy ra phải có một xrj = 1 (j 6= s) và một xis = 1(i 6= r). Vì thế
γ(S1) = min
j6=s crj + mincis
sao cho hiệu giữa các cận dưới này là lớn nhất, nghĩa là đặt
max
(r,s)
{γ(S1)−γ(S2)} (3.7)
Nếu crs > 0 thì γ(S1) = 0 (do trên hàng r và cột s của C đều chứa số 0), còn γ(S2) = crs > 0, từ đó γ(S1) −γ(S2) < 0. Vì thế để có (3.7) ta
chỉ cần xét các cặp (r,s) với crs = 0. Trong trường hợp này γ(S2) = 0 và
γ(S1) > 0.
Điều này có nghĩa là thay cho (3.7) ta có thể chon biến xrs để phân nhánh theo quy tắc θ(r, s) =max cpq=0 θ(p, q) = min j6=q cpj + min i6=p ciq .
Lập luận trên đây cũng đúng cả khi các tập phương án Si về sau được chia thành các tậpSr vàSr+1, nhưng thay cho các cận dưới γ(s1) vàγ(S2)
ta xét mức tăng của các cận dưới γ(Sr)−γ(Si) và γ(Sr+1)−γ(Si) tương ứng.
Ngăn cấm tạo chu trình con:
Nếu tập được xét khơng phải là S0 mà là
Sp = {x :x ∈ S0, xi1j1 = δ1, xi2j2 = δ2, ..., xikjk = δk},
thì quy tắc chọn biến để phân nhánh về cơ bản vẫn như trước, tuy nhiên cần tiến hành một số thay đổi. Trước hết, đó là việc thực hiện các lựa chọn bắt buộc. Chẳng hạn, nếu
xuj = 0, j = 1, ..., v−1, v+ 1, ..., n
thì tất nhiên phải có xuv = 1. Cũng làm như vậy đối với các cột.
Một số loại lựa chọn bắt buộc khác: Khi đã cố định xrs = 1 thì phải có
chứa cạnh (r,s) gồm ít nhất 2 và nhiều nhất n-2 cạnh
(1 ≤v ≤ n−3)
(khơng có cạnh nào có dạng xki1 = 1 hay xivj = 1), thì để ngăn cấm tạo
chu trình con dạng (i1, i2, ..., iu, r, s, i1) , ta đặt csi1 = ∞, cịn để ngăn tạo chu trình con có dạng (r, s, iu+1, iu+2, ..., iv, r), ta đặt civr = ∞. Hơn nữa ta cần có xivi1 = 0 bằng cách đặt civi1 = ∞.
Để tìm i1 ta có thể đi ngược từ r và để tìmiv ta có thể đi xuôi từ s theo danh sách các biến đã cố định ở giá trị 1 trong tập Sp.
Để ngăn cấm tạo thành chu trình con như hình vẽ dưới đây ta đặt:
csr = csi1 = ci4r = ci4i1 = ∞.
Ở mỗi bước lặp, trước khi tính các cận dưới cho các tập mới, cần thực hiện những lựa chọn bắt buộc nêu trên. Có như vậy mới thu được những cận dưới chính xác hơn và tránh được những phân nhánh vơ ích. Nếu trong tập Sp nào đó đã có n-2 biến được cố định ở giá trị 1 thì phương án gồm n phần tử hồn tồn được xác định, khi đó cận dưới của tập Sp là cận dưới đúng và bằng giá trị mục tiêu tương ứng với phương án này.
3.3 Ví dụ minh họa
Giải bài toán người du lịch với ma trận chi phí sau đây:
∞ 48 43 54 31 20 ∞ 30 63 22 29 64 ∞ 4 17 6 19 2 ∞ 8 1 28 7 18 ∞ Giải:
Rút gọn ma trận : trừ mỗi phần tử của các hàng 1, 2, 3, 4, 5 cho số nhỏ nhất trên hàng tương ứng là 31, 20, 4, 2, 1 ta được ma trận
∞ 17 12 23 0 0 ∞ 10 43 2 25 60 ∞ 0 13 4 17 0 ∞ 6 0 27 6 17 ∞
Trừ mỗi phần tử ở cột 2 của ma trận trên cho số nhỏ nhất trên cột đó là số 17, ta được ma trận rút gọn sau: ∞ 00 12 23 02 02 ∞ 10 43 2 25 43 ∞ 030 13 4 00 06 ∞ 6 06 10 6 17 ∞
Số mũ ghi bên cạch các số 0 trong ma trận trên là số
θ(p, q) = min
j6=q cpj + min
i6=p ciq
của ô tương ứng.
Tổng các hằng số rút gọn là 31+20+4+2+1+17=75.
Vì vậy cận dưới cho tất cả các hành trình là 75. Điều này có nghĩa là khơng thể tìm được hành trình có tổng chi phí nhỏ hơn 75.
θ(3,4) = max
cpq=0θ(p, q) = 30
Vì thế ta chọn cặp (3,4) để phân nhánh. Khi đó, tập tất cả các hành trình được phân thành hai tập con: một tập gồm các hành trình chứa cạnh (3,4), cịn tập kia gồm các hành trình khơng chứa cạnh (3,4). Ta lần lượt xét hai tập này:
Tập khơng chứa cạnh (3,4): Vì cạnh (3,4) khơng có mặt trong hành trình, cho nên ta có hể cấm việc đi theo cạnh này bằng cách đặt c34 = ∞
∞ 0 12 23 0 0 ∞ 10 43 2 25 43 ∞ ∞ 13 4 0 0 ∞ 6 0 10 6 17 ∞
Ma trận thu được có thể rút gọn bằng cách bớt mỗi phần tử hàng 3 đi 13 và bớt mỗi phần tử cột 4 đi 17. Kết quả ta nhận được cận dưới cho tập các hành trình khơng chứa cạnh (3,4) là :
75 + 13 + 17 = 105
và ma trận tương ứng với tập này là:
∞ 0 12 6 0 0 ∞ 10 26 2 12 30 ∞ ∞ 0 4 0 0 ∞ 6 0 10 6 0 ∞
Tập chứa cạnh (3,4): ta phải loại hàng 3 và cột 4 khỏi ma trận tương ứng với tập này, bởi vì đã đi theo cạnh (3,4) thì khơng thể đi từ 3 đến bất kỳ nơi nào khác và cũng không được phép đi từ bất kỳ đâu vào 4. Kết quả ta thu được ma trận giảm đi một bậc. Hơn nữa đã đi theo cạnh (3,4) thì khơng thể đi từ 4 đến 3 nữa. Vì vậy ta cần cấm cạnh (4,3) bằng cách đặt
c43 = ∞. Ma trận thu được lại có thể rút gọn đi 6 (số nhỏ nhất trên cột 3) và cận dưới của tập này bây giờ là 75 + 6 = 81. Ma trận tương ứng với
nhánh bên trái trước và sau khi rút gọn có dạng: ∞ 0 12 0 0 ∞ 10 2 4 0 ∞ 6 0 10 6 ∞ ∞ 0 6 0 0 ∞ 4 2 4 0 ∞ 6 0 10 0 ∞
Lúc này cây phân nhánh có dạng sau:
∞ 00 6 02 02 ∞ 4 2 4 04 ∞ 6 00 10 04 ∞ ∞ 00 12 6 00 02 ∞ 10 26 2 12 30 ∞ ∞ 012 4 00 06 ∞ 6 00 10 6 06 ∞
Hình 3.1. Cây phân nhánh ban đầu
Trong qúa trình phân nhánh ta đi theo nhánh bên trái trước vì có cận dưới nhỏ hơn. Nhánh này có ma trận rút gọn với bậc giảm đi 1.
Trong ma trận ở nhánh bên phải ta thay số 0 bởi ∞, vì thế có thể rút gọn thêm được ma trận này khi tính lại các hằng số rút gọn theo hàng và
cột của ma trận, nhưng kích thước của ma trận vẫn giữ nguyên.
Trong ma trận 4x4 của nhánh bên trái (hình 3.1) số 0 ở vị trí (4,2) sẽ cho tổng các hằng số rút gọn là 4 (theo hàng 4 là 4 cột 2 là 0). Đây là giá trị lớn nhất đối với các số 0 của ma trận này. Vì vậy việc phân nhánh tiếp theo dựa vào cạnh (4.2). Tình huống phân nhánh này được mơ tả trong hình 3.2. Cũng có thể phân nhánh theo cạnh (5.3) vì số 0 ở vị trí này cũng có số mũ là 4.
Ma trận của nhánh bên phải tương ứng với tập các hành trình đi qua (3,4) nhưng không đi qua (4,2), sau khi thay 0 ở vị trí (4,2) bởi ∞, được rút gọn đi 4 (hàng 4). Cận dưới của tập các hành trình này bằng 81+4=85
∞ 6 08 02 ∞ 2 00 06 ∞ ∞ 010 6 02 02 ∞ 4 2 02 ∞ ∞ 2 00 10 04 ∞
Nhánh bên trái sẽ tương ứng với ma trận 3x3, bởi vì ta phải loại bỏ hàng 4 và cột 2. Các cạnh (3,4) và (4,2) đã nằm trong hành trình, cho nên cạnh (2,3) không thể đi qua nữa (nếu khơng sẽ tạo thành chu trình con). Để ngăn ngừa việc tạo thành chu trình con ta gán cho phần tử ở vị trí (2,3) giá trị c23 = ∞.
Tiếp tục phân nhánh từ tập bên trái bằng cách sử dụng cạnh (1,5), bởi vì số 0 ở vị trí này có tổng các hằng số rút gọn là 6 + 2 =8 (theo hàng 1 là 6, theo cột 5 là 2). Đây là giá trị lớn nhất đối với các số 0 của ma trận rút gọn 3x3 ở hình 3.2. Sau khi phân nhánh cạnh (1,5), cận dưới của nhánh bên phải tương ứng với tập các hành trình đi qua (3,4), (4,2) nhưng khơng đi qua (1,5) là 81 + 8 = 89. Ma trận của nhánh trái có kích thước 2x2. Vì đã đi qua (1.5), nên ta cấm cạnh (5,1) bằng cách đặt c51 = ∞ , và thu được ma trận sau:
0 ∞ ∞ 0
Cận dưới của tập tương ứng vẫn là 81. Cây phân nhánh cho đến bước này thể hiện trong hình 3.3.
Sau khi đã chấp nhận n - 2 = 3 cạnh vào hành trình thì hai cạnh cịn lại của hành trình sẽ khơng phải lựa chọn nữa, mà được kết nạp ngay vào hành trình. Trong ví dụ đang xét, sau khi đã có các cạnh (3,4), (4,2), và (1,5), ta sẽ kết nạp nốt hai cạnh (2,1) và (5,3) vào và thu được hành trình gồm các cạnh (3,4), (4,2), (1,5), (2,1), (5,3). Như vậy hành trình là
1 →5 →3 →4 →2 →1
với tổng chi phí bằng :
31 + 7 + 4 + 19 + 20 = 81.
Các tập cịn lại đều có cận dưới lớn hơn 81 nên sẽ bị loại. Vì thế hành trình tìm được là hành trình tơi ưu.
Tóm lại, chương này đã xét bài toán người du lịch, một bài tốn khó trong tối ưu rời rạc và nó là mơ hình tốn học của nhiều vấn đề lý thuyết và thực tiễn. Thuật tốn nhánh cận đã được trình bày khá chi tiết và rõ ràng: cách phân nhánh và tính cận khá độc đáo và hiệu quả, dựa trên tư duy lơgic chính xác. Cuối chương nêu ví dụ số minh hoạ cho thuật tốn đã trình bày.
Kết luận
Luận văn đã đề cập tới phương pháp nhánh cận trong tối ưu rời rạc, một phương pháp quen thuộc và có hiệu quả giải các bài tốn tối ưu với biến số nhận các giá trị nguyên hay rời rạc. Hiện nay, phương pháp nhánh cận, với nhiều biến dạng và cải tiến khác nhau, vẫn là một cơng cụ hữu ích và có hiệu quả để giải các bài toán tối ưu rời rạc, kể cả bài toán cỡ lớn. Các thuật toán nhánh cận đã được cài đặt trên nhiều phần mềm thương mại hoá về tối ưu để giải các bài toán tối ưu rời rạc. Luận văn đã trình bày những nội dung như sau:
1. Mơ hình bài tốn qui hoạch ngun tuyến tính nói chung và bài tốn qui hoạch nguyên 0 - 1 nói riêng.
2. Lược đồ tổng quát của phương pháp nhánh cận trong tối ưu rời rạc và áp dụng vào bài toán qui hoạch nguyên tuyến tính (thuật tốn nhánh cận Land - Doig).
3. Mơ hình bài tốn cái túi, cơ sở lý luận và thuật toán nhánh cận giải bài toán cái túi.
4. Bài toán người du lịch và thuật toán nhánh cận của Little, Murty, Sweeney và Karel giải bài tốn người du lịch.
Có thể xem luận văn như bước tìm hiểu đầu tiên về phương pháp nhánh cận trong tối ưu rời rạc. Việc này giúp hiểu rõ thêm cách tiếp cận tổ hợp trong tối ưu rời rạc.
Tác giả luận văn hy vọng sẽ có địp được tìm hiểu sâu hơn về nội dung, phương pháp giải và ứng dụng thực tế của các bài toán tối ưu rời rạc khác trong tương lai.
Tài liệu tham khảo
[1] Trần Vũ Thiệu và Bùi Thế Tâm Các phương pháp tối ưu hóa , NXB Giao Thơng Vận Tải Hà Nội, 1998.
[2] A.A.Korbut and Yu.Finkelstein, Discrete Programming, Nauka.
Moscow, 1969.
[3] L.B.Kovacs. Combinatorial Methods of Discrete Programming
Akademiai Kiado. Budapet, 1980.
[4] A.H.Land and A.G.Doig. An automatic method of solving discrete pro- gramming problems NXB Econometrica, 28(3), 1960, 497-520.
[5] J.D.C Littlee, K.G. Murty, D.W. Sweenney and C.Karel An algorithm for salesman problems, Operat.Rets, 1963, 11, N6, 972-989.
[6] P.Tseng. Discrete Optimization, Dep of Math Univ of Wasington, Springer 2008.