【问题标题】:optimization, reduction variables, and MATLAB parfor优化、减少变量和 MATLAB parfor
【发布时间】:2012-03-02 15:30:48
【问题描述】:

我正在尝试编写一个简单的通用并行代码来最小化 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 保存到磁盘。

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

这个问题似乎定义明确(所以它不像其他问题那样,输出可能取决于迭代顺序),但我找不到这样做的优雅方法。

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

【问题讨论】:

  • 这取决于你对“跟踪”的理解。您只是想要某种形式的显示,只是当前值 - 还是您需要整个开发?请澄清。
  • 谢谢。我只是想保存它,或存储它以备后用。我将编辑原始帖子以澄清。
  • 起初我建议保留所有的 xcurrent 然后搜索最小值。但是你写了一些关于记忆的东西——N有那么大吗?
  • 是的,N 真的很大。这是一个组合优化问题,我无法存储所有正在生成的“xcurrent”。
  • 只是一个想法——如果你编写自己的归约函数——基本上只包含 if 块和保存或输出?

标签: matlab optimization


【解决方案1】:

谢谢,所以我把建议复制到这里。

只是一个想法——如果你编写自己的归约函数——基本上只包含 if 块和保存或输出?

【讨论】:

  • 谢谢!看来这是“推荐”的方式。在文档 (link) 中,我找到了一个示例(在“使用自定义缩减函数”标题下),这与我想要做的非常接近。非常感谢!
【解决方案2】:

您可能需要在内存中维护多个xcurrent 结构,因为每个执行循环体的工作人员都必须有一个单独的副本。我会尝试将您的循环拆分为外部并行部分和内部串行部分——这将允许您将 xcurrent 的副本数分别调整为总迭代次数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多