Ограничение времени для смешанного целочисленного программирования с Python PuLP

Я использовал PuLP для решения конкретной интересующей меня смешанной целочисленной линейной программы (MIP). Однако , поскольку размер проблемы растет, PuLP занимает слишком много времени. Я хочу иметь возможность запустить решатель в течение некоторого времени и преждевременно завершить его, если это займет слишком много времени, и получить наилучшее возможное решение, вычисленное на данный момент. Я попытался вручную синхронизировать решатель с помощью сигнала, но все переменные равны «Нет».

Я просмотрел документацию, и PuLP, похоже, не поддерживает это, хотя, насколько я понимаю, большинство вызываемых им процедур решателя поддерживают. Есть ли способ установить ограничение по времени для PuLP?


person eepperly16    schedule 27.12.2017    source источник
comment
Он поддерживается, и его использование в некоторой степени зависит от используемого решателя. Более внимательно просмотрите документы.   -  person sascha    schedule 27.12.2017


Ответы (2)


Вместо прямого вызова метода resolve () вы можете самостоятельно вызывать шаги, выполняемые с помощью функции resolve (). Вот пример использования cplex python api

#Create your problem
P = pulp.LpProblem()

#Build the solverModel for your preferred
solver = pulp.CPLEX_PY()
solver.buildSolverModel(P)

#Modify the solvermodel
solver.solverModel.parameters.timelimit.set(60)

#Solve P
solver.callSolver(P)
status = solver.findSolutionValues(P)

После buildSolverModel () solver.solverModel содержит экземпляр API решателя. Затем вы можете использовать все функции из документации решателя. Я использовал cplex, но в gurobi можно использовать тот же подход, что и http://www.gurobi.com/documentation/7.5/refman/python_parameter_examples.html#PythonParameterExamples

person user3053216    schedule 12.04.2018
comment
здесь - это код для установки максимального количества секунд (время out) для решателя CBC - person Prakash M; 06.03.2020

В пульпе вы можете вызвать другие внешние решатели, такие как cplex и gurobi. Обычно вы можете установить ограничение по времени и оптимальный промежуток в их параметрах при вызове решателей. Возьмем, к примеру, гуроби:

prob = LpProblem("anything", LpMinimize) prob.solve(GUROBI(timeLimit=1200))

Вы можете найти конкретные параметры в исходном коде pulp. https://github.com/coin-or/pulp/blob/master/src/pulp/solvers.py

Например, если вы используете gurobi, см. Параметры инициализации.

class GUROBI(LpSolver):
"""
The Gurobi LP/MIP solver (via its python interface)
The Gurobi variables are available (after a solve) in var.solverVar
Constriaints in constraint.solverConstraint
and the Model is in prob.solverModel
"""
try:
    sys.path.append(gurobi_path)
    # to import the name into the module scope
    global gurobipy
    import gurobipy
except: #FIXME: Bug because gurobi returns
        #a gurobi exception on failed imports
    def available(self):
        """True if the solver is available"""
        return False
    def actualSolve(self, lp, callback = None):
        """Solve a well formulated lp problem"""
        raise PulpSolverError("GUROBI: Not Available")
else:
    def __init__(self,
                mip = True,
                msg = True,
                timeLimit = None,
                epgap = None,
                **solverParams):
        """
        Initializes the Gurobi solver.
        @param mip: if False the solver will solve a MIP as an LP
        @param msg: displays information from the solver to stdout
        @param timeLimit: sets the maximum time for solution
        @param epgap: sets the integer bound gap
        """
        LpSolver.__init__(self, mip, msg)
        self.timeLimit = timeLimit
        self.epgap = epgap
        #set the output of gurobi
        if not self.msg:
            gurobipy.setParam("OutputFlag", 0)
        #set the gurobi parameter values
        for key,value in solverParams.items():
            gurobipy.setParam(key, value)
person Yaning Li    schedule 20.03.2018