并行多维优化

2024-05-07

我正在构建一个脚本,该脚本生成输入数据[参数]以供另一个程序进行计算。我想优化结果数据。之前我一直在使用 numpy powell optimization。伪代码看起来像这样。

def value(param):
     run_program(param)
     #Parse output
     return value

scipy.optimize.fmin_powell(value,param) 

这很好用;然而,它的速度非常慢,因为程序的每次迭代都可能需要几天的时间才能运行。我想做的是粗粒度并行化它。因此,它不是一次运行一个迭代,而是一次运行(参数数量)*2。例如:

Initial guess: param=[1,2,3,4,5]

#Modify guess by plus minus another matrix that is changeable at each iteration
jump=[1,1,1,1,1]
#Modify each variable plus/minus jump.
for num,a in enumerate(param):
    new_param1=param[:]
    new_param1[num]=new_param1[num]+jump[num]
    run_program(new_param1)
    new_param2=param[:]
    new_param2[num]=new_param2[num]-jump[num]
    run_program(new_param2)

#Wait until all programs are complete -> Parse Output
Output=[[value,param],...]
#Create new guess
#Repeat

变量的数量可以是 3-12 个,因此这样的事情可能会加快代码的速度,从一年缩短到一周。所有变量都相互依赖,我只是从最初的猜测中寻找局部最小值。我已经开始使用粗麻布矩阵进行实现;然而,这相当复杂。有没有什么可以做到这一点,有没有更简单的方法,或者有什么建议可以开始?

所以首要问题如下: 是否有一种算法可以开始猜测,生成多个猜测,然后使用这些多个猜测来创建新的猜测,并重复直到找到阈值。仅可用解析导数。解决这个问题的好方法是什么?是否已经构建了可以做到这一点的东西,还有其他选择吗?

感谢您的时间。

作为一个小更新,我确实通过每个维度的三个点计算简单的抛物线,然后使用最小值作为下一个猜测来实现此目的。这似乎工作正常,但不是最佳的。我仍在寻找其他选择。

当前最好的实现是并行化鲍威尔方法的内循环。

谢谢大家的评论。不幸的是,对于这个特定问题似乎根本没有一个简洁的答案。如果我开始实施一些可以做到这一点的东西,我会将其粘贴在这里;然而,由于该项目不是特别重要或者对结果的需求紧迫,我可能会满足于让它占据一个节点一段时间。


我在大学时也遇到过同样的问题,我们有一个 Fortran 算法来根据一组变量计算引擎的效率。当我们使用 modeFRONTIER 时,如果我没记错的话,没有一个算法能够生成多个猜测。

正常的方法是拥有一个 DOE,并使用一些算法来生成最适合您的问题的 DOE。之后,我们将并行运行单个 DOE 条目,并且算法将“观察”显示当前最佳设计的优化的发展。

旁注:如果您没有集群并且需要更多计算能力,HTCondor 可能会帮助您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行多维优化 的相关文章

随机推荐