122§17.借助于Matlab 用贯序算法求解目标规划问题虽然Matlab 没有提供直接求解目标规划的优化工具,但是根据目标规划的求解思路——单纯形方法。
我们可以将一个目标规划问题分解成若干线性规划问题,通过序贯式算法借助于Matlab 优化工具进行求解。
例1:教材第6章第3节中的目标规划问题:-+-++++=3322211)(min d p d d p d p Z11221≤+x x 01121=-+-+-d d x x1022221=-+++-d d x x561083321=-+++-d d x x)3,2,1(0,,,21=≥+-i d d x x i i首先将上述问题化为标准形式:-+-++++=3322211)(min d p d d p d p Z112321=++x x x01121=-+-+-d d x x1231022221=-+++-d d x x561083321=-+++-d d x x)3,2,1(0,,=≥+-i d d x i i i然后按照以下步骤分解计算: 第一步:求解如下线性规划问题:min d12x1+x2+x3=11 x1-x2+d1_-d1=0x1,x2,x3>=0,d1_>=0,d1>=0对上述线性规划问题,可以借助于Matlab 优化工具中的linprog 函数求解,函数调用命令为:[x,fval]=linprog(f,[],[],Aeq,beq,lb,[]) 其中,参数如下:Aeq= 2 1 1 0 0 0 0 0 0 1 -11-1beq=11 0f=0 0 0 1 0 0 0 0lb=0 00000000运行后,得求解结果如下:Optimization terminated successfully.x =0.16456.06284.6083267.4155261.5173fval =即:d1=0第二步:求解如下线性规划问题:min d2_+d22x1+x2+x3=11x1-x2+d1_-d1=0x1+2x2+d2_-d2=10d1=0x1,x2,x3>=0,d1_>=0,d1>=0,d2_>=0,d2>=0对上述线性规划问题,可以借助于Matlab优化工具中的linprog函数求解,函数调用命令为:[x,fval]=linprog(f,[],[],Aeq,beq,lb,[],x0)其中,参数如下:124Aeq=2110000001-101-10000120001-100000010000beq=1110f=0 00001100lb=0 00000000x0=0.16456.06284.6083267.4155261.5173运行后,得求解结果如下:x =0.05774.97125.91354.91350.00000.0000125fval =5.1844e-010即:d2_+d2=5.1844e-010≈0第三步:求解如下线性规划问题:min d3_2x1+x2+x3=11x1-x2+d1_-d1=0x1+2x2+d2_-d2=108x1+10x2+d3_-d3=56d1=0d2_+d2=0x1,x2,x3>=0; d1_>=0,d1>=0,d2_>=0,d2>=0,d3_>=0,d3>=0对上述线性规划问题,可以借助于Matlab优化工具中的linprog函数求解,函数调用命令为:[x,fval]=linprog(f,[],[],Aeq,beq,lb,[],x0)其中,参数如下:Aeq=2110000001-101-10000120001-100810000001-1000010000000001100beq=111012656f=0 00000010lb=0 00000000x0=0.05774.97125.91354.9135运行后,输出结果如下:x =2.27933.86032.58101.58100.00000.00000.00000.8380fval =3.6940e-013最后得到如下一组满意解:2.27933.86031271282.581 1.581 0 0 0 0 0.838可以看出,以上求解的满意解方案不同于用Lindo 软件求得的结果。
这是因为,该问题本身有多重解,而linprog 函数求解算法又不同于Lindo 的缘故。
有兴趣的读者可以进一步验证,上述解和借助于Lindo 软件用贯序方法求解的结果都是满意解方案。
例2:教材第6章第4节中的目标规划问题,土地利用问题:)()(m in 222111+-+-+++=d d P d d P Z耕地面积约束:⎪⎩⎪⎨⎧=++=++=++200x x x 300x x x 100x x x 332313322212312111最低收获量约束:⎪⎩⎪⎨⎧≥++≥++≥++35000010000x 12000x 14000x 0000310x 0066800x 8000x 1900009000x 9500x 11000x 333231232221131211目标约束为:6100000(X) 111=-++d d f -1296600000(X) 222=-++d d f -即:610000010000x 12000x 14000x +0x 0066800x 8000x + 9000x 9500x 11000x 11333231232221131211=-++++++++-d d00660000x 0089600x 11200x 9000x 10200x 12000x 10800x 11400x 13200x 22333231232221131211=-++++++++++-d d非负约束:1,2,3)j 1,2,3;(i 0x ij ==≥0,00,0,2211≥≥≥≥+-+-d d d d对于上述目标规划问题,可以按照如下两个步骤进行分解求解: 第一步:求解线性规划问题:min d1_+d1 x11+x21+x31=100 x12+x22+x32=300 x13+x23+x33=20011000x11+9500x12+9000x13>=190000 8000x21+6800x22+6000x23>=130000 14000x31+12000x32+10000x33>=35000011000x11+9500x12+9000x13+8000x21+6800x22+6000x23+14000x31+12000x32+10000x 33+d1_-d1=6100000xij>=0 (i,j=1,2,3); d1_>=0, d1>=0对上述线性规划问题,可以借助于Matlab 优化工具中的linprog 函数求解,函数调用命令为:[x,fval]=linprog(f,A,b,Aeq,beq,lb,[])其中,参数如下:A=-11000-9500-900000000000 000-8000-6800-600000000000000-14000-12000-1000000 b=-190000-130000-350000Aeq=10010010000010********0010010010011000 950090008000680060001400012000100001-1 beq=1003002006100000f=00000000011 lb=00000000000求解运行,输出结果:x =33.2724108.3943145.396116.469613054.32020.629650.2580137.285553.97430.00000.0000fval =2.6261e-014即:d1_+d1=2.6261e-014≈0第二步:求解线性规划问题:min d2_+d2x11+x21+x31=100x12+x22+x32=300x13+x23+x33=20011000x11+9500x12+9000x13>=1900008000x21+6800x22+6000x23>=13000014000x31+12000x32+10000x33>=35000011000x11+9500x12+9000x13+8000x21+6800x22+6000x23+14000x31+12000x32+10000x 33+d1_-d1=6100000d1_+d1=013200x11+11400x12+10800x13+12000x21+10200x22+9000x23+11200x31+9600x32+800 0x33+d2_-d2=6600000xij>=0 (i,j=1,2,3); d1_>=0, d1>=0,d2_>=0,d2>=0对上述线性规划问题,可以借助于Matlab优化工具中的linprog函数求解,函数调用命令为:[x,fval]=linprog(f,A,b,Aeq,beq,lb,[])131其中,参数如下:A=-11000-9500-9000000000000 0 000-8000-6800-6000000000 0000000-14000-12000-10000000 0b=-190000-130000-350000Aeq=100100100000 0 010********* 0 001001001000 0 11000 950090008000680060001400012000100001-10 0 13200 1140010800120001020090001120096008000001-10 000000001100 beq=10030020061000006600000f=00000000000 1 1 lb=000000000000 0运行输出求解结果:x =5.9011232.5826198.550312.81454.27711320.790581.284463.14030.65920.00000.00000.00000.0000fval =1.0126e-015即:d2_+d2=1.0126e-015≈0最后得到一个非劣解方案,如下表:I等耕地II等耕地III等耕地水稻 5.901 1 232.582 6 198.550 3大豆12.814 5 4.277 1 0.790 5玉米81.284 4 63.140 3 0.659 2同样可以看出,以上求解的满意解方案不同于用LINDO软件求得的结果。
这是因为,该问题本身有多重解,而linprog函数求解算法又不同于LINDO的缘故。