Parallele vieldimensionale Optimierung

Ich erstelle ein Skript, das Eingabedaten [Parameter] für ein anderes zu berechnendes Programm generiert. Ich möchte die resultierenden Daten optimieren. Bisher habe ich die Numpy-Powell-Optimierung verwendet. Der Pseudocode sieht ungefähr so ​​aus.

def value(param):
     run_program(param)
     #Parse output
     return value

scipy.optimize.fmin_powell(value,param) 

Das funktioniert großartig; Es ist jedoch unglaublich langsam, da die Ausführung jeder Iteration des Programms Tage dauern kann. Was ich tun möchte, ist Grobkorn parallelisieren. Anstatt also eine einzelne Iteration gleichzeitig auszuführen, würde sie (Anzahl der Parameter) * 2 gleichzeitig ausgeführt. Zum Beispiel:

Initial guess: param=[1,2,3,4,5]

#Modify guess by plus minus another matrix that is changeable at each iteration
jump=[1,1,1,1,1]
#Modify each variable plus/minus jump.
for num,a in enumerate(param):
    new_param1=param[:]
    new_param1[num]=new_param1[num]+jump[num]
    run_program(new_param1)
    new_param2=param[:]
    new_param2[num]=new_param2[num]-jump[num]
    run_program(new_param2)

#Wait until all programs are complete -> Parse Output
Output=[[value,param],...]
#Create new guess
#Repeat

Die Anzahl der Variablen kann zwischen 3 und 12 liegen, so dass sich der Code möglicherweise von einem Jahr auf eine Woche verkürzt. Alle Variablen sind voneinander abhängig und ich suche nur nach lokalen Minima von der anfänglichen Vermutung. Ich habe eine Implementierung mit hessischen Matrizen gestartet. das ist aber ziemlich umständlich. Gibt es irgendetwas, das dies tut, gibt es einen einfacheren Weg oder Vorschläge, um anzufangen?

Die Hauptfrage lautet daher wie folgt: Gibt es einen Algorithmus, der eine Anfangsschätzung annimmt, mehrere Schätzungen generiert, diese dann verwendet, um eine neue Schätzung zu erstellen, und sich wiederholt, bis ein Schwellenwert gefunden wurde. Es sind nur analytische Derivate verfügbar. Was ist ein guter Weg, dies zu tun, gibt es bereits etwas, das dies tut, gibt es andere Optionen?

Vielen Dank für Ihre Zeit.

Als kleines Update funktioniert dies, indem einfache Parabeln durch die drei Punkte jeder Dimension berechnet und dann die Minima als nächste Schätzung verwendet werden. Dies scheint anständig zu funktionieren, ist aber nicht optimal. Ich suche noch nach zusätzlichen Optionen.

Die derzeit beste Implementierung ist die Parallelisierung der inneren Schleife der Powell-Methode.

Vielen Dank für Ihre Kommentare. Leider sieht es so aus, als gäbe es einfach keine präzise Antwort auf dieses spezielle Problem. Wenn ich dazu komme, etwas zu implementieren, das dies tut, werde ich es hier einfügen. Da das Projekt jedoch nicht besonders wichtig ist oder die Ergebnisse dringend benötigt werden, bin ich wahrscheinlich damit zufrieden, dass es für eine Weile einen Knoten einnimmt.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage