Я успешно использовал целочисленное линейное программирование для решения проблемы заполнения слотов, используя следующее (+ некоторые жесткие / мягкие ограничения).
def opt(A, max=float('inf'),
min=0):
"""Find the optimal solution
M, N = len(A), len(A[0])
# Create problem:
prob = pulp.LpProblem("optimiser", pulp.LpMaximize)
# Create variables:
x = pulp.LpVariable.dicts("x", itertools.product(range(M), range(N)),
cat=pulp.LpBinary)
# Constraints
В частности, у меня есть ряд идентификаторов (M) со связанным с ними ассортиментом продуктов (N), и продукты, несмотря на то, что изначально привязанные к нескольким IDS изначально могут быть назначены только одному идентификатору в концепроцесс.Я могу сделать это до сих пор.
ID Product
1 100
1 200
1 300
2 100
2 200
3 100
4 500
4 200
5 600
6 600
Они преобразуются в двоичную матрицу для назначения до 6 доступных слотов (минимальный максимум, который я контролирую с мягкими ограничениями), и этоотлично работает в качестве базового оптимизатора, однако мне нужно добавить некоторые дополнительные правила.
Например, я хочу добавить веса к определенным продуктам (каждому из них присваивается балл в качестве отдельной переменной), и мне нужно, чтобы продукты с наивысшим рейтингом были добавлены в слоты с приоритетом).
ID Product Score
1 100 5
1 200 5
1 300 2
2 100 5
2 200 5
3 100 5
4 500 1
4 200 5
6 600 4
6 600 4
Так что я бы хотел расставить приоритеты для тех продуктов, которые набрали 5 баллов, чтобы вначале был присвоен идентификатор.Как только все это вошло, затем следующий нисходящий счет и т. Д.
Итак
- Возможно ли это здесь, и есть какие-нибудь идеи, как туда добраться?
- Может лиЯ добавляю дополнительные весовые переменные, если это необходимо?
- Если это невозможно с ILP - есть еще какие-нибудь предложения?(надеюсь, это не O / T)
Буду очень признателен за любую помощь здесь ..