我正在尝试编写一个简单的通用并行代码,用于最小化MATLAB中的函数。这个想法非常简单,基本上是:
parfor k = 1:N
(...find a good solution xcurrent with cost fcurrent ... )
% keep best current value
fmin = min(fmin,fxcurrent)
end
这很好用,因为fmin是一个简化变量,因此我可以使用这种结构来更新当前的最佳值。
然而,我找不到保持(或存储)最佳当前解决方案(“xcurrent”)的优雅方式。
如何跟踪到目前为止找到的最佳解决方案?
换句话说,如果当前值严格小于fmin,我如何保存xcurrent(受并行循环在MATLAB中施加的约束)?
[当然,串口版本很简单,只是前置
if fxcurrent < fmin;
xbest = xcurrent;
end;
但这不适用于parfor循环。]
我想到了一些方法:
我可以存储所有解决方案和成本(使用切片变量),但这是非常低效的内存(迭代次数N非常大,解决方案本身非常大)。
同样,我可以使用(集合或矩阵)缩减变量并执行:
solutionset = [solutionset,xcurrent]
但就内存要求而言,这几乎一样糟糕。
我试图寻找一个更简单的解决方案,但没有什么是非常有用的。
问题似乎是明确定义的(所以它不像其他问题,输出可能依赖于迭代顺序),但我找不到一种优雅的方式来做到这一点。
如果我遗漏了一些明显的东西,请提前道歉,并提前多多感谢!
答案 0 :(得分:0)
无论如何,你可能需要在内存中维护多个xcurrent
结构,因为执行循环体的每个worker必须有一个单独的副本。我会尝试将您的循环拆分为外部并行部分和内部串行部分 - 这样您就可以将xcurrent
的副本数量分别调整为总迭代次数。
内部(串行)循环可以使用普通if fxcurrent < fmin; xmin = xcurrent; end
构造来更新其最佳解决方案,而外部(并行)循环可以使用切片存储所有解决方案。最后一步,您可以从(小)集中选择最佳解决方案。
答案 1 :(得分:0)
谢谢,所以我在这里复制了这个建议。
只是一个想法 - 如果你编写自己的缩减函数怎么办 - 基本上只包含if块和保存或输出?