预备知识:
单目标规划
Matlab优化工具箱的的相关函数(linprog,fmincon)
linprog
常用调用格式:
x = linprog(f,A,b)
x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
[x,fval] = linprog(___)
x = linprog(f,A,b,Aeq,beq,lb,ub) 定义设计变量 x 的一组下界和上界,使解始终在 lb ≤ x ≤ ub 范围内。如果不存在等式,请设置 Aeq = [] 和 beq = []。
[x,fval] = linprog(___) 返回目标函数 fun 在解 x 处的值:fval = f'*x。
上面的调用格式是基于线性规划的标准型来的,任何线性规划都可以转化为标准型
线性规划标准型
例1
% linprog
A=[-2 5 -1;1 3 1];
Aeq=[1 1 1];
lb=[0;0;0];
b=[-10;12];
beq=[7];
f=[-2;-3;5];
[x,fval]=linprog(f,A,b,Aeq,beq,lb,[]);
x,fval=-fval
x_1=6.4286,x_2=0.5714,x_3=0是最优解
最优解的值为f=14.5714
fmincon
x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
[x,fval] = fmincon(___)
执行最小化时,满足 nonlcon 所定义的非线性不等式 c(x) 或等式 ceq(x)。fmincon 进行优化,以满足 c(x) ≤ 0 和 ceq(x) = 0。如果不存在边界,请设置 lb = [] 和/或 ub = []。
fun:目标函数
x0:自变量的初始值
A,b,Aeq,beq:线性规划标准型的参数,若没有线性约束条件,这里填写[].
lb,ub是列向量,是自变量x的下界和上界,若没有上下界,填写[].
nonlcon:非线性约束条件,是一个含有自变量x的分量的列向量:
创建一个m文件,命名为fun,m
function f=fun(x)
f=x(1)^2+x(2)^2+x(3)^2+8
fun2.m
function [c,ceq]=fun2(x)
c=[-x(1)^2+x(2)-x(3)^2;x(1)+x(2)^2+x(3)^3-20];
ceq=[-x(1)-x(2)^2+2;x(2)+2*x(3)^2-3];
main.m
[X,fval]=fmincon('fun',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
运行结果
理论部分:
传统的多目标规划有多种方法,下面我列举3个常用的方法
1.序贯法
序贯法是确定目标函数的重要性次序,根据次序,先求解第一个目标函数最优解对应的解空间,缩小定义域,使得第一个目标函数在当前定义域下的最优解不变差,反复这个过程,在依次求解后续目标函数的解空间,在这里我们保证,前面的目标函数解的最优性不被后面的目标函数影响,这就体现了重要性次序。
目标函数:这里设第i次求解时,定义域为D_i,,第i次求解时,f_i的最优解为f_i^*
第1次求解:
第2次求解:
第k次求解:
直到定义域变为空集
这是一个客观的算法
2.加权法
加权法是对每个目标函数加权处理
线性加权的权重通常需要专家来判定,主观性较强,但是这个模型比较直观,求解也相对简单,确定了权重后,就转化为单目标规划问题,利用前面单目标规划的代码即可解决问题
3.理想点法
多目标规划的每个目标函数都有最优解,我们记录每个目标函数的最优解,每个目标函数的最优解构成的向量称为理想解,重新构造一个目标函数,这个目标函数的目的是使自变量的取值在可行解的范围内,距离理想解最近。
常见的距离是欧氏距离
例题:
fx1=[3;-2];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
[x1,fav1]=linprog(fx1,a,b,[],[],lb,ub);
fx2=[-4;-3];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
[x2,fav2]=linprog(fx2,a,b,[],[],lb,ub);
x0=[1;1];
a=[2 3;2 1];
b=[18;10];
lb=[0;0];
ub=[];
x=fmincon('((-3*x(1)+2*x(2)-12)^2+(4*x(1)+3*x(2)-24)^2)^(1/2)',x0,a,b,[],[],lb,ub)
f1=-3*x(1)+2*x(2)
f2=4*x(1)+3*x(2)
求解结果:
x =
0.5268
5.6488
f1 =
9.7171
f2 =
19.0537