Python 古罗比多目标函数递阶退化

Python 古罗比多目标函数递阶退化,python,python-3.x,gurobi,Python,Python 3.x,Gurobi,我试图实现一个具有多个目标函数(特别是2)的Gurobi模型,该模型以字典形式(在层次结构中)解决问题,但我遇到了一个问题,即当优化第二个目标函数时,它会将解决方案降级为第一个目标函数,这在层次结构优化中不应该发生。它将第一个解决方案降级1,将第二个解决方案降级5,这可能是我在分层设置模型时的错误吗?这是我设置模型的代码: m = Model('lexMin Model') m.ModelSense = GRB.MINIMIZE variable = m.addVars(

我试图实现一个具有多个目标函数(特别是2)的Gurobi模型,该模型以字典形式(在层次结构中)解决问题,但我遇到了一个问题,即当优化第二个目标函数时,它会将解决方案降级为第一个目标函数,这在层次结构优化中不应该发生。它将第一个解决方案降级1,将第二个解决方案降级5,这可能是我在分层设置模型时的错误吗?这是我设置模型的代码:

    m = Model('lexMin Model')
    m.ModelSense = GRB.MINIMIZE
    variable = m.addVars(k.numVars, vtype=GRB.BINARY, name='variable') 
    m.setObjectiveN(LinExpr(quicksum([variable[j]*k.obj[0][j] for j in range(k.numVars)])),0)
    m.setObjectiveN(LinExpr(quicksum([variable[j]*k.obj[1][j] for j in range(k.numVars)])),1)

    for i in range(0,k.numConst): 
        m.addConstr(quicksum([k.const[i,j]*variable[j] for j in range(k.numVars)] <= k.constRHS[i]))

        m.addConstr(quicksum([variable[j]*k.obj[0][j] for j in range(k.numVars)]) >= r2[0][0])
        m.addConstr(quicksum([variable[j]*k.obj[0][j] for j in range(k.numVars)]) <= r2[1][0])
        m.addConstr(quicksum([variable[j]*k.obj[1][j] for j in range(k.numVars)]) >= r2[1][1])
        m.addConstr(quicksum([variable[j]*k.obj[1][j] for j in range(k.numVars)]) <= r2[0][1])

    m.Params.ObjNumber = 0
    m.ObjNPriority = 1
    m.update()
    m.optimize()
因此,它查找值(-14613,-12803)而不是(-14614,-12798)

默认值为1e-4。第一个目标是降低比这更低的质量。(1/14614=~0.7 e-4)。如果你降低MIPGap,你的问题就会消失。在代码中添加

m.setObjective('MipGap', 1e-6)
在优化之前

一种解释这种行为的方法是,因为您的MIPGap为1e-4,所以即使您没有第二个目标,您也会接受值为-14113的a解决方案

m.setObjective('MipGap', 1e-6)