我正在使用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等)吗?
感谢。
答案 0 :(得分:1)
答案 1 :(得分:0)
我无法给你一个确切的答案,但我会尝试原始或双重容忍。整数容忍对我的约束没有意义。
你知道如何通过Python界面更改这些选项(我想试验它,但不想调用命令行工具,而且我无法将选项传递给解算器)?