Pyomo / python-код для ограничения судового потока при оптимизации - PullRequest
0 голосов
/ 10 января 2019

У меня есть некоторые трудности, связанные с реализацией одного ограничения в моей задаче оптимизации.

Математическое выражение ограничения Это моя первая попытка ограничения потока. Это работает, когда 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) 
...