MATLAB 多目标规划

多目标规划

多目标规划是指在一定的约束条件下,求解多个目标函数的最优解。


数学模型

正负偏差变量

设 d 为决策变量的函数,d0 为目标值。

正负偏差变量 d+ = max{0, d - d0} 表示决策值超过目标值的部分;d- = max{0, d0 - d} 表示决策值低于目标值的部分。

因为决策值不可能既高于目标值,又低于目标值,所以恒有 d+ × d- = 0。

绝对约束和目标约束

  • 绝对约束:线性规划直接给出的约束条件,一定要满足的约束
  • 目标约束:由决策目标得出的约束条件,尽量满足的约束,允许存在一定的正负偏差

优先因子

为各个目标主观设定一个因子,表示各个目标的重要程度。优先因子越高的目标拥有越高的权重,将会被优先考虑。

多目标规划的目标函数

对于每个目标,有以下三种情况:

  • 恰好达到:正负偏差都尽可能小,minz=f(d++d)min \quad z=f(d^+ + d^-)
  • 不超过:正偏差尽可能小,minz=f(d+)min \quad z=f(d^+)
  • 不少于:负偏差尽可能小,minz=f(d)min \quad z=f(d^-)

最后将各个目标的目标函数根据优先因子进行加权求和,得到最终的目标函数。


如何使用 MATLAB 解决多目标规划问题

MATLAB 为我们提供了 fgoalattain 函数,可以直接求解多目标规划问题。

fgoalattain 函数的语法为:

1
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon) 

其中,fun 为目标函数,x0 为初始值,goal 为目标值,weight 为优先因子,A 为线性不等式约束系数,b 为线性不等式约束的右端项,Aeq 为线性等式约束系数,beq 为线性等式约束的右端项,lb 为变量的下界,ub 为变量的上界,nonlcon 为非线性约束。

输入的标准形式为:

minx,γγ such that {F(x)weightγgoalc(x)0ceq(x)=0AxbAeqx=beqlbxub.\min _{x,\gamma} \gamma \text { such that } \begin{cases} & F(x) - weight \cdot \gamma \leq goal \\ & c(x) \leq 0 \\ & ceq(x)=0 \\ & A \cdot x \leq b \\ & { Aeq } \cdot x={ beq } \\ & l b \leq x \leq u b. \end{cases}

例1

假设有以下双目标函数:

F(x)=[2+(x3)25+x2/4]\begin{aligned} F(x) = \begin{bmatrix} 2 + (x-3)^2 \\ 5 + x^2/4 \end{bmatrix} \end{aligned}

设置目标 [3,6] 和权重 [1,1],并从 x0 = 1 开始求解目标达到问题。

1
2
3
4
5
fun = @(x)[2+(x-3)^2;5+x^2/4];
goal = [3,6];
weight = [1,1];
x0 = 1;
[x,fval] = fgoalattain(fun,x0,goal,weight)

结果为:

1
2
3
4
5
6
7
x =
2.0000


fval =
3.0000
6.0000

可以看到,目标函数达到了目标值。

例2

目标函数为:

F(x)=[2+xp125+xp22/4]\begin{aligned} F(x) = \begin{bmatrix} 2 + ||x-p_1||^2 \\ 5 + ||x-p_2||^2/4 \end{bmatrix} \end{aligned}

此处,p1=[2,3]p_1 = [2,3]p2=[4,1]p_2 = [4,1]。目标是 [3,6],权重是 [1,1],线性约束是x1+x24x_1+x_2 \leq 4

从 x0 = [1,1] 开始求解目标达到问题。

1
2
3
4
5
6
7
8
9
10
11
p_1 = [2,3];
p_2 = [4,1];
fun = @(x)[2 + norm(x-p_1)^2;5 + norm(x-p_2)^2/4];
goal = [3,6];
weight = [1,1];

A = [1,1];
b = 4;

x0 = [1,1];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)

结果为:

1
2
3
4
5
6
x =
2.0694 1.9306

fval =
3.1484
6.1484