SAMIN
Конструктор
SAMIN(; nt::Int = 5 # снижать температуру каждые nt*ns*dim(x_init) вычислений
ns::Int = 5 # корректировать границы каждые ns*dim(x_init) вычислений
rt::T = 0.9 # геометрический коэффициент снижения температуры: при изменении температуры новая температура равна t=rt*t
neps::Int = 5 # количество предыдущих лучших значений, с которыми сравнивается конечный результат
f_tol::T = 1e-12 # требуемый уровень допуска для сравнения значений функций
x_tol::T = 1e-6 # требуемый уровень допуска для x
coverage_ok::Bool = false, # если false, увеличивать температуру до тех пор, пока не будет охвачено пространство начальных параметров
verbosity::Int = 0) # скаляр: 0, 1, 2 или 3 (значение по умолчанию — 0).
Описание
Метод SAMIN
реализует алгоритм имитации отжига для задач с ограничениями по границам, как описано в работе Гоффа (Goffe) и соавторов (1994) и Гоффа (Goffe) (1996). Ключевым параметром управления является rt, геометрическая скорость снижения температуры, которая должна находиться в диапазоне от нуля до единицы. Если установить меньшее значение rt, алгоритм будет быстрее сужать пространство поиска, сокращая время работы. Слишком низкое значение rt приведет к тому, что алгоритм будет сужать поиск слишком быстро, и истинный минимизатор может быть пропущен. Если возможно, запустите алгоритм несколько раз, чтобы убедиться, что каждый раз находится одно и то же решение. В противном случае увеличьте значение rt. Если вы сомневаетесь, начните с консервативного значения rt, например rt=0,95, и разрешите большое количество итераций. Для алгоритма требуются нижние и верхние границы параметров, хотя эти границы часто задаются в довольно широком диапазоне и необязательно отражают ограничения в модели, а скорее являются границами, ограничивающими пространство параметров. Если итоговые x
находятся очень близко к границе (что можно проверить, установив уровень детализации равным 1), рекомендуется перезапустить оптимизатор с более широкими границами, если только эти границы не отражают жесткие ограничения для x
.
Пример
В этом примере демонстрируется успешная минимизация:
julia> using Optim, OptimTestProblems
julia> prob = UnconstrainedProblems.examples["Rosenbrock"];
julia> res = Optim.optimize(prob.f, fill(-100.0, 2), fill(100.0, 2), prob.initial_x, SAMIN(), Optim.Options(iterations=10^6))
================================================================================
SAMIN results
==> Normal convergence <==
total number of objective function evaluations: 23701
Obj. value: 0.0000000000
parameter search width
1.00000 0.00000
1.00000 0.00000
================================================================================
Results of Optimization Algorithm
* Algorithm: SAMIN
* Starting Point: [-1.2,1.0]
* Minimizer: [0.9999999893140956,0.9999999765350857]
* Minimum: 5.522977e-16
* Iterations: 23701
* Convergence: false
* |x - x'| ≤ 0.0e+00: false
|x - x'| = NaN
* |f(x) - f(x')| ≤ 0.0e+00 |f(x)|: false
|f(x) - f(x')| = NaN |f(x)|
* |g(x)| ≤ 0.0e+00: false
|g(x)| = NaN
* Stopped by an increasing objective: false
* Reached Maximum Number of Iterations: false
* Objective Calls: 23701
* Gradient Calls: 0
Пример
В этом примере показана неудачная минимизация, поскольку скорость охлаждения rt=0,5 слишком высокая:
julia> using Optim, OptimTestProblems
julia> prob = UnconstrainedProblems.examples["Rosenbrock"];
julia> res = Optim.optimize(prob.f, fill(-100.0, 2), fill(100.0, 2), prob.initial_x, SAMIN(rt=0.5), Optim.Options(iterations=10^6))
================================================================================
SAMIN results
==> Normal convergence <==
total number of objective function evaluations: 12051
Obj. value: 0.0011613045
parameter search width
0.96592 0.00000
0.93301 0.00000
================================================================================
Results of Optimization Algorithm
* Algorithm: SAMIN
* Starting Point: [-1.2,1.0]
* Minimizer: [0.9659220825756248,0.9330054696322896]
* Minimum: 1.161304e-03
* Iterations: 12051
* Convergence: false
* |x - x'| ≤ 0.0e+00: false
|x - x'| = NaN
* |f(x) - f(x')| ≤ 0.0e+00 |f(x)|: false
|f(x) - f(x')| = NaN |f(x)|
* |g(x)| ≤ 0.0e+00: false
|g(x)| = NaN
* Stopped by an increasing objective: false
* Reached Maximum Number of Iterations: false
* Objective Calls: 12051
* Gradient Calls: 0
Справочные материалы
-
Goffe, et. al. (1994) Global Optimization of Statistical Functions with Simulated Annealing, Journal of Econometrics, V. 60, N. 1/2.
-
Goffe, William L. (1996) SIMANN: A Global Optimization Algorithm using Simulated Annealing. Studies in Nonlinear Dynamics & Econometrics, Oct96, Vol. 1 Issue 3.