分析计算结果,x1=2,x2=4,d1=100,因此,目标规划的最优解为x=(2,4) 最优利润为1600。 上述过程虽然给出了目标规划问题的最优解,但需要连续编几个程序,这样在使 用时不方便,下面用 LINGO软件,编写一个通用的程序,在程序中用到数据段未知数 据的编程方法。 例4(续例3)按照序贯式算法,编写求解例3的通用 LINGO程序。 variable/1.2/: x: h con num/1.1/: b s con num/1.4/: g, plus, minus; h con(h con num, variable):ai ob](level, s con num)/1 1,2 2,3 3,3 4/: plus, wminus i endsets data ctr=?i goa1=??0; b=12 g=150001615 a=22 c=2003002-14005 plus=0 1 3 1 wminus=1 13 0 enddata min=Gsum (level:p*z)i p(ctr)=li @for (level(i)li#ne#ctr: p(1)=0) @for (level(1):z()=@sum(obj(i,3): plus(i, j)*dplus(3)+minus (i, j) minus(]))) @for(h con num(i): Gsum(variable(3):a(i,j)*x(1))<b(i))i @for(s con num(i): sum(variable(3):c(i,j)*x(]))+minus (i)-dplus )=g(1)); @for (level (i)Ii #lt# @size (level): @bnd (0, z(1), goal(1))) 当程序运行时,会出现一个对话框。 在做第一级目标计算时,ctr输入1,goal(1)和gol(2)输入两个较大的值,表明这 两项约束不起作用。求得第一级的最优偏差为0,进行第二轮计算。 在第二级目标的运算中,c输入2。由于第一级的偏差为0,因此goal(1)的输入值 为0,goa(2)输入一个较大的值。求得第二级的最优偏差仍为0,进行第三级计算。 在第三级的计算中,ct输入3。由于第一级、第二级的偏差均是O,因此,goal(1) 和goa(2)的输入值也均是0。最终结果是:x1=2,x2=4,最优利润是1600元,第 级的最优偏差为29。 §4多标规划的 Matlab解法 多目标规划可以归结为
-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 y 使得 F(x)- weight:y≤goal A·x≤b,Ae q c(x)≤0,ceq(x)=0 1b<x≤bb 其中x, weight,goal,b,beq,lb和mb是向量,A和Aeq是矩阵;c(x),ceq(x)和F(x) 是向量函数,他们可以是非线性函数。F(x)是所考虑的目标函数,goal是欲达到的 目标,多目标规划的 Matlab函数 fgoalattain的用法为 Lx, fval]=fgoalattain('fun, xo, goal, weight) Lx, fval]=fgoalattain('fun, xo, goal, weight, A, b) Lx, fval]=fgoalattain('fun, Xo, goal, weight, A, b, Aeq, beq Lx, fval]=fgoalattain('fun, Xo, goal, weight, A, b, Aeq, beq, I b, ub, nonlcon) 其中fun是用M文件定义的目标向量函数,x是初值, weight是权重。Ab定义不等 式约束A*x≤b, Aeq, beq定义等式约束Acq*x=Beq, nonion是用M文件定义的非线性 约束c(x)≤0,ceq(x)=0。返回值fva是目标向量函数的值。 要完整掌握其用法,请用 help fgoalattain或 type fgoalattain查询相关的帮助。 例5求解多目标线性规划问题 z1=100x1+90x2+80x3+70 inZ,=3x,+2 x3+x4 3x1+ 3x,+2x4≤48 x≥0 解(i)编写M函数Fun function F=Fun(x) F(1)=-100+x(1)-90*x(2)-80*x(2)-70*x(4 (2)=3*x(2)+2+x(4) i)编写M文件 3020 0302] b=[-30-3012048]!; c1=[-100-90-80-70] x1,g1]=1 inprog(c1,a,b,[],[], zeros(4,1))暑求第一个目标函数的目标值 x2,q2]=1 Improg(c2,a,b,[],[], zeros(4,1))求第二个目标函数的目标值 g3=[g1;g2]号目标goa1的值 [x, fval]=fgoalattain(' Fun, rand(4, 1),g3, abs(g3),a,b,[l,[], zeros (4
-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))