Я создаю script, который генерирует входные данные [параметры] для вычисления другой программы. Я хотел бы оптимизировать полученные данные. Раньше я использовал оптимизацию Powies numpy. Код psuedo выглядит примерно так.
def value(param):
run_program(param)
#Parse output
return value
scipy.optimize.fmin_powell(value,param)
Это отлично работает; однако это невероятно медленно, так как каждая итерация программы может занять несколько дней. То, что я хотел бы сделать, это грубое зерно, распараллеливающее это. Поэтому вместо запуска одной итерации за один раз она будет работать (количество параметров) * 2 за раз. Например:
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
Число переменных может варьироваться от 3-12, поэтому что-то вроде этого может потенциально ускорить выполнение кода от года до недели. Все переменные зависят друг от друга, и я только ищу локальные минимумы из первоначального предположения. Я начал реализацию с использованием гессианных матриц; однако это довольно активно. Есть ли что-то, что делает это, есть ли более простой способ или какие-либо предложения для начала?
Итак, основной вопрос заключается в следующем: Есть ли алгоритм, который принимает исходное предположение, генерирует несколько догадок, а затем использует эти множественные угадывания для создания нового угадывания и повторяется до тех пор, пока не будет найдено пороговое значение. Доступны только аналитические производные. Что такое хороший способ сделать это, есть ли что-то построенное уже, что делает это, есть ли другие варианты?
Спасибо за ваше время.
В качестве небольшого обновления у меня есть эта работа, вычисляя простые параболы через три точки каждого измерения, а затем используя минимумы в качестве следующего предположения. Это, похоже, работает прилично, но не оптимально. Я все еще ищу дополнительные опции.
Текущая лучшая реализация - это параллелизация внутреннего цикла метода powell.
Спасибо всем за ваши комментарии. К сожалению, похоже, что этот конкретный вопрос просто не является кратким ответом. Если я приступлю к реализации чего-то, что делает это, я буду вставлять его здесь; однако, поскольку проект не особенно важен или необходимость в прессовании результатов, я, скорее всего, буду довольствоваться тем, что он займет некоторое время node.