Есть 4 разных проблемы.
1)
use_customer = LpVariable.dicts("UseCustomer",[(i,j) for i in CUSTOMERS for j in FACILITY],1)
Это эквивалентно тому, что каждая переменная дробная и должна быть больше единицы . То есть вы устанавливаете lowBound=1
. Я думаю, что вы хотели бы сказать здесь, что переменная является двоичной:
use_customer = LpVariable.dicts("UseCustomer",[(i,j) for i in CUSTOMERS for j in FACILITY], cat=LpBinary)
2)
Вторая проблема заключается в том, что вы не ограничиваете клиента назначением хотя бы в какое-либо учреждение (хотя бы потому, что поскольку проблема является проблемой минимизации, а ваши затраты строго положительны, клиент никогда не будет назначен более чем одному средство, но в дальнейшем я приму ровно один )
for i in CUSTOMERS:
prob += lpSum(use_customer[(i,j)] for j in FACILITY) == 1.0
3)
Я не уверен, что понял, что вы хотели бы сказать здесь:
for j in FACILITY:
prob += lpSum(use_facility[j] for j in FACILITY) <=1.0 ##Constraint 1
Каждый раз, когда вы суммируете все объекты и ограничивает сумму их значений не более одного. Я думаю, это ошибка.
4) * * тысяча двадцать шесть
Наконец, вы не связываете переменные use_facility
и use_customer
вместе. То есть переменная use_facility
никогда не будет иметь значение, большее чем 0. Поскольку она является двоичной, я предполагаю, что use_facility[j]
представляет стоимость активации. Таким образом, вам нужно добавить, чтобы активировать объект, то есть объект j активируется, если его использует хотя бы один клиент :
for j in FACILITY:
for i in CUSTOMERS:
prob += use_facility[j] >= lpSum(use_customer[(i,j)])
Собираем все вместе:
##Decision Variables
use_facility = LpVariable.dicts("UseFacility", FACILITY, cat=LpBinary)
use_customer = LpVariable.dicts("UseCustomer",[(i,j) for i in CUSTOMERS for j in FACILITY], cat=LpBinary)
## Objective Function
prob += lpSum(actcost[j]*use_facility[j] for j in FACILITY) + lpSum(pipelineCost[j]*use_facility[j] for j in FACILITY)+ lpSum(serviceCosts[j][i]*use_customer[(i,j)] for i in CUSTOMERS for j in FACILITY)
# Constraints
for j in FACILITY:
prob += lpSum(use_customer[(i,j)] for i in CUSTOMERS) <= maxSizeOfPlatforms[j]
for i in CUSTOMERS:
prob += lpSum(use_customer[(i,j)] for j in FACILITY) == 1
for j in FACILITY:
for i in CUSTOMERS:
prob += use_facility[j] >= lpSum(use_customer[(i,j)])