Усовершенствованная эвристика для проблемы маршрутизации транспортных средств MIP в PuLP - PullRequest
0 голосов
/ 08 апреля 2020

Я сейчас пытаюсь ускорить 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 не совсем ускоряет процесс, фактически он как бы замедляет его. Мне было интересно, если это было реализовано правильно, или я что-то упустил. Любая помощь или предложения будут с благодарностью.

...