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

时间:2017-01-19 20:43:01

标签: python model gurobi

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

  1. 首先将决策变量的乘积与系数矩阵-1的总和最小化
  2. 其次将决策变量的乘积与系数矩阵-2的总和最小化
  3. 我正在使用分层或词典编纂方法,其中我为每个目标设置优先级,并按优先级顺序进行优化。 我不能在这里使用model.setObjective()函数,因为我无法指定目标函数编号,模型会混淆。我怎样才能写出两个目标函数?

1 个答案:

答案 0 :(得分:1)

我一直在测试此功能。

文档对于我们必须设置目标函数的方式并不太清楚。但是,我做了以下事情:

  • 定义与目标函数相关的变量(成本等)
  • 然后我更改了目标数量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 ()