Axe*_*xel 5 python linear-programming solver pulp mixed-integer-programming
我会尽量让我的问题简短明了。如果您需要任何进一步的信息,请告诉我。
我有一个 MIP,用 Python 包 PuLP 实现。(大约 100 个变量和约束)问题的数学表述来自一篇研究论文。本文还包括一项数值研究。然而,我的结果与作者的结果不同。
我的问题变量叫做prob
prob = LpProblem("Replenishment_Policy", LpMinimize)
Run Code Online (Sandbox Code Playgroud)
prob.solve()
LpStatus我通过退货解决问题Optimal
当我添加一些最佳(论文)结果作为约束时,我得到了稍微更好的客观值。将目标函数限制为稍低的值也是如此。LpStatus 保持不变Optimal。
original objective value: total = 1704.20
decision variable: stock[1] = 370
adding constraints: prob += stock[1] == 379
new objective value: 1704.09
adding constraints: prob += prob.objective <= 1704
new objective value: 1702.81
Run Code Online (Sandbox Code Playgroud)
我的假设是 PuLP 的求解器近似解。计算速度很快,但显然不太准确。有没有办法可以提高 PuLP 所使用的求解器的精度?我正在寻找类似的内容:prob.solve(accuracy=100%).我查看了文档,但不知道该怎么做。有什么想法可能是什么问题吗?
任何帮助表示赞赏。谢谢。
ayhan 给出了我的问题的答案fracGap:要指定求解器的精度,您可以使用所选求解器的参数。
prob.solve(solvers.PULP_CBC_CMD(fracGap=0.01))
Run Code Online (Sandbox Code Playgroud)
但是,我提出的问题与我遇到的问题不一致。结果的偏差确实不是求解器准确性的问题(正如 sascha 在评论中指出的那样)。
我的问题的原因: 我实现的算法是在非平稳、随机需求下优化 (Rn, Sn) 策略的订单策略参数。上述论文为: Tarim, SA, & Kingsman, BG (2006)。具有非平稳随机需求的库存系统的建模和计算(R n,S n)策略。欧洲运筹学杂志,174(1), 581-599。
该算法有两个二元变量delta[t]和P[t][j]。P[t][j]只要delta[t]定义为二进制,以下两个约束仅允许 的值为 0 和 1 。
for t in range(1, T+1):
prob += sum([P[t][j] for j in range(1, t+1)]) == 1
for j in range(1, t+1):
prob += P[t][j] >= delta[t-j+1] - sum([delta[k] for k in range(t-j+2, t+1)])
Run Code Online (Sandbox Code Playgroud)
由于P[t][j]只能取 0 或 1 的值,因此是一个二进制变量,我将其声明如下:
for t in range(1, T+1):
for j in range(1, T+1):
P[t][j] = LpVariable(name="P_"+str(t)+"_"+str(j), lowBound=0, upBound=1, cat="Integer")
Run Code Online (Sandbox Code Playgroud)
最小化回报的目标值:1704.20
在研究了很长一段时间的解决方案之后,我注意到论文的一部分说:
...因此,即使 P_tj 被声明为连续变量,它仍然必须采用二进制值。因此,二元变量的总数减少为周期总数 N。
因此我将变量cat的参数更改P[t][j]为cat="Continuous"。在不改变任何其他内容的情况下,我得到了较低的客观值1702.81。两种情况下结果的状态均显示:Optimal
我仍然不确定所有这些方面是如何相互关联的,但我想这周对我来说很有效。对于遇到这个问题的其他人来说,可能会通过本文顶部给出的答案找到必要的帮助。
| 归档时间: |
|
| 查看次数: |
6109 次 |
| 最近记录: |