1 概述
线性规划只能解决一组约束条件下,一个目标函数的最大或最小值问题。在实际决策中,衡量方案优劣要同时考虑多个目标,在这些目标中,有主要的也有次要的;有最大的也有最小的,有定性的也有定量的。对于这类问题,要在线性规划的基础上进行改进。
解决多目标规划问题有两种思路:
(1)加权系数法:为每一目标确定一个权重系数,将多目标模型转化为单一目标的模型。但是要合理确定权重系数,以反映不同目标的重要程度。
(2)优先等级法:将各目标按其重要程度不同的优先等级,转化为单目标规划模型。
在目标规划中不提最优解的概念,只提满意解的概念,即寻求能照顾到各个目标,并使决策者满意的解。
目标规划的一般数学模型:
设是目标规划的决策变量,共有m个约束是刚性约束,(可能是等式约束也可能是不等式约束);设有l个柔性目标约束,其目标约束的偏差为.设有q个优先级别,分别为.在同一个优先级中有不同的权重,分别记为,.因此目标规划,模型的一般数学表达式:
建立目标规划模型时,需要确定目标值、优先等级、权系数等,他们都有一定的主观性和模糊性,可以用专家评定法进行量化。
2 编程求解
多目标规划可以归结为:
式中,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定义不等式约束, Aeq,beq定义等式约束 ,nonlcon是以M文件定义的非线性约束.返回值fval是目标向量函数的值。
示例:求解以下目标规划问题:
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))