【问题标题】:does pyomo drop parentheses it sees as unneeded?pyomo 是否会删除它认为不需要的括号?
【发布时间】:2020-03-29 09:13:17
【问题描述】:

我有一个约束(稍微匿名):

def ex_rule(mod, t, p, s):
return mod.blah[t, p, s] == alpha[s] + \
       beta[s] * ((1-mod.Q[t-Term[s], s]) ** 2) * \
       (1 + (1/2) * ((1-mod.Q[t-2*Term[s], s]) ** 2) *
        (1 + (1/2) * ((1-mod.Q[t-3*Term[s], s]) ** 2)))
model.ex = Constraint(T1, P, set_s, rule=ex_rule)

这会在模型文件中生成多行约束。一个特定的行是下面的行(对于 t=1、p=1、s=1、Term[1]=3、alpha[1] = .25 和 beta[1] = .15)。

blah[1,1,1] - (0.25 + 0.15*(1 - Q[-2,1])**2*(1 + 0.5*(1 - Q[-5,1])**2*(1 + 0.5*(1 - Q[-8,1])**2)))

我的主要问题是有人可以确认 Pyomo 只是删除了不必要的括号吗?所以我们可以相信 PEMDAS 正在工作,所以 X**2*Y 是作为 (X^2)*Y 而不是 X^(2*Y) 完成的?感谢您的帮助。

【问题讨论】:

    标签: constraints parentheses pyomo


    【解决方案1】:

    看来我可以回答我自己的问题了。 Pyomo 确实删除了不需要的括号并正确使用了 PEMDAS。我用一个非常小的问题进行了测试,所有结果看起来都正确。 (我用几种不同的方式改变了括号,包括 X^(2*Y) 答案是正确的)

    from pyomo.environ import *
    model = ConcreteModel()
    
    model.x = Var(initialize=0, bounds=(0, 2))
    model.y = Var(initialize=0, bounds=(0, 3))
    
    def obj_rule(mod):
        return ((mod.x**2))*mod.y
    model.obj = Objective(rule=obj_rule, sense=maximize)
    
    model.pprint(filename='super_temp_mod.txt')
    solver = SolverFactory("ipopt")
    results = solver.solve(model, load_solutions=True, tee=True)
    model.pprint(filename='super_temp_soln.txt')
    

    【讨论】:

      【解决方案2】:

      Pyomo 本身并没有“删除”括号。 pyomo 打印出来的(例如,通过pprint())是内存中保存的表达式树的中缀字符串表示。生成字符串表示的例程遵循正常的 Python 运算符优先级规则,并在必要时插入括号(实际上,在某些情况下,我们引入了不必要的括号,其中 Python 运算符优先级规则有点不直观;例如,参见 @ 987654321@及其对应的fix)。

      【讨论】:

        猜你喜欢
        • 2020-09-07
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2023-02-02
        相关资源
        最近更新 更多