最小化Gurobi最佳值的最大值

时间:2018-06-09 16:18:13

标签: python linear-programming gurobi

我正在使用gurobi和python开发一个解决MIP问题的模型。问题涉及一组预定义路线上的旅行时间。我想要实现的目标函数之一是最小化所选路线的最大行程时间。这种数学表示是: min f = max(Dij * Zij)
其中D是每条路线的旅行时间ij和Z是指示路径ij是否是解决方案的一部分的赋值变量,因此如果未选择路线,则表达式的计算结果为0.什么是模拟此模型的最佳方法Gurobi for python?

1 个答案:

答案 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.将我的随机值替换为您的实际距离。

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 = 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。希望有所帮助。