主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

particleswarm

粒子群优化

说明

x = particleswarm(fun,nvars) 尝试求达到 fun 的局部最小值的向量 xnvarsfun 的维数(设计变量的数目)。

注意

传递额外参数说明如何将额外的参数传递给目标函数(如有必要)。

示例

x = particleswarm(fun,nvars,lb,ub) 定义设计变量 x 的一组下界和上界,以便在 lb x ub 范围内求得解。

示例

x = particleswarm(fun,nvars,lb,ub,options) 最小化时,其默认优化参数由 options 中的值替换。如果不存在边界,请设置 lb = []ub = []

示例

x = particleswarm(problem)problem 的最小值,它是 problem 中所述的一个结构体。

[x,fval,exitflag,output,points] = particleswarm(___) 还使用上述语法中的任何输入参量组合返回以下内容:

  • fval,作为目标函数值 fun(x) 的标量

  • exitflag,描述退出条件的值

  • output,包含有关优化过程的信息的结构体

  • points,一个结构体,其中包含 points.X 中的最终群位置和 points.Fval 中的相关联目标函数值

示例

示例

全部折叠

最小化一个包含两个变量的简单函数。

定义目标函数。

fun = @(x)x(1)*exp(-norm(x)^2);

调用 particleswarm 最小化该函数。

rng default  % For reproducibility
nvars = 2;
x = particleswarm(fun,nvars)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.

x =

  629.4474  311.4814

您可以在函数图中看到,此解远远不是真正的最小值。

fsurf(@(x,y)x.*exp(-(x.^2+y.^2)))

通常,最好设置边界。请参阅 最小化具有边界的简单函数

最小化一个具有边界约束的包含两个变量的简单函数。

定义目标函数。

fun = @(x)x(1)*exp(-norm(x)^2);

设置变量的边界。

lb = [-10,-15];
ub = [15,20];

调用 particleswarm 最小化该函数。

rng default  % For reproducibility
nvars = 2;
x = particleswarm(fun,nvars,lb,ub)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

   -0.7071   -0.0000

使用更大的种群和混合函数尝试获得更优解。

指定目标函数和边界。

fun = @(x)x(1)*exp(-norm(x)^2);
lb = [-10,-15];
ub = [15,20];

指定选项。

options = optimoptions('particleswarm','SwarmSize',100,'HybridFcn',@fmincon);

调用 particleswarm 最小化该函数。

rng default  % For reproducibility
nvars = 2;
x = particleswarm(fun,nvars,lb,ub,options)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

   -0.7071   -0.0000

返回可选的输出参量,以更详细地检查求解过程。

定义问题。

fun = @(x)x(1)*exp(-norm(x)^2);
lb = [-10,-15];
ub = [15,20];
options = optimoptions('particleswarm','SwarmSize',50,'HybridFcn',@fmincon);

使用所有输出调用 particleswarm 以最小化该函数并获取有关求解过程的信息。

rng default  % For reproducibility
nvars = 2;
[x,fval,exitflag,output,points] = particleswarm(fun,nvars,lb,ub,options)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

   -0.7071   -0.0000

fval = 
-0.4289
exitflag = 
1
output = struct with fields:
      rngstate: [1×1 struct]
    iterations: 43
     funccount: 2203
       message: 'Optimization ended: relative change in the objective value ↵over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.↵FMINCON: Initial point is a local minimum that satisfies the constraints.↵↵Optimization completed because at the initial point, the objective function is non-decreasing ↵in feasible directions to within the value of the optimality tolerance, and ↵constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The final point is the initial point.↵The first-order optimality measure, 2.118144e-07, is less than options.OptimalityTolerance =↵1.000000e-06, and the maximum constraint violation, 0.000000e+00, is less than↵options.ConstraintTolerance = 1.000000e-06.↵'
    hybridflag: 1

points = struct with fields:
       X: [50×2 double]
    Fval: [50×1 double]

输入参数

全部折叠

目标函数,指定为函数句柄或函数名称。编写目标函数以接受长度为 nvars 的行向量,并返回一个标量值。

'UseVectorized' 选项为 true 时,编写 fun 以接受一个 pop×nvars 矩阵,其中 pop 是当前种群大小。在本例中,fun 返回一个与包含适应度函数值的 pop 长度相同的向量。请确保 fun 没有为 pop 假定任何特定大小,因为 particleswarm 即使在向量化计算中也可以传递种群的单个成员。

示例: fun = @(x)(x-[4,2]).^2

数据类型: char | function_handle | string

变量的数目,指定为正整数。求解器传递长度从 nvarsfun 的行向量。

示例: 4

数据类型: double

下界,指定为实数向量或双精度数组。lb 表示 lb x ub 中元素的下界。

particleswarm 在内部将数组 lb 转换为向量 lb(:)

示例: lb = [0;-Inf;4] 表示 x(1) ≥ 0x(3) ≥ 4

数据类型: double

上界,指定为实数向量或双精度数组。ub 表示 lb x ub 中元素的上界。

particleswarm 在内部将数组 ub 转换为向量 ub(:)

示例: ub = [Inf;4;10] 表示 x(2) ≤ 4x(3) ≤ 10

数据类型: double

particleswarm 的选项,指定为 optimoptions 函数的输出。

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

CreationFcn

创建初始群的函数。指定为 'pswcreationuniform' 或函数句柄。默认值是 'pswcreationuniform'。请参阅 群创建

Display

返回到命令行的输出显示级别。

  • 'off''none' 不显示输出。

  • 'final' 仅显示最终输出(默认值)。

  • 'iter' 显示迭代输出。

DisplayInterval迭代输出的间隔。对于每次 DisplayInterval 迭代,迭代输出都打印一行。默认值是 1
FunctionTolerance默认为 1e-6 的非负标量。当最佳目标函数值在最后一次 MaxStallIterations 迭代中相对变化小于 options.FunctionTolerance 时,迭代结束。
FunValCheck

检查目标函数和约束值是否有效。如果为 'on',则当目标函数或约束返回的值是复数、InfNaN 时,会显示错误。默认值 'off' 不会显示错误。

HybridFcn

particleswarm 终止后继续优化的函数。指定为名称或函数句柄。可能的值:

  • 'fmincon'

  • 'fminsearch'

  • 'fminunc'

  • 'patternsearch'

也可以是指定混合函数及其选项的元胞数组,如 {@fmincon,fminconopts}。默认值是 []。请参阅 混合函数

请参阅 何时使用混合函数

InertiaRange具有按升序排列的相同符号值的二元素实数向量。给出自适应惯量的下界和上界。要获得恒定(非自适应)惯量,请将 InertiaRange 的两个元素设置为相同的值。默认值是 [0.1,1.1]。请参阅 粒子群优化算法
InitialPoints

粒子的初始种群或部分种群,指定为矩阵或结构体。

  • 矩阵的大小为 M×nvars。每行表示一个粒子。如果 M < SwarmSize,则 particleswarm 创建更多粒子,使得总数为 SwarmSize。如果 M > SwarmSize,则 particleswarm 使用前 SwarmSize 行。

  • 结构体必须有字段 X,它表示初始点的矩阵。

  • 如果结构体具有多个字段,则该结构体必须包含字段 Fval,其中包含点 InitialPoints.X 的目标函数值向量。

InitialSwarmSpan

@pswcreationuniform 创建的粒子位置的初始范围。可以是正标量,也可以是包含 nvars 个元素的向量,其中 nvars 是变量的数目。任何粒子分量的范围均为 -InitialSwarmSpan/2,InitialSwarmSpan/2,如果需要,可以移位和缩放以匹配任何边界。默认值是 2000

InitialSwarmSpan 也影响初始粒子速度的范围。请参阅 初始化

MaxIterationsparticleswarm 接受的最大迭代次数。默认值为 200*nvars,其中 nvars 是变量的数目。
MaxStallIterations正整数,默认值为 20。当最佳目标函数值在最后一次 MaxStallIterations 迭代中相对变化小于 options.FunctionTolerance 时,迭代结束。
MaxStallTime已知目标函数值没有改进的最大秒数。正标量,默认值为 Inf
MaxTimeparticleswarm 运行的最长时间(秒)。默认值是 Inf
MinNeighborsFraction最小自适应邻域大小,从 01 的标量。默认值是 0.25。请参阅 粒子群优化算法
ObjectiveLimit最小目标值,停止条件。标量,默认为 -Inf
OutputFcn函数句柄或函数句柄元胞数组。输出函数可以读取迭代数据并停止求解器。默认值是 []。请参阅 输出函数和绘图函数
PlotFcn函数名称、函数句柄或函数句柄元胞数组。对于自定义绘图函数,传递函数句柄。绘图函数可以读取迭代数据、对每次迭代绘图并停止求解器。默认值是 []。可用的内置绘图函数:'pswplotbestf'。请参阅 输出函数和绘图函数
SelfAdjustmentWeight调整速度时每个粒子最佳位置的权重。有限标量,默认值为 1.49。请参阅 粒子群优化算法
SocialAdjustmentWeight调整速度时邻域最佳位置的权重。有限标量,默认值为 1.49。请参阅 粒子群优化算法
SwarmSize群中的粒子数,是大于 1 的整数。默认值为 min(100,10*nvars),其中 nvars 是变量的数目。
UseParallel当为 true 时,并行计算目标函数。默认值是 false。请参阅 并行或向量化函数求值
UseVectorized当为 true 时,以向量化方式计算目标函数。默认值是 false。请参阅 并行或向量化函数求值

优化问题,指定为具有以下字段的结构体。

solver'particleswarm'
objective目标函数的函数句柄,或目标函数的名称。
nvars问题中的变量数目。
lb下界向量或数组。
ub上界的向量或数组。
optionsoptimoptions 创建的选项。
rngstate求解过程开始时随机数生成器的可选状态。

数据类型: struct

输出参量

全部折叠

解,以使目标函数在任何边界约束下最小化的实数向量形式返回。

目标值,以实数标量 fun(x) 形式返回。

算法停止条件,以整数形式返回,标识算法停止的原因。下面列出 exitflag 的值以及相应的 particleswarm 停止原因。

1

在前 options.MaxStallIterations 次迭代中目标值的相对变化小于 options.FunctionTolerance

0

迭代次数超出 options.MaxIterations

-1

迭代被输出函数或绘图函数停止。

-2

边界不一致:对于某些 ilb(i) > ub(i)

-3

最佳目标函数值低于 options.ObjectiveLimit

-4

最佳目标函数值在 options.MaxStallTime 秒内没有变化。

-5

运行时间超过 options.MaxTime 秒。

求解过程摘要,以包含优化过程信息的结构体形式返回。

iterations

求解器迭代次数

funccount

目标函数计算的次数。

message

算法停止的原因。

hybridflag

混合函数的退出标志。与 HybridFcn options 相关。

rngstate

算法即将开始之前默认随机数生成器的状态。

最终群位置和目标函数值,以具有以下字段的结构体形式返回:

  • X - 最终群的位置,以矩阵形式返回。矩阵的每行表示一个点。

  • Fval - 最终群的目标函数值。对于每个 i,即最终群的成员的索引,points.Fval(i) = fun(points.X(i))

要继续优化,您可以将 points 作为 InitialPoints 选项传递。不过,这种方法与从一开始就运行较长时间的优化不同,因为当优化从最终种群重新开始时,算法的许多方面都是不相同的。请参阅 粒子群优化算法

数据类型: struct

限制

  • 基于问题的优化实时编辑器任务当前不支持指定多个初始点或初始目标函数值。要指定初始点,请使用基于求解器的任务,或使用命令行。

算法

有关粒子群优化算法的描述,请参阅粒子群优化算法

替代功能

App

优化实时编辑器任务为 particleswarm 提供了一个可视化界面。

扩展功能

全部展开

版本历史记录

在 R2014b 中推出

全部展开