比较lpSolve和linprog的结果,是不是实现上的问题?

Comparing the results from lpSolve to linprog, is it a problem in implementation?

我想最小化具有线性约束的线性规划系统 "equalities"。

系统总结如下代码"Python 3"

>>> obj_func = [1,1,1]
>>> const = [[[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1]]]
>>> constraints= np.reshape(const, (-1, 3))
>>> constraints
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1],
       [1, 1, 1]])
>>> rhs = [0.4498162176582741, 0.4498162176582741, 0.10036756468345168, 1.0]

使用scipy.optimization.linprg:

   >>> res = linprog(obj_func, constraints, rhs, method="interior-point", options={"disp":True})
>>> res
     con: array([], dtype=float64)
     fun: 1.4722956444515663e-09
 message: 'Optimization terminated successfully.'
     nit: 4
   slack: array([0.44981622, 0.44981622, 0.10036756, 1.        ])
  status: 0
 success: True
       x: array([4.34463075e-10, 4.34463075e-10, 6.03369494e-10])

相同的系统在 R 中总结并使用 lpSolve 最小化:

> obj.func = c(1,1,1)
> constraints = matrix(c(1,0,0,0,1,0,0,0,1,1,1,1), nrow= 4, byrow = TRUE)
> rhs = c(0.4498162+0i, 0.4498162+0i, 0.1003676+0i, 1.0000000+0i)
> f.dir = c("=","=","=","=")
>
> res = lp("min",obj.func,constraints,f.dir,rhs,compute.sens=FALSE)
> res
Success: the objective function is 1 

如上详述,虽然是同一个系统,但结果并不接近,所以我对其他系统做了同样的工作,但结果也相差甚远。

我的问题:我知道没有必要每个 LP 都有唯一的解决方案,但我认为它们应该产生接近的值!就我而言,我尝试使用两种求解器来最小化许多系统,但结果太过分了。例如,

First system: linprog gave 1.4722956444515663e-09 while lpSolve gave 1
Another system: linprog gave 1.65952852061376e-11 while lpSolve gave 0.8996324
Another system: linprog gave 3.05146726445553e-12 while lpSolve gave 0.8175745

您正在解决不同的模型。

res = linprog(obj_func, constraints, rhs, method="interior-point", options={"disp":True})

表示

res = linprog(obj_func, A_ub=constraints, b_ub=rhs, method="interior-point", options={"disp":True})

影响约束:

x0 <= 0.4498162176582741
...

而不是

x0 == 0.4498162176582741

所以 linprog 仅使用 inequalities 而 lpsolve 仅使用 equalities (没有我检查 f.dir = c("=","=","=","=") 是否在做什么我认为它正在做;但结果或多或少显示了这一点。

linprog 结果:

x: array([4.34463075e-10, 4.34463075e-10, 6.03369494e-10])

是典型的内点法零向量输出(只近似积分解)!与commercial solvers like Gurobi相反,没有交叉步骤。

阅读 docs(包含此信息)时要小心。