Всегда сначала формулируйте правильную математическую модель, прежде чем внедрять ее в PuLp.
Let
g(i,k) = 1 if guest i sits at table k
0 otherwise
и
p(i,j,k) = 1 if guests i and j sit at table k
0 otherwise
Сначала вам понадобятся некоторые ограничения присваивания:
sum(i, g(i,k)) <= capacity(k) for all k
sum(k, g(i,k)) = 1 for all i
Двоичное умножение
p(i,j,k) = g(i,k) * g(j,k)
может быть линеаризован как
p(i,j,k) <= g(i,k)
p(i,j,k) <= g(j,k)
p(i,j,k) >= g(i,k)+g(j,k)-1
p(i,j,k) ∈ {0,1}
Обычно нам не нужны все эти переменные и уравнения, но это зависит от деталей модели.Наверняка мы должны рассмотреть только i<j
.Интересно, что эта формулировка настолько тесна, что мы можем ослабить p (i, j, k), чтобы быть непрерывным между 0 и 1: они будут автоматически целочисленными.
Это математическое описание легко транскрибируется в Python / Pulp.Вы, вероятно, должны переделать свой код Python, поскольку он содержит некоторые бессмысленные вещи.Некоторые подсказки:
- двоичные переменные уже имеют границы 0 и 1
- Pulp может создавать ограничения на равенство (запись <= и> = ограничений глупа)
- попытатьсясделать вещи более читабельными (ближе к математическому представлению)
- для другого подхода см. wedding.py