Bài giảng Chương 2: Những khái niệm mở đầu
Trong chương này sẽtrình bày những khái niệm cơbản vềquy hoạch tuyến tính,
phương pháp đơn hình bình thường, phương pháp đơn hình đối ngẫu từvựng, và khái
niệm vềbài toán quy hoạch tuyến tính nguyên.
1. NHỮNG KHÁI NIỆM CƠBẢN VỀQUY HOẠCH TUYẾN TÍNH
GẪU TỪ VỰNG 5.1. Phương pháp đơn hình đỗi ngẫu xây dựng một dãy hữu hạn các giả phương án Xo, X1, ... , Xk. Giả phương án cuối cùng Xk là phương án (vì vậy là phương án tối ưu) của bài toán (5) - (7) . Hàm mục tiêu xo = xo(Xr) không tăng khi r tăng. Mỗi giả phương án Xr ứng với bảng Tr và các tập Br , Nr . 1 -x1 -x2 x0 0 -1 -1 x1 0 -1 0 x2 0 0 -1 x3 38 2 11 x4 7 1 1 x5 5 4* -5 1 -x5 -x2 x0 5/4 1/4 -9/4 x1 5/4 1/4 -5/4 x2 0 0 -1 x3 71/2 -1/2 27/2 x4 23/4 -1/4 9/4* x5 0 -1 0 Bùi Thế Tâm II.7 Quy hoạch rời rạc Quá trình giải gồm bước lặp ban đầu (xây dựng giả phương án xuất phát Xo) và dãy bước lặp tổng quát. 5.2. Tìm cực đại từ vựng của phương án mở rộng ~ X = ( n1o x,...,x,x ) = 1 1 , ,..., n j j n j c x x x = ∑ với các điều kiện 1 n ij j i j a x b = =∑ (i = 1, ..., m) 0 ( 1, 2, , )jx j n≥ = " Ký hiệu bài toán là ( , )L C hay l - bài toán. Phương pháp đơn hình đỗi ngẫu từ vựng gọi gọn là l - phương pháp. 5.3. Bước lặp r ≥ 0 tổng quát Có l - giả phương án Xr với x0j ≥ 0, j∈ Nr, và tương ứng Tr , Br , Nr, các cột là 0( )rj rR j N∈ . Kiểm tra xem Tr có chấp nhận được hay không (tức là xio≥ 0 với mọi i = 1,..,n). Nếu đúng thì Xr là phương án l - tối ưu. Nếu không thì tìm biến xk loại khỏi cơ sở theo quy tắc: k = min { i | i = 1, ... , n ; xio <0} Tìm xl đưa vào cơ sở theo quy tắc min ; 0jl r kj kl kj RR lex j N x x x = ∈ < Nếu trong các số xkj (j∈ Nr) không có số âm thì bài toán không giải được. Nếu có thì biến đổi bảng đơn hình theo các công thức ở tiết 3 ta được Xr+1, Tr+1 , Br+1 , Nr+1 5.4. Tính l giả phương án Xo Giả sử ta xây dựng bảng đơn hình T ứng với bài toán (5) - (7) không phải là l -chuẩn, ứng với nó có các tập B và N. Giả sử hàm ∑ ∈Nj jx bị chặn trên tập (6)- (7). Khi đó ta tìm được số M sao cho: ∑ ∈Nj jx ≤ M (có thể dùng đơn hình thường để xác định M). Đưa vào biến mới ≥ −+= + ∈ + ∑ 0x )x.(1Mx 1n Nj j1n Viết ràng buộc mới này vào cuối bảng T, chọn xk loại khỏi cơ sớ theo quy tắc: k = n+1. Chọn biến xl đưa vào cơ số theo quy tắc Bùi Thế Tâm II.8 Quy hoạch rời rạc Rl = lex min {Rj | j ∈ N } Thực hiện một bước biến đổi bảng đơn hình theo các công thức của tiết 3 ta nhận được bảng To là l - chuẩn (Rj ≥ 0 với j ∈ No ) và ứng với nó ta có các tập Bo và No: Bo = (B ∪ { l}), No = (N ∪ {n + 1})\ { l}. 5.5. Ví dụ bằng số Giải bài toán sau bằng phương pháp đơn hình đối ngẫu. Max 3210 23 xxxx −−= 000 2 43 1042 321 321 321 321 ≥≥≥ =+− ≥++ ≤−+ xxx xxx xxx xxx , , Sau khi thay ràng buộc đẳng thức bằng hai ràng buộc bất đẳng thức bài toán trên trở thành: Max 3210 23 xxxx −−= 0,0,0 2 2 43 1042 321 321 321 321 321 ≥≥≥ −≤−+− ≤+− −≤−−− ≤−+ xxx xxx xxx xxx xxx Tiếp theo thêm các biến bù ta được bài toán: Max 3210 23 xxxx −−= 0,,,,,, 2 2 34 4210 7654321 3217 3216 3215 3214 ≥ +−+−= −+−= +++−= +−−= xxxxxxx xxxx xxxx xxxx xxxx Ta có các bảng đơn hình sau khi thêm ràng buộc phụ : Bùi Thế Tâm II.9 Quy hoạch rời rạc 1 -x1 -x2 -x3 x0 0.00000 -3.00000 1.00000 -2.00000 x1 0.00000 -1.00000 0.00000 0.00000 x2 0.00000 0.00000 -1.00000 0.00000 x3 0.00000 0.00000 0.00000 -1.00000 x4 10.00000 2.00000 4.00000 -1.00000 x5 -4.00000 -3.00000 -1.00000 -1.00000 x6 2.00000 1.00000 -1.00000 1.00000 x7 -2.00000 -1.00000 1.00000 -1.00000 x8 100.00000 1.00000* 1.00000 1.00000 Bảng 1 1 -x8 -x2 -x3 x0 300.00000 3.00000 4.00000 1.00000 x1 100.00000 1.00000 1.00000 1.00000 x2 0.00000 - 0.00001 -1.00000 0.00000 x3 0.00000 - 0.00001 0.00000 -1.00000 x4 -190.00000 -2.00000 2.00000 -3.00000* x5 296.00000 3.00000 2.00000 2.00000 x6 -98.00000 -1.00000 -2.00000 0.00000 x7 98.00000 1.00000 2.00000 0.00000 Bảng 2 1 -x8 -x2 -x4 x0 236.66667 2.33333 4.66667 0.33333 x1 36.66667 0.33333 1.66667 0.33333 x2 0.00000 - 0.00001 -1.00000 0.00000 x3 63.33333 0.66667 - 0.66667 - 0.33333 x4 0.00000 0.00000 0.00000 -1.00000 x5 169.33333 1.66667 3.33333 0.66667 x6 -98.00000 -1.00000* -2.00000 0.00000 x7 98.00000 1.00000 2.00000 0.00000 Bảng 3 Bùi Thế Tâm II.10 Quy hoạch rời rạc 1 -x6 -x2 -x4 x0 8.00000 2.33333 0.00000 0.33333 x1 4.00000 0.33333 1.00000 0.33333 x2 0.00000 - 0.00001 -1.00000 0.00000 x3 -2.00000 0.66667 -2.00000* - 0.33333 x4 0.00000 0.00000 0.00000 -1.00000 x5 6.00000 1.66667 0.00000 0.66667 x6 0.00000 -1.00000 0.00000 0.00000 x7 0.00000 1.00000 0.00000 0.00000 Bảng 4 1 -x6 -x3 -x4 x0 8.00000 2.33333 0.00000 0.33333 x1 3.00000 0.66667 0.50000 0.16667 x2 1.00000 - 0.33333 - 0.50000 0.16667 x3 0.00000 0.00000 -1.00000 0.00000 x4 0.00000 0.00000 0.00000 -1.00000 x5 6.00000 1.66667 0.00000 0.66667 x6 0.00000 -1.00000 0.00000 0.00000 x7 0.00000 1.00000 0.00000 0.00000 Bảng 5 Vậy phương án tối ưu là (3, 1, 0, 0, 6, 0, 0) với trị hàm mục tiêu bằng x[0]=-8. 5.6. Chương trình máy tính • Chương trình nhằm giải bài toán quy hoạch tuyến tính có dạng: max 1 0 →=∑ = j m j j xcx ij m j ij bxa ≤∑ =1 , pi ,...,1= 0≥jx , mj ,...,2,1= Bùi Thế Tâm II.11 Quy hoạch rời rạc 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: ii m j ij bxa =∑ =1 thì ta thay thế bằng hai bất đẳng thức: ii m j ij bxa ≤∑ =1 và ii m j ij bxa ≥∑ =1 . • Sau khi thêm biến bù bài toán trên có thể viết ở dạng: max))(( 1 0 →−−=∑ = m j jj xcx mjxx jj ,...,2,1))(1( =−−= .,...,2,1))(( 1 pixabx j m j ijiim =−−+= ∑ = + .,...,2,10 pmjx j +=≥ •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 jiij cba , ss = 1 nếu bảng s là l- chuẩn nhưng không chấp nhận được và = 0 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ụ (8). - 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: - n, m,gz, 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 : Bùi Thế Tâm II.12 Quy hoạch rời rạc - Mảng cs: nhập các số 0,1,2,,n. - Mảng nc: nhập các số 1,2,,m. Với dữ liệu bài toán trong mục 5.5 thì tệp dữ liệu DN.SLI có dạng : 7 3 100 0 0 -3 1 -2 0 -1 0 0 0 0 -1 0 0 0 0 -1 10 2 4 -1 -4 -3 -1 -1 2 1 -1 1 -2 -1 1 -1 0 1 2 3 4 5 6 7 1 2 3 •Văn bản chương trình. #include #include #include #include #define M 30 #define N 30 double s[N+2][M+1],r,gz; int blap,kgd, kgd2,ss,sb,cmin; int m,n,i,j,k,l,tg,cs[N+2],nc[M+1]; unsigned long far *t; long int t1,t2; char *s1,*s2; FILE *f1,*f2; -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 Bùi Thế Tâm II.13 Quy hoạch rời rạc int cotquay(); void biendoi(); void inbang(int cuoi); int dhdoingau(); void main() { 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 ban dau printf("\nVao ten tep so lieu : "); gets(s1); f1= fopen(s1,"r"); fscanf(f1,"%d%d%lf%d",&n,&m,&gz,&ss); for (i=0;i<=n;i++) for (j=0; j<=m;j++) { fscanf(f1,"%lf",&r); s[i][j]=r; } for (i=0; i<=n;i++) fscanf(f1,"%d",&cs[i]) ; for (j=1; j<=m; j++) fscanf(f1,"%d",&nc[j]); fclose(f1); sb=1; // In so lieu de kiem tra printf("\n n,m,gz,ss = %d %d %13.5lf %d\n",n,m,gz,ss); if (tg==1){ printf("\nVao ten tep chua ket qua : "); gets(s2); f2=fopen(s2,"w"); fprintf(f2,"\n n,m,gz,ss = %d %d %13.5lf %d\n",n,m,gz,ss); } printf("\nBang 1, so lieu ban dau"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau"); inbang(0); if (ss==1){ printf("\nBang 1, so lieu ban dau, l- chuan, khong chap nhan duoc"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, khong c.nhan duoc"); goto L1;} // Them rang buoc phu cs[n+1]=n+1; s[n+1][0]=gz; for (j=1;j<=m; j++) s[n+1][j]=1; printf("\nBang 1, so lieu ban dau them rang buoc phu"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau them rang buoc phu"); inbang(1); l=n+1; // Chon cot quay Rl = lexmin { Rj | j (- N } 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; } } printf("\nDong quay = %d, Cot quay = %d Ptq = %13.5lf",l,cmin,s[l][cmin]); if (tg==1) { fprintf(f2,"\nDong quay = %d, Cot quay = %d Ptq = %13.5lf", l,cmin,s[l][cmin]); } biendoi();sb++; printf("\nBang %d, l- chuan dau tien",sb); Bùi Thế Tâm II.14 Quy hoạch rời rạc if (tg==1) fprintf(f2,"\nBang %d, l- chuan dau tien",sb); inbang(0); L1: kgd2= dhdoingau(); if (kgd2==1) { printf("\nBai toan phu khong giai duoc"); if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP"); getch(); return; } getch(); } // Phan cac ham int cotquay() { k=0; for (j=1; j<=m; j++) if (s[l][j]<0) { k=j; break;} if (k==0) return 1; cmin=k; for (j=k+1;j<=m;j++) if (s[l][j]<0) { for (i=0; i<=n;i++) { double t1,t2; t1= s[i][cmin]/fabs(s[l][cmin]); t2=s[i][j]/fabs(s[l][j]); if (t1 > t2) {cmin=j; break;} if (t1 < t2) break; } } return 0; } void biendoi() { for (j=0;j<=m;j++) if (j!= cmin) { for (i=0;i<=n;i++) if (i!=l) s[i][j]=s[i][j]-(s[l][j]/s[l][cmin])*s[i][cmin]; s[l][j]=0; } for (i=0;i<=n;
File đính kèm:
- C2 Nhung khai niem mo dau.pdf