目标规划c++实现.docx
- 文档编号:5889270
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:25
- 大小:64.87KB
目标规划c++实现.docx
《目标规划c++实现.docx》由会员分享,可在线阅读,更多相关《目标规划c++实现.docx(25页珍藏版)》请在冰豆网上搜索。
目标规划c++实现
《运筹学》课程设计任务书
班 级 10信科
(2)班
学号I10630230
姓名 郑小青
指导老师 周永华
浙江理工大学理学院数学系
2012年6月
一.设计题目:
目标规划问题模型及单纯形算法
已知三个工厂生产的产品供应四个用户需要,各工厂生产量、用户需求量及从各工厂到用户的单位产品的运输费用如下表所示:
用户
工厂
1
2
3
4
生产量
1
200
5
100
2
6
7
300
2
3
5
200
4
6
200
3
4
5
250
2
150
3
400
需求量
200
100
450
250
用表上作业法得最优运输方案,如表一中所示(红字),但上述方案只考虑了运费为最少,没有考虑到很多具体情况和条件。
故上级部门研究后确定了制订调配方案时要考虑的四个目标,并规定重要性次序为:
P1:
1、第4用户为重要部门,需要量必须全部满足;
2、供应用户1的产品中工厂3的产品不少于100单位。
P2:
为兼顾一般,每个用户满足率不低于80%。
P3:
新方案总运费不超过原方案的10%。
P4:
1、因道路限制从工厂2到用户4的路线应尽量避免分配运输任务;
2、用户1和用户3的满足率应尽量保持平衡。
请给出满意的方案供决策。
二、理论分析
1、目标规划
目标规划(Goalprogramming)目标规划是线性规划的一种特殊应用,能够处理单个主目标与多个目标并存,以及多个主目标与多个次目标并存的问题。
由美国学者查纳斯(A.Charnes)和库伯(W.W.Cooper)在1961年首次提出。
2、意义
企业管理中经常碰到多目标决策的问题。
企业拟订生产计划时,不仅要考虑总产值,而且要考虑利润、产品质量和设备利用率等。
有些目标之间往往互相矛盾。
例如,企业利润可能同环境保护目标相矛盾。
如何统筹兼顾多种目标,选择合理方案,是十分复杂的问题。
应用目标规划可能较好的解决这类问题。
目标规划的应用范围很广,包括生产计划、投资计划、市场战略、人事管理、环境保护、土地利用等。
3、与线性规划差异
目标规划是以线性规划为基础而发展起来的,但在运用中,由于要求不同,有不同于线性规划之处:
①目标规划中的目标不是单一目标而是多目标,既有总目标又有分目标。
根据总目标建立部门分目标,构成目标网,形成整个目标体系。
制定目标时应注意协调各个分目标,消除分目标间的矛盾,以利总目标的实现;各分目标必须服从总目标的实现,不能脱离总目标。
②线性规划只寻求目标函数的最优值,即最大值或最小值。
而目标规划,由于是多目标,其目标函数不是寻求最大值或最小值,而是寻求这些目标与预计成果的最小差距,差距越小,目标实现的可能性越大。
目标规划中有超出目标和未达目标两种差距。
一般以Y+代表超出目标的差距,Y-代表未达目标的差距。
Y+和Y-两者之一必为零,或两者均为零。
当目标与预计成果一致时,两者均为零,即没有差距。
人们求差距,有时求超过目标的差距,有时求未达目标的差距。
目标规划的核心问题是确定目标,然后据以建立模型,求解目标与预计成果的最小差距。
目标规划可用一般线性规划求解,也可用备解法求解,还可用单体法求解,或者先用线性规划或备解法求解后,再用单体法验证有无错误。
目标规划有时还要用对偶原理进行运算,依一般规则,将原始问题转换为对偶问题,以减少单体法运算步骤。
在企业中,目标规划的用途极为广泛,如确定利润目标,确定各种投资的收益率,确定产品品种和数量,确定对原材料、外购件、半成品、在制品等数量的控制目标等。
三、数学模型
由表上作业法可得最小运费为2950元,其10%为295元。
设x[ij]为工厂运往用户的调运量,则有:
P1:
需求约束:
x11+x12+x13+x14<=300
x21+x22+x23+x24<=200
x31+x32+x33+x34<=400
供应约束:
x14+x24+x34+(d1-)-(d1+)=250
供应不少于100个单位?
:
x31+(d2-)-(d2+)=100
P2:
不少于需求的80%:
x11+x21+x31+(d3-)-(d3+)=160
x12+x22+x32+(d4-)-(d4+)=80
x13+x23+x33+(d5-)-(d5+)=360
x14+x24+x34+(d6-)-(d6+)=200
P3:
总运费不超过10%
(c11*x11+c12*x12+…-…-+c34*x34)+(d7-)-(d7+)=2950*1.1
P4:
尽量避免A2到B4:
x24+(d8-)-(d8+)=0
B1和B3保持平衡a:
êo
x11+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
usingnamespacestd;
/*由®¨¦表À¨ª上¦?
作Á¡Â业°¦Ì法¤¡§可¨¦得Ì?
,ê?
最Á?
小?
运?
费¤?
为a2950元a,ê?
其?
10%为a295元a。
¡ê
设¦¨¨x[ij]为a工¡è厂¡ì运?
往ª¨´用®?
户¡ì的Ì?
调Ì¡Â运?
量¢?
,ê?
则¨°有®D:
êo
P1:
需¨¨求¨®约?
束º?
:
êo
x11+x12+x13+x14<=300
x21+x22+x23+x24<=200
x31+x32+x33+x34<=400
供?
应®|约?
束º?
:
êo
x14+x24+x34+(d1-)-(d1+)=250
供?
应®|不?
少¦¨´于®¨²100个?
单Ì£¤位?
:
êo
x31+(d2-)-(d2+)=100
P2:
不?
少¦¨´于®¨²需¨¨求¨®的Ì?
80%:
êo
x11+x21+x31+(d3-)-(d3+)=160
x12+x22+x32+(d4-)-(d4+)=80
x13+x23+x33+(d5-)-(d5+)=360
x14+x24+x34+(d6-)-(d6+)=200
P3:
êo总Á¨¹运?
费¤?
不?
超?
过y10%
(c11*x11+c12*x12+…-…-+c34*x34)+(d7-)-(d7+)=2950*1.1
P4:
尽?
量¢?
避À¨¹免aA2到Ì?
B4:
x24+(d8-)-(d8+)=0
B1和¨ªB3保À¡ê持?
平?
衡a:
êo
x11+x21+x31-4/9(x13+x23+x33)+(d9-)-(d9+)=0
目?
标À¨º函¡¥数ºy:
êo
minz=P1((d1-)+(d1+)+(d2-))+P2((d3-)+(d4-)+(d5-)+(d6-))+P3(d7+)+P4((d8+)+(d9-)+(d9+))*/
#defineN20
#defineM40
#defineK10
#defineT5
#defineCH100
voidmain()
{
stringint_into_char(intnum);
boolIs_number(charch);
voidanalyse(double*p_val1,double*p_val2,string*str_p1,string*str_p2,string*str_x1,string*str_x2,string*str_t,intx_num,intd_num,intp,double(*a)[M],double*var_val,double(*test)[M]);
voidcompute(double*p_val1,double*p_val2,string*str_p1,string*str_p2,string*str_x1,string*str_x2,string*str_t,intx_num,intd_num,intp,double(*a)[M],double(*test)[M]);
doublesum_money=0,x[N];
for(inti=0;i doubletest[K][M]; /*charch1[N][CH],ch_fun[CH]; memset(test,'\0',sizeof(test)); memset(x,'\0',sizeof(x)); doublea[N][M],p_val1[M],p_val2[M],var_val[N]; stringstr_p1[M],str_p2[N],str_x1[M],str_x2[N],str_t[T]; intx_num,d_num,p;*/ doubleinitial_val[N]={5,2,6,7,3,5,4,6,4,5,2,3}; doublea[N][M]={{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,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,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},}; doublep_val1[M]={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}; doublep_val2[N]={1,1,1,1,1,1,0,0,1}; intx_num=12,d_num=9,p=4; stringstr_p1[M]={"0","0","0","0","0","0","0","0","0","0","0","0","p1","0","0","0","0","0","P3","P4","P4","P1","P1","P2","P2","P2","P2","0","0","P4"}; stringstr_p2[N]={"P1","P1","P2","P2","P2","P2","0","0","P4"}; stringstr_x1[M]={"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-"}; stringstr_x2[N]={"d1-","d2-","d3-","d4-","d5-","d6-","d7-","d8-","d9-"}; stringstr_t[T]={"P1","P2","P3","P4",}; doublevar_val[N]={250,100,160,80,360,200,3245,0,0}; /*cout<<"请? 输º? 入¨? x的Ì? 个? 数ºy,ê? d的Ì? 个? 数ºy和¨ª优®? 先¨¨级? p的Ì? 个? 数ºy(p、¡éd<20,x+2*d<40): êo"< cin>>x_num>>d_num>>p; for(inti=1;i<=p;i++) { if(i<=9) { chartemp_ch=(char)(i+48); stringtemp_str="p"; str_t[i-1]=temp_str+temp_ch; } else { str_t[i-1]="p"+int_into_char(i); } } for(inti=1;i<=x_num+2*d_num;i++) { if(i<=x_num) { if(i<=9) { chartemp_ch=(char)(i+48); stringtemp_str="x"; str_x1[i-1]=temp_str+temp_ch; } else { str_x1[i-1]="x"+int_into_char(i); } } elseif(i<=x_num+d_num) { if(i<=9) { chartemp_ch=(char)(i+48-x_num); stringtemp_str="d"; str_x1[i-1]=temp_str+temp_ch+"+"; } else { str_x1[i-1]="d"+int_into_char(i-x_num)+"+"; } } else { if(i<=9) { chartemp_ch=(char)(i+48-x_num-d_num); stringtemp_str="d"; str_x1[i-1]=temp_str+temp_ch+"-"; } else { str_x1[i-1]="d"+int_into_char(i-x_num-d_num)+"-"; } } } for(inti=0;i cout<<"请? 输º? 入¨? 各¡Â方¤? 程¨¬: êoeg.p1(d1-)+p2(d2-)+p2(d2+)+3p3(d3-)+5p3(d4-)"< cout<<"5(x1)+4(x2)+(d1-)-(d1+)=20"< cout<<"目? 标À¨º函¡¥数ºy方¤? 程¨¬(请? 按ã¡ä照? 格? 式º? 输º? 入¨? ! ê? ! ê? ! ê? ): êo"< cin>>ch_fun; inttemp_index=0; stringstr_p="",str_d=""; doubles_num=0; for(inti=0;i { p_val1[i]=0; str_p1[i]="0"; } for(inti=0;i { if(Is_number(ch_fun[i])) { inttemp_seat=0,flag_seat=0; do { if(ch_fun[i]=='.') {i++;flag_seat++;} else { s_num=s_num*10+(int)(ch_fun[i])-48; i++; if(flag_seat! =0)temp_seat++; } }while(Is_number(ch_fun[i])); for(inti=0;i flag_seat=0; } if(ch_fun[i]=='('||ch_fun[i]==')')i++; if(ch_fun[i]=='p') { str_p=ch_fun[i]; i++; while(Is_number(ch_fun[i])) { str_p=str_p+ch_fun[i]; i++; } } if(ch_fun[i]=='('||ch_fun[i]==')')i++; if(ch_fun[i]=='d') { str_d="d"; i++; do { str_d=str_d+ch_fun[i]; i++; }while(Is_number(ch_fun[i])); str_d=str_d+ch_fun[i]; } for(intj=x_num;j { if(str_d==str_x1[j]) { if(s_num==0)p_val1[j]=1; elsep_val1[j]=s_num; str_p1[j]=str_p; s_num=0; str_p=""; str_d=""; break; } } } for(inti=0;i { for(intj=0;j { if(j==i+x_num)a[i][j]=-1; elseif(j==i+x_num+d_num)a[i][j]=1; elsea[i][j]=0; } } cout<<"请? 输º? 入¨? 方¤? 程¨¬组Á¨¦: êo"< for(inti=0;i { cin>>ch1[i]; intflag=0; doublea_num=0; stringstr_x=""; for(intj=0;j { if(ch1[i][j]=='+')continue; if(ch1[i][j]=='-') { flag++; j++; } if(Is_number(ch1[i][j])) { inttemp_seat=0,flag_seat=0; do { if(ch1[i][j]=='.'){j++;flag_seat++;} else { if(flag==0)a_num=a_num*10+(int)(ch1[i][j])-48; elsea_num=a_num*10-(int)(ch1[i][j])+48; j++;flag=0; if(flag_seat! =0)temp_seat++; } }while(Is_number(ch1[i][j])); for(inti=0;i flag_seat=0; } if(ch1[i][j]=='('||ch1[i][j]==')')j++; if(ch1[i][j]=='x') { str_x="x"; j++; while(Is_number(ch1[i][j])) { str_x=str_x+ch1[i][j]; j++; } } if(ch1[i][j]=='d'){j=j+3;flag=0;} if(ch1[i][j]=='('||ch1[i][j]==')')j++; if(ch1[i][j]=='=') { j++; if(ch1[i][j]=='-') { inttemp_seat=0,flag_seat=0; j++; while(Is_number(ch1[i][j])) { if(ch1[i][j]=='.'){j++;flag_seat++;} else { a[i][x_num+2*d_num]=a[i][x_num+2*d_num]*10-(int)(ch1[i][j])+48; j++; if(flag_seat! =0)temp_seat++; } } for(inti=0;i flag_seat=0; continue; } else { inttemp_seat=0,flag_seat=0; while(Is_number(ch1[i][j])) { if(ch1[i][j]=='.'){j++;flag_seat++;} else { a[i][x_num+2*d_num]=a[i][x_num+2*d_num]*10+(int)(ch1[i][j])-48; j++; if(flag_seat! =0)temp_seat++; } } for(inti=0;i flag_seat=0; continue; } } for(intk=0;k { if(str_x==str_x1[k]) { if(a_num==0&&flag==0)a[i][k]=1; elseif(flag! =0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 目标 规划 c+ 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)