温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - How to include a if check into a for loop
dictionary for-loop if-statement python pyomo

python - 如何将if检查包括到for循环中

发布于 2020-03-27 15:55:48

我尝试将约束表达式添加到python / pyomo模型:我尝试的代码是这样的:

for r_k in VAR1: 
    for p_v in VAR2:
        for b_n in VAR3:
            IF mix[b_n][p_v]() >= 0:
                model.cons.add(model.func2[r_k,b_n,p_v]*q1[b_n][p_v] - model.func1[r_k,b_n,p_v] ==0)

如果我离开IF循环,它将运行良好。上面的代码产生语法错误。唯一的缺点是它会创建数千个不需要的额外数学上的琐碎约束。
“ mix”仅是稀疏填充的“ binary”字典(即,大多数为零,中间为几个)。仅当存在“ 1”时才需要约束。似乎在for循环中评估/调用字典值存在问题。任何解决此问题的想法将不胜感激。谢谢。

查看更多

查看更多

提问者
Perry Hall
被浏览
142
Scotty1- 2020-01-31 16:46

您的代码中有两个错误:

  • if在Python中是小写字母。在任何标准模块IF都不存在
  • 假设mix是二分法,则不能称之为。通过()在变量或范围内的任何内容后面添加大括号,可以告诉python将其视为可调用对象并尝试执行它。

假设其余代码工作正常,这应该可以解决您的问题:

for r_k in VAR1: 
    for p_v in VAR2:
        for b_n in VAR3:
            if mix[b_n][p_v] >= 0:
                model.cons.add(model.func2[r_k, b_n, p_v] * q1[b_n][p_v] - model.func1[r_k, b_n, p_v] == 0)

进一步说明:

  • if(和elifelse)是不是一个循环,这是一个条件语句!for或是while循环。
  • 您进行检查mix[b_n][p_v] >= 0,但声明仅当“有一个“ 1””时才需要约束因此,您的病情不应该mix[b_n][p_v] > 0或更明确mix[b_n][p_v] == 1吗?(显式比隐式更好,请参阅《The Zen of Python,第二条语句》