2017-01-19 16 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, 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() 
+0

Спасибо за вашу помощь, но у меня есть две объектные функции: '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)) ' Как это записать в вашем указанном коде? – ash25

+0

@ JG25 Можете ли вы поделиться математической формулировкой целей? – Romerito

+0

@ JG25 Я изменил ответ, чтобы объяснить, как определить целевую функцию на основе стоимости. – Romerito

 Смежные вопросы

  • Нет связанных вопросов^_^