【发布时间】:2014-04-26 20:06:38
【问题描述】:
我有以下代码……
for i=1:100
for j=1:200
for k=1:100
error = DOprocess(i,j,k);
if(error==const)
%%Break all loops...
end
end
end
end
现在的问题是 DoProcess 函数每次运行都需要大量时间。但我想找到错误代码等于 const 的 I,j,k 的组合。我也不知道 DoProcess 的内部逻辑。我知道,如果我知道我可以使用优化技术来找到最佳解决方案。对于 I、j 和 k 的多个组合,DoProcess 也可以返回一个等于 const 的错误。我只需要找到第一次出现。所以任何人都可以建议我替代搜索算法而不是这些循环。该代码在 Matlab 中,但对于 c/c++ 人来说,您只需将 end 替换为} 并在每个 for 循环的开头保留一个 {。如果需要,我已准备好在 matlab 中实现搜索算法。
【问题讨论】:
-
购买 100*100*200 处理器并并行执行。
-
根据您提供的信息,我怀疑是否会有更好的方法来完成此任务。在最坏的情况下,您可能需要查看所有可能的组合。
-
这个
DoProcess返回的错误代码是否有任何系统(例如,对于较大的 i 或 j 或 k 值,只有升序错误编号?)?因为(我知道)加快搜索 算法 本身的唯一方法是,如果您至少可以预测返回值的趋势。如果DoProcess返回的内容完全是随机的,那么除了暴力破解所有组合之外,不可能找到它——只有更快(和/或并行)的硬件才能让它更快——使用更多内核的简单解决方案可能是OpenMP -
我建议你深入 DoProcess 函数查看更多细节。
-
假设
DOprocess(i,j,k)是一个连续函数,您可以将成本函数定义为(const - DOprocess(i,j,k))^2并尝试像fmincon这样的简单优化算法,例如找到最优i,@987654329 @ 和k。如果不是,那么您将不得不像其他人所说的那样暴力破解它。但我认为它很有可能具有合理的行为,因此可以进行优化。