У меня есть некоторые трудности, связанные с реализацией одного ограничения в моей задаче оптимизации.
Математическое выражение ограничения Это моя первая попытка ограничения потока. Это работает, когда T = 1.
Если T не 1, это приводит к ошибкам. Нужен более общий подход для кодирования ограничения.
def Flow_Of_Ships_rule(model, i, v, h):
print(h)
# max(h - model.TimeVisitingPort[k] - model.TimeTravelingPort2Port[k, i]) = 2
if h == 1:
return sum(model.VesselTravel[i, j, v, h] for j in model.Node if j!=i) + model.VesselWait[i, v, 8]\
- sum(model.VesselTravel[k, i, v, (8 - model.TimeTravelingPort2Port[k, i])] for k in model.Node if k!=i) - model.VesselWait[i, v, 7] == 0
elif h == 2:
return sum(model.VesselTravel[i, j, v, h] for j in model.Node if j!=i) + model.VesselWait[i, v, h - model.TimeVisitingPort[i]]\
- sum(model.VesselTravel[k, i, v, (9 - model.TimeTravelingPort2Port[k, i])] for k in model.Node if k!=i) - model.VesselWait[i, v, 8] == 0
else:
return sum(model.VesselTravel[i, j, v, h] for j in model.Node if j!=i) + model.VesselWait[i, v, h - model.TimeVisitingPort[i]]\
- sum(model.VesselTravel[k, i, v, (h - model.TimeVisitingPort[k] - model.TimeTravelingPort2Port[k, i])] for k in model.Node if k!=i) - model.VesselWait[i, v, h - model.TimeVisitingPort[i] - 1] == 0
model.Flow_Of_Ships = Constraint(model.Node, model.Vessel, model.Time, rule=Flow_Of_Ships_rule)
###############################################################################
def One_Flow_Of_Ships_rule(model, v, h):
return sum(sum(model.VesselTravel[i, j, v, h] for j in model.Node) for i in model.Node) + sum(model.VesselWait[i, v, h] for i in model.Node) <= 1
model.One_Flow_Of_Ships = Constraint(model.Vessel, model.Time, rule=One_Flow_Of_Ships_rule)
###############################################################################
def No_Travel_rule(model, i, j, v, h):
if i != j:
return Constraint.Skip
else:
return model.VesselTravel[i, j, v, h] == 0
model.No_Travel = Constraint(model.Node, model.Node, model.Vessel, model.Time, rule=No_Travel_rule)