2017-01-19 25 views
2

我正在与Gurobi 7.0的多目标功能工作,我有两个目标函数:如何在Gurobi中编写多目标函数?

  1. 首先判定变量的乘积的总和最小化与系数矩阵-1
  2. 第二最小化产品的总和决策变量与系数矩阵-2

我正在使用分层或词典方法,其中我为每个目标设置优先级,并按优先级顺序进行优化。 我不能在这里使用model.setObjective()函数,因为我将无法指定目标函数编号,模型会变得混乱。我怎样才能写出两个目标函数?

+0

链接 'Gurobi' 优化器(商业产品)的定义:www.gurobi.com。如果您在这里没有得到答案,请尝试他们的支持小组:https://groups.google.com/forum/#!forum/gurobi –

+0

@TerryJanReedy好的,谢谢! – ash25

+0

阅读此:https://www.gurobi.com/documentation/7.0/refman/multiple_objectives.html,并编写一些代码,然后更新您的问题。 –

回答

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,合)。

参数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() 
+0

感谢您的帮助,但我有两个目标函数,如 'obj1 = quicksum(Matrix2 [j] [k] * variable1 [j,k],范围为(0,m) ))'' 'obj2 = quicksum('0','')范围内(0,n)中的k在范围(0,m)中的矩阵2 [j,k] *变量1 [j,k])' 我怎么写它在你指定的代码? – ash25

+0

@ JG25你可以分享目标的数学公式吗? – Romerito

+0

@ JG25我改变了答案,以解释如何根据成本定义目标函数。 – Romerito