Оценка целевой функции (функции черного ящика) решателем оптимизации независимо от используемых алгоритмов?

Основная идея здесь состоит в том, чтобы узнать, как функции черного ящика используются в определении целевой функции и как алгоритмы оптимизации вызывают эти функции.

Предположим, что у нас есть функция, определенная следующим образом:

f является целевой функцией, которая должна быть минимизирована для данной проблемы.

f(Xi,Yi)=(Ai.Xi)+(Bi.Xi.Yi) для i=1,2...n

где Yi= N(X1,X2,...Xn) - функция черного ящика (симуляция), аналитическая форма которой неизвестна, которая принимает все Xi в качестве входных данных

N относится к моделируемой сети.

Ai и Bi постоянные

Проблема имеет следующие ограничения:

X1 + X2 +... + Xn = C

Приведенное ниже определение функции просто для того, чтобы показать, как я назвал результаты моделирования и использовал их в своей задаче оптимизации. Я также открыт для предложений, если это можно сделать еще лучше. (Но мой главный вопрос следует за моим определением функции)

def fun(X): 
   sim_inpfile(X)  # function that has been already defined which is called now by taking x as arguments to write the input file to a simulation
   Popen('python Test02.py')  # running a python code to execute the simulation       
   jn.output.Results  # Extracting results of simulation by importing a custom made python module called jn 
   Y=[] # Simulation Result
   for i in range(len(jn.output.Results.res)):
      if jn.output.Results.res[i].name in nodes:
          y += [(jn.output.Results.res[i].pr)]  # extracting y as a list from the simulation results
   sum = 0 # optimization objective
   for i in range(len(a)):  # len[a]=len[b]=len[X]=len[Y]
      sum += a[i]*X[i]+ b[i]*X[i]*Y[i] #a and b are constants which are lists with the same size as x and y
  return sum   #the ultimate objective function that takes y(simulation results) as arguments to return the optimization objective value

Я сейчас называю решатель оптимизации Python.

res = scipy.optimize.minimize(fun, x0, method='SLSQP', bounds=bnds, constraints=cons)    # x0=initial x values, bounds= Variable bounds on X, Constraint =equality constraint 

QNS:

  • Будет ли целевая функция вызываться для каждой итерации алгоритма для оценки?

  • Если да, это способ, которым я закодировал, подходящий способ вернуть мою цель
    функция с оценкой функции черного ящика на каждой итерации решателя?

  • Также, если есть или похожие проблемы в любом из пакетов оптимизации Python или аналогичных вопросов и примеров, пожалуйста, поделитесь ссылками или темами.

Я ценю вас за ваше время, и ваш опыт может помочь мне решить эту проблему.

1 ответ

Это очень широкий вопрос, а оптимизация - очень сложная тема! Итак, несколько замечаний:

Будет ли целевая функция вызываться для каждой итерации алгоритма для оценки?

Как вы это называете, функция будет вызываться несколько раз за итерацию, поскольку вы не указали jacobian. SLSQP будет использовать численное дифференцирование, чтобы рассуждать о направлении шага (и его длине)!

Если да, является ли способ, которым я кодировал, подходящий способ вернуть мою целевую функцию с оценкой функции черного ящика на каждой итерации решателя?

Нет, наверное нет!

Первая очевидная вещь - это основанный на процессе вызов вашего моделирования, который вызывает накладные расходы. Если ваша симуляция доминирует над временем, это менее актуально, но в этом случае это неправильный подход в целом.

Другие замечания

  • Большинство оптимизаторов scipy предполагают гладкую и детерминированную задачу оптимизации. Ваш может сделать недействительными оба (и может случиться много плохого). Гладкость, вероятно, трудно рассуждать, но детерминированный / случайный может быть проанализирован, когда вы понимаете свою оптимизацию (случайные числа?)
    • Имейте в виду, что случайность может быть даже более критичной, если это итеративное моделирование, которое останавливается после x-итераций без какого-либо формального критерия сходимости
    • Все эти вещи еще более драматичны в случае численного дифференцирования (упрощенный пример: вызов с x против вызова с x+1e-15; если ошибка моделирования в некотором масштабе или выше: плохо)
  • Эти оптимизаторы первого / второго порядка (такие как SLSQP) не предназначены для эффективной оценки функций.
    • Численная дифференциация усугубляет ситуацию
  • Глобальная оптимизация / оптимизация без деривативов обычно использует другие подходы, чем те, которые можно найти в scipy
    • Часто методы нулевого порядка (не на основе градиента)
    • Часто вводят некоторые предположения о потере / прокси, такие как RBF-kernels и co.
    • Они намного более эффективны с точки зрения вызовов функций и часто также разработаны так, чтобы не ломаться в случае негладкости и недетерминированного поведения
    • Но: Глобальная оптимизация / оптимизация без деривативов в целом даже сложнее, чем плавная детерминированная оптимизация (что уже сложно в теории)

Поэтому, несмотря на то, что в вашем вопросе не так много деталей (детали / предположения имеют значение!), Scipy - не самая полезная библиотека для достижения того, чего вы хотите! Существуют обзоры ( пример) об оптимизации без глобальных / производных, в которых описываются альтернативы. Одним из примеров (произвольно выбранный; с открытым исходным кодом) может служить RBFOpt CoinOR, где на его странице обобщены наши проблемы сверху:

Он не предполагает, что f(x) известен в аналитической форме: f(x) - это просто черный ящик, который при заданных входных значениях выдает выходные значения. Оценки переменных x_L, x_U предполагаются конечными. RBFOpt особенно нацелен на проблемы, для которых каждая оценка целевой функции f(x) является дорогостоящей (с точки зрения вычисления времени, или стоимости, или какой-либо другой меры), и мы хотим найти глобальный минимум функции с минимальным количеством функций. оценки по возможности. Поскольку это очень сложный класс задач (мы не предполагаем наличие производных первого порядка), RBFOpt лучше всего работает над задачами, которые относительно маломерны (до 20 переменных, в идеале менее 10) и для которых ограничивающая рамка не является слишком большой.

Другие вопросы по тегам