我正在解决一个非常大的LP - 一个没有0的基本可行解决方案(BFS)。我想知道如果通过解算器一个基本可行的解决方案,我可以加快这个过程。寻找以下内容:solver.setBasicFeasibleSolution()
。我将在下面制定一个玩具实例(约束更少),并告诉你我的意思。
from ortools.linear_solver import pywraplp
def main():
# Instantiate solver
solver = pywraplp.Solver('Toy',
pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
# Variables
x = solver.NumVar(-1, solver.infinity(), 'x')
y = solver.NumVar(-1, solver.infinity(), 'y')
z = solver.NumVar(-1, solver.infinity(), 'z')
# Constraint 1: x + y >= 10.
constraint1 = solver.Constraint(10, solver.infinity())
constraint1.SetCoefficient(x, 1)
constraint1.SetCoefficient(y, 1)
# Constraint 2: x + z >= 5.
constraint2 = solver.Constraint(5, solver.infinity())
constraint2.SetCoefficient(x, 1)
constraint2.SetCoefficient(z, 1)
# Constraint 3: y + z >= 15.
constraint2 = solver.Constraint(15, solver.infinity())
constraint2.SetCoefficient(y, 1)
constraint2.SetCoefficient(z, 1)
# Objective function: min 2x + 3y + 4z.
objective = solver.Objective()
objective.SetCoefficient(x, 2)
objective.SetCoefficient(y, 3)
objective.SetCoefficient(z, 4)
objective.SetMinimization()
# What I want:
"""
solver.setBasicFeasibleSolution({x: 10, y: 5, z: 15})
"""
solver.Solve()
[print val.solution_value() for val in [x, y, z]]
希望这样的东西可以加快速度(如果求解器必须使用两个阶段单纯形来找到初始BFS或大M方法)。
此外,如果有人能指出我的python API文档 - 而不是Google提供的示例 - 这将非常有用。想要了解ortools解算器中可用的对象,它们的方法是什么,以及它们的返回值和模式是什么。有点像C ++文档。
当然,也欢迎其他资源。
答案 0 :(得分:3)
对文档进行抓取,提到this seems to be the API-docs用于基于C ++的求解器和基于swig的python绑定。
在此范围内,您会发现MPSolver:
SetStartingLpBasis
返回类型:void
参数:const std :: vector& variable_statuses,const std :: vector& constraint_statuses
高级用法:增量。此函数采用在下一个LP Solve()调用中使用的起始基础。可以通过MPVariable或MPConstraint的basis_status()函数检索当前解决方案的状态。警告:使用Glop时,您应该在使用此时禁用预解决,因为此信息不会与预解决同步修改,并且可能对预先解决的问题没有多大意义。
警告在某种程度上让我想知道这是否适合你(节省时间)。
如果你没有充分的理由坚持使用GLOP(看起来很有趣!),请使用CoinORs Clp(令人沮丧的文档状态;但imho是最好的开源LP解算器,包括一些有趣的崩溃-procedures)!我认为它甚至在ortools中接口。 (Mittelmann Benchmarks,它甚至击败了CPLEX。但就科学评估而言,它只表明它具有很强的竞争力!)
或者如果它非常大并且你不需要类似Simplex的解决方案,那就选择一种内点法(Clp有一个;没有关于质量的信息)。