目標規(guī)劃c++實現(xiàn)_第1頁
目標規(guī)劃c++實現(xiàn)_第2頁
目標規(guī)劃c++實現(xiàn)_第3頁
目標規(guī)劃c++實現(xiàn)_第4頁
目標規(guī)劃c++實現(xiàn)_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、運籌學課程設計任務書班級10信科(2)班學號I10630230姓名鄭小青指導老師周永華浙江理工大學理學院數(shù)學系2012年6月設計題目:目標規(guī)劃問題模型及單純形算法已知三個工廠生產的產品供應四個用戶需要,各工廠生產量、用戶需求量及從各工廠到 用戶的單位產品的運輸費用如下表所示:戶工廠1234生產量120051002673002352004620034525021503400需求量200100450250用表上作業(yè)法得最優(yōu)運輸方案,如表一中所示(紅字),但上述方案只考慮了運費為最 少,沒有考慮到很多具體情況和條件。故上級部門研究后確定了制訂調配方案時要考慮的四 個目標,并規(guī)定重要性次序為:P1:

2、1、第4用戶為重要部門,需要量必須全部滿足;2、供應用戶1的產品中工廠3的產品不少于100單位。P2:為兼顧一般,每個用戶滿足率不低于80%。P3:新方案總運費不超過原方案的10%。P4: 1、因道路限制從工廠2到用戶4的路線應盡量避免分配運輸任務;2、用戶1和用戶3的滿足率應盡量保持平衡。請給出滿意的方案供決策。二、理論分析1、目標規(guī)劃目標規(guī)劃(Goal programming)目標規(guī)劃是線性規(guī)劃的一種特殊應用,能夠處理單個 主目標與多個目標并存,以及多個主目標與多個次目標并存的問題。由美國學者查納斯(A.Charnes)和庫伯(W.W.Cooper)在 1961 年首次提出。2、意義企業(yè)管

3、理中經常碰到多目標決策的問題。企業(yè)擬訂生產計劃時,不僅要考慮總產值,而且要 考慮利潤、產品質量和設備利用率等。有些目標之間往往互相矛盾。例如,企業(yè)利潤可能同 環(huán)境保護目標相矛盾。如何統(tǒng)籌兼顧多種目標,選擇合理方案,是十分復雜的問題。應用目 標規(guī)劃可能較好的解決這類問題。目標規(guī)劃的應用范圍很廣,包括生產計劃、投資計劃、市 場戰(zhàn)略、人事管理、環(huán)境保護、土地利用等。3、與線性規(guī)劃差異目標規(guī)劃是以線性規(guī)劃為基礎而發(fā)展起來的,但在運用中,由于要求不同,有不同于線 性規(guī)劃之處:目標規(guī)劃中的目標不是單一目標而是多目標,既有總目標又有分目標。根據(jù)總目標建 立部門分目標,構成目標網,形成整個目標體系。制定目標時

4、應注意協(xié)調各個分目標,消除 分目標間的矛盾,以利總目標的實現(xiàn);各分目標必須服從總目標的實現(xiàn),不能脫離總目標。線性規(guī)劃只尋求目標函數(shù)的最優(yōu)值,即最大值或最小值。而目標規(guī)劃,由于是多目標, 其目標函數(shù)不是尋求最大值或最小值,而是尋求這些目標與預計成果的最小差距,差距越小, 目標實現(xiàn)的可能性越大。目標規(guī)劃中有超出目標和未達目標兩種差距。一般以Y+代表超出 目標的差距,Y-代表未達目標的差距。Y+和Y-兩者之一必為零,或兩者均為零。當目標與 預計成果一致時,兩者均為零,即沒有差距。人們求差距,有時求超過目標的差距,有時求 未達目標的差距。目標規(guī)劃的核心問題是確定目標,然后據(jù)以建立模型,求解目標與預計成

5、 果的最小差距。目標規(guī)劃可用一般線性規(guī)劃求解,也可用備解法求解,還可用單體法求解,或者先用線 性規(guī)劃或備解法求解后,再用單體法驗證有無錯誤。目標規(guī)劃有時還要用對偶原理進行運算, 依一般規(guī)則,將原始問題轉換為對偶問題,以減少單體法運算步驟。在企業(yè)中,目標規(guī)劃的用途極為廣泛,如確定利潤目標,確定各種投資的收益率,確定產 品品種和數(shù)量,確定對原材料、外購件、半成品、在制品等數(shù)量的控制目標等。三、數(shù)學模型由表上作業(yè)法可得最小運費為2950元,其10%為295元。設xij為工廠運往用戶的調運量,則有:P1:需求約束:x11+x12+x13+x14=300 x21+x22+x23+x24=200 x31+

6、x32+x33+x34=400供應約束:x14+x24+x34+(d1-)-(d1+)=250供應不少于10 0個單位?:x31+(d2-)-(d2+)=100P2:不少于需求的80%:x11+x21+x31+(d3-)-(d3+)=160 x12+x22+x32+(d4-)-(d4+)=80 x13+x23+x33+(d5-)-(d5+)=360 x14+x24+x34+(d6-)-(d6+)=200P3:總運費不超過10%(c11*x11+c12*x12+c34*x34)+(d7-)-(d7+)=2950*1.1P4:盡量避免A2到B4:x24+(d8-)-(d8+)=0B1和B3保持平衡

7、a:eox11+x21+x31-4/9(x13+x23+x33)+(d9-)-(d9+)=0目標函數(shù):minz=P1(d1-) + (d1+) + (d2-)+P2(d3-) + (d4-) + (d5-) + (d6-)+P3(d7+)+P4(d8+) + (d9-) + (d9+ )四、程序源代碼#include #include #include using namespace std;/*由l表Aa上?作而入業(yè)莊法的可:得i?, e?最A?小?運?費口?為a2950元a,倉?其?10%為3295元3。倫 設Lxij為a工愴廠ii運?往用?pji的i?調IjA運?量0?, e?則“有D:

8、 eoP1:需求”約?束?: eox11+x12+x13+x14=300 x21+x22+x23+x24=200 x31+x32+x33+x34=400供?應I約?束?: eox14+x24+x34+(d1-)-(d1+)=250供?應I不?少,于2100個?單困位?: eox31+(d2-)-(d2+)=100P2:不?少,于以需求“的i?80%: eox11+x21+x31+(d3-)-(d3+)=160 x12+x22+x32+(d4-)-(d4+)=80 x13+x23+x33+(d5-)-(d5+)=360 x14+x24+x34+(d6-)-(d6+)=200P3: eo總A“i運

9、?費口?不?超?迪10%(c11*x11+c12*x12+.-.-+c34*x34)+(d7-)-(d7+)=2950*1.1P4盡?量 0? 避A1 免 aA2到i?B4:x24+(d8-)-(d8+)=0B1和aB3保Aie持?平?衡a: eox11+x21+x31-4/9(x13+x23+x33)+(d9-)-(d9+)=0目?標入”。函數(shù): eomin z=P1(d1-)+(d1+)+(d2-)+P2(d3-)+(d4-)+(d5-)+(d6-)+P3(d7+)+P4(d8+)+(d9-)+(d9+)*/#define N 20#define M 40#define K 10#defi

10、ne T 5#define CH 100void main()string int_into_char(int num);bool Is_number(char ch);void analyse(double *p_val1,double *p_val2,string *str_p1,string *str_p2,string *str_x1,string*str_x2,string *str_tjnt x_numjnt d_numjnt p,double (*a)Mdouble *var_val,double (*test)M);void compute(double *p_val1doub

11、le *p_val2,string *str_p1,string *str_p2,string *str_x1,string*str_x2,string *str_tjnt x_numjnt d_numjnt p,double (*a)Mdouble (*test)M);double sum_money=0,xN;for(int i=0;iN;i+) xi=0;double testKM;/*char ch1NCH,ch_funCH;memset(test,0,sizeof(test);memset(x,0,sizeof(x);double aNM,p_val1M,p_val2M,var_va

12、lN;string str_p1M,str_p2N,str_x1M,str_x2N,str_tT;int x_num,d_num,p;*/double initial_valN=5,2,6,7,3,5,4,6,4,5,2,3;double aNM=0,0,0,1,0,0,0,1,0,0,0,1,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,250,0,0,0,0,0,0,0,0,1,0,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,100,1,0,0,0,1,0,0,0,1,0,0,0,0,0,-1,0,0,0,0,0,0,0,0

13、,1,0,0,0,0,0,0,160,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,80,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,360,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,200,5,2,6,7,3,5,4,6,4,5,2,3,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,3245,0,0,0,0,0,0,0,1,0,0,0

14、,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,1,0,0.4444,0,1,0,0.4444,0,1,0,0.4444,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,;double p_val1M=0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1;double p_val2N=1,1,1,1,1,1,0,0,1;int x_num=12,d_num=9,p=4;stringstr_p1M=0,0r0,”0,”0,”0,”0,0,0,”0,”0,”0,”

15、p1,”0,”0,”0,0,0,”P3,P4,”P4,”P1,”P1”,”P2”,”P2”,”P2”,”P2”,”0”,”0”,”P4”;string str_p2N=P1 ,”P1”,”P2”,”P2” ,P2 ,P2 ,0 ,”0”,”P4”;stringstr_x1M=x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,d1+,d2+,d3+,d4+,d5+,d6+,d7+,d8+,d9+,d1-,d2-,d3-,d4-,d5-,d6-,d7-,d8-,d9-;string str_x2N=d1-,d2-,d3-,d4-,d5-,d6-,d7-,d8-,d9-;

16、string str_tT=P1 ,P2 ,P3 ,P4,;double var_valN=250,100,160,80,360,200,3245,0,0;/*cout請?輸。?A?x的i?個?數(shù)0y, ?d的i?個?數(shù)0y和優(yōu)?先級?p的i?個?數(shù)y(p、 id20,x+2*d40) eox_numd_nump;for(int i=1;i=p;i+)if(i=9)char temp_ch=(char)(i+48);string temp_str=p;str_ti-1=temp_str+temp_ch;elsestr_ti-1=p+int_into_char(i);for(int i=1;i=

17、x_num+2*d_num;i+)if(i=x_num)if(i=9)char temp_ch=(char)(i+48);string temp_str=x;str_x1i-1=temp_str+temp_ch;elsestr_x1i-1=x+int_into_char(i);else if(i=x_num+d_num)if(i=9)char temp_ch=(char)(i+48-x_num);string temp_str=d;str_x1i-1=temp_str+temp_ch+;elsestr_x1i-1=d+int_into_char(i-x_num)+;elseif(i=9)cha

18、r temp_ch=(char)(i+48-x_num-d_num);string temp_str=d;str_x1i-1=temp_str+temp_ch+-;elsestr_x1i-1=d+int_into_char(i-x_num-d_num)+-;for(int i=0;id_num;i+) str_x2i=str_x1i+x_num+d_num;cout請?輸。?入“?各A加?程-:卸eg. p1(d1-)+p2(d2-)+p2(d2+)+3p3(d3-)+5p3(d4-)endl;cout5(x1)+4(x2)+(d1-)-(d1+)=20endl;cout目?標妃函數(shù):/方0?

19、程.-(請?按a;a照?格?式?輸?入?! e?I e? ! e?): eoch_fun;int temp_index=0;string str_p=,str_d=;double s_num=0;for(int i=0;iM;i+)p_val1i=0;str_p1i=0;for(int i=0;istrlen(ch_fun);i+)if(Is_number(ch_funi)int temp_seat=0,flag_seat=0;doif(ch_funi=.)i+;flag_seat+;elses_num=s_num*10+(int)(ch_funi)-48;i+;if(flag_seat!=0

20、) temp_seat+;while(Is_number(ch_funi);for(int i=0;itemp_seat;i+) s_num=s_num/10;flag_seat=0;if(ch_funi=(|ch_funi=) i+;if(ch_funi=p)str_p=ch_funi;i+;while(Is_number(ch_funi)str_p=str_p+ch_funi;i+;if(ch_funi=(|ch_funi=) i+;if(ch_funi=d)str_d=d;i+;dostr_d=str_d+ch_funi;i+;while(Is_number(ch_funi);str_d

21、=str_d+ch_funi;for(int j=x_num;jx_num+2*d_num;j+)if(str_d=str_x1j)if(s_num=0) p_val1j=1;else p_val1j=s_num;str_p1j=str_p;s_num=0;str_p=”;str_d=;break;for(int i=0;iN;i+)for(int j=0;jM;j+)if(j=i+x_num) aij=-1;else if(j=i+x_num+d_num) aij=1;else aij=0;cout請?輸?入“?加?程.-組A: eoendl;for(int i=0;ich1i;int fl

22、ag=0;double a_num=0;string str_x=”;for(int j=0;jstrlen(ch1i);j+)if(ch1ij=+,) continue;if(ch1ij=-)flag+;j+;if(Is_number(ch1ij)int temp_seat=0,flag_seat=0;doif(ch1ij=.) j+;flag_seat+;elseif(flag=0) a_num=a_num*10+(int)(ch1ij)-48;else a_num=a_num*10-(int)(ch1ij)+48;j+;flag=0;if(flag_seat!=0) temp_seat+

23、;while(Is_number(ch1ij);for(int i=0;itemp_seat;i+) a_num=a_num/10;flag_seat=0;if(ch1ij=(|ch1ij=) j+;if(ch1ij=x)str_x=x;j+;while(Is_number(ch1ij)str_x=str_x+ch1ij;j+;if(ch1ij=d) j=j+3;flag=0;if(ch1ij=(|ch1ij=) j+;if(ch1ij=)j+;if(ch1ij=-)int temp_seat=0,flag_seat=0;j+;while(Is_number(ch1ij)if(ch1ij=.)

24、 j+;flag_seat+; elseaix_num+2*d_num=aix_num+2*d_num*10-(int)(ch1ij)+48;j+;if(flag_seat!=0) temp_seat+;for(int i=0;itemp_seat;i+) aix_num+2*d_num=aix_num+2*d_num/10; flag_seat=0;continue;elseint temp_seat=0,flag_seat=0;while(Is_number(ch1ij)if(ch1ij=.) j+;flag_seat+; else aix_num+2*d_num=aix_num+2*d_

25、num*10+(int)(ch1ij)-48;j+;if(flag_seat!=0) temp_seat+;for(int i=0;itemp_seat;i+) aix_num+2*d_num=aix_num+2*d_num/10; flag_seat=0;continue;for(int k=0;kx_num+2*d_num;k+)if(str_x=str_x1k)if(a_num=0&flag=0) aik=1;else if(flag!=0&a_num=0) aik=-1;else aik=a_num;a_num=0;flag=0;str_x=”;break;for(int i=0;id

26、_num;i+)str_p2i=str_p1i+x_num+d_num;p_val2i=p_val1i+x_num+d_num;*/compute(p_val1,p_val2, str_p1, str_p2, str_x1, str_x2, str_t, x_num,d_num,p,a,test);for(int i=0;id_num;i+)for(int j=0;j0)xj=aix_num+2*d_num;else xj=0;cout最人?優(yōu)?a為a: eoendl;for(int i=0;ix_num;i+)coutsetw(5)xi+1c=xi;coutendl;for(int i=0;

27、iN;i+) sum_money+=xi*initial_vali;cout最人?優(yōu)?運?費口?為 asum_money元a。 jeendl; cout是。?否?進?行D靈礦敏?度分?析?? e?(y & n)whether_anayse;if(whether_analyse=y,)cout下?面?進?行。靈西敏?度.分H?析?*endl;analyse(p_val1,p_val2,str_p1,str_p2,str_x1,str_x2,str_t,x_num,d_num,p,a,var_val,test);system(pause);/單g屯2?形?他static int times=1;v

28、oid compute(double *p_val1double *p_val2,string *str_p1,string *str_p2,string *str_x1,string *str_x2,string *str_tjnt x_numjnt d_numjnt p,double (*a)Mdouble (*test)M) bool is_less_than_0(int *x1_indexint x_num,int d_num,double (*test)Mjnt p);void matrixQouble(*a)Mjnt x1_index,string *str_x1,string *

29、str_x2,string *str_p1,string *str_p2,double *p_val1double *p_val2jnt d_numjnt x_num);void testnumber(string *str_p1,string *str_p 團ouble (*a)Mdouble *p_val1double *p_val2jnt x_num,int d_numjnt p,string *str_tdouble (*test)M);void display(double(*a)M,string *str_x1,string *str_x2,string *str_p1,strin

30、g *str_p2,string *str_t,double *p_val1,double (*test)Mdouble *p_val2jnt d_numjnt x_numjnt p);int x1_index=0;testnumber(str_p1,str_p2,a,p_val1,p_val2,x_num,d_num, p,str_t,test);display(a,str_x1,str_x2,str_p1,str_p2,str_t,p_val1,test,p_val2,d_num,x_num, p);while(is_less_than_0(&x1_index,x_num,d_num,te

31、st,p)matrix(a,x1_index,str_x1,str_x2,str_p1,str_p2,p_val1,p_val2,d_num, x_num);memset(test,0,sizeof(test);for(int i=0;ip;i+)for(int j=0;jx_num+2*d_num;j+) testij=0;testnumber(str_p1,str_p2,a,p_val1,p_val2,x_num,d_num, p,str_t,test); display(a,str_x1,str_x2,str_p1,str_p2,str_t,p_val1,test,p_val2,d_nu

32、m,x_num, p);/輸?出?單tQ純2?形?表Aavoid display(double(*a)M,string *str_x1,string *str_x2,string *str_p1,string *str_p2,string *str_double *p_val1,double (*test)Mdouble *p_val2,int d_numjnt x_numjnt p) cout*NO.times次2?*endl;for(int i=0;i1) coutsetw(13)p_val1istr_p1i;else coutsetw(15)1) coutsetw(3)p_val1ist

33、r_p1i;else coutsetw(5)str_p1i;coutendl;coutsetw(5)CBsetw(5)XB”;for(int i=0;ix_num+2*d_num;i+) coutsetw(5)str_x1i;coutsetw(5)bendl;for(int j=0;jd_num;j+)if(p_val2j=1) coutsetw(5)str_p2j;else coutp_val2jsetw(4)str_p2j;coutsetw(5)str_x2j;for(int i=0;ix_num+2*d_num+1;i+) coutsetw(5)aji; coutendl;for(int

34、 i=0;ip;i+)coutsetw(10)str_ti;for(int j=0;jx_num+2*d_num;j+) coutsetw(5)testij;coutendl;times+;/計?算?檢-驗數(shù)yvoid testnumber(string *str_p1,string *str_p免ouble (*a)Mdouble *p_val1double *p_val2jnt x_numjnt d_num,int p,string *str_t,double (*test)M)int falg1,flag2;for(int k=0;kp;k+)falg1=0;flag2=0;for(in

35、t i=0;id_num;i+)if(str_p2i=str_tk)falg1+;if(flag2=0)for(int j=0;jx_num+2*d_num;j+)if(str_p1j=str_tk) testkj=p_val1j-p_val2i*aij;else testkj-=p_val2i*aij;elsefor(int j=0;jx_num+2*d_num;j+) testkj-=p_val2i*aij;flag2+;if(falg1=0)for(int i=0;i0) min=atemp2*d_num+x_num/atempx1_indexbreak; else temp+;if(t

36、empd_num) break;for(int i=temp+1;i0&ai2*d_num+x_num/aix1_indexmin) temp=i;str_x2temp=str_x1x1_index;str_p2temp=str_p1x1_index;p_val2temp=p_val1x1_index;for(int i=0;id_num;i+)iRaix1_index=0)continue;flag=0;for(int j=0;j=2*d_num+x_num;j+)if(i!=temp)if(flag=0) temp_val=aix1_index;aij-=atempj*temp_val/a

37、tempx1_index;flag+;else break;double temp_a=atempx1_index;for(int j=0;j=2*d_num+x_num;j+)atempj=atempj/temp_a;/判D斷?檢-驗I數(shù)y是?否口?都?小?于20bool is_less_than_0(int *x1_indexint x_num,int d_num,double (*test)M jnt p)int flag1=0,flag2=0;double min_val=0;for(int i=0;ip;i+)for(int j=0;jx_num+2*d_num;j+)if(test

38、ijtestij)for(int k=0;k0) flag2+;if(flag2=0)min_val=testij;*x1_index=j;flag1+;else flag2=0;if(flag1!=0)return true;return false;void analysedouble *p_val1,double *p_val2,string *str_p1,string *str_p2,string *str_x1,string *str_x2,string*str_t,int x_numjnt d_numjnt p,double (*a)M,double *var_valdouble

39、 (*test)M)string var_str;char go_on=y;while(go_on=,y,)cout請?輸。?入?你?想?加?析?的1?變A?量兩(e;b,c) e?: eovar_str;if(var_str=bllvar_str=B)double BNN,min=0,max=0,temp=0;double sum=0;int var_num=0;memset(B,0,sizeof(B);for(int i=0;id_num;i+)for(int j=0;jd_num;j+) Bij=aij+x_num+d_num;cout您想?分?析?第i2幾?個?變A?量兩?倉?”(0var_numd_num)var_num;for(int i=0;id_num;i+)for(int j=0;j=max) max=temp;elseif(min=0&tempmin) min=temp;else if(min0&tempmin) min=temp;coutbvar_num的 1?范口?圍ji是?: e

溫馨提示

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

最新文檔

評論

0/150

提交評論