Я использую оптимизацию 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)
Но я получил ошибку.Как я могу решить эту проблему?