线性规划只能解决一组线性约束条件下,一个目标的最大或最小值的问题。在实际决策中,衡量方案优劣要考虑多个目标,这些目标中,有主要的,也有次要的;有最大值的,也有最小值的;有定量的,也有定性的;有相互补充的,也有相互对立的,线性规划则无能为力。
多目标规划是数学规划的一个分支。研究多于一个的目标函数在给定区域上的最优化。又称多目标最优化。通常记为 MOP(multi-objective programming)。
多目标规划的概念是 1961年由美国数学家查尔斯和库柏首先提出的。多目标最优化思想,最早是在1896年由法国经济学家V.帕雷托提出来的。他从政治经济学的角度考虑把本质上是不可比较的许多目标化成单个目标的最优化问题,从而涉及了多目标规划问题和多目标的概念。
以下用Matlab工具实现多目标规划问题:
Matlab实现的代码如下:
function y=Fun(x)
y(1) = -100*x(1)-90*x(2)-80*x(3)-70*x(4);
y(2) = 3*x(2)+2*x(4);
end
clear
clc
fitnessfcn=@Fun;
nvars=4; % 变量个数
options=gaoptimset('paretoFraction',0.3,'populationsize',200,'generations',300,'stallGenLimit',200,'TolFun',1e-10,'PlotFcns',@gaplotpareto);
[x,fval]=gamultiobj(fitnessfcn,nvars,[-1 -1 0 0;0 0 -1 -1;3 0 2 0;0 3 0 2],[-30;-30;120;48],Aeq,beq,[0;0;0;0],[],options);
x,fval
plot(fval(:,1),-fval(:,2),'pr')
xlabel('f_1(x)')
ylabel('f_2(x)')
title('Pareto front')
grid on
得到的结果如下:
得到一系列Pareto前沿 :
x =
24.2310 6.3848 23.6540 14.4232
24.2310 6.3848 23.6540 14.4232
24.2940 5.7473 23.4867 7.2334
24.3119 5.7330 23.4641 7.0706
24.2633 5.8411 23.5074 7.2688
24.2593 5.8447 23.5312 11.9272
24.2838 5.7551 23.5006 7.1243
24.2722 5.8546 23.5600 8.5598
24.2637 6.0499 23.5045 11.4442
24.3025 5.8562 23.5115 7.1489
24.2680 5.8938 23.5864 11.2439
24.2785 5.8243 23.5654 9.4312
24.2734 5.9001 23.5442 10.6148
24.2347 6.3488 23.5889 14.2295
24.3119 5.7330 23.4641 7.0706
24.2636 5.8827 23.4966 12.0057
24.2685 5.8796 23.5810 10.4265
24.2739 5.7686 23.5771 12.2672
24.2575 5.8468 23.6032 9.8882
24.2758 5.8889 23.5742 11.4497
24.2648 5.8730 23.5928 7.3794
24.2374 6.2066 23.6043 13.3456
24.2701 5.8353 23.5747 12.3082
24.2461 6.2268 23.6312 14.2939
24.2384 6.2841 23.6427 14.0953
24.2749 6.0008 23.5579 9.4942
24.2717 5.7705 23.5616 8.5721
24.2678 5.9393 23.5498 14.2271
24.2629 6.0285 23.5792 12.5851
24.2743 5.8390 23.5776 11.1474
24.2637 6.0555 23.5389 14.2471
24.2394 6.3071 23.5452 12.8484
24.2795 5.9848 23.5105 14.0822
24.2676 5.9160 23.5734 11.3326
24.2569 6.0361 23.5942 10.2683
24.2867 5.7677 23.5086 9.7176
24.2811 5.8275 23.5238 11.8398
24.2538 5.8332 23.5786 10.2752
24.2720 5.9517 23.5299 10.4672
24.2769 5.9159 23.5132 8.6929
24.2539 5.9170 23.5680 12.8627
24.2744 6.0381 23.5420 10.6600
24.2745 5.7899 23.5452 8.7669
24.2399 6.0532 23.5178 12.7813
24.2783 5.8940 23.5224 9.1249
24.2973 5.9457 23.5397 9.1363
24.2718 5.8535 23.5340 10.2826
24.2554 5.9432 23.5481 11.1031
24.2502 6.2869 23.5676 14.0145
24.2644 5.8804 23.5771 7.4663
24.2403 6.2957 23.6124 12.5999
24.2469 5.9873 23.6106 7.9534
24.2401 6.0208 23.5869 13.7465
24.2730 5.7865 23.5512 9.9019
24.2322 6.3697 23.6133 14.3937
24.2584 5.8918 23.5834 10.1014
24.2549 5.8504 23.5624 9.5216
24.2750 6.0170 23.5694 13.1424
24.2773 5.7989 23.5347 7.4292
24.2542 5.9219 23.5673 11.5097
24.3056 6.0575 23.5373 10.4841
24.2387 5.9602 23.6041 13.6125
24.3025 5.8666 23.4888 8.3668
24.2700 5.8581 23.5947 12.7078
24.2342 6.3503 23.6287 13.6659
24.2420 6.3507 23.6336 14.3035
由于y(1)是求最大值,故只需在下方fval的左侧添加负号即可得到结果
fval =
1.0e+03 *
-5.8997 0.0480
-5.8997 0.0480
-5.3319 0.0317
-5.3192 0.0313
-5.3414 0.0321
-5.6693 0.0414
-5.3251 0.0315
-5.4381 0.0347
-5.6523 0.0410
-5.3386 0.0319
-5.6312 0.0402
-5.4975 0.0363
-5.5849 0.0389
-5.8780 0.0475
-5.3192 0.0313
-5.6759 0.0417
-5.5724 0.0385
-5.6914 0.0418
-5.5324 0.0373
-5.6450 0.0406
-5.3590 0.0324
-5.8049 0.0453
-5.6997 0.0421
-5.8761 0.0473
-5.8675 0.0470
-5.5168 0.0370
-5.4315 0.0345
-5.8412 0.0463
-5.7361 0.0433
-5.6195 0.0398
-5.8518 0.0467
-5.7746 0.0446
-5.8332 0.0461
-5.6384 0.0404
-5.5753 0.0386
-5.5087 0.0367
-5.6633 0.0412
-5.5559 0.0381
-5.5779 0.0388
-5.4497 0.0351
-5.7438 0.0435
-5.6004 0.0394
-5.4458 0.0349
-5.7449 0.0437
-5.4788 0.0359
-5.4876 0.0361
-5.5565 0.0381
-5.6215 0.0400
-5.8573 0.0469
-5.3645 0.0326
-5.7616 0.0441
-5.4091 0.0339
-5.8151 0.0456
-5.5253 0.0372
-5.8931 0.0479
-5.5499 0.0379
-5.5035 0.0366
-5.7745 0.0443
-5.3525 0.0323
-5.6495 0.0408
-5.5926 0.0391
-5.8015 0.0451
-5.4230 0.0343
-5.7313 0.0430
-5.8419 0.0464
-5.8877 0.0477