分析计算结果,1=2,x2=4,d=100,因此,目标规划的最优解为x=(2,4) 最优利润为1600 上述过程虽然给出了目标规划问题的最优解,但需要连续编几个程序,这样在使 用时不方便,下面用LNG0软件,编写一个通用的程序,在程序中用到数据段未知数 据的编程方法。 例4(续例3)按照序贯式算法,编写求解例3的通用LNGO程序。 et: 1eve11:3/:2goa1: h_con_num/1. 8j(leve05 con um)2333 4/:wplus,wminus: ctr-? 915001615; c-200 3002 -14005: wn311330 enddata D(ctr)-1; (level:p*z) or (leve1(((o (:wplus (,)dplus ()+minus ( um(variabl @for(level(i)li#1t#@size(level):@bnd(0,z(i),goal(i))); end 当程序运行时,会出现一个对话框。 在做第一级目标计算时,ctr输入1,0al(1)和g0al(2)输入两个较大的值,表明这 两项约束不起作用。求得第一级的最优偏差为0,进行第二轮计算。 在第二级日标的运算 输入 由于第 级的偏差为0,因此 goal(1)的输入值 为0 小较大的值 求得第 级的最 计算 于第一级、第 和g0al(2)的输入值也均是0。最终结果是:x=2,x2=4,最优利润是1600元,第 三级的最优偏差为29。 多目标复划可以归解法 § 多标规划的Matla -258
-258- 分析计算结果, 2 x1 = , 4 x2 = , 1 = 100 + d ,因此,目标规划的最优解为 (2,4) * x = , 最优利润为1600。 上述过程虽然给出了目标规划问题的最优解,但需要连续编几个程序,这样在使 用时不方便,下面用 LINGO 软件,编写一个通用的程序,在程序中用到数据段未知数 据的编程方法。 例 4(续例 3) 按照序贯式算法,编写求解例 3 的通用 LINGO 程序。 model: sets: level/1.3/:p,z,goal; variable/1.2/:x; h_con_num/1.1/:b; s_con_num/1.4/:g,dplus,dminus; h_con(h_con_num,variable):a; s_con(s_con_num,variable):c; obj(level,s_con_num)/1 1,2 2,3 3,3 4/:wplus,wminus; endsets data: ctr=?; goal=? ? 0; b=12; g=1500 0 16 15; a=2 2; c=200 300 2 -1 4 0 0 5; wplus=0 1 3 1; wminus=1 1 3 0; enddata min=@sum(level:p*z); p(ctr)=1; @for(level(i)|i#ne#ctr:p(i)=0); @for(level(i):z(i)=@sum(obj(i,j):wplus(i,j)*dplus(j)+wminus(i,j)* dminus(j))); @for(h_con_num(i):@sum(variable(j):a(i,j)*x(j))<b(i)); @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i )=g(i)); @for(level(i)|i #lt# @size(level):@bnd(0,z(i),goal(i))); end 当程序运行时,会出现一个对话框。 在做第一级目标计算时,ctr 输入 1,goal(1)和 goal(2)输入两个较大的值,表明这 两项约束不起作用。求得第一级的最优偏差为 0,进行第二轮计算。 在第二级目标的运算中,ctr 输入 2。由于第一级的偏差为 0,因此 goal(1)的输入值 为 0,goal(2)输入一个较大的值。求得第二级的最优偏差仍为 0,进行第三级计算。 在第三级的计算中,ctr 输入 3。由于第一级、第二级的偏差均是 0,因此,goal(1) 和 goal(2)的输入值也均是 0。最终结果是: 2 x1 = , 4 x2 = ,最优利润是 1600 元,第 三级的最优偏差为 29。 §4 多标规划的 Matlab 解法 多目标规划可以归结为
min 使得 F(x)-weight·y≤goal Ax≤ Aeq-x= cx)≤0,cegx)=O h≤X≤b 其中x,weight,.goal,b,beq,1b和ub是向量,A和Aeq是矩阵:c(x),ceqx)和F(x) 是向量函数,他们可以是非线性函数。F(x)是所考虑的目标函数,go是欲达到的 aht) [x fval]=faoalattainCfun'xo gal weight.A.b) x.fval]=fgoalattain('fun'.xo.goal.weight.A.b.Aeq.beq) x,fval fgoalattain('fun',x oal.weight.A.b.Aeq.beq.Ib.ub.nonlcon) 其中fn是用M文件定义的目标向量函数,X是初值,weight是权重 A,b定义不等 式约束A*x≤b,Aeq,beq定义等式约束Aeqx non con是用M文件定义的非线性 约束c(x)≤0 可值fval是目标向量函数的值。 解线视出攻6c查询相关的帮助 maxZ,=100x1+90x2+80x3+70x min Z,3x,+2x 3+x2≥30 x+x4≥30 3x1+2x≤120 3x2+2x448 x.20.i=1.4 解(i)编写M函数Funm function F=Fun(x); (i)编写M文件 a-[-1-100 h=I. 3806481 090.-80-701: [x1,a11=11 nprog(c1,a,b,【1,[1,zeros(4,1))号求第一个目标函数的目标值 [x2,g21-11 nprog(c2,a,b,[门,[门,zero3(4,1)号求第二个目标函数的目标值 g3=[g1g2] 1vall-fgoa 目标goa1的 Fun',rand(4,1),g3,abs (g3),a,b,[][]zeros (4 259
-259- γ γ , min x 使得 F(x) − weight ⋅ γ ≤ goal A⋅ x ≤ b, Aeq ⋅ x = beq c(x) ≤ 0, ceq(x) = 0 lb ≤ x ≤ ub 其中 x,weight, goal,b,beq,lb和ub 是向量,A 和 Aeq 是矩阵;c(x), ceq(x) 和 F(x) 是向量函数,他们可以是非线性函数。 F(x) 是所考虑的目标函数, goal 是欲达到的 目标,多目标规划的 Matlab 函数 fgoalattain 的用法为 [x,fval]= fgoalattain('fun',x0,goal,weight) [x,fval]= fgoalattain('fun',x0,goal,weight,A,b) [x,fval]= fgoalattain('fun',x0,goal,weight,A,b,Aeq,beq) [x,fval]= fgoalattain('fun',x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon) 其中 fun 是用 M 文件定义的目标向量函数,x0是初值,weight 是权重。A,b 定义不等 式约束 A*x ≤ b,Aeq,beq 定义等式约束 Aeq*x=Beq,nonlcon 是用 M 文件定义的非线性 约束 c(x)≤0,ceq(x)=0。返回值 fval 是目标向量函数的值。 要完整掌握其用法,请用 help fgoalattain 或 type fgoalattain 查询相关的帮助。 例 5 求解多目标线性规划问题 2 2 4 1 1 2 3 4 min 3 2 max 100 90 80 70 Z x x Z x x x x = + = + + + ⎪ ⎪ ⎪ ⎩ ⎪ ⎪ ⎪ ⎨ ⎧ ≥ = + ≤ + ≤ + ≥ + ≥ 0, 1, ,4 3 2 48 3 2 120 30 30 2 4 1 3 3 4 1 2 x i L x x x x x x x x i 解 (i)编写 M 函数 Fun.m: function F=Fun(x); F(1)=-100*x(1)-90*x(2)-80*x(2)-70*x(4); F(2)=3*x(2)+2*x(4); (ii)编写 M 文件 a=[-1 -1 0 0 0 0 -1 -1 3 0 2 0 0 3 0 2]; b=[-30 -30 120 48]'; c1=[-100 -90 -80 -70]; c2=[0 3 0 2]; [x1,g1]=linprog(c1,a,b,[],[],zeros(4,1)) %求第一个目标函数的目标值 [x2,g2]=linprog(c2,a,b,[],[],zeros(4,1)) %求第二个目标函数的目标值 g3=[g1;g2] %目标goal的值 [x,fval]=fgoalattain('Fun',rand(4,1),g3,abs(g3),a,b,[],[],zeros(4 ,1))