Die Antworten auf die Echtzeitüberwachung, die Protokollaufzeichnung und die Wiederaufnahme von fmin führen dazu, dass die aufrufbare Funktion verwendet wird, um die Funktionseingänge und -ausgänge in einer Nachschlagetabelle zu speichern. Hier ist, wie es gemacht wird:
import numpy as np
import scipy as sp
import scipy.optimize
die Geschichte zu speichern, erstellen Sie eine globale Geschichte Vektor für die Eingänge und ein globale Geschichte Vektor für die objektiven Funktionswerte der Eingänge gegeben. Ich initialisiert den anfänglichen Eingangsvektor auch hier:
x0 = np.array([1.05,0.95])
x_history = np.array([[1e8,1e8]])
fx_history = np.array([[1e8]])
I Rosenbrock- hier Funktion bin zu optimieren, da es die typische optimzation Algorithmus ist:
def rosen(x):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
einen Wrapper erstellen für die Funktion, die Sie zu optimieren und schreiben die globalen Variablen, wenn neue Eingaben von der Optimierungsfunktion angefordert werden und der Zielfunktionswert berechnet wird. Suchen Sie für jede Iteration den Verlauf, um zu ermitteln, ob der Zielfunktionswert für den angeforderten Vektor zuvor berechnet wurde, und verwenden Sie den zuvor berechneten Wert, falls dies der Fall war. Um einen Stromausfall zu "simulieren", habe ich eine Variable namens powerFailure erstellt, um die Optimierung zu beenden, bevor sie abgeschlossen ist. Ich habe powerFailure dann ausgeschaltet, um die Optimierung zu sehen.
def f(x):
global firstPoint, iteration, x_history, fx_history
iteration = iteration + 1
powerFailure = True
failedIteration = 10
previousPoint = False
eps = 1e-12
if powerFailure == True:
if iteration == failedIteration:
raise Exception("Optimization Ended Early Due to Power Failure")
for i in range(len(x_history)):
if abs(x_history[i,0]-x[0])<eps and abs(x_history[i,1]-x[1])<eps:
previousPoint = True
firstPoint=False
fx = fx_history[i,0]
print "%d: f(%f,%f)=%f (using history)" % (iteration,x[0],x[1],fx)
if previousPoint == False:
fx = rosen(x)
print "%d: f(%f,%f)=%f" % (iteration,x[0],x[1],fx)
if firstPoint == True:
x_history = np.atleast_2d([x])
fx_history = np.atleast_2d([fx])
firstPoint = False
else:
x_history = np.concatenate((x_history,np.atleast_2d(x)),axis=0)
fx_history = np.concatenate((fx_history,np.atleast_2d(fx)),axis=0)
return fx
Schließlich führen wir die Optimierung.
firstPoint = True
iteration = 0
xopt, fopt, iter, funcalls, warnflag, allvecs = sp.optimize.fmin(f,x0,full_output=True,xtol=0.9,retall=True)
Mit dem Stromausfall die Optimierung bei der Iteration 9. Nach dem „Einschalten der Stromversorgung zurück“
die Funktion druckt endet
1: f(1.050000,0.950000)=2.328125 (using history)
2: f(1.102500,0.950000)=7.059863 (using history)
3: f(1.050000,0.997500)=1.105000 (using history)
4: f(0.997500,0.997500)=0.000628 (using history)
5: f(0.945000,1.021250)=1.647190 (using history)
6: f(0.997500,1.045000)=0.249944 (using history)
7: f(0.945000,1.045000)=2.312665 (using history)
8: f(1.023750,1.009375)=0.150248 (using history)
9: f(1.023750,0.961875)=0.743420 (using history)
10: f(1.004063,1.024219)=0.025864
11: f(0.977813,1.)=0.316634
12: f(1.012266,1.010117)=0.021363
13: f(1.005703,0.983398)=0.078659
14: f(1.004473,1.014014)=0.002569
15: f(0.989707,1.001396)=0.047964
16: f(1.006626,1.007937)=0.002916
17: f(0.995347,1.003577)=0.016564
18: f(1.003806,1.006847)=0.000075
19: f(0.996833,0.990333)=0.001128
20: f(0.998743,0.996253)=0.000154
21: f(1.005049,1.005600)=0.002072
22: f(0.999387,0.999525)=0.000057
Optimization terminated successfully.
Current function value: 0.000057
Iterations: 11
Function evaluations: 22