1

我正在使用 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 等)?

谢谢。

4

2 回答 2

1

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

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

参数 fracgap 应该为我做。

于 2015-06-22T21:37:53.410 回答
0

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

您知道如何通过 Python 界面更改这些选项(我想尝试一下,但不想调用命令行工具,并且无法将选项传递给求解器)?

于 2015-01-18T22:55:05.653 回答