Я сейчас пытаюсь ускорить MIP. Подход, который я рассматривал, состоял в том, чтобы реализовать срезанный обратный вызов heuristi c с PuLP (тот, который округляет ослабленные целочисленные переменные больше чем 0,9 к 1). К сожалению, я не верю, что у PuLP есть такая функция для вызова, и я изучил модуль mip, а также dippy, но мне не хочется прыгать на них. Итак, как примечание: если кто-нибудь знает, как это можно сделать изначально с PuLP, дайте мне знать ...
Это подводит меня к моему основному вопросу. Поскольку PuLP является оберткой и может использоваться с другими решателями, я увидел, что Gurobi имеет такую функцию, и смог вызвать код для Gurobi из PuLP с кодом ниже:
Lp_prob = plp.LpProblem('Problem', plp.LpMinimize)
sd = plp.solvers.GUROBI(mip=True)
sd.actualSolve(Lp_prob, callback=mycallback)
Вот функция, которую я пытаюсь вызвать:
def mycallback(model, where):
model._vars = model.getVars()
if where == GRB.Callback.MIPNODE:
for x in model._vars:
if model.cbGetNodeRel(x) > 0.9 and model.cbGetNodeRel(x) < 1.0:
model.cbSetSolution(x, 1.0)
else:
return
Однако, после запуска несколько раз heuristi c не совсем ускоряет процесс, фактически он как бы замедляет его. Мне было интересно, если это было реализовано правильно, или я что-то упустил. Любая помощь или предложения будут с благодарностью.