Поиск с помощью золотого сечения — различия между версиями
Строка 1: | Строка 1: | ||
− | |||
'''Поиск с помощью золотого сечения''' (''Golden section search'') - это улучшение наивной реализации [[Троичный поиск|троичного поиска]], служащий для поиска минимума/максимума функции. При простом троичном поиске на каждой итерации функция вычисляется в двух точках. Метод же золотого сечения требует вычисления лишь в одной точке (за исключением первой итерации). За счет этого достигается выйгрыш в производительности. | '''Поиск с помощью золотого сечения''' (''Golden section search'') - это улучшение наивной реализации [[Троичный поиск|троичного поиска]], служащий для поиска минимума/максимума функции. При простом троичном поиске на каждой итерации функция вычисляется в двух точках. Метод же золотого сечения требует вычисления лишь в одной точке (за исключением первой итерации). За счет этого достигается выйгрыш в производительности. | ||
Строка 92: | Строка 91: | ||
*[http://en.wikipedia.org/wiki/Golden_section_search Wikipedia - Golden section search] (english) | *[http://en.wikipedia.org/wiki/Golden_section_search Wikipedia - Golden section search] (english) | ||
+ | |||
+ | [[Категория:Дискретная математика и алгоритмы]] |
Версия 20:23, 15 июня 2011
Поиск с помощью золотого сечения (Golden section search) - это улучшение наивной реализации троичного поиска, служащий для поиска минимума/максимума функции. При простом троичном поиске на каждой итерации функция вычисляется в двух точках. Метод же золотого сечения требует вычисления лишь в одной точке (за исключением первой итерации). За счет этого достигается выйгрыш в производительности.
Содержание
Алгоритм
Рассмотрим одну итерацию алгоритма троичного поиска. Попробуем подобрать такое разбиение отрезка на три части, чтобы на следующей итерации одна из точек нового разбиения совпала с одной из точек текущего разбиения. Тогда в следующий раз не придется считать функцию в двух точках, так как в одной она уже была посчитана.
Точки
и разбивают отрезок на три части. Потребуем, чтобы одновременно выполнялось:
Где
- это некоторое отношение, в котором мы делим отрезок (точки и разбивают отрезок симметрично).Тогда:
, откуда получаем (тот корень уравнения, который меньше нуля, по понятным причнам отбросили).
Это число совпадает с золотым сечением. Отсюда название метода.
Для реализации алгоритма нам потребуется найти
и . Если - длина исследуемого отрезка, тогда:
Причем, заметим что в силу того что
- золотое сечение, то .Формально для поиска минимума (для максимума - делается аналогично) функции
делаем следующее:- Шаг 1:
- Определяем границы поиска и , затем устанавливаем текущее разбиение:
- и вычислем функцию на них:
- Шаг 2:
- если
- иначе:
- если
- Шаг 3:
- если точность нас устраивает, тогда останавливаемся, и искомая точка , иначе назад к шагу 2
Псевдокод
phi = (1 + sqrt(5)) / 2 resphi = 2 - phi goldenSectionSearch(f, lbound, rbound, eps) x1 = lbound + resphi * (rbound - lbound) x2 = rbound - resphi * (rbound - lbound) f1 = f(x1) f2 = f(x2) do if f1 < f2: rbound = x2 x2 = x1 f2 = f1 x1 = lbound + resphi * (rbound - lbound) f1 = f(x1) else: lbound = x1 x1 = x2 f1 = f2 x2 = rbound - resphi * (rbound - lbound) f2 = f(x2) while (abs(rbound - lbound) < eps) return (x1 + x2) / 2
Время работы
На каждой итерации исследуемый отрезок сокращается в
раз и делается один расчет функции, до тех пор, пока не станет . Если считать, что одна итерация выполняется за 1 времени, то потребуется операций, чтобы: .Значит время работы можно оценивать как
. Если удельный вес вычисления функции достаточно большой, тогда получим ускорение работы примерно в 2,3 раз по сравнению с неулучшенным троичным поиском.См также
Ссылки
- Wikipedia - Golden section search (english)