Ограничение предшествования Pyomo

1

У меня есть некоторые проблемы с моим кодом ограничения приоритета. Вот пример:

Изображение 174551

Я хотел бы реализовать следующее ограничение предшественника:

Изображение 174551

где:

i = tasks;
t = period;
j = model of product

x = binary variable which returns 1
    if task i is done in period t for model j and 0 otherwise.

Чтобы удовлетворить ограничению, P_i представляет собой набор с предшествующими задачами i.

Чтобы стандартизировать код, я использую предшествующую матрицу для создания наборов в зависимости от задачи, сохраненной в словаре. Вот мой код:

import pyomo.environ
from pyomo.core import *
from pyomo.opt import SolverFactory
M_predecessor = [[0,0,0,0,],[0,0,0,0],[1,1,0,0,],[0,0,1,0,]]

predecessor = dict()
for i in range(4):
    b = i+1    
    predecessor[b] = []
    for j in range(4):
        if M_predecessor[i][j] == 1:
            predecessor[b].append(j+1)

model = ConcreteModel()

model.TASKS = RangeSet(1,len(M_predecessor))
model.PERIODS = RangeSet(1,10)
model.MODELS = [1]

Здесь это ограничение:

def rest1_rule(model, i, j):
   return sum(t * model.x[i,t,j] for t in model.PERIODS) >= (
       sum(t * model.x[p for p in predecessor[i],t,j] for t in model.PERIODS)) + model.tiempo[p for p in predecessor[i],j] 
model.rest1 = Constraint(model.TASKS, model.MODELS, rule=rest1_rule)

Я не уверен, как реализовать его в моем ограничении, пожалуйста, любая идея? Есть ли другая форма? заранее спасибо

Теги:
python-3.x
pyomo

1 ответ

0
Лучший ответ
@model.Constraint(model.TASKS, model.TASKS, model.MODELS)
def rest1(m, i, p, j):
    if p in predecessor[i]:
        return sum(t * m.x[i, t, j] for t in m.PERIODS) >= (
            sum(t * m.x[p, t, j] for t in m.PERIODS)
            + model.timepo[p])
    else:
        return Constraint.NoConstraint
  • 0
    Большое спасибо за вашу помощь Ци Чен, она работает отлично!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню