我有一个约束条件(稍作匿名):
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)吗?感谢您的帮助。
好像我可以回答自己的问题。 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')
Pyomo本身并不“删除”括号。 pyomo打印出的内容(例如,通过pprint()
)是保存在内存中的表达式树的中缀字符串表示。生成字符串表示形式的例程遵循正常的Python运算符优先级规则,并在必要时插入括号(实际上,在某些情况下,我们引入了不必要的括号,而Python运算符优先级规则有点不直观;例如,请参见[ C0]及其对应的issue)。