代码之家  ›  专栏  ›  技术社区  ›  bright612

如何使用python、pyomo将变量放入if中

  •  0
  • bright612  · 技术社区  · 8 年前

    这个问题通过那些心存感激的人的建议得到了解决。

    我想使用python进行模拟 在必要的约束中,有一个约束包含max函数。 我用“if”分隔了它。 但是,“if”包含变量,无法执行。 您能告诉我如何在“if”中包含变量或在max中包含变量吗?

    ==========================================

    def comfirststage_rule(model): 
    
        if (-model.wind1 - model.discharge[1,1] + model.charge[1,1] + model.bidding[1,1]) <= 0.0 :*
    
            return model.FirstStageCost - model.price[1,1]*model.bidding[1,1] - (model.wind2 +model.discharge[1,1] - model.charge[1,1] - model.bidding[1,1])*model.penalty[1,1] - model.bidding[1,2]*(model.price[1,2] + model.coeffru[1,1]*model.price[1,1]) - model.bidding[1,3]*(model.price[1,3]-model.price[1,1]*model.coeffrd[1,1]) == 0.0
        else:
            return model.FirstStageCost - model.price[1,1]*model.bidding[1,1] + (model.bidding[1,1]-model.discharge[1,1]+model.charge[1,1]-model.wind1)*model.penalty[1,2] - model.bidding[1,2]*(model.price[1,2] + model.coeffru[1,1]*model.price[1,1]) - model.bidding[1,3]*(model.price[1,3]-model.price[1,1]*model.coeffrd[1,1]) == 0.0 
    
    model.comfirststage = Constraint(rule=comfirststage_rule)
    

    产生此错误

    ERROR: Rule failed when generating expression for constraint comfirststage: TypeError: Relational expression used in an unexpected Boolean context. The inequality expression: -60 - discharge[1,1] + charge[1,1] + bidding[1,1] <= 0.0
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Bethany Nicholson    8 年前

    是否有 model.wind1 , model.discharge[1,1] , model.charge[1,1] , model.bidding[1,1] 变量?如果是这样,请从Pyomo论坛上查看以下答案:

    “Pyomo没有将涉及Var对象的if语句传递给解算器的机制。有一些建模技巧(通常不特定于Pyomo)可用于对变量值进行“分支”。例如,请参阅HP Williams关于建模的书以及其他来源。”

        2
  •  0
  •   gunesevitan    8 年前

    如果是类型错误,则

    (-model.wind1 - model.discharge[1,1] + model.charge[1,1] + model.bidding[1,1])
    

    该代码与

    0.0
    

    在if语句的条件下工作,并尝试像这种方法那样减少问题的大小。