我正在使用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)
但是我有一个错误。我该如何解决这个问题?