Я создал модель, но у меня возникли проблемы с пониманием того, как составить список моих формулировок (получить файл LP, список ограничений), и с пониманием, правильно ли я ввел выражения для ограничений? Оптимизация работает в PULP, но не в PYSCIPOPT. Пожалуйста, смотрите ниже:
model = Model('name')
shift_starts = {}
load = {}
capacity = {}
unmet_demand = {}
for zone in zones:
for timeslot in timeslots:
load[zone,timeslot] = model.addVar(vtype="C",name="load(%s,%s)" % (zone,timeslot), lb=0.0)
capacity[zone,timeslot] = model.addVar(vtype="C",name="capacity(%s,%s)" % (zone,timeslot), lb=0.0)
unmet_demand[zone,timeslot] = model.addVar(vtype="C",name="unmet_demand(%s,%s)" % (zone,timeslot), lb=0.0)
for length in shift_lengths:
shift_starts[zone,length,timeslot] = model.addVar(vtype="I",name="shift_starts(%s,%s,%s)" % (zone,length,timeslot), lb=0)
for zone in zones:
for timeslot in timeslots[:11]:
rhs = Expr()
for length in shift_lengths:
if length - timeslot > 1:
rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[timeslot-length+1:])
rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[:timeslot+1])
else:
rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[timeslot-length+1:timeslot+1])
model.addCons(capacity[zone,timeslot] <= rhs*productivity[zone][0], name="capacity(%s,%s)" % (zone,timeslot))
for zone in zones:
for timeslot in timeslots[12:]:
rhs = Expr()
for length in shift_lengths:
rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[timeslot-length+1:timeslot+1])
model.addCons(capacity[zone,timeslot] <= rhs*productivity[zone][0], name="capacity(%s,%s)" % (zone,timeslot))
for zone in zones:
for timeslot in timeslots:
model.addCons(unmet_demand[zone, timeslot] >= load[zone, timeslot] - capacity[zone, timeslot], name="unmet_demand(%s,%s)" % (zone,timeslot))
for zone in zones:
model.addCons(load[zone,0] >= unmet_demand[zone,(t-1)] + arrivals[zone][0], name="load(%s,%s)" % (zone,timeslot))
for timeslot in timeslots[1:]:
model.addCons(load[zone,timeslot] >= unmet_demand[zone,timeslot-1] + arrivals[zone][timeslot], name="load(%s,%s)" % (zone,timeslot))
rhs = Expr()
for length in shift_lengths:
model.addCons(quicksum(shift_starts[zone, length, timeslot] for zone in zones for timeslot in timeslots) <= max_shifts[length-1], name="shifts(%s)" % (length))
rhs += quicksum(shift_starts[zone, length, timeslot] for zone in zones for timeslot in timeslots) * length
model.setObjective(quicksum(shift_starts[zone,length,timeslot] for (zone, length, timeslot) in shift_starts), "minimize")
model.optimize()
Правильно ли установлены мои ограничения?