优化包含 8 个 for 循环的嵌套循环以最小化函数

Optimizing a Nested loop that contains 8 for loops to minimize a function

我有一个 python 代码,它使用嵌套的 for 循环最大化超过 8 个参数的函数。执行大约需要 16 分钟,这太长了,因为我必须针对我要解决的问题进行多次优化。

我试过了:

1.) 用列表理解替换 for 循环,但性能没有变化。

2.) Jug 并行化但整个系统冻结并重新启动。

我的问题:

1.) 是否有任何其他方法可以使用多处理模块并行化嵌套 for 循环?

2.) 有什么方法可以用完全不同的方法替换嵌套循环来最大化函数吗?

Code Snippet: 
def SvetMaxmization(): #Maximization function
    Max = 0
    res = 1.0 # Step Size, execution time grows expo if the value is reduced
    for a1 in np.arange(0, pi, res):
        for a2 in np.arange(0,pi, res):
            for b1 in np.arange(0,pi, res):
                for b2 in np.arange(0,pi, res):
                    for c1 in np.arange(0,pi, res): 
                        for c2 in np.arange(0,pi, res):
                            for d1 in np.arange(0,pi, res):
                                for d2 in np.arange(0,pi, res):
                                   present =Svet(a1,a2,b1,b2,c1,c2,d1,d2) #function to be maximized 
                                   if present > Max:
                                        Max = present

svet() 函数:

def Svet(a1,a2,b1,b2,c1,c2,d1,d2):
    Rho = Desnitystate(3,1) #Rho is a a matrix of dimension 4x4
    CHSH1 = tensor(S(a1),S(b1)) + tensor(S(a1),S(b2)) + tensor(S(a2),S(b1)) - tensor(S(a2),S(b2)) # S returns a matrix of dimension 2x2
    CHSH2 = tensor(S(a1),S(b1)) + tensor(S(a1),S(b2)) + tensor(S(a2),S(b1)) - tensor(S(a2),S(b2))
    SVet3x1 = tensor(CHSH1, S(c2)) + tensor(CHSH2, S(c1))
    SVet3x2 = tensor(CHSH2, S(c1)) + tensor(CHSH1, S(c2))                   
    SVet4x1 = tensor(SVet3x1, S(d2)) + tensor(SVet3x2, S(d1))           
    Svd = abs((SVet4x1*Rho).tr())

    return Svd

系统详细信息:主频为 3.2GHz 的英特尔酷睿 I5

感谢您的宝贵时间!!

很难给出一个单一的 "right" 答案,因为这在很大程度上取决于成本函数的行为。

但是,考虑到您现在正在对参数 space 进行网格搜索(基本上是暴力破解解决方案),我认为有些事情值得尝试。

  1. 看看您是否可以使用更复杂的优化算法。 请参阅 scipy.optimize module,例如只是如果

    x0 = ... # something
    bounds = [(0,np.pi) for _ in range(len(x0))]
    result = minimize(Svet, x0, bounds=bounds)
    

    可以解决问题

  2. 如果成本函数的表现如此糟糕以至于 none 这些方法都起作用,那么您唯一的希望可能就是加快成本函数本身的执行速度。根据我自己的经验,我会尝试以下方法:

    1. numba 是一个很好的第一个选择,因为它很容易尝试,因为它不需要您更改当前代码中的任何内容。不过,它并不总能加速您的代码。

    2. Cython重写代价函数。这需要您做一些工作,但可能会大大提高速度。同样,这取决于成本函数的性质。

    3. 使用例如重写C、C++ 或任何其他 "fast" 语言。