优化模型_多目标规划

1 概述

        线性规划只能解决一组约束条件下,一个目标函数的最大或最小值问题。在实际决策中,衡量方案优劣要同时考虑多个目标,在这些目标中,有主要的也有次要的;有最大的也有最小的,有定性的也有定量的。对于这类问题,要在线性规划的基础上进行改进。

        解决多目标规划问题有两种思路:

        (1)加权系数法:为每一目标确定一个权重系数,将多目标模型转化为单一目标的模型。但是要合理确定权重系数,以反映不同目标的重要程度。

      (2)优先等级法:将各目标按其重要程度不同的优先等级,转化为单目标规划模型。

        在目标规划中不提最优解的概念,只提满意解的概念,即寻求能照顾到各个目标,并使决策者满意的解。

        目标规划的一般数学模型:
        设x_j (j=1,2,3...n)是目标规划的决策变量,共有m个约束是刚性约束,(可能是等式约束也可能是不等式约束);设有l个柔性目标约束,其目标约束的偏差为d_i^+,d_i^-(i=1,2,3...l).设有q个优先级别,分别为P_1,P_2,P_3,...P_q.在同一个优先级P_k中有不同的权重,分别记为w_{ki}^+,w_{ki}^-,(i=1,2,3...l).因此目标规划,模型的一般数学表达式:

min z=\sum _{k=1}^{q}P_k(\sum _{i=1}^lw_{ki}^-d_i^-+w_{ki}^+d_i^+)

s.t. \left\{\begin{matrix} \sum _{j=1}^na_{tj}x_j\leqslant b_i&t=1,2,3...m \\ \sum_{j=1}^{n}c_{ij}x_j+d_i^--d_i^+=d_i^0& i=1,2,3...l\\ x_j\geqslant 0&j=1,2,3...n \\ d_i^+,d_i^-\geqslant 0 & i=1,2,3...l \end{matrix}\right.

        建立目标规划模型时,需要确定目标值、优先等级、权系数等,他们都有一定的主观性和模糊性,可以用专家评定法进行量化。

2 编程求解

        多目标规划可以归结为:

min_{x,y} \gamma

s.t.\left\{\begin{matrix} F(x)-weight*\gamma\leqslant goal\\ A*x\leqslant b\\ Aeq*x\leqslant beq\\ c(x)\leqslant 0\\ ceq(x)=0\\ lb\leqslant x\leqslant ub \end{matrix}\right.

        式中,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\leqslant b, Aeq,beq定义等式约束  Aeq*x=beq,nonlcon是以M文件定义的非线性约束c(x)\leqslant 0,ceq(x)=0.返回值fval是目标向量函数的值。

示例:求解以下目标规划问题:

min \left\{\begin{matrix} z_1=-3x_1-x_2\\ z_2=-x_1-2x_2 \end{matrix}\right.

s.t. \left\{\begin{matrix} x_1+x_2\leqslant 7\\ x_1\leqslant5 \\ x_2\leqslant 5\\ x_1,x_2\geqslant 0 \end{matrix}\right.

Matlab代码:

function F=fun(x)
F=[-3*x(1)-x(2)
    -x(1)-2*x(2)];
end
A=[1,2;
   1,0;
   0,1];
b=[7;5;5];
c1=[-3 -1];
c2=[-1,-2];
[x,g1]=linprog(c1,A,b,[],[],zeros(2,1));
[x,g2]=linprog(c2,A,b,[],[],zeros(2,1));
g3=[g1,g2];
%权重等于goal的绝对值
[x,fval]=fgoalattain('fun',rand(2,1),g3,abs(g3),A,b,[],[],zeros(2,1))

计算结果:

如果使用匿名函数,只需一个程序文件:

A=[1,2;
   1,0;
   0,1];
b=[7;5;5];
c1=[-3 -1];
c2=[-1,-2];
fun=@(x) [c1;c2]*x;
[x,g1]=linprog(c1,A,b,[],[],zeros(2,1));
[x,g2]=linprog(c2,A,b,[],[],zeros(2,1));
g3=[g1,g2];
%权重等于goal的绝对值
[x,fval]=fgoalattain('fun',rand(2,1),g3,abs(g3),A,b,[],[],zeros(2,1))

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值