粒子群选项
指定粒子群的选项
使用 optimoptions 函数创建 options,如下所示。
options = optimoptions('particleswarm',... 'Param1',value1,'Param2',value2,...);
有关示例,请参阅 使用粒子群进行优化。
本节中的每个选项均按 options 中的字段名称列出。例如 Display 引用 options 的对应字段。
群创建
默认情况下,particleswarm 会调用 'pswcreationuniform' 群创建函数。该函数的工作原理如下。
如果存在
InitialSwarmMatrix选项,则'pswcreationuniform'将把SwarmSize矩阵的前InitialSwarmMatrix行作为群。如果InitialSwarmMatrix矩阵的行数小于SwarmSize,则'pswcreationuniform'继续下一步。'pswcreationuniform'创建的粒子足够多,因此总共有SwarmSize个。'pswcreationuniform'创建的粒子随机且均匀分布。任何群分量的范围都是-InitialSwarmSpan/2,InitialSwarmSpan/2,如果需要,可以进行移动和缩放以匹配任何边界。
创建后,particleswarm 检查所有粒子是否满足任何边界,并在必要时截断分量。如果 Display 选项是 'iter' 并且粒子需要截断,那么 particleswarm 会通知您。
自定义创建函数
设置自定义创建函数使用 optimoptions 将 CreationFcn 选项设置为 @,其中 customcreationcustomcreation 是您的创建函数文件的名称。自定义创建函数具有此语法。
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) 分布的随机向量 u1 和 u2,更新速度
v = W*v + y1*u1.*(p-x) + y2*u2.*(g-x).
变量 W = inertia、y1 = SelfAdjustmentWeight 和 y2 = SocialAdjustmentWeight。
此更新使用以下各项的加权和:
先前的速度
vx-p,当前位置x与粒子见过的最佳位置p之间的差异x-g,当前位置x与当前邻域中最佳位置g之间的差值
根据此公式,这些选项具有以下效果:
惯性
W的绝对值越大,新的速度越趋于一致,且绝对幅值越大。W的绝对值过大可能会破坏群的稳定性。W的值保持在二元素向量InertiaRange的范围内。y1 = SelfAdjustmentWeight的值越大,粒子头部越接近其访问过的最佳位置。y2 = SocialAdjustmentWeight的值越大,粒子越倾向于朝向当前邻域中的最佳位置。
较大的惯性值、SelfAdjustmentWeight 或 SocialAdjustmentWeight 可能会破坏群的稳定性。
MinNeighborsFraction 选项设置每个粒子的初始邻域大小和最小邻域大小;请参阅 粒子群优化算法。将 MinNeighborsFraction 设置为 1 使得群的所有成员使用全局最小值点作为其社会调整目标。
请参阅 使用粒子群进行优化 了解设置这些调整选项的示例。
混合函数
混合函数是在粒子群算法终止后运行的另一个最小化函数。您可以在 HybridFcn 选项中指定混合函数。选项包括
[]- 没有混合函数。'fminsearch'- 使用 MATLAB® 函数fminsearch执行无约束最小化。'patternsearch'- 使用模式搜索执行约束或无约束最小化。'fminunc'- 使用 Optimization Toolbox™ 函数fminunc执行无约束最小化。'fmincon'- 使用 Optimization Toolbox 函数fmincon执行约束最小化。
注意
确保您的混合函数接受您的问题约束。否则,particleswarm 将引发错误。
您可以为混合函数设置单独的选项。使用 optimset 代替 fminsearch,或使用 optimoptions 代替 fmincon、patternsearch 或 fminunc。例如:
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 结构体
particleswarm 将 optimValues 结构体传递给您的输出函数或绘图函数。optimValues 结构体具有以下字段。
| 字段 | 内容 |
|---|---|
funccount | 目标函数评估的总数。 |
bestx | 找到最佳解解,对应最佳目标函数值 bestfval。 |
bestfval | 找到最佳(最低)目标函数值。 |
iteration | 迭代序号。 |
meanfval | 当前迭代中所有粒子的平均目标函数。 |
stalliterations | 自 bestfval 上次更改以来的迭代次数。 |
swarm | 包含粒子位置的矩阵。每行包含一个粒子的位置,行数等于群大小。 |
swarmfvals | 包含群中粒子的目标函数值的向量。对于粒子 i、swarmfvals(i) = fun(swarm(i,:)),其中 fun 是目标函数。 |
并行或向量化函数求值
为了提高速度,您可以设置选项,以便 particleswarm 以并行或向量化方式评估群的目标函数。您只能使用其中一个选项。如果将 UseParallel 设置为 true 并将 UseVectorized 设置为 true,则计算将以向量化方式完成,而不是并行完成。
并行粒子群
如果您有 Parallel Computing Toolbox™ 许可证,您可以将目标函数的评估分发给处理器或核心之间的群。将 UseParallel 选项设置为 true。
当您的目标函数计算成本高昂,或者您有许多粒子和处理器时,并行计算可能比串行计算更快。否则,通信开销可能会导致并行计算比串行计算慢。
有关详细信息,请参阅并行计算。
向量化粒子群
如果您的目标函数可以一次评估所有粒子,您通常可以通过将 UseVectorized 选项设置为 true 来节省时间。您的目标函数应该接受一个 M x N 矩阵,其中每一行代表一个粒子,并返回一个 M x 1 目标函数值向量。此选项的工作方式与 patternsearch 和 ga UseVectorized 选项相同。有关 patternsearch 的详细信息,请参阅 向量化目标和约束函数。
停止条件
当发生以下任何一种情况时,particleswarm 就会停止迭代。
| 停止选项 | 停止测试 | 退出标志 |
|---|---|---|
MaxStallIterations 和 FunctionTolerance | 在前 MaxStallIterations 次迭代中,最佳目标函数值 g 的相对变化小于 FunctionTolerance。 | 1 |
MaxIterations | 迭代次数达到 MaxIterations。 | 0 |
OutputFcn 或 PlotFcn | OutputFcn 或 PlotFcn 可以停止迭代。 | -1 |
ObjectiveLimit | 可行点的最佳目标函数值 g 小于 ObjectiveLimit。 | -3 |
MaxStallTime | 最佳目标函数值 g 在最后 MaxStallTime 秒内没有变化。 | -4 |
MaxTime | 函数运行时间超过 MaxTime 秒。 | -5 |
此外,如果将 FunValCheck 选项设置为 'on',并且群中存在具有 NaN、Inf 或复杂目标函数值的粒子,则 particleswarm 将停止并发出错误。