Pyomo错误:从数据构造组件“约束” =没有失败

时间:2018-12-03 01:07:24

标签: python pyomo

你好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的“约束”函数根据“ 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)

0 个答案:

没有答案