Как минимизировать максимальное значение переменных - PullRequest
0 голосов
/ 23 декабря 2018

Я использую оптимизацию gurobi для решения проблемы.В этой задаче у меня есть некоторые переменные и некоторые ограничения, которые выбирают соответствующие переменные и их значение.Моя цель - минимизировать максимальное значение переменных.

На самом деле у меня есть n узлов и предопределенный набор M из других узлов длиной m.каждый член этого предопределенного набора M соединен со всеми n узлами с назначенным весом.Теперь между всеми подмножествами с длиной s из множества M, которые соответствуют моим ограничениям, я хочу найти тот, который имеет меньший максимальный вес.Ниже приведен полукод и упрощенный пример:

from gurobipy import *
N = [n1,n2,n3,n4,n5]
M = [m1,m2,m3,m4]

try:

  m = Model("model")

  Edges = tuplelist([(m1,n1),(m1,n2),(m1,n3),(m1,n4),(m1,n5),
                     (m2,n1),(m2,n2),(m2,n3),(m2,n4),(m2,n5),
                     (m3,n1),(m3,n2),(m3,n3),(m3,n4),(m3,n5),
                     (m4,n1),(m4,n2),(m4,n3),(m4,n4),(m4,n5)
                   ])

  weight = {
            (m1,n1): 1, (m1,n2): 4, (m1,n3): 7, (m1,n4): 2, (m1,n5): 4,
            (m2,n1): 7, (m2,n2): 4, (m2,n3): 3, (m2,n4): 1, (m2,n5): 9,
            (m3,n1): 3, (m3,n2): 2, (m3,n3): 1, (m3,n4): 6, (m3,n5): 2,
            (m4,n1): 5, (m4,n2): 1, (m4,n3): 6, (m4,n4): 4, (m4,n5): 3
            }  

  x = m.addVars(Edges, vtype=GRB.BINARY, name = "x")

  m.setObjective(quicksum(x[w,s]*weight[w,s] for w,s in Edges), GRB.MINIMIZE)

  m.addConstr("constraint 1"))
  m.addConstr("constraint 2"))
  m.addConstr("constraint 3"))
  ...

  m.optimize()
  for v in m.getVars():
      print (v.varname , v.x)

  print('Obj:', m.objVal)

except GurobiError:
print('Error reported')

Но моя проблема в том, что "quicksum" не очень хороший способ, потому что, например, в этом случае две ссылки с весами "5"и «3» лучше, чем две ссылки с весами «4» и «4».в то время как для меня "4" и "4" лучше.Я попытался решить эту проблему следующим образом:

obj = max(x[w,s]*weight[w,s] for w,s in Edges)
m.setObjective(obj, GRB.MINIMIZE)

Но я получил ошибку.Как я могу решить эту проблему?

...