Добавление весов к целочисленному линейному программированию в Python / PuLP - PullRequest
0 голосов
/ 20 марта 2019

Я успешно использовал целочисленное линейное программирование для решения проблемы заполнения слотов, используя следующее (+ некоторые жесткие / мягкие ограничения).

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 баллов, чтобы вначале был присвоен идентификатор.Как только все это вошло, затем следующий нисходящий счет и т. Д.

Итак

  1. Возможно ли это здесь, и есть какие-нибудь идеи, как туда добраться?
  2. Может лиЯ добавляю дополнительные весовые переменные, если это необходимо?
  3. Если это невозможно с ILP - есть еще какие-нибудь предложения?(надеюсь, это не O / T)

Буду очень признателен за любую помощь здесь ..

...