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

2024-06-25 22:52:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我会尽量使我的问题简短明了。如果你需要更多的信息,请告诉我。在

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

我的问题变量是prob

prob = LpProblem("Replenishment_Policy", LpMinimize)

我用prob.solve()来解决这个问题 LpStatus返回Optimal

当我把一些最优(论文)结果作为约束条件加起来,我得到了一个稍微好一点的客观值。将objeve函数约束为略低的值也是如此。LpStatus保持Optimal。在

^{pr2}$

我的假设是纸浆的解算器近似解。计算很快,但显然不是很准确。有没有方法可以提高纸浆求解器的精确度?我在找这样的东西:prob.solve(accuracy=100%).我看了一下documentation,但不知道该怎么办。你有什么想法吗?在

感谢任何帮助。谢谢。在


Tags: 信息policyoptimal作者数学公式纸浆pulp数值
1条回答
网友
1楼 · 发布于 2024-06-25 22:52:28

我的问题的答案是由ayhan给出的:要指定解算器的精度,可以使用所选解算器的fracGap参数。在

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

然而,我提出的问题与我所面临的问题并不一致。结果的偏差确实不是求解器的精度问题(正如sascha在评论中指出的那样)。在

我的问题的原因: 我所实现的算法是在非平稳随机需求下,对a(Rn,Sn)策略的订货策略参数进行优化。上述文件为: 塔里木,S.A.,和金斯曼,B.G.(2006)。非平稳随机需求库存系统的建模与计算策略。欧洲运筹学杂志,174(1),581-599。

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

^{pr2}$

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

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

... it follows that P_tj must still take a binary value even if it is declared as a continuous variable. Therefore, the total number of binary variables reduces to the total number of periods, N.

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

我仍然不确定所有这些方面是如何相互关联的,但我想这对我来说是有效的。对于其他人谁是直接指向这个问题,可能会找到必要的帮助与答案在这篇文章的顶部。在

相关问题 更多 >