pyomo放在不需要的括号里吗?

问题描述 投票:0回答:2

我有一个约束条件(稍作匿名):

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
2个回答
0
投票

好像我可以回答自己的问题。 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')

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.