Линейное программирование − 1 (13-е марта 2024)
- Гаусс
- Воспоминание: привести матрицу к трапецевидному виду
- Новый вид задачи: вектора добавляются по одному, поддерживать базис
- Особенности реализации: не переставляем столбцы, столбец b − часть матрицы A
- Код Гаусса, код восстановления решения по значениям свободным переменных {unknownvariable:code}/linearsk2019.cpp.html
- Время работы Гаусса: O(nmk), где k − число линейно независимых строк, k ≤ min(n,m)
- Задача линейного программирования: Ax ≤ b, x ≥ 0, cx → max
- Вид Ax ≤ B ↔ Ax = B (x ≤ b ⇒ x+y=b, вводим новые переменные)
- Условия x ≥ 0 ↔ отсутствие условия (xi=vi-ui, вводим новые переменные)
- (cx → max) ↔ (cx → min)
- Задачи на линейное программирование
- LP : Максимальный поток; Поток минимальной стоимости.
- ILP : Паросочетание в произвольном графе минимального веса. На самом деле решится за полином.
- LP : Многопродуктовый поток (задача про два непересекающихся потока s1 → t1 размера f1; s2 → t2 размера f2).
В отличии от предыдущих задач не решается иначе как "свести к LP, запустить симплекс".
- ILP : Задача про два непересекающихся пути (A → B, C → D). NP-трудна. Почему не следует из предыдущей?
- ILP : Взвешенное вершинное покрытие
- LP : Паросочетание в двудольном графе минимального веса. Казалось бы ILP, но решение, найденное симплекс методом обязательно будет целым.
- LP : Кратчайшее расстояние; Поиск потенциалов.
- Геометрическая интерпретация и экспоненциальное решение
- Пересечение полупространств, полиэдр, максимум в вершине ⇒ перебор вершин
- Перебор базисных планов + Гаусс
- ♥ Кошерный вид задачи линейного программирования и Симплекс-метод
- i < m ⇒ xi = bi ≥ 0, i ≥ m ⇒ xi = 0, i < m ⇒ ci = 0, A = EA' (EA')(x) = (b)
- Переход: выбрать min j, cj > 0, пытаемся увеличивать, ограничения: xi = bi - aijxj ≥ 0, выбираем i: aij > 0, bi / aij → min
- Пересчитываем матрицу A: поменяли местами два столбца, rowi /= aii, rowj -= aji rowi
- Пересчёт вектора "c", как дополнительной строки матрицы A
- Приведение систем к кошерному виду
- Вид Ax ≤ b, x ≥ 0.
- Вид Ax = b, x ≥ 0.
- Поиск начального решения (ввести фиктивную переменную, пустить симплекс, убрать фиктивную переменную)
- Наличие решения, корректность, время работы
- Решений нет ⇔ поиск начального не смог сделать t = 0, максимум не ограничен ⇔ в одном из переходов не было ограничивающего условия
- В симплексе все ci ≤ 0 ⇒ решение оптимально, можно остановиться
- Симплекс работает конечное время т.к. набор выбранных столбцов однозначно задаёт решение, а множества столбцов не циклятся
- Почему не циклятся? Если xj строго увеличилось, то ок. Если xj осталось 0, то важно правило Бленда: min j сj > 0, для такого min i, на котором достигается ограничение на xj