Найти глобальный минимум дискретно определенной функции
У меня есть четырехпараметрическая функция, для которой у меня нет математической формы, потому что она на самом деле является результатом нескольких отдельных процессов. В своей простейшей форме его можно представить как черный ящик, который возвращает значение, зависящее от значений параметров a,b,c,d
, с помощью которых он вызывается. Вот как это выглядит:
def my_func(a, b, c, d):
# Make lots of calculations here to come up with 'func_value',
# which depends on the values of the parameters given a,b,c,d.
func_value = x(a, b, c, d)
return func_value
Пространство этих четырех параметров ограничено не только по диапазону, но и дискретно. Это означает, что параметры могут иметь определенные значения:
a = [0.004, 0.006, 0.008, 0.010, ...]
b = [0.2, 0.25, 0.3, 0.35, ...]
c = [0.0, 0.01, 0.02, 0.03, ...]
b = [10.1, 10.2, 10.3, 10.4, ...]
, а не те, что между ними (т. е.: они варьируются в шагах).
Мне нужно найти глобальный минимум для этой функции, т. е.: набор, состоящий из тех частных значений параметров [a_i,b_j,c_k,d_l]
, который возвращает минимальное значение, возможное для my_func
.
2 ответа:
Все алгоритмы "восхождения на холм" основаны на предположении, что небольшие изменения на входе приводят к (как правило) небольшим изменениям на выходе. Ваше описание задачи не содержит абсолютно никаких ограничений на форму графа функций (за исключением вашего интереса к вероятностному восхождению на холм, что подразумевает, что оно действительно применимо к вашей области). Например, вы не можете использовать hill climbing для криптографической хэш-функции.
Но лучший алгоритм в значительной степени зависит от дополнительных характеристики задачи:
Имитация отжига начинается с больших "прыжков", которые становятся все меньше, идея заключается в том, что вы оказываетесь на самом большом" холме " (или долине, поскольку вы формулируете свою цель как минимум), прежде чем ваши прыжки становятся слишком маленькими, и вы попадаете в ловушку.
Генетический алгоритм хорош, когда различные параметры или их группы полунезависимы друг от друга. Идея заключается в том, что малые группы параметров могут быть независимо оптимизируется локальным восхождением на холм, и функция рекомбинации может объединить несколько оптимизированных подгрупп для получения суперрешения. Это бесполезно, если все параметры тесно связаны.
Другие алгоритмы также лучше всего подходят для различных профилей задач. (И, к сожалению, ваше описание проблемы, кажется, не включает в себя соответствующие свойства.)
Короче говоря: в то время как математическая формула не является требованием, вам нужно некоторое понимание того, как ведет себя граф вашей функции, и любые инварианты проекции (величины, которые вносят вклад в
x
, но не зависят от всех четырех параметровa, b, c, d
). Это последнее также будет полезно для ускорения вычисления значений функции, что, как вы говорите, чрезвычайно дорого. Я бы посоветовал вам, по крайней мере, построить график некоторых срезов с низким разрешением в пространстве поиска. Они могут дать вам некоторые идеи.ПС. Если качество решения более важно, чем время расчета, вы всегда можете реализовать несколько подходов, запустить их параллельно и сохранить лучшее решение.
Как вы упомянули, это обычная задача оптимизации. Математическая формула очень редко требуется, так как на практике мы редко имеем ее. Одна важная особенность, которая многое упрощает, - это выпуклость функции (опять же, вам не нужно думать о ней в терминах математических формул, а если глобальный максимум уникален).
Для начала я бы предложил один из следующих классических алгоритмы: