О разделе
Play ITЗагрузка интерактивного демо…
Play ITЗагрузка интерактивного демо…
Длинные листинги (от ~12 строк) вынесены в каталог code.spirzen.ru и подгружаются в статьях через ExternalCodeEmbed — так HTML энциклопедии не раздувается, а код остаётся с подсветкой, вкладками и сериями "шаг 1…N". Короткие фрагменты (псевдокод, пара строк linprog, формулы) по-прежнему прямо в markdown. Диаграммы mermaid и интерактив — на месте или в play.spirzen.ru.
Раздел для логистики, исследования операций и углублённой математики — не нужен для освоения SQL, HTML или аналитики на Excel/Python. Вернитесь сюда, если учебный план или работа требуют оптимизационных моделей.
Раздел "Математическое программирование" — про выбор лучшего плана при линейных правилах — сколько произвести, куда перевезти, как распределить бюджет. Слово "программирование" здесь означает план действий в смысле исследования операций; реализацию в коде показывает статья 9 (scipy, OR-Tools). Символьная алгебра (решить систему, упростить выражение) — отдельная ветка: SymPy — уравнения и производные; численная оптимизация — здесь и в SciPy.
Формулы в главах сопровождаются псевдокодом на русском — сначала "что выбираем и что ограничивает", потом запись max Z = … и симплекс.
// Мини-пример: пекарня (два вида пирожков)
переменные: x1 = штук с яблоком, x2 = штук с капустой
максимизировать прибыль Z = 3·x1 + 2·x2 // руб. с штуки
при ограничениях:
мука: 2·x1 + 1·x2 ≤ 100 // грамм муки в запасе
духовка: x1 + x2 ≤ 80 // штук за смену
x1 ≥ 0, x2 ≥ 0 // нельзя "минус пирожков"
лучший_план := перебрать_допустимые (x1, x2), взять максимальный Z
// на практике это делает солвер, не ручной перебор
Перед стартом раздела
Этот раздел — цельный мини-курс. Мы последовательно идём от формулировки задачи к техникам решения и затем к коду. По ходу формируется инженерное понимание корректности ответа — зачем солвер дал именно такой план и как это проверить.
Если вы когда-либо сталкивались с задачами вида "ресурсов мало, вариантов много, нужно выбрать лучший план", то это и есть тот самый класс задач, который закрывает математическое программирование. Производство, логистика, бюджетирование, нагрузка сервисов, SLA, приоритизация работ — всё это естественно укладывается в модели данного раздела.
Читать полезно в режиме "медленно, но с проверкой" — после каждого блока пробуйте переформулировать идею своими словами и проверять 1 мини-пример руками. Такой темп выглядит медленнее, но в реальности он резко ускоряет освоение следующих разделов, где уже используется готовый инструментарий оптимизации.
Рекомендуемый порядок для новичка — Математическое программирование — введение и постановка задач (обозначения и постановка) → Выпуклые множества, свойства ЗЛП и графический метод (картинка на плоскости) → Метод Жордана–Гаусса в задачах линейного программирования–Двойственность в линейном программировании (симплекс и двойственность) → по необходимости Транспортная задача–Динамическое программирование и уравнение Беллмана. Код — когда понятна постановка на бумаге.
Что вы получите после раздела
- Умение переводить прикладную задачу в формальную модель — переменные, цель, ограничения.
- Понимание границ применимости линейной модели.
- Знание случаев, когда нужны целочисленные или нелинейные подходы.
- Навык проверять решение двумя способами — вручную (графика/симплекс) и в коде (солвер).
- Базу для тем уровня middle — чувствительность, MIP, network flow, робастные модели.
Практический режим прохождения
Чтобы материал действительно закрепился, полезно после каждой главы делать три шага —
- Выписать 5-10 терминов своими словами.
- Решить один мини-пример руками (даже если потом будет код).
- Проверить тот же пример в
linprogили OR-Tools.
Такой цикл резко уменьшает разрыв между "понимаю теорию" и "могу применить в задаче проекта".
Интерактивный старт
Перед чтением глав попробуйте руками "покрутить" коэффициенты и ограничения — так быстрее появляется интуиция, как меняется оптимальный план.
Как работать с демо —
- сначала оставьте базовые значения и проверьте, что лучший план совпадает с логикой из примера;
- затем измените прибыль
c1/c2и посмотрите, какой продукт начинает "тянуть" оптимум сильнее; - после этого уменьшите лимиты
b1/b2, чтобы увидеть, как появляются узкие места.
Play ITЗагрузка интерактивного демо…
После упражнения важно вынести две мысли —
- Оптимум определяется целью и набором активных ограничений.
- Даже небольшое изменение коэффициентов может сдвинуть лучший план заметнее, чем ожидается "на глаз".
С этим контекстом переходите к карточкам раздела ниже — читайте формулы с рабочей интуицией.
Откуда вырос курс
Линейное программирование оформилось в XX веке как язык планирования производства и перевозок. В введении к главе 1 разбирают постановки; здесь — короткая хронология для ориентира.
| Период | Вклад |
|---|---|
| 1930-е | А.Н. Толстой — оптимальный план перевозок; Л.В. Канторович — методы линейного планирования в СССР |
| 1931 | Б. Эгервари — задача назначения ("венгерский" метод) |
| 1947 | Дж. Данциг — симплекс-метод |
| 1950-е | Р. Беллман — динамическое программирование |
| 1975 | Нобелевская премия по экономике Л.В. Канторовичу (совместно с Т. Купмансом) |
Структура раздела следует классическому курсу ЗЛП — от постановки и симплекса до транспортной задачи и уравнения Беллмана. Практику в коде даёт глава 9.
Введение и постановка
Что такое математическое программирование, линейное программирование, стандартные формы записи, примеры из планирования и IT.
Теория и графический метод
Теоретические основы линейного программирования, выпуклость, геометрия допустимой области и пошаговый графический метод на примере.
Метод Жордана–Гаусса
Приведение систем линейных уравнений к ступенчатому и приведённому виду, slack-переменные и связь с симплекс-таблицей.
Симплекс-метод
Общая схема симплекс-метода, построение и заполнение таблицы, сокращённая форма, контроль ошибок, разбор числового примера.
M-метод и искусственный базис
Двухфазный симплекс-метод, метод большого штрафа M, искусственные переменные и вывод из оптимальной таблицы.
Теория двойственности
Постановка двойственной задачи, принцип двойственности, двойственный симплекс-метод, экономический смысл и связь с симплекс-таблицей.
Транспортная задача
Опорный план, метод северо-западного угла, распределительный метод, потенциалы, блокирование клеток, проверка оптимальности.
Динамическое программирование
Общая схема ДП в исследовании операций, этапы, уравнение Беллмана, примеры и отличие от алгоритмического DP.
Решатели в коде
scipy.optimize.linprog, постановка ЗЛП в Python, OR-Tools и когда доверять солверу вместо ручного симплекса.
Математическое программирование — итоги
Краткие итоги раздела "Математическое программирование" — ЗЛП, симплекс, транспортная задача, двойственность, ДП Беллмана.
Математическое программирование — чек-лист
Вопросы для самопроверки по математическому программированию — ЗЛП, симплекс, транспорт, двойственность, ДП.
Математическое программирование — о разделе
Раздел «Математическое программирование» — про выбор лучшего плана при линейных правилах: сколько произвести, куда перевезти, как распределить бюджет.