【问题标题】:Minimize the max value in Gurobi optimaztion最小化 Gurobi 优化中的最大值
【发布时间】:2022-01-28 11:40:04
【问题描述】:

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

【问题讨论】:

    标签: python linear-programming gurobi


    【解决方案1】:

    这是在 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 = 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。希望对您有所帮助。

    【讨论】:

    • 您的建议奏效了。我能够使用 gurobi 语法在一行中创建旅行时间约束:` #Constraint:所有旅行时间必须小于人旅行时间决策 var m.addConstrs(trav_time[c,b]*z[c,b]
    • 很高兴听到这个消息。谢谢。
    • 这段代码有一个错误:应该是m.addVar而不是model.addVar
    • @AntonioDaSilva 是的,你是对的!谢谢你抓住那个。我现在已经修好了。
    猜你喜欢
    • 2018-08-10
    • 2012-05-03
    • 2016-09-15
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多