Добавление ограничений в PYSCIPOPT? - PullRequest
0 голосов
/ 07 февраля 2020

Я создал модель, но у меня возникли проблемы с пониманием того, как составить список моих формулировок (получить файл 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()

Правильно ли установлены мои ограничения?

1 Ответ

0 голосов
/ 08 февраля 2020

Обратите внимание, что сейчас невозможно выполнить ваш код, поскольку некоторые переменные еще не определены. Синтаксис, кажется, в порядке, но извините, мы не будем проверять правильность вашей модели для вас. Я бы посоветовал вам использовать model.writeProblem("model.cip") для экспорта вашей модели в формат * .cip. Этот формат удобен для чтения и может помочь вам обнаружить проблему в вашем коде.

...