我尝试将约束表达式添加到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循环中评估/调用字典值存在问题。任何解决此问题的想法将不胜感激。谢谢。
您的代码中有两个错误:
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
(和elif
,else
)是不是一个循环,这是一个条件语句!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,第二条语句》)
感谢您的快速答复。我一定会尝试的
==1
。重新循环,对不起,我还是编程的新手,所以所有条款都还不够好。欢迎您,一点问题都没有!我很高兴能够提供帮助。:)