У меня есть целевая функция с условным значением if
.У меня возникают проблемы с его реализацией в Gurobi Python.
Справочная информация
Есть s
поставщиков и p
растений.x[s][p]
- это переменная, которая указывает количество элементов, которые передаются от supplier-x
до plant-p
.c[s][p]
указывает на стоимость доставки одного предмета от поставщика в центр.
Кроме того, существует фиксированная стоимость t[s]
для каждого поставщика.Если поставщик осуществляет поставки в какой-либо центр, это фиксированная стоимость (эта фиксированная стоимость не зависит от количества товаров).
Я хочу минимизировать стоимость, используя такую целевую функцию, как -
Первая часть легко моделируется как sum(x[s, p] * spc[s, p] for s in range(num_suppliers) for p in range(num_center))
.
Для второго термина, как я могу моделировать ее?(Вторая часть в основном означает, что добавьте фиксированную стоимость поставщика только в том случае, если поставщик фактически является поставщиком чего-либо для какого-либо завода).
Редактировать
Это код, который у меня естьсейчас.Примечание: это не дает минимальное значение -
from gurobipy import *
supplier_capacity = [
5, 10
]
plant_demand = [
2, 4
]
num_suppliers = len(supplier_capacity)
num_plants = len(plant_demand)
t = [
100, 1
]
c = {
(0, 0): 1,
(0, 1): 4,
(1, 0): 4,
(1, 1): 2
}
x = {} # flow between each supplier to plant
m = Model()
xl = [(s, p) for s in range(num_suppliers) for p in range(num_plants)]
x = m.addVars(xl, vtype=GRB.INTEGER, lb=0, name='flow')
for s in range(num_suppliers):
m.addConstr(x.sum(s, '*') <= supplier_capacity[s])
for p in range(num_plants):
m.addConstr(x.sum('*', p) >= plant_demand[p])
m.setObjective(
(
sum(x[s, p] * c[s, p] for s in range(num_suppliers) for p in range(num_plants)) +
sum(t[s] for s in range(num_suppliers) if x.sum(s, '*') >= 0)
), GRB.MINIMIZE
)
m.update()
m.optimize()
if m.status == GRB.Status.OPTIMAL:
print('==== RESULTS ====')
print('Min Cost: {}'.format(m.ObjVal))
for v in m.getVars():
print('{} = {}'.format(v.VarName, v.X))
else:
print('Infeasible model')