首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从gurobipy到pyomo的数学建模:如何枚举在pyomo中的集合?

从gurobipy到pyomo的数学建模:如何枚举在pyomo中的集合?
EN

Stack Overflow用户
提问于 2022-08-18 16:14:45
回答 1查看 40关注 0票数 0

我在gurobipy中实现了一个课程规划问题。一切都很好。我的下一个任务是用pyomo重写它。我对一个具体的公式(用gurobipy编写)有困难:

代码语言:javascript
复制
model.addConstrs((quicksum(gamma[l, k, s, T[tau]] for tau in range(index_t, index_t + dur[m]) if tau < len(T))
                      >= dur[m] * start[l, k, s, t] for index_t, t in enumerate(T) for m in M
                      for k in KM[m] for l in LM[m] for s in SM[m]), name='Hintereinander')

gammalkst和startlkst是二元决策变量。l,k,s,t是指t是周期的指标。所以集合T是一个句点的列表。在这个方程中,我需要ord(t)能够用和进行计算。因此,我在整句末尾执行枚举(T)。(当遍历所有所需的索引时)。

我的数据是预先给出的,所以我用pyomo编写了一个ConcreteModel()。我很难在pyomo中包含集合T的枚举。我已经拥有的是:

代码语言:javascript
复制
def gamma_hintereinander_rule(model,m,k,l,s):
    for index_t,t in enumerate(T):
        if k in KM[m]:
            if l in LM[m]: 
                if s in SM[m]: 
                    return sum(model.gamma[l, k, s, T[tau]] for tau in range(index_t, index_t + dur[m]) if tau< len(T)) >= dur[m] * model.start[l, k, s, t]                    
                else:
                    return Constraint.Skip    
            else: 
                return Constraint.Skip
        else:
            return Constraint.Skip
model.gamma_hintereinander = Constraint(M, K, L, S,rule=gamma_hintereinander_rule)

它不能正常工作。如果有人能帮我,我会很高兴和感激的!诚挚的问候!泽尼布

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-18 17:24:04

问题是约束规则内部的for-循环。在遇到第一个返回语句之后,您将退出该规则,因此尽管使用for-循环,但只返回了一个约束或Constraint.Skip。我认为最好的方法是用T索引约束,如下所示:

代码语言:javascript
复制
def gamma_hintereinander_rule(model,m,k,l,s,t):
    index_t = T.index(t)
    if k in KM[m]:
        if l in LM[m]: 
            if s in SM[m]: 
                return sum(model.gamma[l, k, s, T[tau]] for tau in range(index_t, index_t + dur[m]) if tau< len(T)) >= dur[m] * model.start[l, k, s, t]                    
            else:
                return Constraint.Skip    
        else: 
            return Constraint.Skip
    else:
        return Constraint.Skip 
model.gamma_hintereinander = Constraint(M, K, L, S, T, rule=gamma_hintereinander_rule)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73406391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档