求解器如何并行计算
Global Optimization Toolbox 中的并行处理类型
并行处理是加速优化算法的一种有吸引力的方法。要使用并行处理,您必须拥有 Parallel Computing Toolbox™ 许可证,并拥有并行工作进程池 (parpool)。有关详细信息,请参阅如何在 Global Optimization Toolbox 中使用并行处理。
Global Optimization Toolbox 求解器以各种方式使用并行计算。
| 求解器 | 并行? | 并行特征 |
|---|---|---|
| × | 无并行功能。但是,fmincon 在 GlobalSearch 中运行时可以使用并行梯度计算。请参阅 在 Optimization Toolbox 中使用并行计算。 |
|
| 起点分布到多个处理器。从这些点开始,局部求解器运行直至完成。有关详细信息,请参阅MultiStart和 如何在 Global Optimization Toolbox 中使用并行处理。 |
对于 fmincon,没有与 MultiStart 并行的并行梯度计算。 | ||
|
| 并行评估群体,每次迭代进行一次。有关详细信息,请参阅遗传算法和 如何在 Global Optimization Toolbox 中使用并行处理。 |
| 不对适应度或约束函数进行向量化。 | ||
|
| 并行评估群体,每次迭代进行一次。有关详细信息,请参阅粒子群和 如何在 Global Optimization Toolbox 中使用并行处理。 |
| 不对目标或约束函数进行向量化。 | ||
|
| 轮询点以并行方式进行评估,每次迭代进行一次。有关详细信息,请参阅模式搜索和 如何在 Global Optimization Toolbox 中使用并行处理。 |
| 不对目标或约束函数进行向量化。 | ||
| × | 无并行功能。但是,simulannealbnd 可以使用并行运行的混合函数。请参阅 模拟退火。 |
|
| 并行评估搜索点。 |
| 不对目标或约束函数进行向量化。 |
此外,一些求解器具有在完成后运行的混合函数。一些混合函数可以并行运行。此外,大多数 patternsearch 搜索方法可以并行运行。有关详细信息,请参阅并行搜索函数或混合函数。
工具箱函数如何分配进程
parfor 特性和注意事项
无嵌套 parfor 循环. 大多数求解器采用 Parallel Computing Toolbox parfor (Parallel Computing Toolbox) 函数来执行并行计算。两个求解器 surrogateopt 和 paretosearch 改用 parfeval (Parallel Computing Toolbox)。
注意
当从另一个 parfor 循环中调用时,parfor 不能并行工作。
注意
文档建议在调用 Simulink® 时不要使用 parfor 或 parfeval;请参阅Using sim Function Within parfor (Simulink)。因此,在使用求解器的内置并行功能并行优化 Simulink 仿真时,可能会遇到问题。有关如何使用多个 Global Optimization Toolbox 求解器优化 Simulink 模型的示例,请参阅并行优化 Simulink 模型。
例如,假设您的目标函数 userfcn 调用 parfor,并且您想使用 MultiStart 和并行处理调用 fmincon。还假设 fmincon 的并行梯度评估条件得到满足,如 并行优化功能 所示。图当 parfor 并行运行时显示了三种情况:
最外层的循环是并行
MultiStart。仅该循环并行运行。最外层的
parfor循环在fmincon中。只有fmincon并行运行。最外层的
parfor循环在userfcn中。在这种情况下,userfcn可以并行使用parfor。
当 parfor 并行运行时

并行随机数不可重现. MATLAB® 中的随机数序列是伪随机的,由种子或初始设置确定。并行计算使用不一定可控制或可重现的种子。例如,MATLAB 的每个实例都有一个默认的全局设置,用于确定随机序列的当前种子。
对于 patternsearch,如果您选择 MADS 作为轮询或搜索方法,并行模式搜索将无法重现运行。如果选择遗传算法或拉丁超立方体作为搜索方法,并行模式搜索就无法重现运行。
对于 ga 和 gamultiobj,平行种群代会产生不可重复的结果。
MultiStart 不同。您可以从并行 MultiStart 进行可重复的运行。运行是可重现的,因为 MultiStart 在本地生成伪随机起点,然后将起点分发到并行处理器。因此,并行处理器不使用随机数。有关详细信息,请参阅并行处理和随机数流。
限制和性能注意事项. 与 parfor 相关的更多警告出现在 并行 for 循环 (parfor) (Parallel Computing Toolbox) 中。
有关影响并行计算速度的因素以及影响并行计算结果的因素的信息,请参阅 利用并行计算提高性能。同样的考虑也适用于使用 Global Optimization Toolbox 函数进行并行计算。
MultiStart
MultiStart 可以自动将问题和起点分配给多个进程或处理器。这些问题独立运行,并且 MultiStart 将不同的局部极小值组合成 GlobalOptimSolution 对象的向量。MultiStart 在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool、Parallel Computing Toolbox 函数启用并行计算。将
MultiStart对象中的UseParallel属性设置为true:ms = MultiStart('UseParallel',true);
当这些条件成立时,MultiStart 会将问题和起点逐个分配给进程或处理器。当达到停止条件或用尽要分配的起点时,算法就会停止。如果 MultiStart Display 属性为 'iter',则 MultiStart 显示:
Running the local solvers in parallel.
有关并行 MultiStart 的示例,请参阅 并行 MultiStart。
并行 MultiStart 中的实现问题. fmincon 与并行 MultiStart 一起使用时无法并行估计梯度。缺乏并行梯度计算是由于 无嵌套 parfor 循环 中描述的 parfor 的限制造成的。
fmincon 并行估计梯度比串行估计梯度可能需要更长的时间。在这种情况下,使用 MultiStart 与 fmincon 中的并行梯度计算会放大减速。例如,假设 ms MultiStart 对象将 UseParallel 设置为 false。假设 fmincon 解决 problem 的时间长 1 秒,且 problem.options.UseParallel 设置为 true。然后 run(ms,problem,200) 比将 problem.options.UseParallel 设置为 false 的相同运行时间长 200 秒
注意
当串行执行时,parfor 循环比 for 循环运行得慢。因此,为了获得最佳性能,当 MultiStart UseParallel 属性为 false 时,请将局部求解器 UseParallel 选项设置为 true。
注意
即使并行运行,求解器偶尔也会在主机上串行调用目标和非线性约束函数。因此,确保您的函数对于它们是否以串行和并行方式评估没有任何假设。
GlobalSearch
GlobalSearch 不分配问题并且起点指向多个进程或处理器。然而,当 GlobalSearch 运行 fmincon 局部求解器时,fmincon 可以通过并行有限差分来估计梯度。fmincon 在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool、Parallel Computing Toolbox 函数启用并行计算。将
UseParallel选项设置为true和optimoptions。在problem结构体中设置此选项:opts = optimoptions(@fmincon,'UseParallel',true,'Algorithm','sqp'); problem = createOptimProblem('fmincon','objective',@myobj,... 'x0',startpt,'options',opts);
有关详细信息,请参阅在 Optimization Toolbox 中使用并行计算。
模式搜索
patternsearch 可以自动将与模式中的点相关的目标和约束函数的评估分配给多个进程或处理器。patternsearch 在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions设置以下选项:UseCompletePoll为true。UseVectorized是false(默认)。UseParallel为true。
当这些条件成立时,求解器在轮询期间并行计算模式搜索的目标函数和约束值。此外,patternsearch 会覆盖 Cache 选项的设置,并使用默认的 'off' 设置。
从 R2019a 开始,当您将 UseParallel 选项设置为 true 时,patternsearch 会在内部将 UseCompletePoll 设置覆盖为 true,以便该函数轮询。
注意
即使在并行运行时,patternsearch 偶尔也会在主机上串行调用目标和非线性约束函数。因此,请确保您的函数没有关于它们是串行还是并行评估的假设。
并行搜索函数. patternsearch 可以选择在每次迭代时调用搜索函数。当您执行以下操作时,搜索是并行的:
将
UseCompleteSearch设置为true。不要将搜索方法设置为
@searchneldermead或custom。将搜索方法设置为
patternsearch轮询方法或拉丁超立方体搜索,并将UseParallel设置为true。或者,如果将搜索方法设置为
ga,则创建一个将UseParallel设置为true的搜索方法选项。
并行模式搜索的实现问题. 模式搜索 中列出的 patternsearch 选项的限制部分源于 parfor 的限制,部分源于并行处理的性质:
Cache被覆盖为'off'-patternsearch将Cache实现为持久变量。parfor不处理持久变量,因为该变量在不同的处理器上可能有不同的设置。UseCompletePoll是true-UseCompletePoll确定一旦patternsearch找到更好的点,轮询是否停止。当并行搜索时,parfor会同时安排所有评估,而patternsearch会在所有评估完成后继续。patternsearch无法在评估开始后停止评估。从 R2019a 开始,当您将
UseParallel选项设置为true时,patternsearch会在内部将UseCompletePoll设置覆盖为true,以便该函数轮询。UseVectorized是false-UseVectorized确定patternsearch是否以向量化方式通过一次函数调用评估模式中的所有点。如果UseVectorized是true,则patternsearch不分配函数的求值,因此不使用parfor。
遗传算法
ga 和 gamultiobj 可以自动将与种群相关的目标和非线性约束函数的评估分配给多个处理器。ga 在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions设置以下选项:UseVectorized是false(默认)。UseParallel为true。
当这些条件成立时,ga 会并行计算种群中个体的目标函数和非线性约束值。
注意
即使在并行运行时,ga 偶尔也会在主机上串行调用适应度和非线性约束函数。因此,请确保您的函数没有关于它们是串行还是并行评估的假设。
并行遗传算法的实现问题. 遗传算法 中列出的选项的限制部分源于 parfor 的限制,部分源于并行处理的性质:
UseVectorized是false-UseVectorized确定ga是否以向量化方式通过一次函数调用评估整个种群。如果UseVectorized是true,则ga不分配函数的求值,因此不使用parfor。
ga 可以具有在完成后运行的混合函数;请参阅 遗传算法中的混合方案。如果希望混合函数利用并行计算,请单独设置其选项,使得 UseParallel 为 true。如果混合函数是 patternsearch,则将 UseCompletePoll 设置为 true,以便 patternsearch 并行运行。
如果混合函数为 fmincon,则使用 optimoptions 设置以下选项以进行并行梯度计算:
GradObj不能是'on'- -它可以是'off'或[]。或者,如果存在非线性约束函数,
GradConstr不能是'on'- - 它可以是在'off'或[]。
要了解如何为混合函数编写选项,请参阅 并行混合函数。
使用 gamultiobj 进行并行计算
使用 gamultiobj 进行并行计算与使用 ga 进行并行计算几乎相同。有关详细信息,请参阅 遗传算法。
gamultiobj 和 ga 并行计算的区别在于混合函数。gamultiobj 只允许一个混合函数,即 fgoalattain。该函数可选择在 gamultiobj 运行完成后运行。计算出的帕累托前沿中的每个个体(即 gamultiobj 找到的最终种群)都成为使用 fgoalattain 进行优化的起点。这些优化并行运行。执行这些优化的处理器数量是个体数量和 parpool 的大小中较小者。
为了使 fgoalattain 并行运行,请正确设置其选项:
fgoalopts = optimoptions(@fgoalattain,'UseParallel',true) gaoptions = optimoptions('ga','HybridFcn',{@fgoalattain,fgoalopts});
gamultiobj 与 gaoptions 一起运行,并且 fgoalattain 并行运行。有关设置混合函数的更多信息,请参阅混合函数选项。gamultiobj 使用 fgoalattain 循环调用 parfor,因此 fgoalattain 在与 gamultiobj 用作混合函数时不会并行估计梯度。有关详细信息,请参阅无嵌套 parfor 循环。
粒子群
particleswarm 可以自动将与种群相关的目标函数的评估分配给多个处理器。particleswarm 在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions设置以下选项:UseVectorized是false(默认)。UseParallel为true。
当这些条件成立时,particleswarm 会并行计算种群中粒子的目标函数。
注意
即使在并行运行时,particleswarm 偶尔也会在主机上串行调用目标函数。因此,请确保您的目标函数没有关于它是串行评估还是并行评估的假设。
并行粒子群优化中的实现问题. 粒子群 中列出的选项的限制部分源于 parfor 的限制,部分源于并行处理的性质:
UseVectorized是false-UseVectorized确定particleswarm是否以向量化方式通过一次函数调用评估整个种群。如果UseVectorized是true,则particleswarm不分配函数的求值,因此不使用parfor。
particleswarm 可以具有在完成后运行的混合函数;请参阅 遗传算法中的混合方案。如果希望混合函数利用并行计算,请单独设置其选项,使得 UseParallel 为 true。如果混合函数是 patternsearch,则将 UseCompletePoll 设置为 true,以便 patternsearch 并行运行。
如果混合函数是 fmincon,则将 GradObj 选项设置为 'off' 或 [] 与 optimoptions 以进行并行梯度计算。
要了解如何为混合函数编写选项,请参阅 并行混合函数。
模拟退火
simulannealbnd 不会自动并行运行。但是,它可以调用利用并行计算的混合函数。要了解如何为混合函数编写选项,请参阅 并行混合函数。
帕累托搜索
paretosearch 可以自动将与种群相关的目标函数的评估分配给多个处理器。paretosearch 在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions设置以下选项:UseParallel为true。
当这些条件成立时,paretosearch 会并行计算种群中粒子的目标函数。
注意
即使在并行运行时,paretosearch 偶尔也会在主机上串行调用目标函数。因此,请确保您的目标函数没有关于它是串行评估还是并行评估的假设。
有关算法的详细信息,请参阅 并行计算和向量化函数求值的修改。
替代优化
surrogateopt 可以自动将与种群相关的目标函数的评估分配给多个处理器。surrogateopt 在以下情况下使用并行计算:
拥有 Parallel Computing Toolbox 软件的许可证。
使用
parpool、Parallel Computing Toolbox 函数启用并行计算。使用
optimoptions设置以下选项:UseParallel为true。
当这些条件成立时,surrogateopt 会并行计算种群中粒子的目标函数。
注意
即使在并行运行时,surrogateopt 偶尔也会在主机上串行调用目标函数。因此,请确保您的目标函数没有关于它是串行评估还是并行评估的假设。
有关算法的详细信息,请参阅 并行 surrogateopt 算法。
