如何最小化变量的最大值

时间:2018-12-23 10:48:49

标签: python-3.x gurobi

我正在使用gurobi优化来解决问题。在这个问题中,我有一些变量和一些约束来选择适当的变量及其值。我的目标是最小化变量的最大值。

实际上,我有n个节点和另一个长度为m的预定义集合M。该预定义集合M的每个成员都以分配的权重连接到所有n个节点。现在,在满足我的约束的集合M中所有长度为s的子集之间,我想找到一个最大权重较小的子集。在下面有一个半代码和简化示例:

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)

但是我有一个错误。我该如何解决这个问题?

0 个答案:

没有答案