Обновлено: 16 March 2019 17:03
Как завещал эконом: между n
и n+1
переывчик о()
.
Нужно для 10 случайных начальных точек запустить алгоритм оптимизации. И собрать информацию о “лучших точках” и сравнить, кто в сркеднем был ближе всех к истине. В качестве алгоритма оптимизации необходимо использовать
Как обсуждали в классе, псевдо код алгоритма Хука Дживса выглядит следующим образом:
Идея алгоритма заключается в том, что даже если следующая точка не является улучшением текущего состояния, то существует вероятность в неё перейти. Это допущение сделано для того, чтобы иметь вомзожность находить не только локальные экстремумы, но и глобальные.
Для алгоритма необходимо определить следующие параметры помимо начальной точки и самой функции:
Вероятность можно задать как \[P(dF, T_i) = \exp(-\frac{dF}{T_i})\]
Если изменения функция будут слишком маленькие, тогда вероятность будет завышена. Это можно учесть выбором неоходимого уровня \(T_i\) чтобы не получать вероятность выше заданной и скорректировав функцию:
\[P(dF, T_i) = \exp(-\frac{dF}{T_i * \overline{|dF|}})\]
где \(\overline{|dF|}\) - значение среднего изменения функции. На первом шаге \(\overline{|dF|} = |dF|\).
Можно задать уровень снижения температуры и максимальное значение, а можно просто рассчитать скорость кбывания температуры при данных значениях \(T_{start}\) и \(T_{end}\).
\(T_{start}\) надо взять такой, чтобы вероятность перехода в первой момент была равна \(p_{start}\).
Из выражения \(P(dF, T_i)\) надо найти, какой должна быть \(T_1\), чтобы \(P(dF, T_i) = p_{start}\).
Пусть \(p_{start} = 0.8\).
Для алгоритма скорость убывания температуры расчитаем как
\[g = (\frac{T_{end}}{T_{start}})^{\frac{1}{n}}\]
где \(n\) - заданное количество шагов (пусть будет 50).
Тогда на каждом шаге, температура будет убывать как
\[T_i = T_{i-1} / g\]
go = rbinom(n = 1, size = 1, prob = P)
. Если go
= 1, то переходим в новую точку.Придумать, как скорректировать алгоритм Хука Дживса на алгоритм имитации, а именно сделать так, чтобы когда точка \(a_2\) страновилась хуже, то существовала вероятность всё равно в неё перейти.
\[f(x,y) = \frac{sin((x^2 + y^2)^{(1/2)})}{(x^2 + y^2)^{(1/2)}}\]
\[f(x,y) = 0.2 + x^2 + y^2 - 0.1 * cos(6\pi *x) - 0.1*cos(6\pi*y)\]
Для каждого алгоритма должен рисоваться график countour
, на котором видно как “шагал” алгоритм.
/|_/|
= 0.o =
( )_( )