我正在使用gurobi和python开发一个解决MIP问题的模型。问题涉及一组预定义路线上的旅行时间。我想要实现的目标函数之一是最小化所选路线的最大行程时间。这种数学表示是:
min f = max(Dij * Zij)
其中D是每条路线的旅行时间ij和Z是指示路径ij是否是解决方案的一部分的赋值变量,因此如果未选择路线,则表达式的计算结果为0.什么是模拟此模型的最佳方法Gurobi for python?
答案 0 :(得分:2)
以下是如何在MIP / Gurobi中设置最小最大约束。
想法:首先,创建一个名为max_distance.
的新变量。这是MIP尝试最小化的内容。
现在添加约束,每个(i,j)组合一个约束,以便:
dist[i][j] * Z[i][j] <= max_distance
以上将注意推动max_distance
至少与最大的Dij一样大。而目标函数将使max_distance尽可能小。
要使后续代码工作,您必须做两件事。 1.添加“选择”首选Zij集的实际约束 2.将我的随机值替换为您的实际距离。
以下是您在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 = model.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。希望有所帮助。