粒子群选项
指定粒子群的选项
使用 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
选项设置为 @
,其中 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) 分布的随机向量 u1
和 u2
,更新速度
v = W*v + y1*u1.*(p-x) + y2*u2.*(g-x)
.
变量 W = inertia
、y1 = SelfAdjustmentWeight
和 y2 = SocialAdjustmentWeight
。
此更新使用以下各项的加权和:
先前的速度
v
x-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
将停止并发出错误。