PHƯƠNG PHÁP NHÁNH CẬN GIẢI BÀI TOÁN QUY HOẠCH NGUYÊN ( Gồm cả slide )
NGUYỄN HỮU THƯƠNG
Trang nhan đề
Lời cảm ơn
Mục lục
Lời nói đầu
Chương_1: Quy hoạch nguyên
Chương_2: Phương pháp nhánh và cận
Chương_3: Giải bài toán nguyên trên Mathlab
Tài liệu tham khảo
53 trang |
Chia sẻ: maiphuongtl | Lượt xem: 3280 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Phương pháp nhánh cận giải bài toán quy hoạch nguyên, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
MỤC LỤC
• MỤC LỤC............................................................................................................................i
• Lời cảm ơn...........................................................................................................................ii
• Lời nói đầu .........................................................................................................................iii
1 QUY HOẠCH NGUYÊN
1.1 Giới thiệu........................................................................................................................1
1.2 Quy hoạch nguyên trong thực tế......................................................................................6
2 PHƯƠNG PHÁP NHÁNH CẬN
2.1 Giới thiệu thuật toán trên ví dụ.....................................................................................30
2.2 Chia nhánh, đặt cận, chạm đáy......................................................................................34
2.3 Thuật toán nhánh - và - cận...........................................................................................36
3 GIẢI BÀI TOÁN NGUYÊN TRÊN MATLAB
3.1 Giới thiệu Matlab..........................................................................................................39
3.2 Lập trình thuật toán trên bài toán nguyên.....................................................................40
3.3 Giải bài toán nguyên trên Matlab..................................................................................44
TÀI LIỆU THAMKHẢO...............................................................................................49
i
Lời cảm ơn
Tôi chân thành cám ơn công lao to lớn của PGS. TS Trần Huệ nương - Giảng viên
hướng dẫn của tôi, người giới thiệu tôi đến với đề tài này và giúp tôi đạt được những kết
quả tốt. Cô đã hỗ trợ tôi trong cả khi thành công và thất bại, động viên tôi tập trung
bất cứ khi nào tôi nản chí; nếu không có những sự giúp đỡ ấy của Cô thì tôi nghĩ luận
văn này không bao giờ hoàn thành.
Viết luận văn Thạc sỹ là một quá trình vất vả, mất nhiều tháng liên tục. Tuy nhiên,
tôi đã nhận được sự giúp đỡ, khuyến khích của những bạn bè, bạn học, Giáo sư. Với tất
cả niềm vui tôi xin cám ơn tất cả.
Điều quan trọng nhất, tôi không thể làm được luận văn này nếu không có sự giúp đỡ
của gia đình. Luận văn không thể hoàn thành mà không có tình yêu, sự nhẫn nại, sự hỗ
trợ giúp đỡ. Tôi chân thành cám ơn.
TP. Hồ Chí Minh, ngày 01 tháng 05 năm 2009.
Nguyễn Hữu Thương
ii
Lời nói đầu
Chuyên ngành quy hoạch tuyến tính được các nhà Toán học trên thế giới nghiên cứu
và phát triển kể từ sau đại chiến thế giới lần thứ hai. Người tiên phong trong lĩnh vực
này là G.B.Dantzig. Có nhiều bài toán thực tế thuộc các lĩnh vực khác nhau có thể mô
tả toán học bằng quy hoạch tuyến tính. Quy hoạch nguyên (IP - Integer Programming)
rất phổ biến trong thực tế. Mảng bài toán này có vẻ đơn giản nhất mà cũng quan trọng
nhất trong các bài toán chọn quyết định (có liên quan nhau nhưng đều ở dạng có hoặc
không). Một số ý tưởng để giải IP là phương pháp mặt phẳng cắt của Gomory công bố
năm 1958, phương pháp nhánh - và - cận (branch - and - bound method) xuất hiện trong
[Land - Doig 1960]. Tác giả đã lựa chọn phương pháp nhánh - và - cận với những ưu điểm
rõ rệt để trình bày trong luận văn này.
Luận văn gồm ba chương: Quy hoạch nguyên, phương pháp nhánh - và cận và Một số
ứng dụng của phương pháp nhánh cận giải quy hoạch nguyên.
Tuy nhiên, luận văn cũng không tránh khỏi thiếu sót. Rất mong nhận được sự đóng
góp của Quý Thầy Cô và các bạn đồng nghiệp.
iii
Chương 1
Quy hoạch nguyên
1.1 Giới thiệu
Quy hoạch nguyên (Integer programming - IP) là bài toán quy hoạch trong đó tất
cả hoặc một phần các biến bị ràng buộc chỉ lấy giá trị nguyên. Tương ứng tên cụ thể
cho từng trường hợp là quy hoạch nguyên hoàn toàn (pure integer programming) và quy
hoạch nguyên bộ phận (mixed integer programming - MIP). Tuy vậy, thuật ngữ "Quy
hoạch nguyên" thực tế chỉ dành cho lĩnh vực toán nghiên cứu lớp bài toán quy hoạch
tuyến tính nguyên. Vì vậy hai thuật ngữ được hiểu như nhau. Lớp bài toán này rất phổ
biến trong thực tế. Mảng bài toán này có vẻ đơn giản nhất mà cũng quan trọng nhất
trong lớp này là các bài toán chọn quyết định (có liên quan nhau nhưng đều ở dạng "có"
hoặc "không" (yes - or - no decision). Chẳng hạn bài toán bổ nhiệm: Giả sử có tập S gồm
m người và tập D gồm m việc hoặc chức vụ. Cước phí của việc bổ nhiệm người i ∈ S vào
việc j ∈ D là cij. Bài toán đặt ra là tìm cách chia cho mỗi người đúng một việc sao cho
tổng cước phí là nhỏ nhất. Đặt biến là
xij =
{
1 nếu người i được việc j,
0 trường hợp khác
thì bài toán trở thành
min
∑
i∈S
∑
j∈D
cijxij,
1
∑
i∈S xij = 1, i ∈ S (mỗi người chỉ được đúng một việc),
∑
j∈D xij = 1, j ∈ D (mỗi việc chỉ dành cho đúng một người).
Nhiều bài toán khác quyết định có - không như vậy, chẳng hạn đầu tư không? có mở
đại lý ở thành phố A không? có nhận thực hiện dự án không?.... Vì các biến (quyết định)
chỉ nhận hai giá trị (biến 0-1) nên bài toán có tên là quy hoạch nguyên nhị phân (binary
integer programming - BIP).
Nếu bài toán có n biến và các ràng buộc cho thấy miền chấp nhận được là giới nội
trong Rn, thì bài toán "chỉ có" hữu hạn nghiệm chấp nhận được, không như quy hoạch
tuyến tính (tổng quát) có miền này là cả một tập lồi đa diện. Tuy vậy, sẽ rất sai lầm
nếu nghĩ rằng quy hoạch nguyên dễ giải hơn, hoặc hơn nữa nghĩ rằng có thể điểm diện
(enumeration) các phương án (tức là nghiệm) chấp nhận được để chọn phương án tối ưu.
Chẳng hạn BIP với n biến có 2n phương án chấp nhận được. Nhưng đây là số khổng lồ
nếu n lớn. Trong lịch sử Trung Hoa cổ đại đã có minh hoạ rất hay là nhà vua không đủ
thóc, dù vét hết kho trong nước, để thưởng 264 hạt thóc theo ước muốn (được vua ban)
của người nghĩ ra cờ tướng làm vua thích thú (bàn cờ đó có 64 ô). Nguyên nhân vì miền
chấp nhận được, tuy hữu hạn, của quy hoạch nguyên không có các đỉnh để thực hiện
phương pháp đơn hình, đã biết là rất hiệu quả. Chính vì vậy quy hoạch tuyến tính dễ
giải hơn. Người ta có thể giải mọi quy hoạch tuyến tính với nhiều ngàn biến và ràng buộc
bằng máy tính trong vài giờ, nhưng đến nay vẫn không đảm bảo giải được với thời gian
tương tự bất kỳ dù chỉ là BIP với 100 biến. Người ta thấy rằng ở quy hoạch tuyến tính
thì độ phức tạp tính toán tăng rõ theo số ràng buộc nhưng với quy hoạch nguyên thì số
biến ảnh hương quyết định.
Một số ý tưởng tự nhiên để giải IP (quy hoạch nguyên) là giải quy hoạch tuyến tính
tương đương, tức là IP nhưng bỏ đi ràng buộc giá trị biến phải nguyên (quy hoạch tuyến
tính này gọi là LP - nới lỏng (LP relaxation) của IP) rồi làm tròn nghiệm tối ưu thành
nghiệm nguyên. Nó sẽ xấp xỉ nghiệm tối ưu của IP. Cách này có thể áp dụng trong thực
tế, nhưng phải cẩn thận hai nguy cơ sau đây. Một là nghiệm làm tròn có thể thậm chí
2
không chấp nhận được đối với IP như ví dụ sau
Ví dụ 1.1.1 Xét quy hoạch nguyên
max z = x2,
−x1 + x2 6 1
2
,
x1 + x2 6 3
1
2
,
x1 > 0, x2 > 0,
x1, x2 nguyên.
Hình 1.1: Nghiệm tối ưu làm tròn không chấp nhận được
3
H.1.1 cho thấy điểm A(3/2, 2) nới lỏng, B(1, 2) và C(2, 2) là hai nghiệm làm tròn từ
A nhưng không chấp nhận được. Nghiệm tối ưu của IP là D(1, 1) và E(2, 1).
Nguy cơ thứ hai là nghiệm làm tròn có thể chấp nhận được nhưng có thể có giá trị mục
tiêu rất xa mục tiêu tối ưu của IP như ví dụ sau đây cho thấy.
Ví dụ 1.1.2 Xét quy hoạch nguyên
max z = x1 + 5x2,
x1 + 10x2 6 20,
x1 6 2,
x1 > 0, x2 > 0,
x1, x2nguyên.
H.1.2 cho thấy điểm A(2, 7/4) là nghiệm tối ưu của LP - nới lỏng (với mục tiêu z =
11). B(2, 1) là nghiệm làm tròn cho IP, chấp nhận được và ứng mục tiêu z = 7, xa với
mục tiêu tối ưu của IP là z = 10 đạt tại điểm C(0, 2).
Bài tập: "Chứng minh rằng nếu quy hoạch nguyên tuyến tính có ít nhất một ràng
buộc đẳng thức thì nghiệm làm tròn từ LP nới lỏng không thể là nghiệm chấp nhận được
của quy hoạch nguyên" cho thấy trường hợp nghiệm làm tròn không chấp nhận được là
rất phổ biến. Có thể nghĩ rằng dữ liệu của bài toán đã là xấp xỉ nên tính không chấp
nhận được này có thể "tha thứ". Nhưng nhiều bài toán IP thực tế có dữ liệu chính xác.
Chẳng hạn ràng buộc kiểu lựa chọn đúng một trong n quyết định "có" còn lại là "không"
4
Hình 1.2: Nghiệm tối ưu làm tròn xa nghiệm tối ưu của IP
là ràng buộc với hệ số chính xác
x1 + x2 + . . .+ xn = 1, xj = 0 hoặc 1.
Hơn nữa ở bài toán nhị phân với biến có ý nghĩa là "có" hay "không" thì giá trị không
nguyên là vô nghĩa rồi, nên không thể làm tròn đi nữa.
Vì quy hoạch nguyên hay gặp như thế, lại không thể nhận được từ làm tròn nghiệm
nhận được từ LP - nới lỏng của nó, nhu cầu tìm các thuật toán riêng là rất lớn, vẫn đang
rất được quan tâm nghiên cứu hiện nay. Do giải quy hoạch nguyên khó và tính toán phức
tạp nên với các bài toán cỡ lớn cách tiếp cận tốt nhất là dùng các thuật toán phán đoán
(heuristic algorithm), tuy không đảm bảo đi đến nghiệm tối ưu trong mọi trường hợp,
nhưng thường rất hiệu quả. Với các bài toán không lớn quá, đã có nhiều thuật toán giải
chính xác. Cách tiếp cận chung là kết hợp việc giải các LP - nới lỏng với điểm diện ẩn
(implicit emmeration), tức là điểm diện các nghiệm chấp nhận được nhưng ở mỗi bước
tìm cách loại bỏ số đáng kể các nghiệm không thể là tối ưu không cần điểm diện. Trước
khi trình bày phương pháp chính là phương pháp nhánh - và - cận ở mục sau, Mục ... giới
5
thiệu ....
Để kết thúc mục này, ta đã thấy nhiều trường hợp may mắn là giải quy hoạch tuyến
tính (không nguyên) bằng thuật toán đơn hình ta nhận được nghiệm tối ưu là nguyên.
Đó là bài toán dòng trên mạng với các dữ liệu nguyên, mà trường hợp riêng là các bài
toán sau với dữ liệu nguyên: bài toán dòng cực đại, bài toán đường ngắn nhất, bài toán
vận tải. Nếu khi giải LP - nới lỏng của quy hoạch nguyên mà gặp may mắn như vậy thì
ta được luôn nghiệm tối ưu của quy hoạch nguyên.
1.2 Quy hoạch nguyên trong thực tế
Ý tưởng giải một bài toán nguyên trong thực tế:
Bước 1. Giải bài toán tuyến tính gốc sau khi bỏ đi điều kiện biến nguyên,
Bước 2. Giả sử được nghiệm tối ưu xk = t. Nếu nghiệm tối ưu đạt được thoả ràng
buộc nguyên thì kết thúc bước lặp. Ngược lại đến bước 3,
Bước 3. Chia bài toán thành hai phần:
LP1: xk ≤ [t]
max z = cx,
Ax ≤ b,
xk ≤ [t],
x ≥ 0.
LP2: xk ≥ [t] + 1
6
max z = cx,
Ax ≤ b,
xk ≥ [t] + 1,
x ≥ 0.
Bước 4. Giải LP1 và LP2 một cách riêng rẽ,
Bước 5. Nếu với bất kỳ bài toán con, nghiệm tối ưu nguyên đạt được thì bài toán
không chia nhánh nữa. Mặt khác quay trở lại Bước 3.
Ví dụ 1.2.1 (Bài toán Balo - knapsack problem) Một nhà thám hiểm chỉ được mang theo
một ba lô trọng lương không quá b, Có n loại vật dụng nên mang theo. Loại vật j có trọng
lượng mỗi vật là aj và giá trị sử dụng mỗi vật là cj. Hỏi ông phải mang thế nào để có giá
trị sử dụng lớn nhất?
Gọi xj là số lượng vật j mang theo thì mô hình toán học của bài toán balo này là quy
hoạch nguyên sau:
max z =
n∑
j=1
cjxj,
n∑
j=1
ajxj ≤ b,
xj ≥ 0 và nguyên, j = 1, . . . , n.
7
Ta xét và giải bài toán balo hai biến như sau: Một học sinh mang theo balo trọng lượng
không quá 12kg, mang theo hai vật, trọng lượng vật một là 3kg, trọng lượng vật hai tương
ứng là 2kg, giá trị sử dụng của cả hai vật là 1. Gọi x1, x2 là số lượng vật một và hai mang
theo, sao cho vật hai mang không quá hai cái. Hỏi phải mang theo bao nhiêu để giá trị sử
dụng lớn nhất? Mô hình bài toán:
max z = x1 + x2,
3x1 + 2x2 ≤ 12,
x2 ≤ 2,
x1, x2 ≥ 0 và nguyên.
Đầu tiên, ta giải bài toán trên bằng phương pháp đơn giản (bỏ đi điều kiện nguyên),
Sau khi thêm biến bù, ta có:
3x1 + 2x2 + w3 = 12,
x2 + w4 = 2,
với w3, w4 là những biến bù.
Nghiệm cơ bản chấp nhận được là:
x1 = x2 = 0, z = 0,
Giải bài toán đơn hình dạng bảng:
8
Ta có nghiệm tối ưu: x1 = 8/3, x2 = 2
Vì nghiệm tối ưu đạt được không phải nghiệm nguyên, ta chọn x1 = 8/3(2 + 2/3) mà
có giá trị phân số và chia bài toán thành hai bài toán con (LP2 và LP3) bằng cách thêm
hai ràng buộc mới x1 ≤ 2, x1 ≥ 3, bởi vì [x1] = [8/3] = 2.
LP2:
max z = x1 + x2,
3x1 + 2x2 ≤ 12,
x2 ≤ 2,
x1 ≤ 2,
x1, x2 ≥ 0.
Thêm biến bù:
3x1 + 2x2 + w5 = 12,
x2 + w6 = 2,
x1 + w7 = 2,
9
với w5, w6, w7 là những biến bù.
Giải bài toán đơn hình dạng bảng:
Nghiệm tối ưu của LP2: x1 = x2 = 2. Vì tất cả các biến trong LP2 có giá trị nguyên,
nên không rẽ nhánh LP2 thêm nữa.
LP3:
max z = x1 + x2,
3x1 + 2x2 ≤ 12,
x2 ≤ 2,
x1 ≥ 3,
x1, x2 ≥ 0.
Thêm biến bù:
3x1 + 2x2 + w8 = 12,
x2 + w9 = 2,
10
x1 − w10 + A1 = 3,
với w8, w9 là những biến bù, w10 là biến phụ, A1 là biến giả.
Giải bài toán đơn hình dạng bảng:
Nghiệm tối ưu của LP3: x1 = 3, x2 = 3/2.
Nghiệm tối ưu đạt được không nguyên nên không là nghiệm tối ưu của bài toán. Vì
x2 = [1 + 1/2] = 1, ta có thể chia nhánh LP3 thành hai bài toán con (LP4 và LP5) bằng
cách thêm các ràng buộc x2 ≤ 1, x2 ≥ 2.
LP4:
max z = x1 + x2,
3x1 + 2x2 ≤ 12,
x2 ≤ 2,
x1 ≥ 3,
x2 ≤ 1,
x1, x2 ≥ 0.
11
Thêm biến bù:
3x1 + 2x2 + w11 = 12,
x2 + w12 = 2,
x1 − w13 + A1 = 3,
x2 + w14 = 1,
với w11, w12, w14 là những biến bù, w13 là biến phụ, A1 là biến giả.
Giải bài toán đơn hình dạng bảng:
Nghiệm tối ưu của LP4: x1 = 10/3, x2 = 1.
Nghiệm tối ưu đạt được không nguyên nên không là nghiệm tối ưu của bài toán. Vì
x1 = [3 + 1/3] = 3, ta có thể chia nhánh LP4 thành hai bài toán con (LP6 và LP7) bằng
cách thêm các ràng buộc x1 ≤ 3, x1 ≥ 4.
LP5:
max z = x1 + x2,
12
3x1 + 2x2 ≤ 12,
x2 ≤ 2,
x1 ≥ 3,
x2 ≥ 2,
x1, x2 ≥ 0.
Nghiệm của LP5 không chấp nhận được nên không xét LP5 nữa.
LP6:
max z = x1 + x2,
3x1 + 2x2 ≤ 12,
x2 ≤ 2,
x1 ≥ 3,
x2 ≤ 1,
x1 ≤ 3,
x1, x2 ≥ 0.
13
Thêm biến bù, biến phụ, biến giả:
3x1 + 2x2 + w15 = 12,
x2 + w16 = 2,
x1 − w17 + A1 = 3,
x2 + w18 = 1,
x1 + w19 = 3,
với w15, w16, w18, w19 là những biến bù, w17 là biến phụ, A1 là biến giả.
Giải bài toán đơn hình dạng bảng, ta có:
LP6 có nhiều nghiệm tối ưu, khi x2 = 0 thì trùng nghiệm cơ bản. Nghiệm tối ưu của
LP6: x1 = 3, x2 = 1. Vì tất cả các biến trong LP6 có giá trị nguyên, nên không rẽ nhánh
LP6 thêm nữa.
LP7:
max z = x1 + x2,
3x1 + 2x2 ≤ 12,
14
x2 ≤ 2,
x1 ≥ 3,
x2 ≤ 1,
x1 ≥ 4,
x1, x2 ≥ 0.
Thêm biến bù:
3x1 + 2x2 + w20 = 12,
x2 + w21 = 2,
x1 − w22 + A1 = 3,
x2 + w23 = 1,
x1 − w24 + A2 = 4,
với w20, w21, w23 là những biến bù, w22, w24 là biến phụ, A1, A2 là biến giả.
Giải bài toán đơn hình dạng bảng, ta có:
15
Nghiệm tối ưu của LP7: x1 = 4, x2 = 0, so sánh với giá trị mục tiêu của bài toán gốc
và điều kiện ràng buộc biến nguyên thì nghiệm của LP7 cũng là nghiệm tối ưu của bài
toán. Vì tất cả các biến trong LP7 có giá trị nguyên, nên không rẽ nhánh LP7 thêm nữa.
Bài toán đạt nghiệm nguyên chấp nhận được tại LP2, LP6, LP7 đều có giá trị mục
tiêu là z = 4 nhưng tổng trọng lượng LP2 mang được là 10, LP6 là 11 và LP7 là 12, vậy
nghiệm tối ưu của cả bài toán là LP7 với tối ưu giá trị sử dụng z = 4 và tối đa trọng
lượng mang theo. Tập nghiệm tối ưu cho bài toán gốc là: x∗ = (4, 0), z∗ = 4
Sơ đồ cây cho quá trình giải bài toán bằng phương pháp nhánh - và - cận có dạng như
sau:
16
Ví dụ 1.2.2 (Capital Budgeting problem) Giả sử chúng ta ước đầu tư một giá trị tối đa
b và có n mục tiêu đầu tư. Đầu tư mục tiêu j yêu cầu aj sẽ có giá trị "present" (giá trị
chiết khấu kỳ hạn) là cj. Chúng ta nên đầu tư như thế nào để tổng giá trị "present" đạt
maximum. Đây là dạng bài toán đầu tư "có - không" nên ta sẽ đưa về quy hoạch nguyên
nhị phân:
max z =
n∑
j=1
cjxj,
n∑
j=1
ajxj ≤ b,
xj =
{
0 không đầu tư
1 đầu tư
xj là nguyên,j = 1, . . . , n.
17
Ta xét bài toán cụ thể với khoản đầu tư mơ ước tối đa b = 14, 000 USD, có bốn mục
tiêu đầu tư, mục tiêu đầu tư một a1 = 5, 000 USD có giá trị c1 = 8, 000 USD, mục tiêu đầu
tư hai a2 = 7, 000 USD có giá trị c2 = 11, 000 USD, mục tiêu đầu tư ba a3 = 4, 000 USD
có giá trị c1 = 6, 000 USD, mục tiêu đầu tư bốn a4 = 3, 000 USD có giá trị c1 = 4, 000
USD. Hỏi phải đầu tư như thế nào để tổng giá trị "present" đạt max? Mô hình bài toán:
max z = 8x1 + 11x2 + 6x3 + 4x4,
5x1 + 7x2 + 4x3 + 3x4 ≤ 14,
xj ∈ {0, 1}, j = 1, . . . , 4.
Theo đó, ta giải bài toán trên bằng phương pháp đơn giản (bỏ đi điều kiện nguyên),
bài toán có dạng:
Sau khi thêm biến, ta có:
max z = 8x1 + 11x2 + 6x3 + 4x4,
5x1 + 7x2 + 4x3 + 3x4 + w5 = 14,
x1 + w6 = 1,
x2 + w7 = 1,
x3 + w8 = 1,
18
x4 + w9 = 1,
với w5, w6, w7, w8, w9 la biến bù.
Phương pháp đơn hình dạng bảng:
Chuyển hàm mục tiêu từ max thành min, ta giải:
max z = −min−z = −8x1 − 11x2 − 6x3 − 4x4,
x1 x2 x3 x4 w5 w6 w7 w8 w9
−8 −11 −6 −4 0 0 0 0 0 0
5 7 4 3 1 0 0 0 0 14
1 0 0 0 0 1 0 0 0 1
0 1 0 0 0 0 1 0 0 1
0 0 1 0 0 0 0 1 0 1
0 0 0 1 0 0 0 0 1 1
Chọn cột xoay là cột 2, hàng xoay là hàng 3, ta có:
x1 x2 x3 x4 w5 w6 w7 w8 w9
−8 0 −6 −4 0 0 11 0 0 11
5 0 4 3 1 0 −7 0 0 7
1 0 0 0 0 1 0 0 0 1
0 1 0 0 0 0 1 0 0 1
0 0 1 0 0 0 0 1 0 1
0 0 0 1 0 0 0 0 1 1
Chọn cột xoay là cột 1, hàng xoay là hàng 2, ta có:
19
x1 x2 x3 x4 w5 w6 w7 w8 w9
0 0 −6 −4 0 8 11 0 0 19
0 0 4 3 1 −5 −7 0 0 2
1 0 0 0 0 1 0 0 0 1
0 1 0 0 0 0 1 0 0 1
0 0 1 0 0 0 0 1 0 1
0 0 0 1 0 0 0 0 1 1
Chọn cột xoay là cột 3, hàng xoay là hàng 1, ta có:
x1 x2 x3 x4 w5 w6 w7 w8 w9
0 0 0 1/2 3/2 1/2 1/2 0 0 22
0 0 1 3/4 1/4 −5/4 −7/4 0 0 1/2
1 0 0 0 0 1 0 0 0 1
0 1 0 0 0 0 1 0 0 1
0 0 0 −3/4 −1/4 5/4 7/4 1 0 1/2
0 0 0 1 0 0 0 0 1 1
Hệ số trên hàng đầu không âm, nghiệm tối ưu là :
x1 = x2 = 1, x3 = 0.5, x4 = 0, z = 22
Chúng ta thấy nghiệm không nguyên, nên chúng ta phải đảm bảo x3 nguyên và rẽ nhánh
x3 = 0 hoặc x3 = 1 và chia thành hai bài toán con LP2 và LP3,
LP2: x3 = 0
Sau khi thêm biến, ta có:
max z = 8x1 + 11x2 + 4x4,
20
5x1 + 7x2 + 3x4 + w10 = 14,
x1 + w11 = 1,
x2 + w12 = 1,
x4 + w13 = 1,
với w10, w11, w12, w13 la biến bù.
Chuyển hàm mục tiêu từ max thành min, ta giải:
max z = −min−z = −8x1 − 11x2 − 4x4,
x1 x2 x4 w10 w11 w12 w13
−8 −11 −4 0 0 0 0 0
5 7 3 1 0 0 0 14
1 0 0 0 1 0 0 1
0 1 0 0 0 1 0 1
0 0 1 0 0 0 1 1
Chọn cột xoay là cột 2, hàng xoay là hàng 3, ta có:
x1 x2 x4 w10 w11 w12 w13
−8 0 −4 0 0 11 0 11
5 0 3 1 0 −7 0 7
1 0 0 0 1 0 0 1
0 1 0 0 0 1 0 1
0 0 1 0 0 0 1 1
21
Chọn cột xoay là cột 1, hàng xoay là hàng 2, ta có:
x1 x2 x4 w10 w11 w12 w13
0 0 −4 0 8 11 0 19
0 0 3 1 −5 −7 0 2
1 0 0 0 1 0 0 1
0 1 0 0 0 1 0 1
0 0 1 0 0 0 1 1
Chọn cột xoay là cột 3, hàng xoay là hàng 1, ta có:
x1 x2 x4 w10 w11 w12 w13
0 0 0 4/3 4/3 5/3 0 21.667
0 0 1 1/3 −5/3 −7/3 0 2/3
1 0 0 0 1 0 0 1
0 1 0 0 0 1 0 1
0 0 0 −1/3 5/3 7/3 1 1/3
Hệ số trên hàng đầu không âm, nghiệm tối ưu là :
x1 = x2 = 1, x3 = 0, x4 = 0.667, z = 21.667
Nghiệm đạt được không nguyên nên không là nghiệm tối ưu của bài toán ban đầu.
LP3: x3 = 1
Sau khi thêm biến, ta có:
max z = 8x1 + 11x2 + 6 + 4x4,
5x1 + 7x2 + 3x4 + w14 = 10,
22
x1 + w15 = 1,
x2 + w16 = 1,
x4 + w17 = 1,
với w14, w15, w16, w17 la biến bù.
Chuyển hàm mục tiêu từ max thành min, ta giải:
max z = −min−z = −8x1 − 11x2 − 6− 4x4,
x1 x2 x4 w14 w15 w16 w17
−8 −11 −4 0 0 0 0 6
5 7 3 1 0 0 0 10
1 0 0 0 1 0 0 1
0 1 0 0 0 1 0 1
0 0 1 0 0 0 1 1
Chọn cột xoay là cột 2, hàng xoay là hàng 1 (do nếu chọn hàng xoay là 2 bài toán
trở lại ban đầu), ta có:
x1 x2 x4 w14 w15 w16 w17
−1/7 0 5/7 11/7 0 0 0 152/7
5/7 1 3/7 1/7 0 0 0 10/7
1 0 0 0 1 0 0 1
−5/7 0 −3/7 −1/7 0 1 0 −3/7
0 0 1 0 0 0 1 1
23
Chọn cột xoay là cột 1, hàng xoay là hàng 2, ta có:
x1 x2 x4 w14 w15 w16 w17
0 0 5/7 11/7 1 0 0 153/7
0 1 3/7 1/7 1 0 0 5/7
1 0 0 0 1 0 0 1
0 0 2/7 4/7 5/7 1 0 2/7
0 0 1 0 0 0 1 1
Hệ số trên hàng đầu không âm, nghiệm tối ưu là :
x1 = x3 = 1, x4 = 0, x2 = 0.714, z = 21.85
Nghiệm đạt được không nguyên nên không là nghiệm tối ưu của bài toán ban đầu.
Giải LP3 và LP2 vẫn chưa đạt nghiệm nguyên, vì vậy chúng ta sẽ chọn bài toán con
và rẽ nhánh 1 trong các biến theo tiêu chuẩn sau:
• Chọn bài toán con mà chưa từng chọn trước đây,
• Chọn bài toán con với giá trị mục tiêu cao nhất.
Trong trường hợp này, ta rẽ nhánh bài toán LP3 với x2 = 0 hoặc x2 = 1 thành hai
bài toán con LP4 và LP5.
LP4: x3 = 1, x2 = 0
Sau khi thêm biến, ta có:
max z = 8x1 + 6 + 4x4,
5x1 + 3x4 + w18 = 10,
24
x1 + w19 = 1,
x4 + w20 = 1,
với w18, w19, w20 la biến bù.
Chuyển hàm mục tiêu từ max thành min, ta giải:
max z = −min−z = −8x1 − 6− 4x4,
x1 x4 x18 x19 x20
−8 −4 1 0 0 6
5 3 1 0 0 10
1 0 0 1 0 1
0 1 0 0 1 1
Chọn cột xoay là cột 1, hàng xoay là hàng 2, ta có:
x1 x4 w18 w19 w20
0 −4 0 8 0 14
0 3 1 −5 0 5
1 0 0 1 0 1
0 1 0 0 1 1
Chọn cột xoay là cột 2, hàng xoay là hàng 3, ta có:
25
x1 x4 w18 w19 w20
0 0 0 8 4 18
0 0 1 −5 3 2
1 0 0 1 0 1
0 1 0 0 1 1
Hệ số trên hàng đầu không âm, nghiệm tối ưu là :
x1 = x3 = x4 = 1, x2 = 0, z = 18
Chúng ta bây giờ đã có một nghiệm chấp nhận được với giá trị mục tiêu là 18.
LP5: x3 = 1, x2 = 1
Sau khi thêm biến, ta có:
max z = 8x1 + 17 + 4x4,
5x1 + 3x4 + w21 = 3,
x1 + w22 = 1,
x4 + w23 = 1,
với w21, w22, w23 la biến bù.
Chuyển hàm mục tiêu từ max thành min, ta giải:
max z = −min−z = −8x1 − 17− 4x4,
26
x1 x4 w21 w22 w23
−8 −4 0 0 0 17
5 3 1 0 0 3
1 0 0 1 0 1
0 1 0 0 1 1
Chọn cột xoay là cột 1, hàng xoay là hàng 1 (do nếu chọn hàng xoay là 2 bài toán
trở lại ban đầu), ta có:
x1 x4 w21 w22 w23
0 4/5 13/5 0 0 21.8
1 3/5 1/5 0 0 3/5
0 −3/5 −1/5 1 0 2/5
0 1 0 0 1 1
Hệ số trên hàng đầu không âm, nghiệm tối ưu là :
x1 = 0.6, x3 = 1, x4 = 0, x2 = 1, z = 21
Nghiệm đạt được không nguyên nên không là nghiệm tối ưu của bài toán ban đầu.
Chúng ta thấy nghiệm không nguyên, nên chúng ta phải đảm bảo x1 nguyên và rẽ
nhánh x1 = 0 hoặc x1 = 1 và chia thành hai bài toán con LP6 và LP7,
LP6: x1 = 0, x2 = x3 = 1
Nghiệm tối ưu:
x1 = 0, x2 = x3 = x4 = 1, z = 21
LP7: x1 = 1, x2 = x3 = 1
27
Nghiệm tối ưu: không chấp nhận được
Bài toán có hai nghiệm tối ưu thoả ràng buộc biến nguyên ở LP4 và LP6 nhưng so
sánh với giá trị mục tiêu thì ta thấy nghiệm tối ưu của LP6 cũng là nghiệm tối ưu của
bài toán do giá trị mục tiêu z = 21 là tốt nhất. Tập nghiệm tối ưu: x∗ = (0, 1, 1, 1)z∗ = 21
Sơ đồ cây cho quá trình giải bài toán bằng phương pháp nhánh - và - cận có dạng như
sau:
28
29
Chương 2
Phương pháp nhánh - và - cận
2.1 Giới thiệu thuật toán trên ví dụ
Phương pháp nhánh - và - cận (branch - and - bound method) xuất hiện đầu tiên trong
[Land - Doig 1960] và nhất là dạng hoàn thiện trong [Dakin 1965], nó trở nên có ưu thế
rõ rệt trong việc giải bài toán nguyên. Ta sẽ trình bày phương pháp thông qua ví dụụ
Hình 2.1:
Ví dụ 2.1.1 Xét quy hoạch nguyên (IP)
30
max z = 5x1 + 4x2,
x1 + x2 ≤ 5,
10x1 + 6x2 ≤ 45,
x1, x2 ∈ Z+.
Gọi LP0 là quy hoạch tuyến tính tương ứng ở bước lặp 0, tức là thay x1, x2 ∈ Z − +
bằng x1, x2 ≥ 0 có nghiệm tối ưu là x1 = 3.75, x2 = 1.25 và z = 23.75, xem H 2.1, ở đây
A là điểm tối ưu của LP0 còn các dấu • là miền chấp nhận được (cnđ) của IP. Lấy bất
kỳ một biến mà ở A có giá trị không nguyên, chẳng hạn x1 = 3.75. Vì phần miền chấp
nhận được của LP0 thoả 3 < x1 < 4 không thể chứa nghiệm chấp nhận được của IP nên
ta có thể bỏ qua không xét phần này và chia nhánh (branching) ra được hai miền và tương
ứng là hai bài toán quy hoạch tuyến tính con ở bước 1 tiếp theo:
1. LP1 với miền chấp nhận được là miền chấp nhận được LP0, với x1 ≤ 3;
2. LP2 với miền chấp nhận được là miền chấp nhận được LP0, với x1 ≥ 4.
x1 được gọi là biến chia nhánh (branching variable) H 2.2 (a) biểu diễn việc chia miền và
(b) là sơ đồ cây của thuật toán ở bước đầu và đã được nghiệm tối ưu của IP
Đến đây ta biết nghiệm tối ưu của IP, phải nằm trong LP (hoặc LP2 (tức là trong
miền xác định của ít nhất một trong hay quy hoạch tuyến tính này). Ta đành giải bất kỳ,
chẳng hạn LP1, là LP0 thêm ràng buộc x1 ≤ 3:
max z = 5x1 + 4x2,
31
Hình 2.2:
x1 + x2 ≤ 5,
10x1 + 6x2 ≤ 45,
x1 ≤ 3,
x1, x2 ∈ Z+.
LP1 có thể giải bằng cách đưa về dạng chính tắc và dùng thuật toán đơn hình tiêu chuẩn.
Cũng có thể giải bằng thuật toán đơn hình áp dụng cho quy hoạch tuyến tính tổng quát,
có chứa cận dạng lj ≤ xj ≤ uj, xem [Khánh - Nương 2000], Chương 9. Nghiệm tối ưu
của LP1 là x1 = 3, x2 = 2, z = 23, vô tình đã là nguyên, Đây là nghiệm tốt nhất tạm thời
cho IP, ta gọi là một kỷ lục (incumbent). Do đó LP1 không thể suy ra nghiệm chấp nhận
được tốt hơn cho IP, chỉ còn chờ so sánh với sự nghiêm cứu LP2. Ta nói đã làm chạm
đáy (fathoming) LP1. Việc "chờ so sánh" này cũng quna trọng không kém việc (nếu như)
LP1 còn được thao tác tiếp (như LP2, sau đây sẽ thấy) vì nó cho một cận dưới của mục
tiêu tối ưu của IP do z = 23 đã đạt được (bởi nghiệm nguyên), z tối ưu không thể nhỏ
hơn. Vậy ở đây ta đã đặt cận (bounding) cho thuật toán. Tiếp theo, nói chung ta phải
giải LP2 như sẽ làm dưới đây. Nhưng trong trường hợp may mắn này ta thấy cận dưới
32
đã là 23 = [23.75] ([.] ký hiệu phần nguyên), với 23.75 là mục tiêu tối ưu của LP0 và
cũng là của IP, đều nguyên, nên mục tiêu tối ưu của IP, là số nguyên không thể tốt hơn
[23.75] = 23. Vậy ta đã may mắn được một nghiệm tối ưu của IP ngay sau một bước.
Nếu ta không chọn (bất kỳ) LP1 như trên mà chọn LP2, thì dù đã chọn (bất kỳ và
may mắn một phần) biến chia nhánh là x1, thuật toán kéo dài như sau. Giải LP2 (là quy
hoạch có được khi thay ràng buộc x1 ≤ 3 bởi x1 ≥ 4 ở LP1) bằng thuật toán đơn hình ta
được x1 = 4, x2 = 0.8333, z = 23, 3333. Vì x2 = 0.8333 chưa nguyên, ta phải nhánh LP2
để được LP3, LP4 với ràng buộc bổ sung tương ứng x2 ≤ 0 và x2 ≥ 1, tức là:
1. Miền chấp nhận được LP3 là miền chấp nhận được LP0 thêm ràng buộc
x1 ≥ 4, x2 ≤ 0;
2. Miền chấp nhận được LP4 là miền chấp nhận được LP0 thêm ràng buộc
x1 ≥ 4, x2 ≥ 1.
Đến đây ta thấy hợp cả ba miền chấp nhận được của LP1, LP3 và LP4 chứa miền
chấp nhận được của IP và còn phải xét cả ba. Có thể chọn bất kỳ để làm tiếp. Một trong
các cách chọn hay dùng là chọn các bài toán con được lập sau cùng, ở đây là LP3 và LP4.
Như vậy khi giải bằng phương pháp đơn hình có thể tận dụng kết quả ở lời giải LP2 ngay
trước đó, vì so với LP2, ở LP3 và LP4 chỉ có thêm một ràng buộc. Do đó có thể áp dụng
nghiên cứu hậu tối ưu lên nghiệm tối ưu của LP2 mà không cần giải lại (xem [Khánh
- Nương 2000], Chương 8). Giả sử chọn ngẫu nhiên LP4 và giải ta thấy LP4 không có
nghiệm chấp nhận được. Tất nhiên sau này chẳng cần nhìn đến LP4 nữa, ta cũng nói nó
đã chạm đáy. Tiếp theo còn LP3 và LP1, ta lại chọn bất kỳ, nhưng theo nguyên tắc mới
lập hơn thì ta lấy LP3 và giải được nghiệm tối ưu của LP3 là x1 = 4.5, x2 = 0, z = 22.5.
Vì x1 chưa nguyên ta phải chia nhánh để được bài toán con:
1. Miền chấp nhận được LP5 là miền chấp nhận được LP0 thêm ràng buộc
x1 ≥ 4, x2 ≤ 0, x1 ≤ 4;
2. Miền chấp nhận được LP4 là miền chấp nhận được LP0 thêm ràng buộc
x1 ≥ 4, x2 ≤ 0, x1 ≥ 5.
33
Ta còn bài toán con chưa xét LP1, LP5 và LP6, chọn bất kỳ theo nguyên tắc mới
hơn xét LP6 ta thấy nó không chấp nhận được, tức là đã chạm đáy. Đến lượt giải LP5,
mới hơn LP1, ta được nghiệm tối ưu là x1 = 4, x2 = 0, z = 20 thoả cả ràng buộc về tính
nguyên. Đến đây ta được một cận dưới của mục tiêu tối ưu của IP là z = 20 và do đó
LP5 cũng chạm đáy, cung cấp một cận dưới cũng là kỷ lục là z = 20. Còn lại duy nhất
LP1 phải xét (xem có được kỷ lục mới không). Theo trên đã thấy giải LP1 ta được nghiệm
tối ưu x1 = 3, x2 = 2, z = 23, cũng thoả tính nguyên nên ta được một cận dưới và LP1
đã chạm đáy, cung cấp một kỷ lục mới. Vì không còn bài toán con nào để xét, kỷ lục mới
này là nghiệm tối ưu của IP.
Như vậy cũng với việc chọn x1 là biến phân nhánh nhưng chọn LP2 để xét thay cho
LP1 ta đã phải làm dài nhất trong các khả năng có thể (nếu dùng quy tắc chọn trong các
bài toán con mới lập) như H 2.3 minh hoạ sơ đồ cây thực hiện thuật toán.
2.2 Chia nhánh, đặt cận, chạm đáy
Mọi thuật toán nhánh - và - cận đều gồm ba thủ tục chia nhánh, đặt cận, chạm đáy.
Mỗi thủ tục được linh động trong cách thực hiện nên có các dạng thuật toán khác nhau.
"Chia nhánh" là chọn một trong các bài toán con còn phải xét để chia tiếp ra. "Chọn"
có thể lấy bất kỳ. Một quy tắc phổ biến là chọn trong các bài toán con mới lập. Vì việc
đặt cận cũng có thể khác nhau, có nhiều cách định nghĩa cận (không chỉ là kỷ lục như
định nghĩa trên), nên cũng sinh ra cách chọn khác là chọn trong các bài toán con có cận
tốt nhất, với hy vọng sớm đi đến kỷ lục mới. "Chia" có nghĩa phổ biến là lấy một biến
chia nhánh xj để chia ra hai bài toán con với ràng buộc thêm xj ≤ [a] và xj ≥ [a] + 1
tương ứng. Với bài toán nhị phân thì hai ràng buộc thêm sẽ là xj = 0 và xj = 1. Tuy vậy,
một số thuật toán chi tiết hơn có thể dùng các chiến thuật nào đó để lấy biến chia nhánh.
"Đặt cận" thường thực hiện bằng giải bài toán nới lỏng. Như phương pháp trên đây
thì phải dùng LP - nới lỏng để đặt cận. Với các thuật toán nhánh - và - cận khác, còn có
các kiểu bài toán nới lỏng khác. Chẳng hạn thuật toán nhánh - và - cận cho quy hoạch
34
Hình 2.3:
nhị phân có thể áp dụng Lagrange nới lỏng (Lagrange relaxation). Định nghĩa tổng quát
Lagrangian nới lỏng như sau. Giả sử cần xét quy hoạch nguyên
max z = cTx,
Ax < b,
xj ∈ Z+, j = 1, . . . , n.
Ở đây x ∈ Rn, A cấp mxn. Lấy một λ ≥ 0, λ ∈ Rm cố định. Khi đó Lagrangian nới lỏng
được định nghĩa là bài toán
max
x≥0
L = cTx− λT (Ax− b).
35
Rõ ràng ta có quan hệ hai mục tiêu tối ưu z∗ ≤ L∗, tức là L∗ là một cận trên (có sát z∗
hay không còn phụ thuộc λ đã chọn)
"Chạm đáy" có ba tiêu chuẫn như sau (cho bài toán tìm max):
• Tiêu chuẩn 1: Nếu cận của bài toán con ≤ mục tiêu kỷ lục, hoặc nói chung hơn là
nếu mọi mục tiêu chấp nhận được của bài toán con ≤ mục tiêu kỷ lục, thì bài toán này
chạm đáy.
• Tiêu chuẩn 2: Nếu bài toán con không chấp nhận được thì nó chạm đáy.
• Tiêu chuẩn 3: Nghiệm tối ưu của LP - nới lỏng của bài toán con là nguyên thì nó
chạm đáy.
Rõ ràng nếu bài toán là tìm min thì ở Tiêu chuẩn 1 chỉ việc đổi dấu thành ≥, còn hai
tiêu chuẩn kia giữ nguyên dạng.
2.3 Thuật toán nhánh - và - cận
Xét bài toán quy hoạch nguyên tìm max. Gọi z là cận dưới - kỷ lục. Bước khởi động
đặt i = 0 và đặt z = −∞. Ở một bước lập tổng quát có hai đoạn như sau.
Đoạn 1 (Chạm đáy/đặt cận). Chọn LPi là bài toán con sẽ xét. Giải và xét nó có chạm
đáy hay không.
(a) Nếu LPi chạm đáy theo tiêu chuẩn 3 thì cập nhật z để được cận dưới mới. Trái
lại, theo tiêu chuẩn khác, thì chọn bài toán con i mới và lập như trên. Nếu không còn bài
toán con chưa xét thì dừng. Nghiệm tối ưu của Ip là tương ứng với cận dưới - kỷ lục cuối
cùng, nếu có nghiệm như vậy.
(b) Nếu LPi không chạm đáy, chuyển sang Đoạn 2 để chia nhánh LPi.
36
Đoạn 2 (Chia nhánh). Chọn một trong các biến xj mà x
∗
j ở nghiệm tối ưu LPi chưa
là số nguyên. Lập hai bài toán con LP - nới lỏng bằng cách thêm ràng buộc tương ứng
xj ≤ [x∗j ] và xj ≥ [x∗j ] + 1
Chuyển sang Đoạn 1.
NHẬN XÉT. Nếu quy hoạch là tim min, thì ở thuật toán chỉ việc thay cận dưới z
bởi cận trên z và ở bước khởi động đặt z = +∞. Các chi tiết khác không đổi.
Thuật toán trên cũng áp dụng cho quy hoạch nguyên bộ phận. Nếu biến nào không
bị ràng buộc lấy giá trị nguyên thì không được chọn là biến phân nhánh. Giả sử ở
ví dụ 2.1, bây giờ x2 là biến liên tục. Nếu ta chọn LP1 để giải được nghiệm tối ưu
x1 = 3, x2 = 2, z = 23 thì đây là nghiệm chấp nhận được của quy hoạch nguyên bộ phận
MIP. Tuy nhiên ta không thể lam chạm đáy LP2 để được nghiệm vừa có là tối ưu của
MIP bằng lý luận như ở Mục 2.1 vì z của MIP có thể không nguyên. Ta phải giải LP2 để
được nghiệm như ở H 2.3. Nghiệm này chấp nhận được cho MIP nên LP2 chạm đáy theo
Tiêu chuẩn 3. z = 23.3333 của LP2 là kỷ lục mới, và là nghiệm tối ưu của MIP vì không
còn bài toán con nào để xét.
Sơ đồ khối thuật toán:
37
38
Chương 3
Giải bài toán nguyên trên Mathlab
3.1 Giới thiệu Mathlab
Matlab là chương trình phần mềm trợ giúp cho việc tính toán và hiển thị. Matlab có
thể chạy trên hầu hết các hệ máy tính từ máy tính cá nhân đến máy tinh khổng lồ - super
computer.
Matlab được điều khiển bởi tập các bộ lệnh, tương tác bằng bàn phím trên cửa sổ
điều khiển, đồng thời Matlab còn cho phép khả năng lập trình với cú pháp thông dịch
lệnh hay còn gọi là scrift file. Các lệnh, bộ lệnh của Matlab lên đến con số hàng trăm và
ngày càng được mở rộng bởi các toolbox trợ giúp hay các hàm ứng dụng tạo ra bởi người
sử dụng.
Các lệnh của Matlab rất mạnh và hiệu quả cho phép giải các loại hình bài toán khác
nhau và đặc biệt hiệu quả cho hệ phương trình tuyến tính cũng như các thao tác trên các
bài toán ma trận. Không những thế Matlab còn rất hữu hiệu trong việc trợ giúp thao tác
và truy xuất đồ hoạ trong không gian 2D, 3D cũng như khả năng tạo hoạt cảnh minh
hoạ cho việc mô tả bài toán một cách sinh động.
Cùng với trên 25 toolbox (thư viện trợ giúp) khác nhau Matlab đưa đến cho các bạn
sự lựa chọn hoàn chỉnh và phong phú về các công cụ trợ giúp đắc lực trong các lĩnh vực
khác nhau trên con đường nghiên cứu mà bạn đã chọn.
39
Đây là một số lĩnh vực mà Matlab đang giải quyết:
• Nghiên cứu và phát triển trong lĩnh vực công nghiệp
• Giảng dạy, nghiên cứu lập các chương trình ứng dụng trong giảng dạy cho các môn
như toán, lý, hoá, ... trong các trường phổ thông nhằm nâng cao khả năng tiếp thu cũng
như ý sáng tạo trong học sinh
• Giảng dạy, nghiên cứu lập các chương trình về toán đặc biệt là các loại hình nguyên lý
cơ bản và các phương trình tuyến tính cho sinh viên cũng như học sinh các trường kỹ thuật
• Giảng dạy và nghiên cứu trong lĩnh vực kỹ thuật và khoa học như: điện tử, lý thuyết
điều khiển, vật lý, đồ hoạ, xử lý ảnh, vật liệu, ...
• Giảng dạy và nghiên cứu trên mọi lĩnh vực có xuất hiện tính toán bao gồm toán
kinh tế, hoá, cơ học, sinh học, ...
3.2 Lập trình thuật toán giải bài toán nguyên
Thuật toán cần áp dụng cùng với Optimazition toolbox và thuật toán đơn hình gốc
(linprog.m) trong Matlab:
function[x, val, status] = IP1(f, A, b, Aeq, beq, lb, ub,M, e)
options = optimset(′display′,′ off ′);
bound = inf ;
Khởi tạo chặn trên của biến
[x0, val0] = linprog(f, A, b, Aeq, beq, lb, ub, [], options);
[x, val, status, b] = rec(f, A, b, Aeq, beq, lb, ub, x0, val0,M, e, bound);
40
Hàm đệ quy truy xuất cây nhánh cận
function[xx, val, status, bb] = rec(f, A, b, Aeq, beq, lb, ub, x, v,M, e, bound)
options = optimset(′display′,′ off ′);
x là nghiệm tối ưu khởi tạo và v là giá trị tối ưu tương ứng
Giải mô hình bài toán tuyến tính sau khi bỏ ràng buộc nguyên
[x0, val0, status0] = linprog(f, A, b, Aeq, beq, lb, ub, [], options);
Nếu nghiệm không chấp nhận được hay giá trị mục tiêu cao hơn giá trị chặn, trả về
nghiệm khởi tạo
ifstatus0 bound
xx = x; val = v; status = status0; bb = bound;
return;
end
Nếu biến ràng buộc nguyên là nguyên
ind = find(abs(x0(M)− round(x0(M))) > e);
ifisempty(ind)
status = 1;
ifval0 < bound
nghiệm này tốt hơn nghiệm hiện tại thì thay thế
x0(M) = round(x0(M));
xx = x0;
val = val0;
bb = val0;
else
41
xx = x;
trả về nghiệm khởi tạo
val = v;
bb = bound;
end
return
end
Nếu nghiệm của LP relaxation là chấp nhận được và đưa một giá trị nhỏ hơn chặn hiện
tại nhưng vài biến ràng buộc nguyên là không nguyên. Vì vậy chúng ta lọc biến không
nguyên và từ hay bài toán LP và giải chúng đệ quy bằng cách gọi hàm tương tự (rẽ nhánh)
Bài toán LP1 với ràng buộc Xi <= floor(Xi) , i=ind(1)
brvar = M(ind(1));
brvalue = x(brvar);
ifisempty(A)
[rc] = size(Aeq);
else
[rc] = size(A);
end
A1 = [A; zeros(1, c)];
A1(end, brvar) = 1;
b1 = [b; floor(brvalue)];
Bài toán LP với ràng buộc Xi >= ceil(Xi) , i=ind(1)
A2 = [A; zeros(1, c)];
A2(end, brvar) = −1;
b2 = [b;−ceil(brvalue)];
42
giải LP1
[x1, val1, status1, bound1] = rec(f, A1, b1, Aeq, beq, lb, ub, x0, val0,M, e, bound);
status = status1;
if status1 > 0 và bound1 < bound
nếu nghiệm tối ưu thì đưa vào chặn tốt hơn
xx = x1;
val = val1;
bound = bound1;
bb = bound1;
else
xx = x0;
val = val0;
bb = bound;
end
Giải LP2
[x2, val2, status2, bound2] = rec(f, A2, b2, Aeq, beq, lb, ub, x0, val0,M, e, bound);
if status2 > 0 và bound2 < bound
nếu nghiệm tối ưu thì đưa vào chặn tốt hơn
status = status2;
xx = x2;
val = val2;
bb = bound2;
end
43
3.3 Giải bài toán nguyên trên Mathlab
Ví dụ 3.3.1 Xét bài toán "knapsack problem" ở phần trên bằng phương pháp nhánh cận
trên Matlab. Mô hình bài toán:
max z = x1 + x2,
3x1 + 2x2 ≤ 12,
x2 ≤ 2,
x1, x2 ≥ 0 và nguyên.
Chuyển thành ngôn ngữ Matlab, ta có:,
f = [−1,−1]; lấy phủ định của bài toán max
A = [3 2; 0 1];
B = [12; 2];
lb = [0 0];
ub = [inf inf ];
M = [1, 2]; vecto chỉ số cho biến mà có ràng buộc nguyên
44
45
Nghiệm tối ưu của bài toán: x1 = 4, x2 = 0 với z = 4
Ví dụ 3.3.2 Xét bài toán "Capital Budgeting" ở phần trên bằng phương pháp nhánh cận
trên Matlab . Mô hình bài toán:
max z = 8x1 + 11x2 + 6x3 + 4x4,
5x1 + 7x2 + 4x3 + 3x4 ≤ 14,
xj ∈ 0, 1, j = 1, . . . , 4.
46
Chuyển thành ngôn ngữ Matlab, ta có:,
f = [−8,−11,−6,−4]; lấy phủ định của bài toán max
A = [5 7 4 3; 1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1];
B = [14; 1; 1; 1; 1];
lb = [0 0 0 0];
ub = [1 1 1 1];
M = [1, 2, 3, 4]; vecto chỉ số cho biến mà có ràng buộc nguyên
47
Nghiệm tối ưu của bài toán: x1 = 0, x2 = x3 = x4 = 1 với z = 21
48
TÀI LIỆU THAM KHẢO
1. [Beasley 1996] (J. E. Beasley, editor), Advances in Linear and Integer Programminh,
Clarendon Press, Oxford.
2. Belvaux, G. and Wolsey, L. A., 2001, Modelling Practical Lot-Sizing Problems as
Mixed-Integer Programs. Management Science 47, 993-1007.
3. [Bertsimas - Tsitsiklis 1997] (D. Bertsimas, J. N. Tsitsiklis), Introduction to Linear
Optimization, Athena Scientific, Belmont, Massachusetts.
4. [Bixby - Boyd - Rios Mercado 1998] (R. E. Bixby, E. A. Boyd, R. Z. Rios Mercado)
Integer Programming and combinatorial Optimization, Springer, New York - Berlin.
5. [Danh 2003] (T. N. Danh), Toán rời rạc, Nhà xuất bản Đại học Quốc gia TP. Hồ
Chí Minh.
6. [Gomory 1958] (R. E. Gomory), Outline of an algorithm for integer solutions to
linear programs, Bulletin of the AMS, Vol. 64, 275-278.
7. [Hanselman - Littlefield] (Duane Hanselman, Bruce Littlefield), Mastering Matlab
7, University of Maine, New York.
8. [Hillier - Lieberman 2001] (F. S. Hillier, G. J. Lieberman), Introduction to Operation
Reasearch, McGraw-Hill, New York.
9. [Khánh - Nương 2000] (P. Q. Khánh, T. H. Nương), Quy hoạch tuyến tính, Nhà
xuất bản Giáo dục, Hà Nội.
10. [Khánh 2000] (P. Q. Khánh), Toán chuyên đề, Nhà xuất bản Đại học Quốc gia TP.
Hồ Chí Minh.
11. [Khánh 2002] (P. Q. Khánh), Vận trù học, Nhà xuất bản Giáo dục, Hà Nội.
12. João P. Pedroso. An evolutionary solver for linear integer programming. BSIS Tehnial
Report 98-7, Riken Brain Siene Institute, Wako-shi, Saitama, Japan, 1998.
13. [Nghĩa 1997] (N. Đ. Nghĩa), Tối ưu hoá, Nhà xuất bản Giáo dục, Hà Nội.
49
14. [Nghĩa - Thành 1997] (N. Đ. Nghĩa, N. T. Thành), Toán rời rạc, Nhà xuất bản Khoa
học Kỹ thuật.
15. Robert E. Bixby, Sebastian an Ceria, CassandraM. M Zeal, and MartinW. P. Savels-
bergh. An updated mixed integer programming library. Tehnial report, Rie Univer-
sity, 1998. TR98-03.
16. [Schrijver 1999] (A. Schrijver), Theory of Linear and Integer Programming, John
Wiley and Sons, New York.
17. S. Sen. Algorithms for Stochastic Mixed-Integer Programming Models. Technical
Report, University of AZ. 2004.
18. [Taha 1975] (H. Taha), Integer Programming, Theory, Applications and Computa-
tions, Academic Press, New York.
19. [Taha 1997] (H. Taha), Operations Research, An Introduction, McMillan, New York.
50