用求和表达式的值返回模型函数的条件

2024-10-06 06:55:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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一起做吗?你知道吗


Tags: 函数in模型目标formodelif表达式
1条回答
网友
1楼 · 发布于 2024-10-06 06:55:56

在大多数优化框架/公式中,不允许使用试图使用的函数(mod/if)。尤其是在LP项目中。 在MILP/MINLP公式中,if语句可以通过一个二进制变量来表示,mod更难(它是周期性不可微的)。 我不确定Pyomo是否支持mod操作符,但我猜它不支持。 即使是这样,您首先需要确保您将要使用的解算器能够解决此类问题(具有不可微点的混合整数非线性)。你知道吗

如果sportGleichzeitig与成本相关,因此您希望解算器将其最小化,则在MILP公式中表示这一点的一种方法如下:

  • a:非负整数变量(辅助)
  • sportGleichzeitig:二进制变量
  • sport >= a * 2
  • sport <= a * 2 + sportGleichzeitig * 2

这样:

  • 如果mod(sport,2) == 0a将是sport/2sportGleichzeitig将是0
  • 如果mod(sport,2) != 0a将是sport // 2sportGleichzeitig将是1

风险在于sportGleichzeitig是1,即使mod(sport,2) == 0。 这就是为什么如上所述,只有当sportGleichzeitig是目标函数的一部分并且与成本相关时,这种方法才有效,这就是为什么模型总是尽可能地最小化成本的原因。你知道吗

相关问题 更多 >