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