PuLP - 如何指定求解器的精度

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%).我查看了文档,但不知道该怎么做。有什么想法可能是什么问题吗?

任何帮助表示赞赏。谢谢。

Axe*_*xel 2

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

我仍然不确定所有这些方面是如何相互关联的,但我想这周对我来说很有效。对于遇到这个问题的其他人来说,可能会通过本文顶部给出的答案找到必要的帮助。