Python 纸浆-如何指定解算器';s精度

Python 纸浆-如何指定解算器';s精度,python,linear-programming,solver,pulp,mixed-integer-programming,Python,Linear Programming,Solver,Pulp,Mixed Integer Programming,我会尽量使我的问题简短。如果你需要任何进一步的信息,请告诉我 我有一个MIP,用Python实现,并带有包PuLP。(大约100个变量和约束)这个问题的数学公式来自一篇研究论文。本文还包括数值研究。然而,我的结果与作者的结果不同 我的问题变量称为prob prob = LpProblem("Replenishment_Policy", LpMinimize) 我用prob.solve() LpStatus返回Optimal 当我把一些最佳(纸上)结果作为约束条件添加时,我得到了一个稍微好一点的

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

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

我的问题变量称为
prob

prob = LpProblem("Replenishment_Policy", LpMinimize)
我用
prob.solve()
LpStatus
返回
Optimal

当我把一些最佳(纸上)结果作为约束条件添加时,我得到了一个稍微好一点的目标值。将objecive函数约束为稍低的值也是如此。LpStatus保持最佳状态

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
原目标值:合计=1704.20
决策变量:股票[1]=370
添加约束:prob+=stock[1]==379
新目标值:1704.09

添加约束:prob+=prob.objective我的问题的答案由ayhan给出:要指定解算器的精度,可以使用所选解算器的
fracGap
参数

prob.solve(solvers.PULP_CBC_CMD(fracGap=0.01))
然而,我问的问题与我的问题并不一致。结果的偏差实际上与解算器的准确性无关(正如sascha在评论中指出的)

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

该算法有两个二进制变量
delta[t]
p[t][j]
。以下两个约束仅允许
P[t][j]
的值为0和1,只要
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

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


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

您可能正在使用默认解算器CBC。在这种情况下,我使用
prob.solve(solvers.palp\u CBC\u CMD(fracGap=0.01))
其中fracGap是最佳解决方案的公差(精度在1%以内)。如果你减少这个,你的准确度就会提高。我不认为传递0会因为浮点问题而起作用,但当然,对于LP,可以大大降低它。
计算速度非常快,但显然不是非常准确
这表明存在问题或误解,由于使用默认配置的有效解决方案与最佳解决方案之间的差异应小于0.1%。感谢您的快速回复。不幸的是,@ayhan的建议并没有改善结果。正如@sascha正确提到的,两个有效解决方案之间的差异大于默认的fracGap。这可能意味着错误在其他地方。解算器的
fracGap
是否也适用于约束?如果没有,我可以如何/在哪里指定?fracGap适用于解决方案。所有解决方案都必须可行=满足约束条件!确保您的解决方案是有效的解决方案,意思是:检查解算器的状态。@Axel我怀疑是解算器的准确性导致了差异。你能公布你得到的obj函数值和公布的值吗?我怀疑其中一个系数可能有点偏离。