我正在尝试使用 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:如何在约束中编写嵌套总和)但没有一个可以帮助我解决如何计算每个步骤中的临时总和的具体问题。不过,我希望你能! 提前致谢并致以诚挚的问候!
根据您的清单,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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句