I'm working on an optimization code using differential evolution to solve. However, it is taking a long time to get the solution. See that I have a variable called number_of_iterations that must equal 1000000. When I consider this decision variable equal to a smaller value (eg number_of_iterations=100), the result is pretty quick. But when I use a million, the result takes a long time. Does anyone have any suggestions on how to speed up this procedure?
Here's the code I'm using:
import numpy as np import random from scipy.optimize import differential_evolution,NonlinearConstraint import math V = 220 FP = 0.85 FS = 1.15 cn = 13.0 cm = cn*FS alpha = 1 beta = 1000 Cp = 50 Cc = 250 h = 24 Ch = 0.4 n = 273.487851 B = 2.929689 pi = 4210.61 def otm(y): T=y[0] cn_m=y[1] Custo_Eqp = Ciclo = Custo_acumulado = Ciclo_acumulado = 0 number_of_iterations=1000000 for i in range(1, number_of_iterations): cn = 13.0 cr = cn stop = 1 W = math.floor(random.weibullvariate(n,B)) j = 1 while stop == 1: j = j+1 x = np.random.gamma(alpha,beta) cr = cr+x pf = (3**0.5)*V*cr*FP p = ((pi+pf)*1)/2 Ce = ((p*(j*h))/1000)*Ch if T < W: if j <= T and cr > cm: Custo_Eqp = Ce+Cc Ciclo = j stop = 0 elif j < T and cn_m <= cr <= cm: Custo_Eqp = Ce+Cp Ciclo = j stop = 0 elif j == T and cr <= cm: Custo_Eqp = Ce+Cp Ciclo = T stop = 0 else: if j <= W and cr > cm: Custo_Eqp = Ce+Cc Ciclo = j stop = 0 elif j < W and cn_m <= cr < cm: Custo_Eqp = Ce+Cp Ciclo = j stop = 0 elif j == W and cr <= cm: Custo_Eqp = Ce+Cc Ciclo = W stop = 0 Custo_acumulado = Custo_acumulado + Custo_Eqp Ciclo_acumulado = Ciclo_acumulado + Ciclo return Custo_acumulado/Ciclo_acumulado y0=(round(n-(0.2*n)),round(n+(0.2*n))) y1=(cn,cm) bounds=(y0,y1) nlc = NonlinearConstraint(otm, 0, +np.inf) res=differential_evolution(otm, bounds=bounds, constraints=(nlc),disp = True,maxiter=100) print(res) I tried running it on colab pro, but little advance in speed I had. Is there any other place that might even pay to get a lot of speed?
jis incremented to 2 first thing in the first iteration of thewhileloop: Is this intentional? (((pi+pf)*1)looks funny, too) \$\endgroup\$workersargument todifferential_evolution? It uses processes to run the problem on multiple CPU cores. And (2) isotm()deterministic? For example, doesotm(274, 14)return the same value every time? It looks like the return value depends on two random values. If that's the case, how do you optimize a function that might return a different value for the exact same arguments? \$\endgroup\$