Chương 4 THUẬT TOÁN GOMORY THỨ HAI Chương này trình bày hai thuật toán: thuật toán Gomory thứ hai dùng để giải bài toán quy hoạch tuyến tính nguyên bộ phận, thuật toán Dalton - Llewelly
Trang 1Chương 4
THUẬT TOÁN GOMORY THỨ HAI
Chương này trình bày hai thuật toán: thuật toán Gomory thứ hai dùng để giải bài toán quy hoạch tuyến tính nguyên bộ phận, thuật toán Dalton - Llewellyn dùng để giải bài toán quy hoạch tuyến tính với các biến nhận giá trị rời rạc
1 LƯỢC ĐỒ LOGIC CHUNG CỦA THUẬT TOÁN
Xét bài toán quy hoạch rời rạc:
0 1
ij 1
j j
Bài toán này kí hiệu là (LD,C) =(L0D,C)
LD là miền chấp nhận được của bài toán (LD,C)
Dj là các tập rời rạc Điều kiện rời rạc (4) có thể có các dạng khác nhau trong các trường hợp cụ thể
Ta giả sử rằng:
1) Hàm mục tiêu x0 bị chặn trên trên miền (2)- (3)
2) Nếu tập phương án tối ưu của bài toán (1) – (3) khác rỗng thì nó phải bị chặn
Lược đồ logic của thuật toán như sau:
Bước lặp ban đầu. Giải l - bài toán ( ) (L C, ≡ L C0, )xác định bởi (1) – (3) Nếu
nó không giải được thì bài toán (L C cũng không giải được Nếu bài toán 0D, ) (L C giải 0, )
được và phương án X L C thoả mãn điều kiện rời rạc (4) thì nó đồng thời là phương ( 0, )
án tối ưu của bài toán (L C Nếu D, ) X L C không thoả mãn điều kiện rời rạc thì ( 0, )
chuyển sang bước lặp thứ r = 0
Bước lặp thứ r (r ≥ 0) Giả sử X L C không thoả mãn điều kiện rời rạc, ta ( r, )
biểu diễn hàm mục tiêu x0 = CX và x1 ,x2 , …,xn qua các biến phi cơ sở xj (j ∈N r)
và nhận được bảng đơn hình Tr = xijr là chấp nhận được và là l - chuẩn
Chọn k là dòng có chỉ số nhỏ nhất ứng với thành phần không thoả mãn điều kiện rời rạc
Trang 2và theo một qui tắc nào đó (tùy từng thuật toán) ta xây dựng lát cắt đúng :
( )
r
j N 1
≥
∑
Viết dòng (5) vào cuối bảng đơn hình Tr ta được bảng mới là không chấp nhận
được (chỉ đối với dòng cuối cùng vừa thêm vào) và là l - chuẩn Sau khi đưa xn+r+1 ra khỏi cơ sở thì dòng tương ứng sẽ bị xoá, nếu đưa vào cơ sở xl (l n ≥ + 1) thì dòng tương ứng không phục hồi Nếu nhận được bảng đơn hình ứng với bài toán qui hoạch tuyến tính không giải được thì bài toán (L C không giải được Nếu nhận được bảng D0, )đơn hình Tr+1 là chấp nhận được và l - chuẩn thì kiểm tra phương án l - tối ưu
( r 1, )
X L+ C có thoả mãn điều kiện rời rạc (4) hay không, nếu nó thoả mãn thì nó là phương án tối ưu của bài toán (L C , nếu không thoả mãn thì chuyển sang bước lặp 0D, )thứ r+1
2 THUẬT TOÁN GOMORY THỨ HAI
2.1. Thuật toán này cho phép ta giải các bài toán qui hoạch tuyến tính nguyên bộ phận
0 1
ij 1
j j j
Trang 3r i r
i r
i j
r i r i
' ij ' ij ' ij
' ij
1
r i r i
x
S X x
Trang 4Z X nguyên nên Z Xi( ) 1 ≥ , suy ra ( ) ( ) 1 { }r0
i
S X+ + S X− ≥ − x , tiếp theo do (18)
r
i r
x
γ = không phụ thuộc vào cách chọn yij Vì vậy các số yij nên chọn sao cho γj( ) yij là nhỏ nhất, trong trường hợp đó sẽ cắt được phần đa diện Lrnhiều nhất
a) Từ (21) và xij' = xijr − yij , j N ∈ r , j n ≤ 1 ta có
Trang 5( ) { } { }(0 ij ijr) ij ijr
0 ij
x
x y
x = x + x nên B đạt cực tiểu khi ta chọn yij = xijr )
Như vậy khi tính đến điều kiện cực tiểu ta nhận được
0
0 0
(0) 1
(1) 0 1.
r
i r
khi
( ) khi
r i r i
r i
Trang 6{ } { }( )
Định lý đã được chứng minh xong
2.3 Quy tắc xây dựng lát cắt đúng Giả sử X L C ( )r, không thoả mãn điều kiện nguyên (10) và Tr = xijr là bảng đơn hình tương ứng Chọn
min { { 1,2, , 1} ; r0 không nguyên }
∈
≥
trong đó γ γ0, j tính theo (14) với i = k
2.4. Tính hữu hạn của thuật toán Gomory thứ 2 chứng minh tương tự như chứng minh tính hữu hạn của thuật toán Gomory thứ nhất Khi đó đòi hỏi các điều kiện:
1) Hàm mục tiêu x0 thoả mãn điều kiện nguyên, điều đó được tính đến khi chọn dòng k để xây dựng lát cắt đúng
2) Thực hiện một trong hai điều kiện:
- Hàm mục tiêu x0 bị chặn dưới trên tập đa diện lồi L ≡ L0
- Bài toán ( L C0N, ) có ít nhất một phương án
Nhờ thuật toán Gomory thứ 2 (khi n1 = n) ta có thể giải bài toán qui hoạch tuyến tính nguyên toàn phần, nhưng không có cơ sở để so sánh hiệu quả của hai phương pháp
2.5. Giải ví dụ bằng số
Giải bài toán quy hoạch tuyến tính nguyên bộ phận sau:
Max x0 = 3 x1 − x2 + 4 x3
4 2 5
9 x1 − x2 + x3 ≥
18 2
6
3 x1 + x2 − x3 ≤
2 7 5
7 x1 + x2 + x3 ≥
3 10 5
Trang 74 4 9 x 5 x 2 x
3 2 1
5 18 3 x 6 x 2 x
3 2 1
6 2 7 x 5 x 7 x
3 2
1
7 3 2 x 5 x 10 x
0 ,
, , , ,
1 x x x x x x ≥
x
2 1
Thực hiện một bước của đơn hình đối ngẫu từ vựng ta được bảng 2 là l-chuẩn
và tiếp tục một bước đơn hình đối ngẫu từ vựng ta được bảng 3 và bảng 4
Trang 9Tám dòng đầu của bảng 4 là bảng đơn hình l- chuẩn và chấp nhận được
Do x0 lẻ nên từ dòng 0 sinh ra lát cắt ở dòng x9 theo quy tắc lát cắt đúng và ta được bảng
4 Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 5 là bảng
đơn hình l- chuẩn và chấp nhận được Biến x1 lẻ nên từ dòng x1 sinh ra lát cắt ở dòng
x10
Bảng 5
Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 6 là bảng
đơn hình l- chuẩn và không chấp nhận được (do x7 nhận giá trị âm)
Bảng 6
Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng giải bài toàn quy hoạch tuyến
tính phụ ta được bảng 7 Bảy dòng đầu của bảng là bảng đơn hình l- chuẩn và chấp nhận
được Do x0 lẻ nên từ dòng 0 sinh ra lắt cắt ở dòng x11 theo quy tắc Chọn dòng x11 làm
Trang 11x
i j m
≥
j
x , j = 1 , 2 , , m
m n
j D
xj∈ j, = 1 , 2 , , 1; n1≤ các b[i] có thể dương và âm, phương án xuất phát không đối ngẫu chấp nhận được Nếu bài toán giải có ràng buộc đẳng thức dạng: i i
m
j ij
b x
max )
m j
x
xj = ( − 1 )( − j) = 1 , 2 , ,
, , 2 , 1 )
)(
(
1
p i
x a b
j ij i
2 , 1
xj ≥ = +
m n
j D
xj∈ j, = 1 , 2 , , 1; n1≤
•Trong chương trình sử dụng các biến và mảng sau:
- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một
số dương đủ lớn và thường lấy bằng max { aij, bi, cj},
Trang 12- x0 =0 nếu x0 đòi hỏi nguyên và bằng 1 nếu x0 không cần nguyên
- ss = 1 nếu bảng đơn hình xuất phát s là l- chuẩn và chấp nhận được, = 2 nếu bảng là l- chuẩn và không chấp nhận được, =3 nếu bảng không là l - chuẩn
- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu bảng đơn hình ở mỗi bước Dòng n+1 để chứa ràng buộc phụ
- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng
- cs: các biến ở bên trái bảng đơn hình, nc: các biến phi cơ sở
•Cách nhập dữ liệu
Các dữ liệu ban đầu của bài toán được ghi trong một tệp văn bản, gồm có:
- n, m, gz, n1, x0, ss
- Mảng s dữ liệu ban đầu bố trí dạng ở dưới và được ghi vào tệp dữ liệu theo từng dòng :
- Tiếp đến là mảng cs: nhập các số từ 0, 1, 2,…, n
- Cuối cùng là mảng nc: nhập các số từ 1, 2,…, m
•Với dữ liệu bài toán trên thì vào số liệu sau được ghi ở tệp VDG2.CPP
7 3 100 2 0 3
0 -3 1 -4
0 -1 0 0
0 0 -1 0
0 0 0 -1
-x1 -x2 -xm 0 -c1 -c2 -cm x0 x1 x2 # xm 0 0 # 0 -1 0 0
0 -1 0
# # % #
0 0 -1
xm+1 # xn b1 # bp -a11 - a1m # # # -ap1 .-apm
Trang 13t= (unsigned long far *)MK_FP(0,0X46C); t1=*t;
printf("\nCo in trung gian hay khong 1/0 ? ");
scanf("%d%*c",&tg);
// Nhap du lieu printf("\nVao ten tep so lieu : "); gets(s1);
Trang 14printf("\nBang 1, so lieu ban dau");
if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau"); inbang(0);
fprintf(f2,"\nBang 1,ban dau,l- chuan,
khong chap nhan duoc,chay DHDN");
l=n+1; // dong quay la dong cuoi cung
// Xac dinh cot quay cmin=1;
for (j=2;j<=m;j++)
{ for (i=0; i<=n;i++)
{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}
if (s[i][cmin] < s[i][j]) break;
Trang 15printf("\nBang %d, l- chuan dau tien",sb);
if (tg==1) fprintf(f2,"\nBang %d, l- chuan dau tien",sb);
inbang(0); lc = n+1;
L1: kgd2= dhdoingau();
if (kgd2==1) {
printf("\nBai toan phu khong giai duoc, STOP");
if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc,STOP");
getch(); getch(); return; }
// Tim xong bang l- chuan + chap nhan duoc, sang Buoc lap lon Lap1: blap = blap+1;
printf("\n -");
printf("\n\nBUOC LAP LON THU %d: ",blap);
if (tg==1)
{ fprintf(f2,"\n -");
fprintf(f2,"\n\nBUOC LAP LON THU %d: ",blap);}
// Kiem tra loi giai toi uu bai toan phu co nguyen khong
le=-1;
for(i=x0;i<=n1;i++) if(ktnguyen(s[i][0])==0){le = i; break; }
printf("\nThanh phan le thuoc dong = %d",le);
if (tg==1) fprintf(f2,"\nThanh phan le thuoc dong = %d",le);
if (le==-1) { printf("\nPHUONG AN TOI UU QHTT NGUYEN: ");
if (tg==1)
fprintf(f2,"\nPHUONG AN TOI UU QHTT NGUYEN: ");
for (i=0; i<=n;i++)
printf("\nx[%2d] = %13.5lf",cs[i],s[i][0]);
printf("\nSo luong lat cat: %d lat cat",blap-1);
printf("\nSo bang don hinh da lap : %d bang",sb);
if (tg==1)
{ for (i=0; i<=n;i++)
Trang 16fprintf(f2,"\nx[%2d] = %13.5lf",cs[i],s[i][0]);
fprintf(f2,"\nSo luong lat cat: %d lat cat",blap-1);
fprintf(f2,"\nSo bang don hinh da lap : %d bang",sb);
}
t= (unsigned long far *)MK_FP(0,0X46C);
t2=*t; printf("\nThoi gian chay chuong trinh: %ld giay",
printf("\nBang %d, sau khi them lat cat",sb);
if (tg==1) fprintf(f2,"\nBang %d, sau khi them lat cat",sb);
Trang 17if (tg==1)
fprintf(f2,"\nCot quay=%d,Phan tu quay=%13.5lf",cmin,s[l][cmin]);
// Bien doi bang don hinh biendoi(); sb++;
printf("\nBang %d, bang dau tien bai toan phu",sb);
fprintf(f2,"\nBai toan phu khong giai duoc, STOP");
getch(); getch(); return; }
goto Lap1;
}
int ktnguyen(double x)
{ long int h; double z; z=fabs(x); h=(int)(z+0.5);
if (fabs(z-h)<=0.0001) return 1; else return 0;
Trang 18void inbang(int cuoi)
{ int n1; if (cuoi==1) n1=n+1; else n1=n;
printf("\nCo so : ");
for (i=0; i<=n1;i++) printf("%d ",cs[i]) ; printf("\n");
printf("Phi co so : ");
for (j=1; j<=m; j++) printf("%d ",nc[j]);printf("\n");
for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)
{ blap2 =0;Lap2: blap2++;
printf("\nBuoc lap Don hinh doi ngau thu %d : ",blap2);
Trang 19if (tg==1) fprintf(f2,"\nDong quay = %d",l);
if (l==-1) {
printf("\nBang tren ung phuong an toi uu cua bai toan phu");
if (tg==1) fprintf(f2,"\nBang tren ung phuong an toi uu bai toan phu");
Số lượng lát cắt: 3 lát cắt
Số bảng đơn hình đã lập : 9 bảng
3 THUẬT TOÁN DALTON VÀ LLEWELLYN
3.1. Dalton cải tiến thuật toán Gomory thứ hai cho bài toán qui hoạch tuyến tính rời rạc bộ phận sau:
Trang 20{ }
0 1
n
j j j n
(31) 0
Trang 211) xi ≥ Ai,υ+1 (33) 2) xi ≤ Aiυ (34)
Ta đưa vào các ký hiệu:
r ij
−
∈ +
+ +
+ +
Đối với Trường hợp 1 hợp nhất (38) và (41), đối với Trường hợp 2 hợp nhất (39)
và (40), trong cả 2 trường hợp ta đều có
+
−hay viết lại
Trang 223.3 Quy tắc xây dựng lát cắt đúng Giả sử X L C ( r, ) không thoả mãn điều kiện rời rạc và ijr 0
,
n r
= là bảng đơn hình tương ứng Chọn min { { 1,2, , 1} ; r0 không thoa (25) }
∈
≥
trong đó γ γ0, j được tính theo (30), (31) với i = k
3.4. Tính hữu hạn của thuật toán này được chứng minh giống thuật toán Gomory thứ nhất, khi đó cần phải thoả mãn các điều kiện sau:
1) Hàm mục tiêu x0 thoả mãn điều kiện rời rạc, điều này được tính đến khi chọn dòng k để xây dựng lát cắt đúng
2)Thực hiện một trong hai điều kiện:
- Hàm mục tiêu bị chặn dưới trên đa diện L
- Bài toán ( L CD0, )có ít nhất một phương án
Thuật toán Dalton cũng có thể dùng để giải bài toán qui hoạch nguyên toàn phần hoặc bộ phận nhưng kém hiệu quả hơn thuật toán Gomory thứ nhất và thứ hai
3.5 Giải ví dụ bằng số
Giải bài toán quy hoạch tính tuyến nguyên bộ phận rời rạc sau:
Trang 23x
} , 3 , 1 , 0
3 12 x 4 x
x0 nguyên
} 4 , 1 , 0 {
1∈
x
} , 3 , 1 , 0
Bảng 1 Bảng 2
Tiếp tục giải ta được bảng 3 (bảng l- chuẩn , chấp nhận được) Do x2 vi phạm điều kiện rời rạc nên sinh ra lát cắt ở dòng x5 và chọn nó làm dòng quay Tiếp tục giải bài toán quy hoạch rời rạc ta được bảng 4 (l- chuẩn và chấp nhận được) Do x1 không thoả mãn điều kiện rời rạc nên sinh ra lát cắt ở dòng x6 chọn nó làm dòng quay
4 12 4 x x
Trang 24
Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 5 ( bảng đơn hình l- chuẩn và chấp nhận được) Vì x1 không thoả mãn điều kiện rời rạc nên sinh ra lát cắt ở dòng x7
Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 6 (bảng đơn hình l- chuẩn và không chấp nhận được)
Trang 250 = Aj < Aj < < Ajq j j = n
Trang 26các b[i] có thể dương và âm, phương án xuất phát không đối ngẫu chấp nhận được Nếu bài toán giải có ràng buộc đẳng thức dạng: i i
m
j ij
b x
max )
m j
x
xj = ( − 1 )( − j) = 1 , 2 , ,
, , 2 , 1 )
)(
(
1
p i
x a b
j ij i
2 , 1
0 = Aj < Aj < < Ajq j j = n Trong chương trình sử dụng các biến và mảng sau:
- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một
số dương đủ lớn và thường lấy bằng max { aij, bi, cj}
- x0=0 nếu x0 đòi hỏi nguyên và bằng 1 nếu x0 không cần nguyên
- ss = 1 nếu bảng đơn hình s ban đầu là l- chuẩn và chấp nhận được, = 2 nếu bảng
là l- chuẩn và không chấp nhận được, =3 nếu bảng không là l- chuẩn
- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu bảng đơn hình ở mỗi bước Dòng n+1 để chứa ràng buộc phụ
- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng
- cs : các biến ở bên trái bảng đơn hình, nc : các biến phi cơ sở
Trang 27- Mảng v[0…n] có ý nghĩa:
v[i]=0 nếu xi không có điều kiện nguyên hay rời rạc, v[i]=1 nếu xi có điều kiện nguyên , v[i]=2 nếu xi có điều kiện rời rạc
- Mảng a[0…n, q]
v[i] =0 hay 1 thì toàn bộ dòng i của mảng a là 0, v[i]=2 thì dòng i là các giá trị rời rạc và tiếp theo là 0
- Mảng w[0…n]
v[i]=0 hay 1 thì w[i]=0, v[i]=2 thì w[i] là số lượng giá trị rời rạc của xi
Với bài toán trên ta có cách nhập dữ liệu
4 2 100 3 4
0 -1 -1
0 -1 0
0 0 -1
12 -1 4
12 4 -1
0 1 2 3 4 1 2 1 2 2 1 1 -x1 -x2 –xm 0 -c1 -c2 -cn1 x0 x1 x2 # xm 0 0 # 0 -1 0 0
0 -1 0
# # % #
0 0 -1
xm+1 # xn b1 # bp -a11 - a1n1 # # # -ap1 .-apm
Trang 28{ clrscr(); t= (unsigned long far *)MK_FP(0,0X46C); t1=*t;
printf("\nCo in trung gian hay khong 1/0 ? "); scanf("%d%*c",&tg);
// Nhap du lieu printf("\nVao ten tep so lieu : "); gets(s1);
for (i=0;i<=n;i++) fscanf(f1,"%d",&v[i]);
for (i=0;i<=n;i++) for (j=1;j<=n1;j++)
printf("\nBang 1, so lieu ban dau");
if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau"); inbang(0);
printf("Mang v : ");
for (i=0; i<=n; i++) printf("%d ",v[i]);printf("\n");
for (i=0;i<=n;i++) { for (j=1; j<=n1;j++)
printf(" %5d ",a[i][j]);