Оптимизация: что это и зачем?
Оптимизация — это поиск наилучшего решения при заданных ограничениях.
Где это применяется?
Типичные задачи из 1С:
1. Распределение задач
Проблема:
Нужно распределить 100 заказов между 10-ю сотрудниками так, чтобы:
- Все заказы были выполнены
- Нагрузка была равномерной
- Общее время работы минимальным
2. Составление расписаний производства
Проблема:
Планируем выпуск продукции в 3-х цехах, где:
- Есть строгая последовательность операций
- Оборудование может выполнять только одну задачу одновременно
- Оборудование само по себе имеет график доступности
- Сырье поступает с задержкой
3. Маршрутизация доставки
Проблема:
Доставить 50 заказов по городу с учетом:
- Грузоподъемности 10-ти машин
- Загруженности дорог
- Временных окон получения
- Приоритетных клиентов
4. Упаковка товаров
Проблема:
Нужно разместить 85 товаров разных размеров в минимальное количество контейнеров, учитывая:
- Габариты каждого товара
- Габариты и максимальную грузоподъемность контейнеров
- Ограничения по складированию (хрупкие товары сверху)
Все эти задачи объединяет:
- Большое число вариантов (слишком долго перебирать)
- Жесткие ограничения (бюджет, время, ресурсы)
- Четкий критерий оптимальности (минимум затрат/максимум прибыли)
Что такое оптимизационная модель?
Оптимизационная модель — это математическое представление задачи, где:
- есть параметры, которые мы можем менять (переменные);
- есть правила, которые нужно соблюдать (ограничения);
- есть критерий качества решения (целевая функция).
Оптимизационная модель может быть описана программным кодом и решена с использованием специализированных алгоритмов. Это выглядит примерно так:
// Хотим закупить груши и яблоки, но бюджет ограничен. Как быть?
// 1. Создаем модель
Модель = О2.СоздатьМодель();
// 2. Объявляем переменные модели
КолвоЯблок = Модель.Переменная("КолвоЯблок");
КолвоГруш = Модель.Переменная("КолвоГруш");
// 3. Описываем ограничения
Модель.Ограничения().Соотношение("КолвоЯблок >= 0; КолвоГруш >= 0");
Модель.Ограничения().Соотношение("210 * КолвоЯблок + 300 * КолвоГруш <= 10000"); // <-- макс. бюджет на закупку
// 4. Устанавливаем цель - максимизировать выручку
Модель.Максимизировать("300 * КолвоЯблок + 440 * КолвоГруш");
// 5. Решаем модель
Решение = Модель.Решить(); // <-- здесь происходит магия
// 6. Наслаждаемся результатом
Сообщить("Количество яблок: " + Решение.ЗначениеПеременной(КолвоЯблок));
Сообщить("Количество груш: " + Решение.ЗначениеПеременной(КолвоГруш));
Из примера видно, что мы лишь описываем задачу, а решение происходит уже без участия прикладного программиста.
Указанный пример содержит всего пару переменных и несколько условий, очевидно его можно решить на бумаге без всяких математических алгоритмов. Реальные же оптимизационные модели могут тысячи, а иногда и миллионы, переменных и условий, а для их решения могут потребоваться существенные вычислеительные ресурсы.
Виды оптимизационных моделей
Линейное программирование (LP)
Линейное программирование используется для работы с дробными числами, где ресурсы можно делить на части. Данные модели называются линейными, потому что их ограничивающие условия описываются линейными соотношениями.
Когда использовать:
- Когда допустимы дробные значения (например, литры, килограммы)
- Для задач пропорционального распределения
- Условия можно свести к набору линейных соотношений
Целочисленное программирование (MIP)
Целочисленное / смешанно-целочисленное программирование используется при работе с целыми числами, когда нельзя купить или произвести 3,5 товара. Некоторые виды моделей допускают наличие и дробных и целочисленных переменных, а некоторые только целочисленных. В таких моделях условия описываются так же линеными соотношениями.
Когда использовать:
- Для определения количества сотрудников/машин
- Присутствуют штучные товары в заказах
- Условия можно свести к набору линейных соотношений
Программирование в ограничениях (CP)
Используется для решения задач с жесткими логическими правилами.
Когда использовать:
- Составление расписаний
- Задачи с нелинейными комбинаторными условиями ("если не А, то Б")
Маршрутизация (Routing)
Используется для построение оптимальных путей между точками.
Когда использовать:
- Логистика доставки
- Обслуживание клиентов с выездом
Гибридные модели (CP-SAT)
Гибридная модель CP-SAT сочетает возможности программирования в ограничениях с решением задач выполнимости булевых формул. Модель позволяет устанавливать как линейные ограничения, так и различные логические ограничения. Модель работает только с целочисленнымми переменными.
Когда использовать:
- Комбинация логических и линейных условий в целочисленных переменных
- Сложные комбинаторные задачи
- Невозможно свести условия только к линеййным соотношениям