这是在 MIP/Gurobi 中设置最小最大约束的方法。
想法:首先,创建一个名为 max_distance. 的新变量,这是 MIP 将尝试最小化的变量。
现在添加约束,每个 (i,j) 组合一个,这样:
dist[i][j] * Z[i][j] <= max_distance
上面将负责推动max_distance 至少与最大的 Dij 一样大。并且目标函数会让max_distance尽可能的小。
要使后面的代码正常工作,您必须做两件事。
- 添加“选择”首选 Zij 集的实际约束
- 用您的实际距离替换我的随机值。
MinMax 的 Gurobi (Python) 代码
这是您在 Gurobi (Python) 中的处理方式。我没有安装 Gurobi,所以这还没有得到验证。就是为了说明min max的思想。
import sys
import math
import random
import itertools
from gurobipy import *
#Create 10 points (nodes i and j) with random values.
# replace this with your distances.
N=10
random.seed(1)
points = [(random.randint(0,100),random.randint(0,100)) for i in range(n)]
dist = {(i,j) :
math.sqrt(sum((points[i][k]-points[j][k])**2 for k in range(2)))
for i in range(n) for j in range(i)}
m = Model()
# minimize 1 * maxDistvar
mdvar = m.addVar(lb=0.0, obj=1.0, GRB.CONTINUOUS, "maxDistvar")
# Create the Zij variables
vars = tupledict()
for i,j in dist.keys():
vars[i,j] = m.addVar(vtype=GRB.BINARY,
name='z[%d,%d]'%(i,j))
#set up limit max distance constraints
# Maxdistvar is greater than or equal to the largest dist[i, j]
for i in range(N):
for j in range(i):
m.addConstr(vars[i,j]*dist[i, j] <= mdvar, 'maxDist[%d,%d]'%(i,j))
# Also, add your constraints that 'select' \
# certain Zij to be 0 or 1 based on other criteria
# These will decide if Zij is part of your solution.
# Solve
m.optimize()
并打印出选定的 Zij's。希望对您有所帮助。