Pyomo错误:根据数据构造组件'constraint'=没有失败

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

Hello Pyomo社区,

我是Pyomo的新手,我必须使用Pyomo解决最小化问题。

我的代码包括

  • 一个我定义了一些建模类的model.py文件,
  • 一个定义了我的问题的输入的main.py文件,
  • 其中定义了Optimizer类的optimization.py文件。

在此Optimizer类中,我定义

  • 计算目标函数的方法(“目标”),
  • 计算不等式约束('ineqCons')的方法,
  • 解决最小化问题的方法(“解决”)

'objective','ineqCons',从modeling.py中定义的类中调用方法。 “解决”使用Pyomo调用Optimizer类的“目标”,“ ineqCons”方法。

'ineqCons'在输入中获取一个'x'列表,计算一组值,将这些值存储在输出列表中,然后返回输出列表。

在'solve'中,我定义了不等式约束的索引集('ineq_indices'),并定义了调用'ineqCons'方法的规则('ineq_rule')。最后,我使用Pyomo的'Constraint'函数根据'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)
python pyomo
1个回答
0
投票

我有同样的问题。...很奇怪!

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