Równoległa optymalizacja wielu wymiarów

Buduję skrypt generujący dane wejściowe [parametry] dla innego programu do obliczenia. Chciałbym zoptymalizować uzyskane dane. Wcześniej korzystałem z optymalizacji powell. Kod psuedo wygląda mniej więcej tak.

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

scipy.optimize.fmin_powell(value,param) 

To działa świetnie; jest jednak bardzo powolny, ponieważ każda iteracja programu może potrwać kilka dni. To, co chciałbym zrobić, to zrównoważyć to gruboziarniste ziarno. Zamiast uruchamiać pojedynczą iterację w tym samym czasie, w którym będzie działać (liczba parametrów) * 2 naraz. Na przykład:

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

Liczba zmiennych może wahać się od 3 do 12, więc coś takiego może potencjalnie przyspieszyć kod z jednego roku do tygodnia. Wszystkie zmienne są od siebie zależne i szukam jedynie minimów lokalnych z początkowego zgadywania. Rozpocząłem implementację przy użyciu macierzy hessian; jednak jest to dość zaangażowane. Czy jest coś, co to robi, czy istnieje prostszy sposób lub jakieś sugestie, aby zacząć?

Podstawowe pytanie brzmi następująco: Czy istnieje algorytm, który zaczyna zgadywanie, generuje wiele zgadnięć, następnie wykorzystuje te wielokrotne domysły do ​​tworzenia nowego zgadywania i powtarza, aż zostanie znaleziony próg. Dostępne są tylko pochodne analityczne. Jaki jest dobry sposób na to, czy istnieje już coś, co to robi, czy istnieją inne opcje?

Dziękuję za Twój czas.

Jako małą aktualizację mam to do czynienia, obliczając proste parabole w trzech punktach każdego wymiaru, a następnie wykorzystując minima jako następne. Wydaje się, że działa to przyzwoicie, ale nie jest optymalne. Nadal szukam dodatkowych opcji.

Obecna najlepsza implementacja jest równoległa do wewnętrznej pętli metody Powella.

Dziękuję wszystkim za komentarze. Niestety wygląda na to, że po prostu nie ma zwięzłej odpowiedzi na ten konkretny problem. Jeśli zacznę wdrażać coś, co to robi, wkleję to tutaj; Ponieważ jednak projekt nie jest szczególnie ważny lub potrzeba naciskania wyników, najprawdopodobniej będę zadowolony, pozwalając mu na chwilę przejąć węzeł.

questionAnswers(7)

yourAnswerToTheQuestion