目标规划c++实现_第1页
目标规划c++实现_第2页
目标规划c++实现_第3页
目标规划c++实现_第4页
目标规划c++实现_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、运筹学课程设计任务书班级10信科(2)班学号I10630230姓名郑小青指导老师周永华浙江理工大学理学院数学系2012年6月设计题目:目标规划问题模型及单纯形算法已知三个工厂生产的产品供应四个用户需要,各工厂生产量、用户需求量及从各工厂到 用户的单位产品的运输费用如下表所示:户工厂1234生产量120051002673002352004620034525021503400需求量200100450250用表上作业法得最优运输方案,如表一中所示(红字),但上述方案只考虑了运费为最 少,没有考虑到很多具体情况和条件。故上级部门研究后确定了制订调配方案时要考虑的四 个目标,并规定重要性次序为:P1:

2、1、第4用户为重要部门,需要量必须全部满足;2、供应用户1的产品中工厂3的产品不少于100单位。P2:为兼顾一般,每个用户满足率不低于80%。P3:新方案总运费不超过原方案的10%。P4: 1、因道路限制从工厂2到用户4的路线应尽量避免分配运输任务;2、用户1和用户3的满足率应尽量保持平衡。请给出满意的方案供决策。二、理论分析1、目标规划目标规划(Goal programming)目标规划是线性规划的一种特殊应用,能够处理单个 主目标与多个目标并存,以及多个主目标与多个次目标并存的问题。由美国学者查纳斯(A.Charnes)和库伯(W.W.Cooper)在 1961 年首次提出。2、意义企业管

3、理中经常碰到多目标决策的问题。企业拟订生产计划时,不仅要考虑总产值,而且要 考虑利润、产品质量和设备利用率等。有些目标之间往往互相矛盾。例如,企业利润可能同 环境保护目标相矛盾。如何统筹兼顾多种目标,选择合理方案,是十分复杂的问题。应用目 标规划可能较好的解决这类问题。目标规划的应用范围很广,包括生产计划、投资计划、市 场战略、人事管理、环境保护、土地利用等。3、与线性规划差异目标规划是以线性规划为基础而发展起来的,但在运用中,由于要求不同,有不同于线 性规划之处:目标规划中的目标不是单一目标而是多目标,既有总目标又有分目标。根据总目标建 立部门分目标,构成目标网,形成整个目标体系。制定目标时

4、应注意协调各个分目标,消除 分目标间的矛盾,以利总目标的实现;各分目标必须服从总目标的实现,不能脱离总目标。线性规划只寻求目标函数的最优值,即最大值或最小值。而目标规划,由于是多目标, 其目标函数不是寻求最大值或最小值,而是寻求这些目标与预计成果的最小差距,差距越小, 目标实现的可能性越大。目标规划中有超出目标和未达目标两种差距。一般以Y+代表超出 目标的差距,Y-代表未达目标的差距。Y+和Y-两者之一必为零,或两者均为零。当目标与 预计成果一致时,两者均为零,即没有差距。人们求差距,有时求超过目标的差距,有时求 未达目标的差距。目标规划的核心问题是确定目标,然后据以建立模型,求解目标与预计成

5、 果的最小差距。目标规划可用一般线性规划求解,也可用备解法求解,还可用单体法求解,或者先用线 性规划或备解法求解后,再用单体法验证有无错误。目标规划有时还要用对偶原理进行运算, 依一般规则,将原始问题转换为对偶问题,以减少单体法运算步骤。在企业中,目标规划的用途极为广泛,如确定利润目标,确定各种投资的收益率,确定产 品品种和数量,确定对原材料、外购件、半成品、在制品等数量的控制目标等。三、数学模型由表上作业法可得最小运费为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目标函数:minz=P1(d1-) + (d1+) + (d2-)+P2(d3-) + (d4-) + (d5-) + (d6-)+P3(d7+)+P4(d8+) + (d9-) + (d9+ )四、程序源代码#include #include #include using namespace std;/*由l表Aa上?作而入业庄法的可:得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目?标入”。函数: 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?个?数0y, ?d的i?个?数0y和优?先级?p的i?个?数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目?标妃函数:/方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最人?优?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最人?优?运?费口?为 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+;/计?算?检-验数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数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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论