【问题标题】:Python (gurobipy) equivalent of GAMS ord(i) functionGAMS ord(i) 函数的 Python (gurobipy) 等价物
【发布时间】:2020-12-03 14:51:23
【问题描述】:

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

我的部分目标函数如下:

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

ord() 给出了集合中元素的索引,因此w * u 的求和只针对那些索引大于iii 元素。

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

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)

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

【问题讨论】:

    标签: python gurobi gams-math


    【解决方案1】:

    最优雅的方法是在一组元组上定义决策变量 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')
    

    【讨论】:

    • 感谢您的回答!我不知道在声明变量时可以设置这些条件。鉴于w 是一个变量而u 是一个参数表这一事实足以使乘法只考虑 w 和 u 的 ii > i 索引,或者我需要以类似的方式声明参数?跨度>
    • 您可以通过这种方式声明决策变量和数据;数据应该是一个元组。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多