Поиск с помощью золотого сечения — различия между версиями
(→Ссылки) |
|||
| Строка 90: | Строка 90: | ||
*[[Троичный поиск]] | *[[Троичный поиск]] | ||
| − | == | + | ==Источники информации== |
*[http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%B7%D0%BE%D0%BB%D0%BE%D1%82%D0%BE%D0%B3%D0%BE_%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F Википедия - Метод золотого сечения] | *[http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%B7%D0%BE%D0%BB%D0%BE%D1%82%D0%BE%D0%B3%D0%BE_%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F Википедия - Метод золотого сечения] | ||
| − | + | *[http://en.wikipedia.org/wiki/Golden_section_search Wikipedia - Golden section search] | |
| − | *[http://en.wikipedia.org/wiki/Golden_section_search Wikipedia - Golden section search] | ||
[[Категория:Дискретная математика и алгоритмы]] | [[Категория:Дискретная математика и алгоритмы]] | ||
[[Категория:Алгоритмы поиска]] | [[Категория:Алгоритмы поиска]] | ||
Версия 19:23, 5 июня 2015
Поиск с помощью золотого сечения (Golden section search) — это улучшение наивной реализации троичного поиска, служащего для нахождения минимума/максимума функции. При простом троичном поиске на каждой итерации функция вычисляется в двух точках. Метод же золотого сечения требует вычисления лишь в одной точке (за исключением первой итерации). За счет этого достигается выигрыш в производительности.
Алгоритм
Рассмотрим одну итерацию алгоритма троичного поиска. Попробуем подобрать такое разбиение отрезка на три части, чтобы на следующей итерации одна из точек нового разбиения совпала с одной из точек текущего разбиения. Тогда в следующий раз не придется считать функцию в двух точках, так как в одной она уже была посчитана.
Потребуем, чтобы одновременно выполнялось:
Где — это некоторое отношение, в котором мы делим отрезок (точки и разбивают отрезок симметрично).
Тогда:
, откуда получаем (тот корень уравнения, который меньше нуля, по понятным причинам отбросили).
Это число совпадает с золотым сечением. Отсюда название метода.
Для реализации алгоритма нам потребуется найти и . Если - длина исследуемого отрезка, тогда:
Причем, заметим что в силу того что — золотое сечение, то .
Формально для поиска минимума (для максимума — делается аналогично) функции делаем следующее:
- Шаг 1:
- Определяем границы поиска и , затем устанавливаем текущее разбиение:
- и вычислим функцию на них:
- Шаг 2:
- если , тогда
- иначе:
- если , тогда
- Шаг 3:
- если точность нас устраивает, тогда останавливаемся, и искомая точка , иначе назад к шагу 2
Псевдокод
phi = (1 + sqrt(5)) / 2
resphi = 2 - phi
goldenSectionSearch(f, l, r, eps)
x1 = l + resphi * (r - l)
x2 = r - resphi * (r - l)
f1 = f(x1)
f2 = f(x2)
do
if f1 < f2:
r = x2
x2 = x1
f2 = f1
x1 = l + resphi * (r - l)
f1 = f(x1)
else:
l = x1
x1 = x2
f1 = f2
x2 = r - resphi * (r - l)
f2 = f(x2)
while abs(r - l) > eps
return (x1 + x2) / 2
Время работы
Так как на каждой итерации мы считаем одно значение функции и уменьшаем область поиска в раз, пока , то время работы алгоритма составит .
Если удельный вес вычисления функции достаточно большой, тогда получим ускорение работы примерно в 2,4 раз по сравнению с неулучшенным троичным поиском ( против .