我有一个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
感谢您的时间!!
答案 0 :(得分:2)
很难给出一个“正确”的答案,因为它将在很大程度上取决于您的成本函数的行为。
但是,考虑到你现在正在对参数空间进行网格搜索(基本上是强制解决方案),我认为有些事情值得尝试。
看看您是否可以使用更复杂的优化算法。
请参阅scipy.optimize
module,例如就好像
x0 = ... # something
bounds = [(0,np.pi) for _ in range(len(x0))]
result = minimize(Svet, x0, bounds=bounds)
可以解决问题。
如果成本函数的表现非常糟糕,以至于这些方法都不起作用,那么您唯一的希望就是加快成本函数本身的执行速度。根据我自己的经验,我会尝试以下方法: