Для l oop в ограничениях Pyomo - PullRequest
0 голосов
/ 28 апреля 2020

Я изо всех сил пытаюсь сделать несколько ограничений, используя для l oop в Python Pyomo. Моя концепция кода выглядит следующим образом:

T = 504
model.times = RangeSet(0, T-1)
model.Machines = Set(initialize = Machines_parameters.keys())

Затем я разделил model.times на 3 набора одинаковой длины, и теперь я хочу написать определенные c ограничения для каждой из этой части набора. Ниже приведена эквивалентная, но упрощенная версия кода:

for k in range(3): #number of parts in which I've divided the set [(0,167),(168,335),(336,503)]
    for j in range(cluster_index[k][0], cluster_index[k][1]):   #respectively first and last number of the subset
        def logic_constr(model,i):
            if j >= const1[k] and j < const2[k]:
                return model.z[i, j + 1] - model.z[i, j] == model.dsu[i, j + 1] - model.dsd[i, j + 1]
            else j==const2[k]:
                return model.z[i,const2[k]] - model.z[i,j] == model.dsu[i,const1[k]] - model.dsd[i,const1[k]]
        model.logic_constr = Constraint(model.Machines, rule = logic_constr)

Я хотел бы создать итеративно создать 504 различных ограничения, каждое из которых имеет свое собственное правило. Есть ли у вас какие-либо предложения о том, как это сделать?

1 Ответ

0 голосов
/ 28 апреля 2020

Как вы сформулировали ограничение прямо сейчас, вы получите только одно ограничение в конце, так как после каждого l oop ограничение будет перезаписано.

Так как, как вы скажем, и в соответствии с вашими циклами for, вы также хотите одно ограничение на шаг по времени, это намного проще.

Во-первых, вам нужно определить ограничение как:

model.logic_constr = Constraint(model.Machines, model.times, rule = logic_constr)

Это означает, что ограничение будет применяться для каждого члена набора model.times, то есть будет 504 ограничения для каждого элемента модели набора. Машины.

Тогда все ваши циклы if и for могут go в ваш определение функции logic_constr.

...