Python (gurobipy) 相当于 GAMS ord(i) 函数

Python (gurobipy) equivalent of GAMS ord(i) function

我正在使用 gurobipy 在 Python 中制作作业车间调度模型,因为 GAMS 的免费版本无法处理这个特定问题的维度,但我是一个新手。

我的 objective 函数的一部分如下:

(sum((i,ii,c)$(ord(ii)>ord(i)),w(i,ii,c)*u(i,ii))*R)

ord() 给出集合中元素的索引,因此 w * u 的求和仅针对索引大于 [=16= 的那些 ii 元素进行] 个。

我想知道在python中是否有一种优雅的方式来编写这段代码,到目前为止我看到我可以使用枚举函数来循环一个一维参数并保留索引,例如:

bs = [7, 6, 5, 4, 1]
cs = [2, 8, 3, 9, 0]

for i, b in enumerate(bs):
    for j, c in enumerate(cs):
        if i > j:
            print(b, " * ", c, " = ", b * c)

但我不知道如何使用多维参数和变量来做到这一点?

最优雅的方法是在一组元组上定义决策变量 w 和 u,其中这些元组仅包含 ord(i)<ord(ii) 处的有效组合。然后你只需要遍历 u 或 w 的索引器。

对于 Gurobi,我会执行以下操作:

u = m.addVars(((i,ii) for m,i in enumerate(bs)
                      for n,ii in enumerate(cs) if m<n),
              name='u')