主要内容

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

粒子群选项

指定粒子群的选项

使用 optimoptions 函数创建 options,如下所示。

options = optimoptions('particleswarm',...
    'Param1',value1,'Param2',value2,...);

有关示例,请参阅 使用粒子群进行优化

本节中的每个选项均按 options 中的字段名称列出。例如 Display 引用 options 的对应字段。

群创建

默认情况下,particleswarm 会调用 'pswcreationuniform' 群创建函数。该函数的工作原理如下。

  1. 如果存在 InitialSwarmMatrix 选项,则 'pswcreationuniform' 将把 SwarmSize 矩阵的前 InitialSwarmMatrix 行作为群。如果 InitialSwarmMatrix 矩阵的行数小于 SwarmSize,则 'pswcreationuniform' 继续下一步。

  2. 'pswcreationuniform' 创建的粒子足够多,因此总共有 SwarmSize 个。'pswcreationuniform' 创建的粒子随机且均匀分布。任何群分量的范围都是 -InitialSwarmSpan/2,InitialSwarmSpan/2,如果需要,可以进行移动和缩放以匹配任何边界。

创建后,particleswarm 检查所有粒子是否满足任何边界,并在必要时截断分量。如果 Display 选项是 'iter' 并且粒子需要截断,那么 particleswarm 会通知您。

自定义创建函数

设置自定义创建函数使用 optimoptionsCreationFcn 选项设置为 @customcreation,其中 customcreation 是您的创建函数文件的名称。自定义创建函数具有此语法。

swarm = customcreation(problem)

创建函数应该返回一个大小为 SwarmSize×nvars 的矩阵,其中每一行代表一个粒子的位置。有关问题结构体的详细信息,请参阅 problem。具体来说,您可以从 SwarmSize 获取 problem.options.SwarmSize,从 nvars 获取 problem.nvars

有关创建函数的示例,请请参阅 pswcreationuniform 的代码。

edit pswcreationuniform

显示设置

Display 选项指定在算法运行时在命令行上显示多少信息。

  • 'off''none' - 没有显示输出。

  • 'iter' - 每次迭代时都会显示信息。

  • 'final'(默认)- 显示停止的原因。

iter 显示:

  • Iteration - 迭代序号

  • f-count -目标函数评估的累计次数

  • Best f(x) - 最佳目标函数值

  • Mean f(x) - 所有粒子的平均目标函数值

  • Stall Iterations - 自 Best f(x) 上次更改以来的迭代次数

DisplayInterval 选项设置在迭代显示更新之前执行的迭代次数。给出一个正整数。

算法设置

particleswarm 算法的细节出现在 粒子群优化算法 中。本节介绍调整参数。

粒子群算法的主要步骤是为群生成新的速度:

对于长度为 nvars 的均匀 (0,1) 分布的随机向量 u1u2,更新速度

v = W*v + y1*u1.*(p-x) + y2*u2.*(g-x).

变量 W = inertiay1 = SelfAdjustmentWeighty2 = SocialAdjustmentWeight

此更新使用以下各项的加权和:

  • 先前的速度 v

  • x-p,当前位置 x 与粒子见过的最佳位置 p 之间的差异

  • x-g,当前位置 x 与当前邻域中最佳位置 g 之间的差值

根据此公式,这些选项具有以下效果:

  • 惯性 W 的绝对值越大,新的速度越趋于一致,且绝对幅值越大。W 的绝对值过大可能会破坏群的稳定性。W 的值保持在二元素向量 InertiaRange 的范围内。

  • y1 = SelfAdjustmentWeight 的值越大,粒子头部越接近其访问过的最佳位置。

  • y2 = SocialAdjustmentWeight 的值越大,粒子越倾向于朝向当前邻域中的最佳位置。

较大的惯性值、SelfAdjustmentWeightSocialAdjustmentWeight 可能会破坏群的稳定性。

MinNeighborsFraction 选项设置每个粒子的初始邻域大小和最小邻域大小;请参阅 粒子群优化算法。将 MinNeighborsFraction 设置为 1 使得群的所有成员使用全局最小值点作为其社会调整目标。

请参阅 使用粒子群进行优化 了解设置这些调整选项的示例。

混合函数

混合函数是在粒子群算法终止后运行的另一个最小化函数。您可以在 HybridFcn 选项中指定混合函数。选项包括

  • [] - 没有混合函数。

  • 'fminsearch' - 使用 MATLAB® 函数 fminsearch 执行无约束最小化。

  • 'patternsearch' - 使用模式搜索执行约束或无约束最小化。

  • 'fminunc' - 使用 Optimization Toolbox™ 函数 fminunc 执行无约束最小化。

  • 'fmincon' - 使用 Optimization Toolbox 函数 fmincon 执行约束最小化。

注意

确保您的混合函数接受您的问题约束。否则,particleswarm 将引发错误。

您可以为混合函数设置单独的选项。使用 optimset 代替 fminsearch,或使用 optimoptions 代替 fminconpatternsearchfminunc。例如:

hybridopts = optimoptions('fminunc',...
    'Display','iter','Algorithm','quasi-newton');
particleswarm options 中包含混合选项如下:
options = optimoptions(options,'HybridFcn',{@fminunc,hybridopts}); 
在设置 hybridopts 之前,options 必须存在。

有关使用混合函数的示例,请参阅 使用粒子群进行优化。请参阅 何时使用混合函数

输出函数和绘图函数

输出函数是 particleswarm 在每次迭代时调用的函数。输出函数可以停止 particleswarm,或者执行其他任务。要指定输出函数,

options = optimoptions(@particleswarm,'OutputFcn',@outfun)

其中 outfun 是一个具有 输出函数或绘图函数的结构体 中指定的语法的函数。如果您有多个输出函数,请将它们作为函数句柄的元胞数组传递:

options = optimoptions(@particleswarm,...
    'OutputFcn',{@outfun1,@outfun2,@outfun3})

类似地,绘图函数是 particleswarm 在每次迭代时调用的函数。输出函数和绘图函数之间的区别在于,绘图函数具有内置的绘图增强函数,例如在绘图窗口上出现的用于暂停或停止 particleswarm 的按钮。单独的内置绘图函数 'pswplotbestf' 绘制了针对迭代的最佳目标函数值。具体来说,

options = optimoptions(@particleswarm,'PlotFcn','pswplotbestf')

要创建自定义绘图函数,请使用 输出函数或绘图函数的结构体 中指定的语法编写函数。要指定自定义绘图函数,请使用函数句柄。如果您有多个绘图函数,请将它们作为函数句柄的元胞数组传递:

options = optimoptions(@particleswarm,...
    'PlotFcn',{@plotfun1,@plotfun2,@plotfun3})

有关自定义输出函数的示例,请参阅 粒子群输出函数

输出函数或绘图函数的结构体

输出函数具有以下调用语法:

stop = myfun(optimValues,state)

如果您的函数将 stop 设置为 true,则迭代结束。将 stop 设置为 false 以使 particleswarm 继续计算。

该函数具有以下输入参量:

  • optimValues - 包含有关当前迭代中的群信息的结构体。详细信息请参阅optimValues 结构体

  • state - 给出当前迭代状态的字符串。

    • 'init' -求解器尚未开始迭代。您的输出函数或绘图函数可以使用此状态来打开文件,或为后续迭代设置数据结构或绘图。

    • 'iter' -求解器正在进行迭代。通常,这是您的输出函数或绘图函数执行其工作的地方。

    • 'done' -求解器已达到停止条件。您的输出函数或绘图函数可以使用此状态进行清理,例如关闭它打开的任何文件。

传递额外参数 解释如何向输出函数或绘图函数提供附加参数。

注意

绘图函数不支持 subplot 语句,因为绘图函数框架管理轴。要指定多个子图,请编写单独的绘图函数,并将其作为元胞数组传递给求解器:

options = optimoptions("solvername",PlotFcn={@plot1,@plot2,@plot3});

输出函数支持 subplot,因此您可以使用输出函数代替绘图函数,在一个函数中包含多个绘图。

optimValues 结构体

particleswarmoptimValues 结构体传递给您的输出函数或绘图函数。optimValues 结构体具有以下字段。

字段内容
funccount目标函数评估的总数。
bestx找到最佳解解,对应最佳目标函数值 bestfval
bestfval找到最佳(最低)目标函数值。
iteration迭代序号。
meanfval当前迭代中所有粒子的平均目标函数。
stalliterationsbestfval 上次更改以来的迭代次数。
swarm包含粒子位置的矩阵。每行包含一个粒子的位置,行数等于群大小。
swarmfvals包含群中粒子的目标函数值的向量。对于粒子 iswarmfvals(i) = fun(swarm(i,:)),其中 fun 是目标函数。

并行或向量化函数求值

为了提高速度,您可以设置选项,以便 particleswarm并行向量化方式评估群的目标函数。您只能使用其中一个选项。如果将 UseParallel 设置为 true 并将 UseVectorized 设置为 true,则计算将以向量化方式完成,而不是并行完成。

并行粒子群

如果您有 Parallel Computing Toolbox™ 许可证,您可以将目标函数的评估分发给处理器或核心之间的群。将 UseParallel 选项设置为 true

当您的目标函数计算成本高昂,或者您有许多粒子和处理器时,并行计算可能比串行计算更快。否则,通信开销可能会导致并行计算比串行计算慢。

有关详细信息,请参阅并行计算

向量化粒子群

如果您的目标函数可以一次评估所有粒子,您通常可以通过将 UseVectorized 选项设置为 true 来节省时间。您的目标函数应该接受一个 M x N 矩阵,其中每一行代表一个粒子,并返回一个 M x 1 目标函数值向量。此选项的工作方式与 patternsearchga UseVectorized 选项相同。有关 patternsearch 的详细信息,请参阅 向量化目标和约束函数

停止条件

当发生以下任何一种情况时,particleswarm 就会停止迭代。

停止选项停止测试退出标志
MaxStallIterationsFunctionTolerance在前 MaxStallIterations 次迭代中,最佳目标函数值 g 的相对变化小于 FunctionTolerance1
MaxIterations迭代次数达到 MaxIterations0
OutputFcnPlotFcnOutputFcnPlotFcn 可以停止迭代。-1
ObjectiveLimit可行点的最佳目标函数值 g 小于 ObjectiveLimit-3
MaxStallTime最佳目标函数值 g 在最后 MaxStallTime 秒内没有变化。-4
MaxTime函数运行时间超过 MaxTime 秒。-5

此外,如果将 FunValCheck 选项设置为 'on',并且群中存在具有 NaNInf 或复杂目标函数值的粒子,则 particleswarm 将停止并发出错误。