我正在用Python中的Pyomo构建一个抽象优化模型。我有一个模型变量(model.x),它被索引为4个集合。为了构建我的目标函数,我用Python构建了5个不同的术语,然后将它们相加,并返回它们。 我使用函数为目标函数返回一些值。这些函数使用sum表达式。然后,我想检查计算的表达式是否为>;0 mod 2,但这不起作用。你知道吗
我已经试着用assert替换if子句,但它没有做我最初希望它做的事情。我还尝试用value()检索表达式的值,但这会引起一个错误,因为变量还没有值。你知道吗
这是我从目标规则调用的函数:
def sportGleichzeitig(model,k,z):
sport = sum(model.x[k,l,"SportM",z] for l in model.Lehrer) +
sum(model.x[k,l,"SportW",z] for l in model.Lehrer)
if sport % 2 > 0 :
return 0
else:
return 1
这是客观规则中涉及函数的部分
sport = model.sportweight * sum(sportGleichzeitig(model,k,z) for k in model.Klassen for z in model.Zeitslots)
所以我想在“SportW”和“SportM”同时出现的时候称一下体重。此代码引发以下异常:
TypeError at /optimierung/
unsupported operand type(s) for %: 'SumExpression' and 'int'
有什么办法可以和Pyomo一起做吗?你知道吗
在大多数优化框架/公式中,不允许使用试图使用的函数(mod/if)。尤其是在LP项目中。 在MILP/MINLP公式中,if语句可以通过一个二进制变量来表示,mod更难(它是周期性不可微的)。 我不确定Pyomo是否支持mod操作符,但我猜它不支持。 即使是这样,您首先需要确保您将要使用的解算器能够解决此类问题(具有不可微点的混合整数非线性)。你知道吗
如果
sportGleichzeitig
与成本相关,因此您希望解算器将其最小化,则在MILP公式中表示这一点的一种方法如下:a
:非负整数变量(辅助)sportGleichzeitig
:二进制变量sport >= a * 2
sport <= a * 2 + sportGleichzeitig * 2
这样:
mod(sport,2) == 0
,a
将是sport/2
,sportGleichzeitig
将是0mod(sport,2) != 0
,a
将是sport // 2
,sportGleichzeitig
将是1风险在于
sportGleichzeitig
是1,即使mod(sport,2) == 0
。 这就是为什么如上所述,只有当sportGleichzeitig
是目标函数的一部分并且与成本相关时,这种方法才有效,这就是为什么模型总是尽可能地最小化成本的原因。你知道吗相关问题 更多 >
编程相关推荐