МЕТОДЫ ОПТИМИЗАЦИИ — КОМПЛЕКТ 4
Лекция 4 «Симплексная таблица».
Лабораторная работа 4 «Методы многомерной оптимизации».

СОСТАВ
simplex_tableau.py — точный табличный симплекс-метод для примера лекции.
geometry.py — квадратичная модель, градиент, минимум на одном луче.
run_geometry.py — выполнение варианта, CSV-таблица, JSON-параметры и рисунки.
variants.json — исходные данные 18 вариантов лабораторной работы.
requirements.txt — библиотеки для лабораторной работы.

ЗАПУСК
Распакуйте архив и откройте терминал в папке с этими файлами.
Для симплекс-таблиц достаточно стандартной библиотеки Python:
    python simplex_tableau.py
Ожидаемая последовательность значений цели: 0, 15/2, 9.
Оптимальный план (x1,x2,x3,x4) = (1,3,0,0).

Для лабораторной установите библиотеки:
    python -m pip install -r requirements.txt
Проверьте ручной пример:
    python geometry.py
Выполните свой вариант (номер от 1 до 18):
    python run_geometry.py 1

Создаётся папка geometry_variant_01 в текущей рабочей папке:
parameters.json — данные, матрица, центр, начальная точка, градиент;
directions.csv — три отдельных перехода из общей начальной точки;
surface_and_levels.png — поверхность и линии уровня;
direction_sections.png — одномерные сечения по трём направлениям.
Повторный запуск того же варианта обновляет файлы его папки.

КАК ПОНИМАТЬ РЕЗУЛЬТАТЫ
geometry.py показывает ручной пример с ненормированным антиградиентом.
run_geometry.py сравнивает ЕДИНИЧНЫЕ направления, поэтому alpha является
длиной перемещения. Нормировка меняет alpha, но не луч и его оптимальную точку.
Три перехода независимы; это не три последовательные итерации оптимизатора.
Код не реализует полный градиентный метод и не проверяет его сходимость.

ФОРМУЛЫ
H = R diag(lambda1,lambda2) R^T, 0 < lambda1 <= lambda2.
f(x) = c + (x-h)^T H (x-h)/2.
g(x) = H(x-h).
alpha = max(0, -g(x)^T d / (d^T H d)).
x_new = x + alpha*d.
Для этой модели минимум x*=h, f*=c.
В программах угол варианта задан в градусах и преобразуется в радианы.

ПРОВЕРКА
Для ручного примера x*=(11/7,6/7), f*=5/7.
Антиградиент d=(4,5): alpha=41/172,
x_new=(41/43,205/172), f_new=383/344.
Для собственного варианта проверьте f(h)=c, g(h)=0, f_new<=f(x0).
При положительном alpha дополнительно проверьте g(x_new)^T d примерно равно 0.
Это равенство не означает, что весь градиент равен нулю.

ДОПОЛНИТЕЛЬНЫЙ ЭКСПЕРИМЕНТ
Для пунктов о кривизне используйте geometry.model с lambda2=kappa*lambda1,
сохраняя остальные параметры и выбирая kappa=1,9,81. Сравнивайте одни и те же
значения уровней в одинаковом масштабе координатных осей.

СИМПЛЕКС-ТАБЛИЦА
Задача имеет вид max c^T x при Ax=b, x>=0.
Нужны единичные начальные базисные столбцы и b>=0; поиска начального базиса нет.
Последний столбец внутренней таблицы — правая часть.
Оценки: delta=c-z. Вход и выход выбираются по правилу Бланда.
Используется fractions.Fraction. Дроби вводите строками '1/3' или Fraction,
а не десятичными float, если требуется точность рациональной арифметики.
Индексы переменных в Python начинаются с нуля: [2,3] означает (x3,x4).

Программы и числовые примеры подготовлены для учебных занятий.
Теоретические источники указаны в документах лекции и лабораторной работы.
