【发布时间】: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