你好Pyomo社区,
我是Pyomo的新手,必须使用Pyomo解决最小化问题。
我的代码包括
在此Optimizer类中,我定义
'objective','ineqCons',从modeling.py中定义的类调用方法。使用Pyomo的“解决”方法调用Optimizer类的“目标”,“ ineqCons”方法。
'ineqCons'在输入中获取一个'x'列表,计算一组值,将这些值存储在输出列表中,然后返回输出列表。
在'solve'中,我定义了不等式约束的索引集('ineq_indices'),并定义了调用'ineqCons'方法的规则('ineq_rule')。最后,我使用Pyomo的“约束”函数根据“ ineq_rule”和“ ineq_indices”创建不等式约束。
尝试解决问题时,python会引发错误:
ERROR: Constructing component 'ineqCons' from data=None failed: ValueError:
Constraint 'ineqCons[0]' encountered a strict inequality expression ('>'
or '<'). All constraints must be formulated using using '<=', '>=', or
'=='.
这令人惊讶,因为我在'ineq_rule'中用'<='符号定义了不等式约束。在网上找不到有关我的特定问题的任何参考。 我在这个link处发现了类似的错误消息,但无法弄清楚这是否与我的问题有关。
有人会对我的问题有任何想法吗?谢谢!
下面是我使用的代码模板:这是一个很长的代码,所以我还没有发布所有内容。
def ineqCons(self, x):
# A first set of values is calculated and stored in the 'c_stored' list
# A second set of values is calculated and stored in the 'c_vented' list
# A third list 'ineq' is created concatenating 'c_stored' and 'c_vented'
# 'ineq' is returned
return ineq
def solve(self):
# Solver and model instances creation
opt = SolverFactory('gurobi')
model = pyo.ConcreteModel()
# Variables definition
model.var_indices = pyo.Set(initialize=list(range(len(self.x))))
def bounds_rule(model, j):
return self.reactors[j].bounds()
def initialize_rule(model, j):
return self.x[j]
model.x = pyo.Var(model.var_indices, domain=pyo.NonNegativeReals, bounds=bounds_rule, initialize=initialize_rule)
# Objective function definition
model.objective = pyo.Objective(expr=self.objective(model.x), sense=pyo.minimize)
# Inequality constraints definition
if len(self.stored + self.vented) > 0:
model.ineq_indices = pyo.Set(initialize=list(range(len(self.stored + self.vented))))
def ineq_rule(model, i):
return self.ineqCons(model.x)[i] <= 0
# Solve and access the solution
results = opt.solve(model)