改变PuLP(对于Python)约束容忍度

时间:2014-12-18 17:27:10

标签: python constraints pulp

我正在使用Python的PuLP线性编程模块来解决线性问题。

我设置问题,约束,并且我使用PuLP提供的默认解算器,即CBC(我的mac上的求解器可执行文件被称为 cbc-osx-64 ,原因很明显)。运行此可执行文件时:

 Welcome to the CBC MILP Solver
 Version: 2.7.6
 Build Date: Mar  3 2013
 Revision Number: 1770

好的,我通过PuLP运行解算器并获得解决方案。在验证约束是否满足时,我得到解决方案与我请求的(对于某些约束,而不是所有约束)之间的差异,小于1e-6但大于1e-7(例如1.6e-7) 。

当然,有一个约束容差是有意义的,这很好。但是我需要能够控制它,我认为这应该是任何LP任务中非常重要的参数吗?

那么让我们看一下CBC求解器的“帮助”(运行可执行文件并输入“?”),这些是我可以改变的参数:

 Commands are:
 Double parameters:
   dualB(ound) dualT(olerance) primalT(olerance) primalW(eight) zeroT(olerance)
 Branch and Cut double parameters:
   allow(ableGap) cuto(ff) inc(rement) integerT(olerance) preT(olerance)
   pumpC(utoff) ratio(Gap) sec(onds)
 Integer parameters:
   force(Solution) idiot(Crash) maxF(actor) maxIt(erations) output(Format)
   slog(Level) sprint(Crash)
 Branch and Cut integer parameters:
   cutD(epth) cutL(ength) depth(MiniBab) hot(StartMaxIts) log(Level) maxN(odes)
   maxS(olutions) passC(uts) passF(easibilityPump) passT(reeCuts) pumpT(une)
   strat(egy) strong(Branching) trust(PseudoCosts)
 Keyword parameters:
   allC(ommands) chol(esky) crash cross(over) direction error(sAllowed)
   fact(orization) keepN(ames) mess(ages) perturb(ation) presolve
   printi(ngOptions) scal(ing) timeM(ode)
Branch and Cut keyword parameters:
   clique(Cuts) combine(Solutions) combine2(Solutions) cost(Strategy) cplex(Use)
   cuts(OnOff) Dins DivingS(ome) DivingC(oefficient) DivingF(ractional)
   DivingG(uided) DivingL(ineSearch) DivingP(seudoCost) DivingV(ectorLength)
   feas(ibilityPump) flow(CoverCuts) gomory(Cuts) greedy(Heuristic)
   heur(isticsOnOff) knapsack(Cuts) lagomory(Cuts) lift(AndProjectCuts)
   local(TreeSearch) mixed(IntegerRoundingCuts) node(Strategy)
   pivotAndC(omplement) pivotAndF(ix) preprocess probing(Cuts)
   rand(omizedRounding) reduce(AndSplitCuts) residual(CapacityCuts) Rens Rins
   round(ingHeuristic) sos(Options) two(MirCuts) Vnd(VariableNeighborhoodSearch)
 Actions or string parameters:
   allS(lack) barr(ier) basisI(n) basisO(ut) directory dualS(implex)
   either(Simplex) end exit export gsolu(tion) help import initialS(olve)
   max(imize) min(imize) para(metrics) primalS(implex) printM(ask) quit
   saveS(olution) solu(tion) stat(istics) stop
 Branch and Cut actions:
   branch(AndCut) doH(euristic) prio(rityIn) solv(e)

这些参数的值具有值:

 dualTolerance has value 1e-07
 primalTolerance has value 1e-07
 zeroTolerance has value 1e-20
 allowableGap has value 0
 integerTolerance has value 1e-06
 preTolerance has value 1e-08
 ratioGap has value 0

唯一可以与约束容差相关联并且与我的观察结果一致的参数是“integerTolerance”。

所以,我将这个容差改为1e-8但得到了相同的结果(也就是说,解决方案与基本事实的差异超过1e-7)。

问题: 任何人都可以对此有所了解吗?特别是,有没有办法设置约束容差(找到的解决方案与我们要求的解决方案之间的差异)? 如果不是CBC,你知道其他任何可以设定这个数量的求解器(GLPK,Gurobi等)吗?

感谢。

2 个答案:

答案 0 :(得分:1)

至少在最新的纸浆版本中,您可以通过参数直接设置它。

https://pythonhosted.org/PuLP/solvers.html

参数fracgap应该对我有用。

答案 1 :(得分:0)

我无法给你一个确切的答案,但我会尝试原始或双重容忍。整数容忍对我的约束没有意义。

你知道如何通过Python界面更改这些选项(我想试验它,但不想调用命令行工具,而且我无法将选项传递给解算器)?