多目标规划——以Matlab中fgoalattain为主
作者:互联网
多目标规划
目录在实际问题中,衡量一个设计方案的好坏往往不止一个标准,常常要考虑多个目标。我们把在这样的背景下建立起来的最优化称之为多目标规划问题。
求解方法
约束法
约束法又称主要目标法,它根据问题的实际情况.确定一个目标为主要目标,而把其余目标作为次要目标,并根据决策者的经验给次要的目标选取—定的界限值,这样就可以把次要目标作为约束来处理,从而就将原有多目标规划问题转化为一个在新的约束下,求主要目标的单目标最优化问题。
假设在p个目标中,\(f_1(x)\)为主要目标,而对应于其余\((p-1)\)个目标函数\(f_i(x)\)均可以确定其允许的边界值:\(a~i~⩽ f_i\leqslant b_i,i=2,3,…,p\)。这样我们就可以将这\((p-1)\)个目标函数当作最优化问题的约束来处理,于是多目标规划问题转化为单目标规划问题
\[\left\{\begin{array}{l}min~f_1(x)\\ s.t.~~ g_{j}(x) \geq 0, \quad j=1,2, \cdots, m \\ ~~~~~~~~a_j\leq f_j\leq b_j(j=2,3,…,p)\end{array}\right. \]评价函数法
例如原多目标规划问题的目标函数为\(F(x)\),则我们可以通过不同的方式构造评价函\(h(F(x))\),然后求解如下问题
\[\left\{\begin{array}{l}min~h(F(x))\\ s.t.~~ x\subset R\end{array}\right. \]求解上述问题之后,可以用上述问题的最优解x作为多目标规划问题的最优解,正是由于可以用不同的方法来构造评价函数,因此有各种不同的评价函数方法,下面介绍几种常用的方法。
评价函数法中主要有:理想点法、平方和加权法、线性加权和法、乘除法、最大最小法。
目标规划的一般数学模型
\[\min \quad z=\sum_{k=1}^{q} P_{k}\left(\sum_{j=1}^{l} w_{k j}^{-} d_{j}^{-}+w_{k j}^{+} d_{j}^{+}\right)\\\left\{\begin{array}{l}\sum_{j=1}^{n} a_{i j} x_{j} \leq(=, \geq) b_{i}, \quad i=1, \cdots, m \\ \sum_{j=1}^{n} c_{i j} x_{j}+d_{i}^{-}-d_{i}^{+}=g_{i}, \quad i=1,2, \cdots, l \\ x_{j} \geq 0, \quad j=1,2, \cdots, n \\ d_{i}^{-}, d_{i}^{+} \geq 0, \quad i=1,2, \cdots, l\end{array}\right. \]设\(x_j~(j=1,2,...,n)\)是目标规划的决策变量,共有\(m\)个约束是刚性约束,可能是等式约束,也可能是不等式约束。设有了l个柔性目标,其目标规划约束的偏差为\(d_i~^+,d_i~^-(i=1,2,...,l)\)。设有\(q\)个优先级别,分别为\(P_1~,P_2~,…,P_q~\)。在同一个优先级Pk中,有不同的权重,分别记为\(w_{kj}~ ^+,w_{kj}~^-(j=1,2,…,l)\)。
建立目标规划的数学模型时,需要确定目标值、优先等级、权系数等,它都具有一 定的主观性和模糊性,可以用专家评定法给以量化。 (其实就是查文献)
求解目标规划的序贯式算法
序贯式算法是求解目标规划的一种早期算法,其核心是根据优先级的先后次序, 将目标规划问题分解成一系列的单目标规划问题,然后再依次求解。
对于\(k=1,2,…,q\),求解单目标规划
\[\min \quad z=\sum_{j=1}^{l}\left(w_{k j}^{-} d_{j}^{-}+w_{k j}^{+} d_{j}^{+}\right)\\s.t.~~\sum_{j=1}^{n} a_{i j} x_{j} \leq(=, \geq) b_{i}, \quad i=1, \cdots, m\\~~~~~~~~~~~~~~~~\sum_{j=1}^{n} c_{i j} x_{j}+d_{i}^{-}-d_{i}^{+}=g_{i}, \quad i=1,2, \cdots, l\\\begin{array}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\sum_{j=1}^{l}\left(w_{s j}^{-} d_{j}^{-}+w_{s j}^{+} d_{j}^{+}\right) \leq z_{s}^{*}, \quad s=1,2, \cdots, k-1, \\x_{j} \geq 0, \quad j=1,2, \cdots, n \\d_{i}^{-}, d_{i}^{+} \geq 0, \quad i=1,2, \cdots, l\end{array} \]其最优目标值为\(z_k^*\) ,当\(k=1\)时,第三个约束为空约束。当\(k=q\)时,\(z_q^*\)对应的解\(x^*\)为目标规划的最优解。
Matlab中的多目标规划解法
语法及说明
x = fgoalattain(fun,x0,goal,weight)
%尝试从 x0 开始、用 weight 指定的权重更改 x,使 fun 提供的目标函数达到 goal 指定的目标。
x = fgoalattain(fun,x0,goal,weight,A,b)
%求解满足不等式 A*x ≤ b 的目标达到问题。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
%求解满足等式 Aeq*x = beq 的目标达到问题。如果不存在不等式,则设置 A = [] 和 b = []。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
%求解满足边界 lb ≤ x ≤ ub 的目标达到问题。如果不存在等式,请设置 Aeq = [] 和 beq = []。如果 x(i) 无下界,则设置 lb(i) = -Inf;如果 x(i) 无上界,则设置 ub(i) = Inf。如果为问题指定的输入边界不一致,则输出 x 为 x0,输出 fval 为 []。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
%求解满足 nonlcon 所定义的非线性不等式 c(x) 或等式 ceq(x) 的目标达到问题。fgoalattain 进行优化,以满足 c(x) ≤ 0 和 ceq(x) = 0。如果不存在边界,则设置 lb = [] 和/或 ub = []。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
%使用 options 所指定的优化选项求解目标达到问题。使用 optimoptions 可设置这些选项。
x = fgoalattain(problem)
%求解 problem 所指定的目标达到问题,它是 problem 中所述的一个结构体。
[x,fval] = fgoalattain(___)
%对上述任何语法,返回目标函数 fun 在解 x 处计算的值。
[x,fval,attainfactor,exitflag,output] = fgoalattain(___)
%还返回在解 x 处的达到因子、描述 fgoalattain 退出条件的值 exitflag,以及包含优化过程信息的结构体 output。
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(___)
%还返回结构体 lambda,其字段包含在解 x 处的拉格朗日乘数。
fgoalattain
求解目标达到问题,这是多目标优化问题最小化的一种表示。
fgoalattain
求以下问题的最小值:
weight
、goal
、b 和 beq 是向量,A 和 Aeq 是矩阵,F(x)、c(x) 和 ceq(x) 是返回向量的函数。F(x)、c(x) 和 ceq(x) 可以是非线性函数。
x、lb 和 ub 可以作为向量或矩阵传递
输入参数
goal——要到达的目标
要达到的目标,指定为实数向量。fgoalattain
尝试找到最小乘数 γ,使以下不等式对于解 x 处的所有 i 值都成立:
假设 weight
是正向量:
- 如果求解器找到同时达到所有目标的点
x
,则达到因子 γ 为负,目标过达到。 - 如果求解器找不到同时达到所有目标的点
x
,则达到因子 γ 为正,目标欠达到。
weight——相对到达因子
相对达到因子,指定为实数向量。fgoalattain
尝试找到最小乘数 γ,使以下不等式对于解 x 处的所有 i 值都成立:
当 goal
的值全部非零时,为确保溢出或低于活动目标的百分比相同,请将 weight
设置为 abs(goal)
。(活动目标是一组目标,它们阻碍解处的目标进一步改进。)
当 weight
为正时,fgoalattain
尝试使目标函数小于目标值。要使目标函数大于目标值,请将 weight
设置为负值而不是正值。
要使目标函数尽可能接近目标值,请使用 EqualityGoalCount
选项,并将目标指定为 fun
返回的向量的第一个元素(
输出参数
attainfactor - 达到因子
达到因子,以实数形式返回。attainfactor
包含解处的 γ 值。如果 attainfactor
为负,则目标过达到;如果 attainfactor
为正,则目标欠达到。
示例
基本目标到达问题
假设有以下双目标函数
\[F(x)=\left[\begin{array}{c}2+(x-3)^{2} \\ 5+x^{2} / 4\end{array}\right] \]显然,在此函数中,当 \(x=3\) 时,\(F_1(x)\) 最小,达到 2;当$ x=0$ 时,\(F2(x)\) 最小,达到 5。
设置目标 [3,6] 和权重 [1,1],并从 x0
= 1 开始求解目标达到问题。
fun = @(x)[2+(x-3)^2;5+x^2/4];
goal = [3,6];
weight = [1,1];
x0 = 1;
x = fgoalattain(fun,x0,goal,weight);
运行脚本得到
x =
2.0000
计算\(F(x)\)在解处的值。
fun(x)
ans =
3.0000
6.0000
fgoalattain
完全达到了目标。
具有线性约束的目标达到问题
目标函数是
\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)
创建目标函数、目标和权重。
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*x <= b
的线性约束矩阵 A
和 b
。
A = [1,1];
b = 4;
设置初始点 [1,1] 并求解目标达到问题。
x0 = [1,1];
x = fgoalattain(fun,x0,goal,weight,A,b)
运行脚本
x =
2.0694 1.9306
计算$ F(x)$在解处的值。
fun(x)
ans =
3.1484
6.1484
fgoalattain
没有满足目标。由于权重相等,求解器溢出每个目标的量是相同的。
有边界的目标达到问题
目标函数是
\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],边界是 \(0≤x_1≤3、2≤x_2≤5\)。
创建目标函数、目标和权重。
fun = @(x)[2+(x-3)^2;5+x^2/4];
goal = [3,6];
weight = [1,1];
x0 = 1;
x = fgoalattain(fun,x0,goal,weight);
创建边界。
lb = [0,2];
ub = [3,5];
将初始点设置为 [1,4],并求解目标达到问题
x0 = [1,4];
A = []; % no linear constraints
b = [];
Aeq = [];
beq = [];
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
运行脚本得到
x =
2.6667 2.3333
计算$ F(x)$在解处的值。
fun(x)
ans =
2.8889
5.8889
fgoalattain
超出满足目标。由于权重相等,求解器结果溢出每个目标的量是相同的。
具有非线性约束的目标达到
目标函数是
\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]\(。目标是 [3,6],权重是 [1,1],非线性约束是\) ||x||^2≤4。$
创建目标函数、目标和权重。
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];
非线性约束函数在 norm4.m
文件中。
type norm4
function [c,ceq] = norm4(x)
ceq = [];
c = norm(x)^2 - 4;
为线性约束和边界创建空输入参数。
A = [];
Aeq = [];
b = [];
beq = [];
lb = [];
ub = [];
将初始点设置为 [1,1],并求解目标达到问题。
x0 = [1,1];
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,@norm4)
运行脚本得到
x =
1.1094 1.6641
计算$ F(x)$在解处的值。
fun(x)
ans =
4.5778
7.1991
fgoalattain
没有满足目标。尽管权重相等,但$ F_1(x) \(与其目标 3 相差约 1.58,\)F_2(x) $与其目标 6 相差约 1.2。非线性约束会防止解 x
同等地达到各目标。
获取目标达到中的目标函数值
目标函数是
\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)
创建目标函数、目标和权重。
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*x <= b
的线性约束矩阵 A
和 b
。
A = [1,1];
b = 4;
设置初始点 [1,1] 并求解目标达到问题。
x0 = [1,1];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
运行脚本得到
x =
2.0694 1.9306
fval =
3.1484
6.1484
目标函数值高于目标,这意味着 fgoalattain
不满足目标。
获得目标达到运算中的所有输出
目标函数是
\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)
创建目标函数、目标和权重。
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*x <= b
的线性约束矩阵 A
和 b
。
A = [1,1];
b = 4;
设置初始点 [1,1] 并求解目标达到问题。请求返回目标函数的值、实现因子、退出标志、输出结构体和拉格朗日乘数。
x0 = [1,1];
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(fun,x0,goal,weight,A,b)
运行脚本得到
x =
2.0694 1.9306
fval =
3.1484
6.1484
attainfactor = 0.1484
exitflag = 4
output = struct with fields:
iterations: 6
funcCount: 29
lssteplength: 1
stepsize: 4.1263e-13
algorithm: 'active-set'
firstorderopt: []
constrviolation: 6.8393e-13
message: '...'
lambda = struct with fields:
lower: [2x1 double]
upper: [2x1 double]
eqlin: [0x1 double]
eqnonlin: [0x1 double]
ineqlin: 0.5394
ineqnonlin: [0x1 double]
attainfactor
为正值表明目标没有达到;您也可以通过比较 fval
和 goal
来确定这一点。
lambda.ineqlin
值非零,表明线性不等式对解进行了约束。
权重、目标和约束对目标达到的影响
目标函数是
\[F(x)=\left[\begin{array}{c}2+||x-p_1||^{2} \\ 5+||x-p_2||^{2} / 4\end{array}\right] \]此处,\(p_1= [2,3]\) 且$ p_2 = [4,1]$。目标是 [3,6],权重是 [1,1],线性约束是 \(x_1+x_2≤4。\)
创建目标函数、目标和权重。
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*x <= b
的线性约束矩阵 A
和 b
。
A = [1,1];
b = 4;
从点 x0 = [1 1]
开始求解目标达到问题。
x0 = [1 1];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
运行脚本得到
x =
2.0694 1.9306
fval =
3.1484
6.1484
fval
的每个分量都高于 goal
的对应分量,表明目标未达到。
通过将 weight(1)
设置为较小的值,提高满足第一个目标的重要性。
weight(1) = 1/10;
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
再次运行脚本得到
x =
2.0115 1.9885
fval =
3.0233
6.2328
现在,fval(1)
的值更接近 goal(1)
,而 fval(2)
更远离 goal(2)
。
将 goal(2)
更改为 7,该值高于当前解。解发生变化。
goal(2) = 7;
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b)
再次运行脚本得到
x =
1.9639 2.0361
fval =
2.9305
6.3047
fval
的两个分量都小于 goal
的对应分量。但是,与 fval(2)
和 goal(2)
的接近程度相比,fval(1)
更接近 goal(1)
。在目标无法达到时,权重越小,会使对应分量更可能接近达到,但在目标能够达到时,则会使溢出目标的量更小。
将权重更改为相等。各个 fval
结果与其对应目标的距离相等。
再次运行脚本得到
x =
1.7613 2.2387
fval =
2.6365
6.6365
约束可防止各个 fval
结果与对应目标等距。例如,对 x(2)
设置上界 2。
ub = [Inf,2];
lb = [];
Aeq = [];
beq = [];
[x,fval] = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
再次运行脚本得到
x =
2.0000 2.0000
fval =
3.0000
6.2500
在这种情况下,fval(1)
正好达到其目标,但 fval(2)
低于其目标。
标签:goal,weight,目标,Matlab,fun,x0,规划,fgoalattain 来源: https://www.cnblogs.com/plzplz/p/16486738.html