Как ограничить некоторые столбцы нулями в целлюлозе

Я работаю над проблемой линейного программирования с модулем PulP.

В этой задаче у нас есть матрица (i x j) - A. Целевая функция - минимизировать производство между A и другой (j x i) матрицей - B. A - это цель, которую мы хотим минимизировать, B - постоянная матрица.

Моя проблема в том, как ограничить n из j столбцов в матрице A, чтобы все они были нулями. n ‹= j и устанавливается пользователем.

prob - это моя проблема Lp, а test - это матрица A, pri - матрица B. Я знаю, как создать ограничение, при котором сумма каждой строки должна быть равна 1.

for i in range(pri.shape[1]):
    prob+=lpSum(test[i,:])==1

В следующем коде я пытаюсь сделать ограничение n столбцов j в матрице A нулями. Хотя это не удалось, и я просто создал фиктивную переменную, по которой я не могу понять причину.

count=0
for i in range(pri.shape[0]):
    if lpSum(test[:,i])==0:
        count +=1
prob += count==n

prob.solve()
for v in prob.variables():
    print(v.name, "=", v.varValue)

Выход:

__dummy = None
a_(1,_1) = 1.0
a_(1,_2) = 0.0
a_(2,_1) = 1.0
a_(2,_2) = 0.0
a_(3,_1) = 1.0
a_(3,_2) = 0.0

Мякоть не так популярна в Интернете. Я не могу найти образец кода, связанный с моей проблемой. Спасибо за Ваш ответ.


person Jacky Tsai    schedule 16.08.2019    source источник
comment
Я думаю, вы путаете данные с переменными решения. Я предлагаю сначала написать математическую модель.   -  person Erwin Kalvelagen    schedule 16.08.2019


Ответы (1)


Имейте двоичную переменную для каждого столбца, которая принимает значение 1, если этот столбец вообще используется, и ноль в противном случае. Это можно сделать, установив ограничение для каждого столбца j следующим образом:

lpSum([test[i, j] for i in set_I]) <= M*binary[j]

Где M - константа, выбранная достаточно большой, чтобы это ограничение не действовало, когда двоичное значение установлено на 1.

Затем вам нужно еще одно ограничение, чтобы количество включенных столбцов не превышало n:

prob += lpSum([binary[j] for j in set_J]) <= n
person kabdulla    schedule 17.08.2019
comment
Большое тебе спасибо!! Вы отвечаете четко, и это решает мою проблему. - person Jacky Tsai; 19.08.2019