【问题标题】:Python Gurobi: addContrs for each step in a loopPython Gurobi:循环中每个步骤的 addContrs
【发布时间】:2018-08-14 03:09:15
【问题描述】:

我正在尝试使用 gurobi 求解器解决 python 中的优化问题。

问题背景:我可以在给定价格 P 的市场上在一系列时间步长内买卖商品。首先,我只能购买/出售一件商品,而我的仓库一次最多可存储 2 件商品。我决定为每个时间步添加一个变量 x,它可以是 -1(买入)、0(什么都不做)或 1(卖出)。因此,限制是每个时间步中所有 x[i] 的总和必须 >=-2 且

我设法运行以下代码:

P =[1,3,5,4,5,2,2,4,6]
x = m.addVars(6,lb=-1, ub=1, vtype=GRB.INTEGER, name="x")
m.addConstr((quicksum(x[i] for i in range(len(P))) <=0), name=("con.format(i)"))
m.addConstr((quicksum(x[i] for i in range(len(P))) >=-2), name=("Const1"))
m.setObjective(quicksum(x[i]*P[i] for i in range(len(P))) , GRB.MAXIMIZE)

但是,优化{0: -1.0, 1: -1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: -1.0, 6: -1.0, 7: 0.0, 8: 1.0} 的结果表明,只有整体解决方案满足要求,但在这两者之间,算法的销量比之前购买的要好(例如 periode 5)。 因此,我需要以一种为每个时间步 [i] 引入约束的方式调整我的代码,以确保所有 privious 步 [1 到 i] 的总和也满足约束。 我发现了一些类似的问题(例如这里:Gurobi Python: how to write nested sum in a constraint),但没有人可以帮助我解决如何计算每个步骤中的临时总和的具体问题。不过,我希望你能!  提前致谢并致以最诚挚的问候!

【问题讨论】:

    标签: python gurobi


    【解决方案1】:

    根据您的列表P 应该是:

    x = m.addVars(9, lb=-1, ub=1, vtype=GRB.INTEGER, name="x")
    

    回答您的问题:如果我正确理解了您的需求,您可以像这样使用m.addConstrs 方法:

    m.addConstrs(quicksum(x[i] for i in range(k)) <= 0 for k in range(1, len(P)))
    m.addConstrs(quicksum(x[i] for i in range(k)) >= -2 for k in range(1, len(P)))
    

    解决方案:

    x[0] -1.0
    x[1] -1.0
    x[2] 1.0
    x[3] 0.0
    x[4] 1.0
    x[5] -1.0
    x[6] -1.0
    x[7] 1.0
    x[8] 1.0
    

    【讨论】:

    • 谢谢!这实际上按预期工作。 Sic,我以为我在 addContrs-Method 中尝试了 for 循环的每种组合,但没有考虑您在语句末尾提供 k 的方式。再次感谢您,经过 2 天的各种尝试,实在是太绝望了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多