2026a

# fgoalattain


求解涉及多目标的目标达到问题

函数库: TyOptimization

# 语法

x,fval,attainfactor,exitflag,output,lambda = fgoalattain(fun,x0,goal,weight)
_ = fgoalattain(fun,x0,goal,weight,A,b)
_ = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
_ = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
_ = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
_ = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
_ = fgoalattain(problem)

# 说明

fgoalattain 求解目标达到问题,这是多目标优化问题最小化的一种表示。

fgoalattain 求以下问题的最小值:

使

weight、goal、b 和 beq 是向量,A 和 Aeq 是矩阵,F(x)、c(x) 和 ceq(x) 是返回向量的函数。F(x)、c(x) 和 ceq(x) 可以是非线性函数。


x,fval,attainfactor,exitflag,output,lambda = fgoalattain(fun,x0,goal,weight) 尝试从 x0 开始、用 weight 指定的权重更改 x,使 fun 提供的目标函数达到 goal 指定的目标。其中 x 为解,fval 为目标函数 fun 在解 x 处计算的值,attainfactor 为在解 x 处的达到因子,exitflag 为描述 fgoalattain 退出条件的值,output 为包含优化过程信息的结构体,lambda 为在解 x 处的拉格朗日乘数结构体。示例


_ = fgoalattain(fun,x0,goal,weight,A,b) 求解满足不等式 A*x ≤ b 的目标达到问题。示例


_ = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq) 求解满足等式 Aeq*x = beq 的目标达到问题。如果不存在不等式,则设置 A = [] 和 b = []。


_ = 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 为 NaN。


_ = 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 = []。示例


_ = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options) 使用 options 所指定的优化选项求解目标达到问题。使用 optimoptions 可设置这些选项。示例


_ = fgoalattain(problem) 求解 problem 所指定的目标达到问题,它是 problem 中所述的一个结构体。

# 示例

基本目标达到问题

假设有以下双目标函数

显然,在此函数中,当 x=3 时, 最小,达到 2;当 x=0 时, 最小,达到 5。

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

using TyOptimization
fun = x->[2+(x[1]-3)^2,5+x[1]^2/4]
goal = [3,6]
weight = [1,1]
x0 = [1]
x, = fgoalattain(fun,x0,goal,weight)
x = 1-element Vector{Float64}:

 1.9999999999737859

计算 F(x) 在解处的值。

fun(x)
ans = 2-element Vector{Float64}:

 3.0000000000524283
 5.999999999973786

fgoalattain 完全达到了目标。

具有线性约束的目标达到问题

具有线性约束的目标达到问题
目标函数是:

此处, = [2,3] 且 = [4,1]。目标是 [3,6],权重是 [1,1],线性约束是

创建目标函数、目标和权重。

using TyOptimization
using TyMath
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-element Vector{Float64}:

 2.069366438850378
 1.9306335611496217

计算 F(x) 在解处的值。

fun(x)
ans = 2-element Vector{Float64}:

 3.148356283378323
 6.148356193143824

fgoalattain 没有满足目标。由于权重相等,求解器溢出每个目标的量是相同的。

有边界的目标达到问题

目标函数是

此处, = [2,3] 且 = [4,1]。目标是 [3,6],权重是 [1,1],边界是

创建目标函数、目标和权重。

using TyOptimization
using TyMath
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]

创建边界。

lb = [0,2]
ub = [3,5]

将初始点设置为 [1,4],并求解目标达到问题。

x0 = [1,4]
A = [] # 没有线性约束
b = []
Aeq = []
beq = []
x, = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x = 2-element Vector{Float64}:

 2.66666666403242
 2.3333333306710005

计算 F(x) 在解处的值。

fun(x)
ans = 2-element Vector{Float64}:

 2.888888888926337
 5.888888888870165

fgoalattain 超出满足目标。由于权重相等,求解器结果溢出每个目标的量是相同的。

具有非线性约束的目标达到

目标函数是

此处, = [2,3] 且 = [4,1]。目标是 [3,6],权重是 [1,1],非线性约束是

创建目标函数、目标和权重。

using TyOptimization
using TyMath
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 。

norm4=x->begin
    ceq = Float64[]
    c = [norm(x)^2 - 4]
    return c,ceq
end

为线性约束和边界创建空输入参数。

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 = 2-element Vector{Float64}:
 1.1094003987692689
 1.6641005844693784

计算 F(x) 在解处的值。

fun(x)
ans = 2-element Vector{Float64}:
 4.577794898127394
 7.1991489102319575

fgoalattain 没有满足目标。尽管权重相等,但 F1(x) 与其目标 3 相差约 1.58,F2(x) 与其目标 6 相差约 1.2。非线性约束会防止解 x 同等地达到各目标。

使用非默认选项实现目标

通过将选项设置为返回迭代输出来监控目标达到求解过程。

using TyOptimization
using TyMath
options = optimoptions(:fgoalattain,Display="iter")

目标函数是

此处, = [2,3] 且 = [4,1]。目标是 [3,6],权重是 [1,1],线性约束是 x1+x2≤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]

为线性等式约束、边界和非线性约束创建空输入参数。

Aeq = []
beq = []
lb = []
ub = []
nonlcon = nothing

设置初始点 [1,1] 并求解目标达到问题。

x0 = [1,1]
x, = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
                 Attainment        Max     Line search     Directional
 Iter F-count        factor    constraint   steplength      derivative   Procedure
    0      4              0             4
    1      9             -1           2.5            1          -0.535     
    2     14     -1.413e-08        0.2813            1           0.883     
    3     19         0.1452      0.005926            1           0.883
    4     24         0.1484     2.868e-06            1           0.883
    5     29         0.1484     6.661e-13            1           0.883   Hessian modified 
x = 2-element Vector{Float64}:
 2.0693664145160815
 1.9306335854839192

报告的达到因子为正值表示 fgoalattain 找不到满足目标的解。

注意

在 Syslab Online 中运行,结果可能会有些许差异。

获取目标达到中的目标函数值

目标函数是

此处, = [2,3] 且 = [4,1]。目标是 [3,6],权重是 [1,1],线性约束是 +≤4。

创建目标函数、目标和权重。

using TyOptimization
using TyMath
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-element Vector{Float64}:

 2.069366438850378
 1.9306335611496217

fval = 2-element Vector{Float64}:

 3.148356283378323
 6.148356193143824

目标函数值高于目标,这意味着 fgoalattain 不满足目标。

获得目标达到运算中的所有输出

目标函数是

此处, = [2,3] 且 = [4,1]。目标是 [3,6],权重是 [1,1],线性约束是

创建目标函数、目标和权重。

using TyOptimization
using TyMath
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-element Vector{Float64}:
 2.069366414516079
 1.9306335854839212

fval = 2-element Vector{Float64}:
 3.14835622795779
 6.14835622795729

attainfactor = 0.1483562279571147

exitflag = 4

output = (iterations = 6, funcCount = 29, lssteplength = 1.0, stepsize = 4.147568684326712e-13, algorithm = "active-set", firstorderopt = NaN, constrviolation = 6.754319326063296e-13, message = "\nLocal minimum possible. Constraints satisfied.\n\nfgoalattain stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.\n\n\nOptimization stopped because the norm of the current search direction, 3.683112244424576e-13, is less than 2*options.StepTolerance = 1.0e-6, and the maximum constraint violation, 6.754319326063296e-13, is less than options.ConstraintTolerance = 1.0e-6.\n\n")

lambda = (lower = [0.0, 0.0], upper = [0.0, 0.0], eqlin = Float64[], eqnonlin = Float64[], ineqlin = [0.5393598610746871], ineqnonlin = Float64[])

attainfactor 为正值表明目标没有达到;您也可以通过比较 fval 和 goal 来确定这一点。

lambda.ineqlin 值非零,表明线性不等式对解进行了约束。

注意

在 Syslab Online 中运行,结果可能会有些许差异。

权重、目标和约束对目标达到的影响

目标函数是

此处,p_1 = [2,3] 且 p_2 = [4,1]。目标是 [3,6],初始权重是 [1,1]。

创建目标函数、目标和初始权重。

using TyOptimization
using TyMath
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.0,1]

设置线性约束

A = [1 1]
b = [4]

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

x0 = [1,1]
x,fval = fgoalattain(fun,x0,goal,weight,A,b)
x = 2-element Vector{Float64}:

 2.069366438850378
 1.9306335611496217

fval = 2-element Vector{Float64}:

 3.148356283378323
 6.148356193143824

fval 的每个分量都高于 goal 的对应分量,表明目标未达到。

通过将 weight[1] 设置为较小的值,提高满足第一个目标的重要性。

weight[1] = 1/10
x,fval = fgoalattain(fun,x0,goal,weight,A,b)
x = 2-element Vector{Float64}:

 2.0115077971553412
 1.988492202844659

fval = 2-element Vector{Float64}:

 3.0232804531014184
 6.232804518964673

现在,fval[1] 的值更接近 goal[1],而 fval[2] 更远离 goal[2]。

将 goal[2] 更改为 7,该值高于当前解。解发生变化。

goal[2] = 7
x,fval = fgoalattain(fun,x0,goal,weight,A,b)
x = 2-element Vector{Float64}:

 1.9639367027287478
 2.036063297271252

fval = 2-element Vector{Float64}:

 2.9304745282776454
 6.3047452266119155

fval 的两个分量都小于 goal 的对应分量。但是,与 fval[2] 和 goal[2] 的接近程度相比,fval[1] 更接近 goal[1]。在目标无法达到时,权重越小,会使对应分量更可能接近达到,但在目标能够达到时,则会使溢出目标的量更小。

将权重更改为相等。各个 fval 结果与其对应目标的距离相等。

weight[2] = 1/10
x,fval = fgoalattain(fun,x0,goal,weight,A,b)
x = 2-element Vector{Float64}:

 1.7612940604718492
 2.238705939528151

fval = 2-element Vector{Float64}:

 2.636549172075733
 6.6365491720752345

约束可防止各个 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-element Vector{Float64}:

 2.0
 2.0

fval = 2-element Vector{Float64}:

 3.0
 6.25

在这种情况下,fval[1] 正好达到其目标,但 fval[2] 低于其目标。

# 输入参数

fun - 目标函数
函数句柄

目标函数,指定为函数句柄。fun 函数接受向量 x,并返回向量 F,即在 x 处计算的目标函数值。对于函数文件,您可以将函数 fun 指定为函数句柄:

x = fgoalattain(myfun,x0,goal,weight)

其中 myfun 是一个 Syslab 函数,例如:

myfun = x->begin
    F = ...         # 计算 x 处的函数值。
    return F
end

fun 也可以是匿名函数的函数句柄:

x = fgoalattain(x->sin(x.*x),x0,goal,weight)

要使目标函数尽可能接近目标值(即不大于也不小于),请使用 optimoptions 将 EqualityGoalCount 选项设置为值应处在目标值邻域中的目标的数目。这些目标必须划分为 fun 返回的向量 F 的前几个元素。

假设目标函数的梯度也可以计算并且 SpecifyObjectiveGradient 选项是 true,设置如下:

options = optimoptions(:fgoalattain,SpecifyObjectiveGradient=true)

在这种情况下,函数 fun 必须在第二个输出参数中返回在 x 处的梯度值 G(矩阵)。梯度由每个 F 在 x 点处的偏导数 dF/dx 组成。如果 F 是长度为 m 的向量,且 x 的长度为 n,其中 n 是 x0 的长度,则 F(x) 的梯度 G 是 n×m 矩阵,其中 G(i,j) 是 F(j) 关于 x(i) 的偏导数(即,G 的第 j 列是第 j 个目标函数 F(j) 的梯度)。

注意

仅当问题没有非线性约束,或问题有非线性约束且 SpecifyConstraintGradient 设置为 true 时,将 SpecifyObjectiveGradient 设置为 true 才会高效。在算法内部,目标被折叠到约束中,因此要为求解器提供两种梯度(目标和约束),以避免估计梯度。

x0 - 初始点
实数向量

初始点,指定为实数向量。求解器使用 x0 中的元素数量和 x0 的大小来确定 fun 接受的变量数量和大小。

示例: x0 = [1,2,3,4]

goal - 要达到的目标
实数向量

要达到的目标,指定为实数向量。fgoalattain 尝试找到最小乘数 γ,使以下不等式对于解 x 处的所有 i 值都成立:

假设 weight 是正向量:

  • 如果求解器找到同时达到所有目标的点 x,则达到因子 γ 为负,目标过达到:
  • 如果求解器找不到同时达到所有目标的点 x,则达到因子 γ 为正,目标欠达到。

示例: [1,3,6]

weight - 相对达到因子
实数向量

相对达到因子,指定为实数向量。fgoalattain 尝试找到最小乘数 γ,使以下不等式对于解 x 处的所有 i 值都成立:

当 goal 的值全部非零时,为确保溢出或低于活动目标的百分比相同,请将 weight 设置为 abs.(goal)。(活动目标是一组目标,它们阻碍解处的目标进一步改进。)

注意

将 weight 向量的某一分量设置为零会导致对应的目标约束被视为硬约束,而不是目标约束。设置硬约束的另一种方法是使用输入参数 nonlcon。

当 weight 为正时,fgoalattain 尝试使目标函数小于目标值。要使目标函数大于目标值,请将 weight 设置为负值而不是正值。

要使目标函数尽可能接近目标值,请使用 EqualityGoalCount 选项,并将目标指定为 fun 返回的向量的第一个元素。

示例: abs.(goal)

A - 线性不等式约束
实矩阵

线性不等式约束,指定为实矩阵。A 是 M×N 矩阵,其中 M 是不等式的数目,而 N 是变量的数目(x0 中的元素数)。对于大型问题,将 A 作为稀疏矩阵传递。

A 以如下形式编写 M 个线性不等式

其中,x 是由 N 个变量组成的列向量,b 是具有 M 个元素的列向量。

例如,假设有以下不等式:

x1 +2x2 ≤10
3x1 +4x2 ≤20
5x1 +6x2 ≤30

通过输入以下约束来指定不等式。

A = [1 2;3 4;5 6]

b = [10,20,30]

示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N) 和 b = [1]。

b - 线性不等式约束
实数向量

线性不等式约束,指定为实数向量。b 是与 A 矩阵相关的包含 M 个元素的向量。

b 以如下形式编写 M 个线性不等式

其中,x 是由 N 个变量组成的列向量,A 是大小为 M×N 的矩阵。

例如,假设有以下不等式:

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30

通过输入以下约束来指定不等式。

A = [1 2;3 4;5 6]

b = [10;20;30]

示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N) 和 b = [1]。

Aeq - 线性等式约束
实矩阵

线性等式约束,指定为实矩阵。Aeq 是 Me×N 矩阵,其中 Me 是等式的数目,而 N 是变量的数目(x0 中的元素数)。对于大型问题,将 Aeq 作为稀疏矩阵传递。

Aeq 以如下形式编写 Me 个线性等式

Aeq*x = beq

其中,x 是由 N 个变量组成的列向量,beq 是具有 Me 个元素的列向量。

例如,假设有以下不等式:

x1 +2x2 +3x3 =10
2x1 +4x2 + x3 =20,

通过输入以下约束来指定不等式。

Aeq = [1 2 3;2 4 1]
beq = [10;20]

示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N) 和 beq = [1]。

beq - 线性等式约束
实数向量

线性等式约束,指定为实数向量。beq 是与 Aeq 矩阵相关的包含 Me 个元素的向量。

beq 以如下形式编写 Me 个线性等式

Aeq*x = beq

其中,x 是由 N 个变量组成的列向量,Aeq 是大小为 Me×N 的矩阵。

例如,请参考以下等式:

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20

通过输入以下约束来指定等式。

Aeq = [1 2 3;2 4 1]
beq = [10,20]

示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N) 和 beq = [1]。

lb - 下界
实数向量

下界,指定为实数向量或实数数组。如果 x0 中的元素数等于 lb 中的元素数,则 lb 指定

x[i] >= lb[i](对于全部 i)。

如果 length(lb) < length(x0),则 lb 指定

x[i] >= lb[i] (1 <= i <= length(lb))。

如果 lb 的元素数少于 x0,求解器将发出警告。

示例: 要指定所有 x 分量为正,请使用 lb = zeros(size(x0))。

ub - 上界
实数向量

上界,指定为实数向量或实数数组。如果 x0 中的元素数等于 ub 中的元素数,则 ub 指定

x[i] <= ub[i](对于全部 i)。

如果 length(ub) < length(x0),则 ub 指定

x[i] <= ub[i] (1 <= i <= length(ub))。

如果 ub 的元素数少于 x0,求解器将发出警告。

示例: 要指定 x 的所有分量小于 1,请使用 ub = ones(size(x0))。

nonlcon - 非线性约束
函数句柄

非线性约束,指定为函数句柄。nonlcon 函数接受向量或数组 x,并返回两个数组 c(x) 和 ceq(x)。

c(x) 是由 x 处的非线性不等式约束组成的数组。fgoalattain 尝试满足

c(x) <= 0 for all entries of c.

ceq(x) 是由 x 处的非线性等式约束组成的数组。fgoalattain 尝试满足

ceq(x) = 0 for all entries of ceq.

例如,

x = fgoalattain(myfun,x0,...,mycon)

其中 mycon 是一个 Syslab 函数,例如:

mycon = x -> begin
    c = ...     # 计算 x 处的非线性不等式.
    ceq = ...   # 计算 x 处的非线性等式.
    return c,ceq
end

假设约束的梯度也可以计算且 SpecifyConstraintGradient 选项是 true,设置如下:

options = optimoptions(:fgoalattain,SpecifyConstraintGradient=true)

在本例中,函数 nonlcon 还必须在第三个输出参数 GC 中返回 c(x) 的梯度,在第四个输出参数 GCeq 中返回 ceq(x) 的梯度。请参阅非线性约束,了解如何“条件化”处理梯度,以将其用于不接受原始梯度的求解器。

如果 nonlcon 返回由 m 个分量组成的向量 c,x 的长度为 n,其中 n 是 x0 的长度,则 c(x) 的梯度 GC 是 n×m 矩阵,其中 GC[i,j] 是 c[j] 关于 x[i] 的偏导数(即,GC 的第 j 列是第 j 个不等式约束 c[j] 的梯度)。同样,如果 ceq 有 p 个分量,ceq(x) 的梯度 GCeq 是 n×p 矩阵,其中 GCeq[i,j] 是 ceq[j] 关于 x[i] 的偏导数(即,GCeq 的第 j 列是第 j 个等式约束 ceq[j] 的梯度)。

注意

仅当 SpecifyObjectiveGradient 设置为 true 时,将 SpecifyConstraintGradient 设置为 true 才有效。在内部,目标折叠到约束中,因此求解器需要按顺序提供的两个梯度(目标和约束)以避免估计梯度。

如有必要,请参阅传递额外参数以了解如何参数化非线性约束函数 nonlcon。

options - 优化选项
optimoptions 的输出 | 结构体

优化选项,指定为 optimoptions 的输出或结构体。

optimoptions 显示中缺少某些选项。这些选项在下表中以斜体显示。有关详细信息,请参阅查看优化选项。

有关在 optimset 中具有不同名称的选项的详细信息,请参阅当前选项名称和旧选项名称。

选项 描述
ConstraintTolerance 约束违反值的终止容差(正标量)。默认值为 1e-6。请参阅容差和停止条件。
Diagnostics 显示关于要最小化或求解的函数的诊断信息。选项是 true 或 false(默认值)。
DiffMaxChange 有限差分梯度变量的最大变化(正标量)。默认值为 Inf。
DiffMinChange 有限差分梯度变量的最小变化(正标量)。默认值为 0。
Display 显示级别(请参阅迭代输出):
  • "off" 或 "none" 不显示输出;
  • "iter" 显示每次迭代的输出,并给出默认退出消息;
  • "iter-detailed" 显示每次迭代的输出,并给出带有技术细节的退出消息;
  • "notify" 仅当函数不收敛时才显示输出,并给出默认退出消息;
  • "notify-detailed" 仅当函数不收敛时才显示输出,并给出技术性退出消息;
  • "final"(默认值)仅显示最终输出,并给出默认退出消息;
  • "final-detailed" 仅显示最终输出,并给出带有技术细节的退出消息。
  • EqualityGoalCount 使目标函数 fun 的值等于目标值 goal 所需的目标数目(非负整数)。目标必须划分到 F 的前几个元素中。默认值为 0。有关示例,请参阅Multi-Objective Goal Attainment Optimization。
    FiniteDifferenceStepSize 有限差分的标量或向量步长因子。当您将 FiniteDifferenceStepSize 设置为向量 v 时,前向有限差分 delta 是 delta = v.*sign′.(x).*max.(abs.(x),TypicalX),其中 sign′(x) = sign(x)(例外是 sign′(0) = 1)。中心有限差分是 delta = v.*max.(abs.(x),TypicalX)。标量 FiniteDifferenceStepSize 扩展为向量。默认值 Float64[] 为占位符。fgoalattain 在内部将使用 fill(sqrt(eps()),numberOfVariables) 或 fill(eps()^(1/3),numberOfVariables) 覆盖此默认值。正向有限差分使用 fill(sqrt(eps()),numberOfVariables);中心有限差分使用 fill(eps()^(1/3),numberOfVariables)。
    FiniteDifferenceType 用于估计梯度的有限差分的类型,"forward"(默认值)或 "central"(中心化)。"central" 需要两倍的函数计算次数,但通常更准确。当同时估计这两种类型的有限差分时,该算法小心地遵守边界。例如,为了避免在边界之外的某个点进行计算,算法可能采取一个后向步而不是前向步。
    FunctionTolerance 函数值的终止容差(正标量)。默认值为 1e-6。请参阅容差和停止条件。
    FunValCheck 该检查表示目标函数和约束值是否有效。如果为 true,则当目标函数或约束返回复数值、Inf 或 NaN 时,会显示错误。默认值 false 不显示错误。
    MaxFunctionEvaluations 允许的函数计算最大次数,为正整数。默认值 -1 为占位符,fgoalattain 内部使用 100*numberOfVariables 覆盖该默认值。请参阅容差和停止条件和迭代和函数计算次数。
    MaxIterations 允许的迭代最大次数,为正整数。默认值为 400。请参阅容差和停止条件和迭代和函数计算次数。
    MaxSQPIter 允许的 SQP 迭代最大次数(正整数)。默认值 -1 为 占位符,fgoalattain 内部使用 10*max(numberOfVariables, numberOfInequalities + numberOfBounds) 覆盖该默认值。
    MeritFunction 如果此选项设置为 "multiobj"(默认值),则使用目标达到评价函数。如果此选项设置为 "singleobj",则使用 fmincon 评价函数。
    OptimalityTolerance 一阶最优性的终止容差(正标量)。默认值为 1e-6。请参阅一阶最优性测度。
    RelLineSrchBnd 线搜索步长的相对边界(非负实数标量值),使得 x 中的总位移满足
    RelLineSrchBndDuration RelLineSrchBnd 所指定的边界应处于活动状态的迭代次数。默认值为 1。
    SpecifyConstraintGradient 用户定义的非线性约束函数梯度。当此选项设置为 true 时,fgoalattain 预计约束函数有四个输出,如 nonlcon 中所述。当此选项设置为 false(默认值)时,fgoalattain 使用有限差分估计非线性约束的梯度。
    SpecifyObjectiveGradient 用户定义的目标函数梯度。请参考 fun 的说明,了解如何定义梯度。将此选项设置为 true,以使 fgoalattain 采用用户定义的目标函数梯度。设置为默认值 false 会导致 fgoalattain 使用有限差分来估计梯度。
    StepTolerance x 的终止容差(正标量)。默认值为 1e-6。请参阅容差和停止条件。
    TolConSQP 内部迭代 SQP 约束违反值的终止容差(正标量)。默认值为 1e-6。
    TypicalX 典型的 x 值。TypicalX 中的元素数等于变量数。默认值 Float64[] 为占位符,fgoalattain 在内部将使用 ones(numberofvariables) 覆盖此默认值。fgoalattain 函数使用 TypicalX 缩放有限差分来进行梯度估计。

    示例: optimoptions(:fgoalattain,Display="off")

    problem - 问题结构体
    结构体

    问题结构体,指定为具有下表中字段的结构体。

    字段名称 条目
    objective 目标函数 fun
    x0 x 的初始点
    goal 要达到的目标
    weight 目标的相对重要性因子
    Aineq 线性不等式约束的矩阵
    bineq 线性不等式约束的向量
    Aeq 线性等式约束的矩阵
    beq 线性等式约束的向量
    lb 由下界组成的向量
    ub 由上界组成的向量
    nonlcon 非线性约束函数
    solver "fgoalattain"
    options 用 optimoptions 创建的选项

    您必须在 problem 结构体中至少提供 objective、x0、goal、weight、solver 和 options 字段。

    # 输出参数

    x - 解
    实数向量

    解,以实数向量形式返回。x 的大小与 x0 的大小相同。通常情况下,当 exitflag 为正时,x 是该问题的局部解。

    fval - 解处的目标函数值
    实数数组

    解处的目标函数值,以实数数组形式返回。通常,fval = fun(x)。

    attainfactor - 达到因子
    实数

    达到因子,以实数形式返回。attainfactor 包含解处的 γ 值。如果 attainfactor 为负,则目标过达到;如果 attainfactor 为正,则目标欠达到。

    exitflag - fgoalattain 停止的原因
    整数

    fgoalattain 停止的原因,以整数形式返回。

    含义
    1 函数收敛于解 x
    4 搜索方向的模小于指定的容差,约束违反值小于 options.ConstraintTolerance
    5 方向导数的模小于指定容差,约束违反值小于 options.ConstraintTolerance
    0 迭代次数超过 options.MaxIterations 或函数计算次数超过 options.MaxFunctionEvaluations
    -1 由输出函数或绘图函数停止
    -2 找不到可行点
    output - 有关优化过程的信息
    结构体

    有关优化过程的信息,以包含下表中字段的结构体形式返回。

    字段 含义
    iterations 执行的迭代次数
    funcCount 函数计算次数
    lssteplength 搜索方向上线搜索步的大小
    constrviolation 约束函数的最大值
    stepsize x 中最后一次位移的长度
    algorithm 使用的优化算法
    firstorderopt 一阶最优性的测度
    message 退出消息
    lambda - 解处的拉格朗日乘数
    结构体

    解处的拉格朗日乘数,以结构体形式返回,其中包含下表中的字段。

    字段 含义
    lower 对应于 lb 的下界
    upper 对应于 ub 的上界
    ineqlin 对应于 A 和 b 的线性不等式
    eqlin 对应于 Aeq 和 beq 的线性等式
    ineqnonlin 对应于 nonlcon 中 c 的非线性不等式
    eqnonlin 对应于 nonlcon 中 ceq 的非线性等式

    # 另请参阅

    fmincon | fminimax | optimoptions