2012-03-02 74 views
2

我想写一个简单的通用并行代码来最小化MATLAB中的函数。这个想法很简单,主要有:优化,减少变量和MATLAB parfor

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保存到磁盘。

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

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

如果我错过了明显的事情,并提前致谢,请提前道歉!

+0

这取决于您通过“保持跟踪”所了解的内容。你只是想要某种显示,只是现在的价值 - 或者你需要整个开发?请澄清。 – bdecaf 2012-03-02 16:06:25

+0

谢谢。我只是想保存它,或者存储它以备后用。我将编辑原始帖子以澄清。 – user1245359 2012-03-02 16:41:57

+0

起初我会建议保留所有xcurrent,然后再做最低限度的搜索。但是你写了一些关于记忆的东西 - N太大了? – bdecaf 2012-03-02 18:22:07

回答

0

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

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

+0

谢谢!看来这是“推荐”的方式。在文档([链接](http://www.mathworks.de/help/toolbox/distcomp/brdqtjj-1.html))中,我找到了一个示例(在“使用自定义缩减功能”标题下),非常接近我想要做的事情。非常感谢! – user1245359 2012-03-03 21:50:47

0

无论如何,您大概需要在内存中维护多个xcurrent结构,因为必须为每个执行循环体的worker创建一个单独的副本。我会尝试将你的循环分成一个外部并行部分和一个内部连续部分 - 这将允许你将xcurrent的拷贝数分别调整到总迭代次数。

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