4

我会尽量让我的问题简短而简单。如果您需要任何进一步的信息,请告诉我。

我有一个 MIP,在 Python 中使用包 PuLP 实现。(大约 100 个变量和约束)问题的数学公式来自一篇研究论文。本文还包括一项数值研究。但是,我的结果与作者的结果不同。

我的问题变量被称为prob

prob = LpProblem("Replenishment_Policy", LpMinimize)

我解决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

我的假设是 PuLP 的求解器近似于解决方案。计算速度非常快,但显然不是很准确。有没有办法可以提高 PuLP 正在使用的求解器的准确性?我正在寻找类似的东西:prob.solve(accuracy=100%).我查看了文档,但不知道该怎么做。有什么想法可能是什么问题?

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

4

1 回答 1

2

ayhan 给出了我的问题的答案fracGap:要指定求解器的准确性,您可以使用所选求解器的参数。

prob.solve(solvers.PULP_CBC_CMD(fracGap=0.01))

但是,我提出的问题与我遇到的问题不一致。结果的偏差确实与求解器的准确性无关(正如 sascha 在评论中指出的那样)。

我的问题的原因: 我实现的算法是在非平稳随机需求下优化(Rn,Sn)策略的订单策略参数。上述论文是: Tarim, SA 和 Kingsman, BG (2006)。具有非平稳随机需求的库存系统的建模和计算 (R n, S n) 策略。欧洲运筹学杂志,174(1),581-599。

该算法有两个二进制变量delta[t]P[t][j]。以下两个约束只允许 0 和 1 的值P[t][j],只要delta[t]定义为二进制即可。

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)])

由于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")

最小化返回的目标值:1704.20

在研究了很长一段时间的解决方案后,我注意到论文的一部分说:

...因此即使将 P_tj 声明为连续变量,它仍必须采用二进制值。因此,二进制变量的总数减少为周期总数 N。

因此,我将变量的cat参数更改P[t][j]cat="Continuous". 在不改变任何其他东西的情况下,我得到了较低的客观价值1702.81。结果的状态显示在这两种情况下:Optimal

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

于 2017-06-29T16:23:53.990 回答