1. Trang chủ
  2. » Giáo Dục - Đào Tạo

QUY HOẠCH RỜI RẠC - CHƯƠNG 5 pdf

23 449 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 490,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chương 5 THUẬT TOÁN GOMORY THỨ BA Chương này trình bày thuật toán Gomory thứ ba nhằm xây dựng các lát cắt đảm bảo tất cả các Bảng đơn hình ở mỗi bước đều có tất cả các phần tử là nguyê

Trang 1

Chương 5

THUẬT TOÁN GOMORY THỨ BA

Chương này trình bày thuật toán Gomory thứ ba nhằm xây dựng các lát cắt đảm bảo tất cả các Bảng đơn hình ở mỗi bước đều có tất cả các phần tử là nguyên

1 ẢNH HƯỞNG CỦA SAI SỐ LÀM TRÒN VÀ TƯ TƯỞNG CỦA THUẬT TOÁN GOMORY THỨ BA

1.1 Ảnh hưởng của sai số làm tròn có thể dẫn đến lời giải sai khi dùng phương pháp đơn hình giải bài toán quy hoạch tuyến tính Khi giải bài toán quy hoạch tuyến tính nguyên ảnh hưởng sai số làm tròn tăng mạnh do các nguyên nhân sau :

- Tăng khối lượng tính toán vì dùng nhiều lần l - phương pháp

- Khả năng mắc sai khi xử lý các số kiểu phần thập phân 0,999999 ≈ 1,000000

- Khả năng nhận lời giải không đúng vì số nguyên có thể nhận là không nguyên

Để tránh sai số làm tròn, Gomory đưa ra thuật toán thứ ba để giải bài toán quy hoạch tuyến tính nguyên toàn phần :

0 1 n

ij j=1

j i

j j

1.2 Tư tưởng của thuật toán Gomory thứ ba

Giả sử bài toán (L,C) ≡ (L0,C) viết ở dạng bảng T0 , l - chuẩn (phần tử khác không đầu tiên ở mỗi cột là số dương) Dùng l - phương pháp, ta nhận được dãy hữu hạn các bảng l - chuẩn T0 , T1 , , Ts mà cái cuối cùng là chấp nhận được

Giả sử bảng xuất phát T0 là nguyên hoàn toàn (tất cả các phần tử là số nguyên) Các bảng tiếp theo có thể không nguyên là do: ngoài các phép toán + , - , * khi chuyển

từ Tν sang Tν+1 , ta còn dùng phép tính chia trên phần tử quay Nếu phần tử quay trên tất

cả các bước là (-1) thì các bảng T1 , T2 , vẫn là nguyên khi T0 - nguyên, cuối cùng phương án tối ưu Xs của bài toán (Ls,C) ứng với Ts cũng là nguyên Vậy Xs là phương

án tối ưu của bài toán quy hoạch tuyến tính nguyên gốc (LN,C)

Vì vậy, ta sẽ cải tiến định nghĩa lát cắt đúng sao cho nếu dòng tương ứng với nó chọn làm dòng quay thì phần tử quay bằng (-1)

Chính xác hơn, bài toán tìm lát cắt đúng nguyên được phát biểu như sau: có bài

toán (L,C), các điều kiện của nó viết dưới dạng bảng nguyên, không chấp nhận được, l

- chuẩn 0

,' ij n

Trang 2

ứng với T' không là phương án mở rộng Cần xây dựng một hàm tuyến tính :

I Điều kiện nguyên :

R R

l

r = ∈ < r (9) thì

r l = − 1 (10) Điều kiện (9) - (10) có nghĩa là nếu dòng Z(X) chọn làm dòng quay thì phần tử quay là (-1)

1.3. Lược đồ logic của thuật toán Gomory thứ ba

Nếu thành công xây dựng lát cắt đúng nguyên thỏa mãn (5) - (10) thì lược đồ logic của thuật toán như sau

Bắt đầu từ bảng không chấp nhận được xuất phát T0 , xây dựng dãy các bảng

T0 , T1 , , Tr , Tr+1 , mà mỗi bảng đều là nguyên và l - chuẩn

Nếu Tr là chấp nhận được thì l - giả phương án ứng với nó Xr đồng thời là phương án tối ưu của bài toán (LN,C)

Nếu Tr là không chấp nhận được thì xây dựng lát cắt đúng nguyên thỏa mãn (5) - (10) Viết dòng tương ứng ngay dưới bảng Tr và lấy nó làm dòng quay Sau đó, thực

hiện một bước lặp của l - phương pháp để nhận được bảng mới Tr+1 nguyên và l -

chuẩn

Trang 3

2 XÂY DỰNG LÁT CẮT ĐÚNG NGUYÊN, THUẬT TOÁN

Trang 4

2.2.Từ định lý trên ta xây dựng lát cắt đúng nguyên thỏa mãn (5) - (10) Giả sử cho bảng ij 0

j

d d

kj

j N x

ij j=1

j i

j j

Trang 5

0 1 n ij j=1

j j

T không là l - chuẩn, nhưng tập các phương án của bài toán (13)-(15) là

bị chặn thì ta giải bài toán quy hoạch tuyến tính với hàm mục tiêu n j

j=1

x

∑ với ràng buộc (14)-(15) và tìm được:

n j j=1

x ≤ M' ≡M

Vì vậy, từ bài toán này ta có thể đưa vào biến mới :

Trang 6

n

j=1 1

T ứng với biến phi cơ sở x j(j=1, , )n )

Thực hiện một bước lặp của l - phương pháp, xóa dòng xn+m+1 (dòng cuối của bảng '

0

T ) và nhận được bảng T0 nguyên, l - chuẩn Nếu sau này biến xn+m+1 đưa vào cơ

sở thì dòng tương ứng không được phục hồi

2.4 Thuật toán Gomory thứ ba

Bước lặp 0.: Xây dựng bảng xuất phát 0 0

0 ij i Q j N n,

= - nguyên , l - chuẩn Nếu

T0 là chấp nhận được thì l - giả phương án mở rộng :

− = ∈ ∈ - nguyên , l - chuẩn nhưng

không chấp nhận được Chọn k là chỉ số đầu tiên vi phạm tính chấp nhận được

kj k

∈ +

Viết dòng (21) vào cuối bảng TP-1 và lấy làm dòng quay Thực hiện một bước lặp

của l - phương pháp (loại xn+P khỏi cơ sở, đưa xl vào cơ sở), xóa dòng xn+P Nếu l ≥ n+1

thì dòng xl không khôi phục nữa, ta sẽ nhận được bảng

Trang 7

X = x x x = x x x là phương án tối ưu mở rộng của bài toán (LN,C) Nếu TP không châp nhận được thì chuyển tới bước (p+1)

2.5. Quy tắc chọn số λ Số λ được chọn theo ba điều kiện sau

III Cột R phải là lexmin : 0P

λ≥ − − (24') b) Điều kiện (25) có thể đơn giản hóa bằng cách sau

x R

Trang 8

P kj

Trang 9

Từ (27) và (25') suy ra cần chọn số λ thỏa mãn:

1

' 1

,

P kj

x z

λ≥ − − Vậy điều kiện (25') chuyển thành điều kiện sau:

P-1

1 j

9 6 6 7 2

5 9 2 2 4

4 1

3 2 1

4 3 2 1

4 3 2 1

− +

≥ + + +

x x x

x x x x

x x x x

4 - 8

-8

4 3 2

4 3 2 1

3 2 1

4 1

x = + +

8 7 6 5 4 3 2 1

0, x , x , x , x , x , x , x , x

x nguyên

Trang 10

Từ đây ta có bảng đơn hình xuất phát (Bảng 1) Vì bảng đơn hình không là l- chuẩn nên ta phải thêm ràng buộc phụ x1 + x2 + x3 + x4 ≤ gz = 100 hay

4 3 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ì

x7 <0 nên sinh ra lát cắt x10 và chọn nó làm dòng quay

Trang 13

x

i j m j

Trang 14

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 có ràng buộc đẳng thức dạng: i i

m

j ij

b x

=1

thì ta thay thế bằng hai bất đẳng thức:

i i m

j ij

b x

m j

x

xj = ( − 1 )( − j) = 1 , 2 , ,

, , 2 , 1 )

)(

(

1

p i

x a b

j ij i

2 , 1

xj ≥ = +

j

x nguyên j = 1 , 2 , , m + p

•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}

- ss = 1 nếu bảng đơn hình s ban đầu là l- chuẩn, =2 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 15

- 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ì ta có tệp dữ liệu VDG3.CPPcó dạng:

8 4 100 2

0 -3 -6 6 3 0 -1 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 0 0 0 -1 5 4 -2 -2 -9 -9 -2 -7 -6 -6 8 -4 8 -9 0 3 -8 0 0 -4 0 1 2 3 4 5 6 7 8 1 2 3 4 •Văn bản chương trình #include <stdio.h> #include <conio.h> #include <math.h> -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 .-ap,m

Trang 16

t= (unsigned long far *)MK_FP(0,0X46C); t1=*t;

printf("\nCo in trung gian hay khong 1/0 ? ");

printf("\nBang 1, so lieu ban dau:");

if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau:");

Trang 17

fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan");

{ for (i=0; i<=n;i++)

{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}

if (s[i][cmin] < s[i][j]) break;

//Bat dau buoc lap lon, da tim duoc bang xuat phat l- chuan

Lap1: blap++; 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 cot phuong an con thanh phan am khong

ka=-1;

for (i=1; i<=n; i++) if (s[i][0]<0) {ka = i; break; }

Trang 18

printf("\nPhan tu am cua phuong an ung voi dong %d",ka);

if (tg==1)

fprintf(f2,"\nPhan tu am cua phuong an ung voi dong %d",ka);

// Bang don hinh la toi uu

if (ka==-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] = %13ld",cs[i],s[i][0]);

printf("\nSo luong lat cat: %d lat cat",blap-1);

printf("\nSo bang da lap : %d bang",sb);

if (tg==1)

{ for (i=0; i<=n;i++)

fprintf(f2,"\nx[%2d] = %13ld",cs[i],s[i][0]);

fprintf(f2,"\nSo luong lat cat: %d lat cat",blap-1);

fprintf(f2,"\nSo bang da lap : %d bang",sb);

fprintf(f2,"\n\nBai toan QHTT nguyen khong giai duoc, STOP");

getch(); getch(); getch(); return; }

// Tim cot quay

Trang 19

cmin=k;

for (j=k+1;j<=m;j++) if (s[ka][j]< 0)

{ for (i=0; i<=n;i++)

{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}

if (s[i][cmin] < s[i][j]) break;

}

}

printf("\nCot quay = %d",cmin);

if (tg==1) fprintf(f2,"\nCot quay = %d ",cmin);

// Xay dung lat cat lamda = -s[ka][cmin];

for(j=1;j<=m;j++) fprintf(f2,"%d ",np[j]); fprintf(f2,"\n"); }

// Xet np co trong hay khong trong=1;

for (j=1; j<=m; j++) if (np[j]==1) {trong=0; break;}

if (trong==1) goto L2;

// Truong hop np khac trong, tim hl

for (i=0;i<=n;i++) if (s[i][cmin]>0) {hl=i; break;}

Trang 20

printf("\nMang NP : ");

for (j=1;j<=m;j++) printf("%d ",np[j]); printf("\n");

if (tg==1) {

fprintf(f2,"\nMang NP : ");

for(j=1;j<=m;j++) fprintf(f2,"%d ",np[j]); fprintf(f2,"\n"); }

// Kiem tra tap np khac trong hay khong

trong=1;

for (j=1; j<=m; j++) if (np[j]==1) {trong=0; break;}

if (trong==1) goto L2;

// Tinh cac zj for (j=1;j<=m;j++) zj[j]=0;

while (s[is][j]== q* s[is][cmin]) is++;

if (s[is][j]> q* s[is][cmin]) zj[j]=q; // kha nang 3 else zj[j]=q-1; // kha nang 4 }

for(j=1;j<=m;j++) fprintf(f2,"%d ",zj[j]); fprintf(f2,"\n"); }

// Tinh lai lamda

Trang 21

printf("\nBang %d, khong ke dong n+1",sb);

if (tg==1) fprintf(f2,"\nBang %d, khong ke dong n+1",sb);

void 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++)

Trang 22

for(j=1;j<=m;j++) fprintf(f2,"%d ",nc[j]);fprintf(f2,"\n");

for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)

fprintf(f2," %10ld ",s[i][j]);

fprintf(f2,"\n"); } }

getch();

}

•Sau khi chạy chương trình ta nhận được lời giải tối ưu của bài toán trên là:

x[ 0] = 288 x[ 1] = 56 x[ 2] = 29 x[ 3] = 0 x[ 4] = 18 x[ 5] = 1 x[ 6] = 414 x[ 7] = 0 x[ 8] = 523

Trang 23

49 3

7 6

5 x1 − x2 − x3 + x4 ≤

24 6

4

2 x1 − x2 + x3 − x4 ≤ −

-3 ≤ +

2

7 1 − 2 − 3 + 4 ≤

x x x x

4 3 2 1

0, x , x , x , x

x nguyên

Đáp số: phương án tối ưu mở rộng (294, 26, 0, 40, 34, 10, 1, 192, 655, 26)

Ngày đăng: 22/07/2014, 06:20

HÌNH ẢNH LIÊN QUAN

Bảng tổng hợp :(Phương án và giá trị  λ  ở mỗi bước) - QUY HOẠCH RỜI RẠC - CHƯƠNG 5 pdf
Bảng t ổng hợp :(Phương án và giá trị λ ở mỗi bước) (Trang 13)

TỪ KHÓA LIÊN QUAN

w