基于Matlab fmincon的双车轴飞轮参数并行优化核心利用率问题求解
核心原因
当前代码的并行层级设计和硬件核心数不匹配:外层2个车轴的fmincon优化为串行执行,单次仅运行1个fmincon实例;单个fmincon调用的成本函数内部仅启动2个并行仿真任务,因此同一时间最多占用2个核心,剩余2核心完全闲置。
解决方法
1. 启用fmincon自带的并行梯度计算(改动最小)
fmincon默认串行计算目标函数的梯度,单次迭代需要多次串行调用成本函数,开启并行梯度计算后会自动并行调用多次成本函数,直接利用闲置核心。
操作步骤:
- 先初始化对应核心数的并行池
- 配置
fmincon的UseParallel参数为true
代码示例:
% 初始化4核心并行池 parpool('local',4); % 配置优化参数 opts = optimoptions('fmincon','UseParallel',true); for Axle = 1:2 ... fmincon(CostFunc,InitialValues, lb, ub, [], [], [], [], [], opts); end
2. 调整并行层级,把并行放到外层循环(性能提升最稳定)
你当前的并行放在成本函数内部,单批次任务量只有2个,并行开销占比高。可以直接把外层车轴循环改为parfor,两个车轴的优化完全并行执行,成本函数内部的parfor改为普通for即可(MATLAB不支持嵌套parfor,内层保留parfor会自动降级为串行)。
代码示例:
parpool('local',4); % 外层车轴循环改为并行 parfor Axle = 1:2 ... fmincon(CostFunc,InitialValues, lb,ub) end % 成本函数内部改为串行飞轮仿真 fob = CostFunc(...) for FlyWheel = 1:2 FlyWheelOutput(FlyWheel) = simulation(...) end fob = abs(FlyWheelOutput(1) - FlyWheelOutput(2)); % 建议加绝对值,避免负误差导致优化方向错误
3. 扩大并行任务规模(适合需要多初始值优化的场景)
如果需要避免局部最优,每个车轴可以同时跑多组不同的初始值,把所有初始值+车轴的组合打包为并行任务,直接拉满所有核心资源。
注意事项
- 并行执行前检查
simulation函数是否有全局变量、公共文件写入的冲突,并行任务不要写入同一个文件,优先用临时变量传递输出。 - 如果单次仿真耗时低于100ms,建议合并任务减少
parfor的调度开销,避免并行反而降速。
内容的提问来源于stack exchange,提问作者steeven
相关产品推荐
相关产品推荐

