我正在使用Gurobi 7.0的多目标功能,我有两个目标函数:
我正在使用分层或词典编纂方法,其中我为每个目标设置优先级,并按优先级顺序进行优化。
我不能在这里使用model.setObjective()
函数,因为我无法指定目标函数编号,模型会混淆。我怎样才能写出两个目标函数?
答案 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 ()