Python 如何在Gurobi中编写多目标函数?

Python 如何在Gurobi中编写多目标函数?,python,model,gurobi,Python,Model,Gurobi,我正在使用Gurobi 7.0的多目标功能,我有两个目标功能: 首先最小化决策变量与系数矩阵-1的乘积之和 第二,最小化决策变量与系数矩阵-2的乘积之和 我使用分层或词典方法,在这种方法中,我为每个目标设置优先级,并按优先级顺序进行优化。 我不能在这里使用model.setObjective()函数,因为我将无法指定目标函数编号,并且模型将被混淆。如何编写这两个目标函数?我一直在测试此功能 文件中没有太清楚地说明我们必须如何设置目标函数。然而,我做了以下工作: 定义与目标函数(成本等)相关的变

我正在使用Gurobi 7.0的多目标功能,我有两个目标功能:

  • 首先最小化决策变量与系数矩阵-1的乘积之和
  • 第二,最小化决策变量与系数矩阵-2的乘积之和
  • 我使用分层或词典方法,在这种方法中,我为每个目标设置优先级,并按优先级顺序进行优化。
    我不能在这里使用
    model.setObjective()
    函数,因为我将无法指定目标函数编号,并且模型将被混淆。如何编写这两个目标函数?

    我一直在测试此功能

    文件中没有太清楚地说明我们必须如何设置目标函数。然而,我做了以下工作:

    • 定义与目标函数(成本等)相关的变量
    • 然后我改变了目标的数量
      m.NumObj=3
    • 为每个目标设置参数

      m.setParam(GRB.Param.ObjNumber, 0)
      m.ObjNPriority = 5
      m.ObjNName = 'Z'
      m.ObjNRelTol = x/10.0
      m.ObjNAbsTol = 0
      Z.objN = 1.0
      
      m.setParam(GRB.Param.ObjNumber, 1)
      m.ObjNPriority = 4
      m.ObjNName = 'Custo'
      m.ObjNRelTol = x/10.0
      m.ObjNAbsTol = 0
      m.ObjNWeight = -1.0
      Custo.ObjN = 1.0
      
      m.setParam(GRB.Param.ObjNumber, 2)
      m.ObjNPriority = 10
      m.ObjNName = 'Hop'
      m.ObjNRelTol = x/10.0
      m.ObjNWeight = -1.0
      Hop.ObjN = 1.0
      
    在我的例子中,有三个目标函数(Z、Custo、Hop)

    参数
    GRB.Param.ObjNumber
    用于更改正在处理的目标函数

    我得出的另一个结论是,目标的数量是根据我们定义与其相关变量的顺序来定义的(据我所知)

    有关目标函数定义的详细信息

        Custo = m.addVar(vtype=GRB.INTEGER, name="Custo", obj=1)
        m.update ()
    
        expr  = []
        for k in xrange (1, KSIZE ):
            expr.append ( quicksum (var_y[ (l[0],l[1],k) ] * links[l][0] for l in links.keys()) )
            expr.append ( quicksum (var_y[ (l[1],l[0],k) ] * links[l][0] for l in links.keys()) )
        m.addConstr (quicksum (expr) == Custo, name= ' custo')
        m.update ()
    

    “古洛比”优化器(商业产品)链接:www.Gurobi.com。如果您在这里没有得到答案,请尝试他们的支持小组:@TerryJanReedy好的,谢谢!阅读以下内容:,并编写一些代码,然后更新您的问题。感谢您的帮助,但我有两个目标函数,如'obj1=quicksum(Matrix2[j][k]*variable1[j,k]表示范围内的k(0,m)表示范围内的j(0,n))''obj2=quicksum(Matrix2[j][k]*variable1[j,k]表示范围内的k(0,m)表示范围内的j(0,n))“我如何在您指定的代码中编写它?@JG25您能分享目标的数学公式吗?@JG25我更改了答案,解释了如何根据成本定义目标函数。