Как сформулировать матричное ограничение для оптимизации затрат в PuLP

#python #optimization #linear-programming #pulp #integer-programming

#python #оптимизация #линейное программирование #pulp #целочисленное программирование

Вопрос:

Я пытаюсь сформулировать это сложное ограничение на основе матрицы в PuLP для задачи оптимизации затрат: у меня есть vars[(i,j)] for i in TruckTypes for j in Days в качестве переменной решения, которая может принимать только неотрицательные целые значения. Я пытаюсь реализовать ограничение на количество active дней.

Теперь, поскольку Days они обозначаются как столбцы, любой столбец, который имеет все нулевые значения, является inactive днем, а все остальные столбцы — active днями. Есть 6 столбцов, обозначающих понедельник- субботу. Например, в приведенной ниже матрице :

   1 0 0 1 3 0
  0 0 0 1 1 0
  2 0 0 1 0 0
  0 0 0 1 0 0
 
  

Столбцы 2,3 и 6 являются inactive , а столбцы 1,4 и 5 являются active . Теперь, как сформулировать ограничение, такое Number of active Days == 3 как для этой переменной решения.

Любая помощь будет оценена. Спасибо!!

Ответ №1:

Подумав некоторое время.. Я думаю, что я взломал это…

  1. Создайте фиктивную 1-D двоичную переменную решения для активных дней. 0- Неактивный 1-Активный.

ActiveDays = LpVariable.dicts(‘activedays’, Days, 0,1, LpBinary)

  1. Создайте фиктивную очень большую константу.

M = 200000

  1. Добавьте первое ограничение.

проблема = LpSum (m[j] для j в днях) ==3

  1. Добавьте второе ограничение

     for j in Days:
    
         prob  = LpSum(vars[i][j] for i in TruckTypes) <= M*m[j]