Python Gurobi:循环中每一步的addContrs

詹姆士

我正在尝试使用 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用python循环后退一步和前进一步

Python Code 一步一步理解代码

在 Python 中自定义梯度下降算法的每一步中存储参数值

Python Pipeline 只显示一步

使用 Python 的河内塔,使用列表打印每一步。但我不想使用全局变量

在while循环中保存txt文件在每一步保存当前和上一次迭代

python高阶函数:我如何一步一步地阅读代码?

有没有办法进一步减少此python代码中的“ for循环”?

python分组和进一步分组

有没有像 Python 的 Thonny 这样的 Java IDE?其中显示了一步一步的代码执行

循环范围,一步一步?

函数未处理每一步

转移元素并打印每一步

跳过循环中的第一步进行第一次迭代

避免在C ++中循环的每一步都检查相同的条件

为什么在for循环的每一步都分配给l

如何在Python中的无限循环中每X次仅调用一次函数?

保存FOR循环中的值以进行进一步分析

进一步研究“避免循环中的context.sync”

Java / Kotlin在步骤1的if循环中获取值,如果条件在for循环中也进行了一步

Python Selenium 一直点击下一步按钮

如何在python中模拟一个传递函数的一步

Python NEAT在某一点之后没有进一步学习

python:兰顿的蚂蚁pygame第一步问题

Python 2.7-如何计算文件中的行数并进一步使用结果

如何一步在 Python 中对字符串进行切片?

使用 python 修改字典(并将其保存以供进一步会话)

Python Selenium单击下一步按钮直到结束

如何使用Selenium从Python按下“下一步”按钮?