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

QUY HOẠCH RỜI RẠC - CHƯƠNG 4 pps

33 322 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

Tiêu đề Quy Hoạch Rời Rạc - Chương 4 PPS
Tác giả Bùi Thế Tâm
Trường học Đại Học Quốc Gia Hà Nội
Chuyên ngành Kỹ Thuật Và Quản Lý
Thể loại Giáo trình
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 33
Dung lượng 662,7 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 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 1

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 - 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 2

và 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 3

r i r

i r

i j

r i r i

' ij ' ij ' ij

' ij

1

r i r i

x

S X x

Trang 4

Z 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 Nr , 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 7

4 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 9

Tá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 11

x

i j m

j

x , j = 1 , 2 , , m

m n

j D

xjj, = 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

xjj, = 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 13

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);

Trang 14

printf("\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 15

printf("\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 16

fprintf(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 17

if (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 18

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

{ blap2 =0;Lap2: blap2++;

printf("\nBuoc lap Don hinh doi ngau thu %d : ",blap2);

Trang 19

if (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 21

1) xiAi,υ+1 (33) 2) xiAiυ (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 22

3.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 23

x

} , 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 25

0 = Aj < Aj < < Ajq j j = n

Trang 26

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

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]);

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

TỪ KHÓA LIÊN QUAN

w