Разработка и оптимизация ИИС

Методы одномерной оптимизации

Разработка и оптимизация ИИС

План лекции

1. Постановка задачи одномерной оптимизации

2. Унимодальные функции

3. Метод равномерного поиска

4. Метод дихотомии

5. Метод золотого сечения

6. Метод Фибоначчи

7. Сравнение методов

8. Программная реализация

Методы одномерной оптимизации
Разработка и оптимизация ИИС

1. Постановка задачи

Задача одномерной безусловной оптимизации:

f(x)=minx[a,b]f(x)f(x^*) = \min_{x \in [a, b]} f(x)

Дано:

  • Функция f(x)f(x), заданная на отрезке [a,b][a, b]
  • Точность ε>0\varepsilon > 0

Найти:

  • Приближённое значение xx^* — точки минимума
  • Приближённое значение f(x)f(x^*) — минимума функции

Предположения:

  • f(x)f(x)унимодальная на [a,b][a, b]
  • Вычисление f(x)f(x) — единственная доступная операция
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Прямые методы оптимизации

Прямые (безусловные) методы — не используют производных, требуют только вычисления значений функции.

Общая идея: последовательное сужение отрезка неопределённости [a,b][a, b], содержащего точку минимума.

Унимодальная функция и сужение отрезка

На каждой итерации вычисляем f(x)f(x) в одной или нескольких пробных точках и отбрасываем часть отрезка, где минимума точно нет.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

2. Унимодальные функции

Функция f(x)f(x) унимодальна на [a,b][a, b], если существует единственная точка xx^*, такая что:

f(x1)>f(x2)при ax1<x2xf(x_1) > f(x_2) \quad \text{при } a \leq x_1 < x_2 \leq x^*

f(x1)<f(x2)при xx1<x2bf(x_1) < f(x_2) \quad \text{при } x^* \leq x_1 < x_2 \leq b

Свойства унимодальной функции:

  • Имеет ровно один локальный минимум
  • Локальный минимум = глобальный минимум
  • Функция строго убывает слева от xx^* и строго возрастает справа

center

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Унимодальность: правило сужения

Правило сравнения: если x1<x2x_1 < x_2, то:

Условие Вывод
f(x1)<f(x2)f(x_1) < f(x_2) x[a,x2]x^* \in [a, x_2]
f(x1)>f(x2)f(x_1) > f(x_2) x[x1,b]x^* \in [x_1, b]
f(x1)=f(x2)f(x_1) = f(x_2) x[x1,x2]x^* \in [x_1, x_2]

Наглядно:

center

Это правило — основа всех прямых методов одномерной оптимизации.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

3. Метод равномерного поиска

Идея: разбить отрезок [a,b][a, b] на nn равных частей, вычислить f(x)f(x) во всех точках, выбрать точку с наименьшим значением.

Шаг сетки: h=banh = \dfrac{b - a}{n}

Пробные точки: xi=a+ih,i=0,1,,nx_i = a + ih, \quad i = 0, 1, \ldots, n

Оценка точности: xx~h=ban|x^* - \tilde{x}^*| \leq h = \dfrac{b - a}{n}

Число вычислений функции: N=n+1N = n + 1

Точность: ε=baN1\varepsilon = \dfrac{b - a}{N - 1}

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод равномерного поиска: иллюстрация

center

Пример: [a,b]=[0,4][a, b] = [0, 4], n=9n = 9, h=0.5h = 0.5

Пробные точки: 0.0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.00.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0

x~=argminf(xi)\tilde{x}^* = \arg\min f(x_i), точность ε=0.5\varepsilon = 0.5

Достоинства: простота, надёжность.

Недостатки: низкая эффективность — требуется много вычислений.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод равномерного поиска: эффективность

Для достижения точности ε\varepsilon требуется:

N=baε+1N = \frac{b - a}{\varepsilon} + 1

Пример: [a,b]=[0,10][a, b] = [0, 10], ε=0.001\varepsilon = 0.001

N=100.001+1=10001 вычисленийN = \frac{10}{0.001} + 1 = 10001 \text{ вычислений}

Проблема: линейная сходимость — отрезок сокращается медленно.

Вопрос: можно ли достичь той же точности при меньшем числе вычислений? → Да, если вычисления выполнять адаптивно.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

4. Метод дихотомии (половинного деления)

Идея: на каждой итерации делить отрезок пополам и сужать его по правилу унимодальности.

Алгоритм:

  1. Вычислить xm=a+b2x_m = \dfrac{a + b}{2}
  2. Задать малое δ>0\delta > 0, вычислить x1=xmδx_1 = x_m - \delta, x2=xm+δx_2 = x_m + \delta
  3. Вычислить f(x1)f(x_1) и f(x2)f(x_2)
  4. Если f(x1)<f(x2)f(x_1) < f(x_2): bxmb \leftarrow x_m (минимум слева)
  5. Если f(x1)>f(x2)f(x_1) > f(x_2): axma \leftarrow x_m (минимум справа)
  6. Если ba<ε|b - a| < \varepsilon: стоп, иначе → шаг 1

Сходимость: отрезок сокращается примерно в 2 раза за итерацию.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод дихотомии: иллюстрация

Метод дихотомии

Пример: f(x)=x26x+10f(x) = x^2 - 6x + 10 на [0,4][0, 4], δ=0.01\delta = 0.01, x=3x^* = 3

Итер. aa bb xmx_m x1x_1 x2x_2 f(x1)f(x_1) f(x2)f(x_2) Действие
1 0.00 4.00 2.00 1.99 2.01 2.0201 1.9801 axma \leftarrow x_m
2 2.00 4.00 3.00 2.99 3.01 1.0001 1.0001 axma \leftarrow x_m
3 3.00 4.00 3.50 3.49 3.51 1.2401 1.2601 bxmb \leftarrow x_m
4 3.00 3.50 3.25 3.24 3.26 1.0576 1.0676 bxmb \leftarrow x_m

Количество итераций: N=log2baεN = \log_2 \dfrac{b - a}{\varepsilon}

Вычислений на итерацию: 2 → всего 2log2baε\approx 2 \log_2 \dfrac{b-a}{\varepsilon}

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод дихотомии: эффективность

Критерий останова: baε|b - a| \leq \varepsilon

Число итераций: nlog2baεn \geq \log_2 \dfrac{b - a}{\varepsilon}

Число вычислений функции: N=2n=2log2baεN = 2n = 2\log_2 \dfrac{b-a}{\varepsilon}

Пример: [0,10][0, 10], ε=0.001\varepsilon = 0.001

N=2log2100.001=213.2927 вычисленийN = 2 \log_2 \frac{10}{0.001} = 2 \cdot 13.29 \approx 27 \text{ вычислений}

Сравнение с равномерным поиском: 27 vs 10001 — в ~370 раз быстрее!

Улучшение: что если на каждой итерации одно из вычислений «переиспользовать»? → Метод золотого сечения.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

5. Метод золотого сечения

Идея: выбирать пробные точки так, чтобы одно вычисление функции на каждой итерации было «бесплатным» (переиспользовалось).

Золотое сечение: φ=1+521.618\varphi = \dfrac{1 + \sqrt{5}}{2} \approx 1.618

Отношение отрезков: 1=12=φ\dfrac{\ell}{\ell_1} = \dfrac{\ell_1}{\ell_2} = \varphi

Коэффициент: α=5120.618\alpha = \dfrac{\sqrt{5} - 1}{2} \approx 0.618

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод золотого сечения: алгоритм

Пробные точки:

x1=bα(ba),x2=a+α(ba)x_1 = b - \alpha(b - a), \qquad x_2 = a + \alpha(b - a)

Алгоритм:

  1. Вычислить x1x_1, x2x_2, f(x1)f(x_1), f(x2)f(x_2)
  2. Если f(x1)<f(x2)f(x_1) < f(x_2): bx2b \leftarrow x_2, x2x1x_2 \leftarrow x_1, f(x2)f(x1)f(x_2) \leftarrow f(x_1), вычислить новый x1x_1
  3. Если f(x1)>f(x2)f(x_1) > f(x_2): ax1a \leftarrow x_1, x1x2x_1 \leftarrow x_2, f(x1)f(x2)f(x_1) \leftarrow f(x_2), вычислить новый x2x_2
  4. Если ba<ε|b - a| < \varepsilon: стоп, x=a+b2x^* = \dfrac{a + b}{2}
  5. Иначе → шаг 2

Ключевое свойство: на каждой итерации — только 1 новое вычисление f(x)f(x).

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод золотого сечения: иллюстрация

Метод золотого сечения

Почему это работает: точка x1x_1 нового отрезка совпадает с точкой x2x_2 старого отрезка (и наоборот), поэтому значение ff уже известно.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод золотого сечения: эффективность

На каждой итерации отрезок сокращается в φ1.618\varphi \approx 1.618 раз.

Число итераций: nlogφbaε=lnbaεlnφn \geq \log_\varphi \dfrac{b - a}{\varepsilon} = \dfrac{\ln\frac{b-a}{\varepsilon}}{\ln \varphi}

Число вычислений функции: N=n+11lnφlnbaε2.08lnbaεN = n + 1 \approx \dfrac{1}{\ln \varphi} \cdot \ln\dfrac{b-a}{\varepsilon} \approx 2.08 \ln\dfrac{b-a}{\varepsilon}

Пример: [0,10][0, 10], ε=0.001\varepsilon = 0.001

N2.08ln100002.089.2119 вычисленийN \approx 2.08 \cdot \ln 10000 \approx 2.08 \cdot 9.21 \approx 19 \text{ вычислений}

Сравнение:

Метод Вычислений f(x)f(x)
Равномерный поиск 10 001
Дихотомия 27
Золотое сечение 19
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод золотого сечения: числовой пример

Пример: f(x)=x26x+10f(x) = x^2 - 6x + 10 на [0,10][0, 10], ε=0.5\varepsilon = 0.5

Минимум в точке x=3x^* = 3, f(3)=1f(3) = 1.

Итерация aa bb x1x_1 x2x_2 f(x1)f(x_1) f(x2)f(x_2) Отрезок
1 0 10 3.82 6.18 1.67 8.07 [0,6.18][0, 6.18]
2 0 6.18 2.36 3.82 1.73 1.67 [2.36,6.18][2.36, 6.18]
3 2.36 6.18 3.82 4.72 1.67 4.12 [2.36,4.72][2.36, 4.72]
4 2.36 4.72 3.26 3.82 1.07 1.67 [2.36,3.82][2.36, 3.82]
5 2.36 3.82 2.92 3.26 1.01 1.07 [2.92,3.82][2.92, 3.82]
6 2.92 3.82 3.26 3.47 1.07 1.22 [2.92,3.47][2.92, 3.47]

ba=0.55>0.5|b - a| = 0.55 > 0.5 → ещё одна итерация.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

6. Метод Фибоначчи

Идея: для заданного числа вычислений NN минимизировать конечную длину отрезка неопределённости.

Числа Фибоначчи: F0=0F_0 = 0, F1=1F_1 = 1, Fk=Fk1+Fk2F_k = F_{k-1} + F_{k-2}

0,1,1,2,3,5,8,13,21,34,55,89,144,0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, \ldots

Пробные точки на kk-й итерации:

x1=a+Fnk1Fnk+1(ba),x2=a+FnkFnk+1(ba)x_1 = a + \frac{F_{n-k-1}}{F_{n-k+1}} (b - a), \qquad x_2 = a + \frac{F_{n-k}}{F_{n-k+1}} (b - a)

Свойство: метод Фибоначчи оптимален — при заданном NN даёт наименьший конечный отрезок среди всех прямых методов.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод Фибоначчи: алгоритм

Вход: отрезок [a,b][a, b], число вычислений NN (задаёт точность)

  1. Определить n=N1n = N - 1 итераций
  2. Вычислить x1x_1, x2x_2 с коэффициентами из чисел Фибоначчи
  3. Вычислить f(x1)f(x_1), f(x2)f(x_2)
  4. Сужение отрезка (как в золотом сечении)
  5. На последней итерации берём x1=x2δx_1 = x_2 - \delta (т.к. F1=F2=1F_1 = F_2 = 1)
  6. Результат: x=a+b2x^* = \dfrac{a + b}{2}

Точность: ε=baFn+1\varepsilon = \dfrac{b - a}{F_{n+1}}

Число вычислений для заданной ε\varepsilon: N=min{n:Fn+1baε}N = \min\{n : F_{n+1} \geq \dfrac{b-a}{\varepsilon}\}

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Метод Фибоначчи: иллюстрация

Метод Фибоначчи

Пример: [0,10][0, 10], N=10N = 10 вычислений (n=9n = 9 итераций)

F10=55,ε=10550.182F_{10} = 55, \quad \varepsilon = \frac{10}{55} \approx 0.182

Для той же точности методом золотого сечения: N20N \approx 20.

Недостаток: нужно заранее знать NN (или ε\varepsilon), нельзя добавить вычислений «на ходу».

Методы одномерной оптимизации
Разработка и оптимизация ИИС

7. Сравнение методов

Метод Вычислений f(x)f(x) Нужно знать NN заранее? Оптимальность
Равномерный поиск baε+1\dfrac{b-a}{\varepsilon} + 1 Нет Не оптимален
Дихотомия 2log2baε2\log_2\dfrac{b-a}{\varepsilon} Нет Не оптимален
Золотое сечение 2.08lnbaε\approx 2.08 \ln\dfrac{b-a}{\varepsilon} Нет Почти оптимален
Фибоначчи min{n;Fn+1(ba)/ε}\min\{n ; F_{n+1} \geq (b-a)/\varepsilon\} Да Оптимален
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Сравнение: числовой пример

Задача: [a,b]=[0,10][a, b] = [0, 10], ε=0.001\varepsilon = 0.001

Метод Вычислений f(x)f(x)
Равномерный поиск 10 001
Дихотомия 28
Золотое сечение 20
Фибоначчи 20

Вывод: золотое сечение и Фибоначчи дают практически одинаковый результат, но золотое сечение не требует знания NN заранее — поэтому на практике предпочитают именно его.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Сравнение: сходимость (график)

center

На графике: длина отрезка неопределённости в зависимости от числа вычислений функции.

Методы одномерной оптимизации
Разработка и оптимизация ИИС

8. Программная реализация

import math

def golden_section(f, a, b, eps=1e-6):
    alpha = (math.sqrt(5) - 1) / 2  # ≈ 0.618
    x1 = b - alpha * (b - a)
    x2 = a + alpha * (b - a)
    f1, f2 = f(x1), f(x2)
    iterations = 0
    while abs(b - a) > eps:
        iterations += 1
        if f1 < f2:
            b, x2, f2 = x2, x1, f1
            x1 = b - alpha * (b - a)
            f1 = f(x1)
        else:
            a, x1, f1 = x1, x2, f2
            x2 = a + alpha * (b - a)
            f2 = f(x2)
    return (a + b) / 2, f((a + b) / 2), iterations

result = golden_section(lambda x: x**2 - 6*x + 10, 0, 10)
print(f"x*={result[0]:.6f}, f(x*)={result[1]:.6f}, iter={result[2]}")
# x*=3.000000, f(x*)=1.000000, iter=25
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Программная реализация: дихотомия и Фибоначчи

def dichotomy(f, a, b, eps=1e-6, delta=1e-8):
    iterations = 0
    while (b - a) / 2 > eps:
        iterations += 1
        xm = (a + b) / 2
        if f(xm - delta) < f(xm + delta):
            b = xm
        else:
            a = xm
    return (a + b) / 2, f((a + b) / 2), iterations

def fibonacci_method(f, a, b, n=20):
    fib = [0, 1]
    for _ in range(2, n + 2):
        fib.append(fib[-1] + fib[-2])
    x1 = a + fib[n - 1] / fib[n + 1] * (b - a)
    x2 = a + fib[n] / fib[n + 1] * (b - a)
    f1, f2 = f(x1), f(x2)
    for k in range(1, n):
        if f1 < f2:
            b, x2, f2 = x2, x1, f1
            x1 = a + fib[n - k - 1] / fib[n - k + 1] * (b - a)
            f1 = f(x1)
        else:
            a, x1, f1 = x1, x2, f2
            x2 = a + fib[n - k] / fib[n - k + 1] * (b - a)
            f2 = f(x2)
    return (a + b) / 2, f((a + b) / 2)
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Программная реализация: сравнение

f = lambda x: x**2 - 6*x + 10
a, b, eps = 0, 10, 1e-6

print("Метод золотого сечения:")
x, fx, n = golden_section(f, a, b, eps)
print(f"  x*={x:.8f}, f(x*)={fx:.8f}, вычислений={2+n}")

print("Метод дихотомии:")
x, fx, n = dichotomy(f, a, b, eps)
print(f"  x*={x:.8f}, f(x*)={fx:.8f}, вычислений={2*n}")

print("Метод Фибоначчи (n=25):")
x, fx = fibonacci_method(f, a, b, 25)
print(f"  x*={x:.8f}, f(x*)={fx:.8f}, вычислений=26")

# Золотое сечение:  27 вычислений
# Дихотомия:        42 вычислений
# Фибоначчи:        26 вычислений
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Заключение

Методы одномерной оптимизации
Разработка и оптимизация ИИС

Ключевые выводы лекции

  • Задача одномерной оптимизации: найти minf(x)\min f(x) на [a,b][a, b]
  • Все прямые методы основаны на свойстве унимодальности
  • Равномерный поиск — прост, но неэффективен (N1/εN \sim 1/\varepsilon)
  • Дихотомия — Nlog(1/ε)N \sim \log(1/\varepsilon), 2 вычисления на итерацию
  • Золотое сечение — Nln(1/ε)N \sim \ln(1/\varepsilon), 1 вычисление на итерацию
  • Метод Фибоначчи — оптимален, но требует знания NN заранее
  • На практике чаще всего используется метод золотого сечения
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Вопросы для самоконтроля

  1. Сформулируйте задачу одномерной безусловной оптимизации.
  2. Что такое унимодальная функция? Сформулируйте правило сужения отрезка.
  3. В чём суть метода равномерного поиска? Какова его сложность?
  4. Опишите алгоритм метода дихотомии. Сколько вычислений f(x)f(x) требуется?
  5. Как выбираются пробные точки в методе золотого сечения? Почему одно вычисление «бесплатное»?
  6. В чём преимущество метода Фибоначчи перед золотым сечением? В чём его недостаток?
  7. Сравните все методы по числу вычислений функции.
Методы одномерной оптимизации
Разработка и оптимизация ИИС

Рекомендуемые ресурсы

Основная литература:

  1. Алексеев, Д. С. Технологии интеллектуального анализа данных.
  2. Серебряная, Л. В. Методы и алгоритмы принятия решений.

Дополнительная литература:

  1. Корячко, В. П. Интеллектуальные системы и нечёткая логика.
  2. Банди, Б. Методы оптимизации: вводный курс.

Онлайн-ресурсы:

Методы одномерной оптимизации

Кратко пробегитесь по плану: начнём с постановки задачи и унимодальности, затем прямые методы (перебор, дихотомия, золотое сечение, Фибоначчи), сравнение эффективности и программная реализация.

Дайте чёткую постановку задачи: найти минимум функции на отрезке. Подчеркните, что это базовая задача, из которой строятся многомерные методы.

Унимодальность — ключевое предположение, без которого прямые методы не работают.

Дихотомия — первый адаптивный метод.

Золотое сечение — один из самых эффективных прямых методов.

Метод Фибоначчи — оптимальный по числу вычислений среди прямых методов.