我正在寻找使用Simplex算法或其喜欢的任何LP(线性程序)解算器。我有一个额外的请求,求解器将执行所有的计算而不会有任何精度损失!!
因此,如果我能找到一个基于模板的C ++库,让我定义它使用的数值变量的下划线类型,我会让它使用boost的类型cpp_ratinal,因此所有的计算都赢了&#39 ;由于浮点的舍入,t会损失任何精度。
这样的C ++库是否存在?
答案 0 :(得分:0)
SoPlex和QSOpt都有精确的单纯形求解器。他们的表现会比你的建议更好。但是,我应该警告你,SoPlex的精确单纯形求解器实际上并不起作用;用SoPlex报告不可行性的理性数据构建一个可行的线性程序是相当简单的。
在整个求解过程中使用精确算法并不是一个好主意。你最终必须在精确算术中减少大矩阵,并且所涉及的确切数字变得非常大。我相信GLPK的精确求解器在理性算术中运行单纯形;你可以玩它,看看你对它的表现有多喜欢。
在内点求解器中,SDPA-GMP是一种内点方法,用于使用任意精度算法的线性规划的泛化。您必须决定要使用的精度,但是您可以使用SDPA-GMP获得非常高精度的解决方案,然后进行某种高精度交叉以获得精确的最佳解决方案。 (我从来没有尝试过这个,因为我从来都不想完全解决LP。)在这种情况下,我怀疑基于单纯形的求解器比IPM运行得更快。
答案 1 :(得分:-1)
看看SoPlex:
SoPlex使用一种名为"迭代细化的技术"将解决方案质量提高到任意精度。所有单纯形操作均以双精度算法执行,以在短时间内获得接近最优的解。然后,在略微修改(减少误差)LP上执行非常少的枢轴以确定精确解。 它以模板方式使用GMP,Gnu多精度库 - 如果你不喜欢GMP,你也可以使用cpp_rational。 在当前版本中,LU分解尚不具备精确算法,因此您无法获得最佳的最佳证明。这已经在我们的开发人员版本中实现,但将在今年年底发布。