python - 优先约束 Pyomo
问题描述
我的优先约束代码有一些问题。这里有一个例子:
我想实现以下前置约束:
在哪里:
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)
我不确定如何在我的约束中实现它,请知道吗?有另一种形式吗?提前致谢
解决方案
@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
推荐阅读
- c# - Visual Studio 2017 更改当前文件的语言?
- php - 如何在 1and1 (Ionos) 上安装 codeigniter?
- excel - 单击另一个按钮后,VBA表单控件按钮需要消失
- reactjs - 开玩笑 - 承诺在模拟中解决多少时间后?
- typescript - 打字稿用枚举键迭代对象
- php - sql Req 没有更新数据库
- python - SettingWithCopyWarning 不合理地发生在 DataFrame.astype 上
- python - 单词中间3个字母/Python
- reactjs - 使用 useState() React Hook 立即使用状态值
- python - 我的 groupby() 在 pandas 数据框中不起作用