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

时间:2016-03-10 12:28:01

标签: python multiprocessing

我有一个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

系统详情:Intel Core I5主频为3.2GHz

感谢您的时间!!

1 个答案:

答案 0 :(得分:2)

很难给出一个“正确”的答案,因为它将在很大程度上取决于您的成本函数的行为。

但是,考虑到你现在正在对参数空间进行网格搜索(基本上是强制解决方案),我认为有些事情值得尝试。

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

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

    可以解决问题。

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

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

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

    3. 使用例如重写C,C ++或任何其他“快速”语言。