多目标规划应用实例

[大谦MATLAB,dqmatlab点com]

【例12】某工厂在一个计划期内生成甲、乙两种产品,各产品都要消耗A,B,C三种不同资源。每件产品对资源的单位消耗、各种资源的限量以及各产品的单位价格、单位利润和所造成的单位污染如表7-1所示。假定产品能全部销售出去,问每期怎样安排生成,才能使利润和产值都最大,且造成的污染最小?

表7-1 各产品相关数据

资源限量
资源A单位消耗 9 4 240
资源B单位消耗 4 5 200
资源C单位消耗 3 10 300
单位产品的价格 400 600
单位产品的利润 70 120
单位产品的污染 3 2

解:设工厂生产产品甲x1个单位,生产产品乙x2个单位,利润目标为z1,产值目标为z2,污染目标为z3,则这个问题可表达为多目标优化问题:

\[\left\{ \begin{matrix} \begin{matrix} \begin{matrix} \mathrm{\mathrm{max}}{{z}_{1}=70{x}_{1}+120{x}_{2}} \\ \mathrm{\mathrm{max}}{{z}_{2}=400{x}_{1}+600{x}_{2}} \\ \mathrm{\mathrm{min}}{{z}_{3}=3{x}_{1}+2{x}_{2}} \end{matrix} \\ 9{x}_{1}+4{x}_{2}\leq240 \\ 4{x}_{1}+5{x}_{2}\leq200 \end{matrix} \\ 3{x}_{1}+10{x}_{2}\leq300 \\ {x}_{1},{x}_{2}\geq0 \end{matrix} \right.\]

首先需要编写目标函数的M文件mgoal01.m,返回目标计算值。

code.matlab
function f=myfun(x)
f(1)=-70*x(1)-120*x(2);
f(2)=-400*x(1) -600*x(2);
f(3)=3*x(1)+2*x(2);

给定目标,权重和初值:

code.matlab
>> goal=[-4000 -20000 100];
>> weight=[1 1 1];
>> x0=[10 25];

给出约束条件的系数,进行计算:

code.matlab
>> A=[9 4;4 5;3 10];
>> b=[240;200;300];
>> lb=zeros(2,1);
>> [x,fval]=fgoalattain(@mgoal01,x0,goal,weight,A,b,[],[],lb,[])

计算结果为:

code.matlab
x =
   12.0879   26.3736
fval =
   1.0e+04 *
   -0.4011   -2.0659    0.0089

故工厂生产产品甲2.9167个单位,生产产品乙4.0833个单位。利润为4011元,产值为20659元,污染为89个单位。

【例13】某公司考虑某个时间段内生产两种光电太阳能电池:产品甲和产品乙。这种生产过程会在空气中引起放射性污染。因此,公司有两个目标:极大化利润与极小化总的放射性污染。已知在一个生产周期内,每单位甲产品的收益是1元,每单位乙产品的收益是3元。而放射性污染的数量,每单位甲产品是1.5个单位,每单位乙产品是1个单位。机器能力(小时)、装配能力(人时)和可用的原材料(单位)有以下限制:

\[\begin{matrix} 0.5{x}_{1}+0.25{x}_{2}\leq8 (\mathrm{机器能力}) \\ 0.2{x}_{1}+0.2{x}_{2}\leq4 (\mathrm{装配能力}) \\ {x}_{1}+5{x}_{2}\leq72 (\mathrm{原材料}) \end{matrix}\]

最优化的目标有两个,一是利润最大,二是污染最小。

解:设工厂生产产品甲x1个单位,生产产品乙x2个单位,利润目标为z1,污染目标为z2,则这个问题可表达为多目标优化问题:

\[\left\{ \begin{matrix} \begin{matrix} \mathrm{\mathrm{max}}{{z}_{1}={x}_{1}+3{x}_{2}} \\ \mathrm{\mathrm{min}}{{z}_{2}=1.5{x}_{1}+{x}_{2}} \\ 0.5{x}_{1}+0.25{x}_{2}\leq8 \end{matrix} \\ 0.2{x}_{1}+0.2{x}_{2}\leq4 \\ {x}_{1}+5{x}_{2}\leq72 \end{matrix} \right.\]

首先需要编写目标函数的M文件mgoal02.m,返回目标计算值。

code.matlab
function f=myfun(x)
f(1)=-x(1)-3*x(2);
f(2)=1.5*x(1)+x(2);

给定目标、权重和初值:

code.matlab
>> goal=[-40 20];
>> weight=[1 1];
>> x0=[0 15];

给出约束条件的系数,进行计算:

code.matlab
>> A=[0.5 0.25;0.2 0.2;1 5];
>> b=[8 4 72];
>> lb=zeros(2,1);
>> [x,fval]=fgoalattain(@mgoal02,x0,goal,weight,A,b,[],[],lb,[])

计算结果为:

code.matlab
x =
    1.4118   14.1176
fval =
  -43.7647   16.2353

故工厂在该时间段内生产产品甲1.4118个单位,生产产品乙14.1176个单位,利润目标为43.7647元,污染16.2358个单位。

【例14】某工厂因生产需要欲采购一种原材料,市场上的这种原材料有两个等级,甲级单价2元/公斤,乙级1元/公斤。要求所花总费用不超过2000元,购得原料总量不少于1000公斤,其中甲级原料不少于500公斤,问如何确定最好的采购方案。

设x1, x2分别为采购甲级和乙级原材料的数量(公斤),要求采购总费用尽量少,采购总重量尽量多,采购甲级原材料尽量多。由题意可得:

\[\left\{ \begin{matrix} \begin{matrix} \begin{matrix} \mathrm{\mathrm{min}}{{z}_{1}=2{x}_{1}+{x}_{2}} \\ \mathrm{\mathrm{max}}{{z}_{2}={x}_{1}+{x}_{2}} \\ \mathrm{\mathrm{max}}{{z}_{3}={x}_{1}} \end{matrix} \\ 2{x}_{1}+{x}_{2}\leq2000 \\ {x}_{1}+{x}_{2}\geq1000 \end{matrix} \\ {x}_{1}\geq500 \\ {x}_{j}\geq0, j=1,2 \end{matrix} \right.\]

编写目标函数的M文件mgoal03.m,返回目标计算值。

code.matlab
function f=myfun(x)
f(1)=2*x(1)+x(2);
f(2)=-x(1)-x(2);
f(3)=-x(1);

确定目标、权重和初值。

code.matlab
>> goal=[2000 -1000 -500];
>> weight=[1 1 1];
>> x0=[550 550];

给出约束条件的系数,进行计算:

code.matlab
>> A=[2 1;-1 -1;-1 0];
>> b=[2000 -1000 -500];
>> lb=zeros(2,1);
>> [x,fval]=fgoalattain(@mgoal03,x0,goal,weight,A,b,[],[],lb,[])

计算结果为:

code.matlab
x =
  666.6667  500.0000
fval =
   1.0e+03 *
    1.8333   -1.1667   -0.6667

所以,最好的采购方案是采购甲级原材料666.7公斤和乙级原材料500公斤。此时采购总费用为1833元,总重量为1166.7公斤,甲级原材料总重量为666.7公斤。