Реализую решение для консолидации пакетов (на основе решения задачи медсестры) с OR-Tools CP Solver.
Есть фабрика, которая производит небольшие упаковки, которые необходимо доставить клиентам по почте. Было бы оптимальным объединить некоторые mini_Packages в более крупные пакеты (например, если мы соблюдаем ограничение по общему весу, мы можем объединить 3 легких mini_Packages в один пакет и оплатить транспортные расходы один раз, а не три раза).
Мини-пакеты имеют некоторые важные атрибуты в источнике данных (фиксированный пункт назначения, вес, допустимый диапазон дат доставки).
Моя основная целочисленная переменная 0-1 выглядит так:
x[mini_package_source_number, destination, optimal_shipment_date, package_number]
Это == 1, если mini_package должен отправиться в определенное место назначения в определенный день, объединенный с определенным Package_number.
Мне удалось собрать большую часть модели, кроме:
1. Основная проблема
Как наложить ограничение, гарантирующее, что, когда решателем назначается оптимальный номер посылки, он не может использоваться ни с каким другим местом назначения или shipment_date? (это физически один консолидированный пакет, отправляемый в определенное место)
Возможный код:
for package_number in range(Packages):
model.Add(sum(x[mini_package_source_number, destination, optimal_shipment_date, package_number] for ...) <= 1)
было бы неправильно, поскольку назначенный Package_number может существовать много раз, объединяя несколько mini_Packages. Он может существовать несколько раз, но всегда должен быть привязан к одному и тому же месту назначения и дате.
Возможное решение:
x[1, Place67, 2019-01-01, 8] = 1
x[2, Place124, 2019-01-04, 119] = 1
x[3, Place124, 2019-01-04, 119] = 1
пока все в порядке, mini_Packages 2 и 3 были объединены в пакет 119 с тем же местом назначения (и датой).
x[4, Place55, 2019-01-05, 119] = 1
было бы неправильно, потому что mini_Package 4 также был объединен в пакет 119, который ранее был решен решателем для перехода в другое место назначения (и в другую дату).
Как это можно было закодировать? Я был бы очень признателен за любое предложение решения.
2. Дополнение
Чувство @Stradivari (ответ ниже) является точным. Весьма вероятно, что я использую лишние переменные.
3. Проблема с конфликтующими продуктами
Пункты 2–3 перемещены в:
https://or.stackexchange.com/questions/2786/shipments-consolidation-with-or-tools-cp-solver-in-python-multi-knapsack.