Python Gurobi:循环中每个步骤的addContrs

时间:2018-08-13 13:33:22

标签: python gurobi

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

问题背景:我可以在给定的价格P下在一系列时间步长上在市场上买卖商品。首先,我只能购买/出售一种商品,并且我的仓库一次最多可以存储2件商品。我决定为每个时间步长添加一个变量x,该变量可以是-1(买入),0(不做任何事情)或1(卖出)。因此,限制是每个时间步中所有x [i]的总和必须为> =-2和<= 0(“永远不要卖出比您以前买的东西还多的东西)

我设法运行以下代码:

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}的结果表明,只有整体解决方案才能满足要求,但是在这两者之间,该算法的销售量要比之前购买的要好(例如,期间5)。 因此,我需要对我的代码进行调整,使其为每个时间步[i]引入一个约束,以确保所有私有步骤[1至i]的总和也满足约束。 我发现了一些类似的问题(例如:Gurobi Python: how to write nested sum in a constraint),但是没有一个问题可以帮助我解决如何计算每一步的中期总和的具体问题。但是,希望你能!  在此先感谢您,并致以最诚挚的问候!

1 个答案:

答案 0 :(得分:0)

根据您的列表strstr(),应为:

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)))