Python Gurobi:为循环中的每个步骤添加 Contrs
Python Gurobi: addContrs for each step in a loop
我正在尝试使用 gurobi 求解器解决 python 中的优化问题。
问题背景:我可以在给定价格 P 的一系列时间步长内在市场上买卖商品。首先,我只能 buy/sell 一件商品,我的仓库一次最多可存储 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}
显示只有整体方案满足要求,但在这两者之间,算法卖出的商品比之前购买的商品多(例如periode 5)。
因此,我需要调整我的代码,为每个时间步 [i] 引入一个约束,以确保所有原始步骤 [1 到 i] 的总和也满足约束。
我发现了一些类似的问题(例如:),但 none 可以帮助我解决如何计算每个步骤中的期中总和的具体问题。但是,我希望你能!
提前致谢并致以最诚挚的问候!
根据你的列表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
我正在尝试使用 gurobi 求解器解决 python 中的优化问题。
问题背景:我可以在给定价格 P 的一系列时间步长内在市场上买卖商品。首先,我只能 buy/sell 一件商品,我的仓库一次最多可存储 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}
显示只有整体方案满足要求,但在这两者之间,算法卖出的商品比之前购买的商品多(例如periode 5)。
因此,我需要调整我的代码,为每个时间步 [i] 引入一个约束,以确保所有原始步骤 [1 到 i] 的总和也满足约束。
我发现了一些类似的问题(例如:
根据你的列表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