优化,简化变量和MATLAB parfor

时间:2012-03-02 15:30:48

标签: matlab optimization

我正在尝试编写一个简单的通用并行代码,用于最小化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]
    

但就内存要求而言,这几乎一样糟糕。

  • 每次解决方案改进时,我也可以将xcurrent保存到磁盘。

我试图寻找一个更简单的解决方案,但没有什么是非常有用的。

问题似乎是明确定义的(所以它不像其他问题,输出可能依赖于迭代顺序),但我找不到一种优雅的方式来做到这一点。

如果我遗漏了一些明显的东西,请提前道歉,并提前多多感谢!

2 个答案:

答案 0 :(得分:0)

无论如何,你可能需要在内存中维护多个xcurrent结构,因为执行循环体的每个worker必须有一个单独的副本。我会尝试将您的循环拆分为外部并行部分和内部串行部分 - 这样您就可以将xcurrent的副本数量分别调整为总迭代次数。

内部(串行)循环可以使用普通if fxcurrent < fmin; xmin = xcurrent; end构造来更新其最佳解决方案,而外部(并行)循环可以使用切片存储所有解决方案。最后一步,您可以从(小)集中选择最佳解决方案。

答案 1 :(得分:0)

谢谢,所以我在这里复制了这个建议。

只是一个想法 - 如果你编写自己的缩减函数怎么办 - 基本上只包含if块和保存或输出?