運(yùn)籌學(xué)兩階段法C語(yǔ)言程序代碼[15頁(yè)]_第1頁(yè)
運(yùn)籌學(xué)兩階段法C語(yǔ)言程序代碼[15頁(yè)]_第2頁(yè)
運(yùn)籌學(xué)兩階段法C語(yǔ)言程序代碼[15頁(yè)]_第3頁(yè)
運(yùn)籌學(xué)兩階段法C語(yǔ)言程序代碼[15頁(yè)]_第4頁(yè)
運(yùn)籌學(xué)兩階段法C語(yǔ)言程序代碼[15頁(yè)]_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、課 程 設(shè) 計(jì) 程 序 代 碼 課程設(shè)計(jì)名稱 運(yùn)籌課程設(shè)計(jì) 專 業(yè) 信息管理與信息系統(tǒng) 班 級(jí) 140505班 學(xué) 生 姓 名 孫玉玲 王鳳禹 王美玲 指 導(dǎo) 教 師 王亞君 2016年7月15日#include #include #define MAX 100#define STP 100int stop=1; /迭代記數(shù)變量int status; /iterative迭代返回值:1唯一最優(yōu),0無(wú)界解,-1無(wú)窮多最優(yōu)解 -2迭代超過(guò)限制次數(shù)int step=1; /目前階段double aMAXMAX,bMAX,cMAX,temp_cMAX,max=0; /方程組相關(guān)系數(shù)int num_x;

2、 /變量個(gè)數(shù) int num_st; /約束方程數(shù)int num_ar=0; /人工變量個(gè)數(shù)int artiMAX; /人工變量下標(biāo)int baseMAX; /基變量下標(biāo)int ma_mi; /1為求最大值,2為求最小值void create(); /建立方程組void iterative(); /單純型法迭代void output(); /輸出結(jié)果void banner(); /打印程序標(biāo)題void exchange(double cMAX,double temp_cMAX); /交換兩階段價(jià)值系數(shù)void show(); /輸出方程組void main() int i,j,k;banner

3、();create();/保存原價(jià)值系數(shù),轉(zhuǎn)換為第一階段價(jià)值系數(shù)for(i=1;i=num_x;i+) k=0; for(j=1;j=num_ar;j+) if(i=artij) k=1; if(k=1) temp_ci=-1; else temp_ci=0;exchange(c,temp_c);printf(nn第一階段問(wèn)題為:nn);show();step+;printf(nn按回車開(kāi)始第一階段迭代);getchar(); getchar();iterative();if(status=-2) puts(迭代超過(guò)限制次數(shù)強(qiáng)行終止!n); puts(n按回車結(jié)束); getchar(); e

4、xit(0);output();if(max!=0) puts(nn原問(wèn)題無(wú)可行解。n); puts(n按回車結(jié)束); getchar(); exit(0);/轉(zhuǎn)換為第二階段價(jià)值系數(shù)exchange(c,temp_c);/把人工變量列全設(shè)為0for(i=1;i=num_ar;i+) cartii=0; for(j=1;j=num_st;j+) ajartii=0;puts(nn第二階段問(wèn)題為:nn);show();puts(nn按回車開(kāi)始第二階段迭代);getchar(); iterative();switch(status) case 1: output(); puts(nn原問(wèn)題有唯一最優(yōu)

5、解。n); puts(n按回車結(jié)束); getchar(); exit(0);case 0: puts(nn原問(wèn)題為無(wú)界解。n); puts(n按回車結(jié)束); getchar(); exit(0);case -1: output(); puts(nn原問(wèn)題有無(wú)窮多最優(yōu)解。n); puts(n按回車結(jié)束); getchar(); exit(0);case -2: puts(迭代超過(guò)限制次數(shù)強(qiáng)行終止!n); puts(n按回車結(jié)束); getchar(); exit(0);/switchvoid banner() printf(tt*n);printf(tt 兩階段法解LP問(wèn)題n);printf(

6、tt*n);printf(n);void show() /對(duì)方程組以自然的格式輸出,系數(shù)為零的x不顯示/為1的不顯示系數(shù)1,-1系數(shù)只顯示負(fù)號(hào)int i,j,k;switch(step) case 1: printf(min z= ); printf(x%d,arti1); for(i=2;i=num_ar;i+) printf( + x%d,artii); break;case 2:printf(max z= );printf(%lg x%d,c1,1);for(i=2;i=0) printf( +%lg x%d,ci,i); else printf( %lg x%d,ci,i);break

7、;printf(nst:n);for(i=1;i=num_st;i+) k=0; for(j=1;j=0&k!=0) printf( +%lg x%d,aij,j); else if(aij=0&k=0) printf( %lg x%d,aij,j); else printf( %lg x%d,aij,j); k=1; printf( = %lgn,bi); printf( x1x%d=0,num_x);void exchange(double cMAX,double temp_cMAX) int i;double tempMAX;for(i=1;i=num_x;i+) tempi=temp_

8、ci; temp_ci=ci; ci=tempi;void create() /輸入方程組系數(shù),每個(gè)方程輸完后回顯確認(rèn)int i,j,k,re_stMAX,tnum_x,num_addv=0,num_ba=0;char confirm;while(2) printf(請(qǐng)選擇:1、求最大值,2、求最小值:(1/2); scanf(%d,&ma_mi); if(ma_mi!=1&ma_mi!=2) printf(輸入錯(cuò)誤,重新選擇。); else break;while(1) printf(指定變量個(gè)數(shù):); scanf(%d,&num_x); printf(輸入價(jià)值系數(shù)c1-c%d:n,num_

9、x); for(i=1;i=num_x;i+) printf(c%d=,i); scanf(%lf,&ci); if(ma_mi=1) printf(max z= ); else printf(min z= ); printf(%lg x%d,c1,1); for(i=2;i=0) printf( +%lg x%d,ci,i); else printf( %lg x%d,ci,i); printf(n正確嗎?:(y/n);getchar();confirm=getchar();if (confirm=y) break;else if(confirm=n) continue;printf(輸入約

10、束方程組個(gè)數(shù):);scanf(%d,&num_st);for(i=1;i=,3、= :(1/2/3); scanf(%d,&re_sti); if(re_sti!=1&re_sti!=2&re_sti!=3) printf(輸入錯(cuò)誤,請(qǐng)重新選擇。); else break; printf(輸入技術(shù)系數(shù):n); for(j=1;j=num_x;j+) printf(a%d=,j); scanf(%lf,&aij); printf(輸入資源擁有量:nb%d=,i); scanf(%lf,&bi); printf(st.%i:n,i); printf(%lg x%d,ai1,1); for(j=2;

11、j=0) printf( +%lg x%d,aij,j); else printf( %lg x%d,aij,j); switch(re_sti) case 1: printf( = %lg,bi); break; case 2: printf( = %lg,bi); break; case 3: printf( = %lg,bi); break; while(1) printf(n正確嗎?(y/n); getchar(); confirm=getchar(); if (confirm=y) break; else if(confirm=n) i-=1; break; /顯示輸入的方程組pri

12、ntf(n原問(wèn)題為:nn);if(ma_mi=1) printf(max z= );else printf(min z= );printf(%lg x%d,c1,1);for(i=2;i=0) printf( +%lg x%d,ci,i); else printf( %lg x%d,ci,i);printf(nst:n);for(i=1;i=num_st;i+) k=0; for(j=1;j=0&k!=0) printf( +%lg x%d,aij,j); else if(aij=0&k=0) printf( %lg x%d,aij,j); else printf( %lg x%d,aij,j

13、); k=1; switch(re_sti) case 1: printf( = %lgn,bi); break; case 2: printf( = %lgn,bi); break; case 3: printf( =0n,num_x);tnum_x=num_x;for(i=1;i=num_st;i+) switch(re_sti) case 1: case 3: num_x+=1; break; case 2: num_x+=2; break; /化為標(biāo)準(zhǔn)形式if(ma_mi=2) for(i=1;i=tnum_x;i+) ci*=-1; /求最小值時(shí),系數(shù)變相反數(shù)for(i=1;i=nu

14、m_st;i+) switch(re_sti) case 1: num_addv+; num_ba+; num_ar+; ctnum_x+num_addv=0; basenum_ba=artinum_ar=tnum_x+num_addv; for(j=tnum_x+1;j=num_x;j+) if(j=tnum_x+num_addv) aitnum_x+num_addv=1; else aij=0; break; case 2: num_addv+; ctnum_x+num_addv=0; num_addv+; num_ba+; num_ar+; ctnum_x+num_addv=0; bas

15、enum_ba=artinum_ar=tnum_x+num_addv; for(j=tnum_x+1;j=num_x;j+) if(j=tnum_x+num_addv-1) aitnum_x+num_addv-1=-1; else if(j=tnum_x+num_addv) aitnum_x+num_addv=1; else aij=0; break; case 3: num_addv+; num_ba+; ctnum_x+num_addv=0; basenum_ba=tnum_x+num_addv; for(j=tnum_x+1;j=num_x;j+) if(j=tnum_x+num_add

16、v) aitnum_x+num_addv=1; else aij=0; break; /switch/增加松弛變量、剩余變量、人工變量、確定基變量/顯示標(biāo)準(zhǔn)化后的方程組printf(n化為標(biāo)準(zhǔn)形式后:nn);if(ma_mi=1) printf(max z= );else printf(max z= );printf(%lg x%d,c1,1);for(i=2;i=num_x;i+) k=0; for(j=1;j=0) printf( +%lg x%d,ci,i); else printf( %lg x%d,ci,i);printf(nst:n);for(i=1;i=num_st;i+) k=

17、0; for(j=1;j=0&k!=0) printf( +%lg x%d,aij,j); else if(aij=0&k=0) printf( %lg x%d,aij,j); else printf( %lg x%d,aij,j); k=1; printf( = %lgn,bi); printf( x1x%d=0,num_x);void iterative() int i,j,k,k_a,k_f,l; /k_a,k_f值為0或1,記錄當(dāng)前下標(biāo)在arti或base里的搜索結(jié)果int base_elem;int base_out,base_in;double sigmaMAX,temp;doub

18、le value_be; /高斯消元里保存主元素值printf(nn第%d次迭代:nn,stop); for(i=1;i=num_st;i+) printf(c%d=%lgt,basei,cbasei); printf(b%d=%lgt,i,bi); switch(step) case 1: for(j=1;j=num_x;j+) printf(a%d%d=%lgt,i,j,aij); printf(n); break; case 2: for(j=1;j=num_x;j+) k_a=0; for(l=1;l=num_ar;l+) if(j=artil)k_a=1; if(k_a!=1) pr

19、intf(a%d%d=%lgt,i,j,aij); printf(n); break; /求檢驗(yàn)數(shù)sigmafor(i=1;i=num_x;i+) sigmai=ci; for(j=1;j=num_st;j+) sigmai-=cbasej*aji; for(j=1;j=num_st;j+) if(i=basej) sigmai=0; switch(step) case 1: printf(sigma%d=%lgt,i,sigmai); break; case 2: k_a=0; for(l=1;l=num_ar;l+) if(i=artil) k_a=1; if(k_a!=1) printf

20、(sigma%d=%lgt,i,sigmai); break; putchar(n);/檢驗(yàn)檢驗(yàn)數(shù)sigma是否全小于等于0k=0;for(i=1;i0) k=1;if(k=0) /sigma是全小于等于0時(shí),檢查是否為無(wú)窮多最優(yōu)解 for(i=1;i=num_x;i+) k_f=k_a=0; for(j=1;j=num_ar;j+) if(i=artij) k_a=1; if(sigmai=0&k_a!=1) for(j=1;j=num_st;j+) if(i=basej) k_f=1; if(k_f=0) status=-1; return; status=1; return;/檢查是否為

21、無(wú)界解for(i=1;i0) for(j=1;j0) k_f=1; if(k_f!=1) status=0; return; /確定換入變量for(i=1;i=num_x;i+) k=0; for(j=1;j0) temp=sigmai-1;/temp賦初值for(i=1;i=num_x;i+) k=0; for(j=1;jtemp&sigmai0) base_in=i; temp=sigmai; /確定換出變量for(i=1;i0) temp=bi/aibase_in+1; break; /temp賦初值for(i=1;i=num_st;i+) if(bi/aibase_in0) for(j=1;j=num_ar;j+) if(basei=artij) base_out=basei; base_elem=i; temp=bi/aibase_in; break; /人工變量?jī)?yōu)先換出 if(bi/aibase_in0)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論