VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > python爬虫 >
  • 手把手教你用Gurobi求解一个数学模型(2)

i,n+1k=1, kK(4)
约束四保证每个客户点都被服务:
∑ k ∈ K ∑ ( i , j ) ∈ A x i , j k = 1 ,   ∀ i ∈ V ∖ { s , t } (5) sum_{k in K}sum_{(i,j)in A}x_{i,j}^k =1, orall i in Vsetminus {s,t} ag{5}kK(i,j)Axi,jk=1, iV{s,t}(5)
约束五保证被服务的相邻节点开始服务时间的大小关系(去回路):
s i + t i j + s e r v i − M ( 1 − x i j ) ≤ s j ,   ∀ ( i , j ) ∈ A (6) s_i+t_{ij}+serv_i-M(1-x_{ij})le s_j, orall (i,j) in A ag{6}si+tij+serviM(1xij)sj, (i,j)A(6)
约束六保证不违反客户的时间窗:
e i ≤ s i ≤ l i ,   ∀ i ∈ V ∖ { s , t } (7) e_i le s_i le l_i , orall i in Vsetminus {s,t} ag{7}eisili, iV{s,t}(7)
约束七保证不违反车辆的载重约束:
∑ ( i , j ) ∈ A x i j k q i ≤ Q k ,   ∀ k ∈ K (8) sum_{(i,j)in A}x_{ij}^kq_i le Q_k , orall k in K ag{8}(i,j)AxijkqiQk, kK(8)
最后是决策变量的取值约束:
x i j k ∈ { 0 , 1 }   ∀ ( i , j ) ∈ A , k ∈ K s i ≥ 0 ,   ∀ i ∈ V ∖ { s , t } (9) x_{ij}^kin {0,1} orall (i,j) in A,k in K \ s_i ge 0, orall i in Vsetminus {s,t} ag{9}xijk{0,1} (i,j)A,kKsi0, iV{s,t}(9)
那么(1)~(9)式就组成了Vrptw问题的数学模型。

python调用Gurobi求解Vrptw

首先我们定义一下需要用到的参数:

class Data:
    customerNum = 0
    nodeNum     = 0
    vehicleNum  = 0
    capacity    = 0
    cor_X       = []
    cor_Y       = []
    demand      = []
    serviceTime = []
    readyTime   = []
    dueTime     = []
    disMatrix   = [[]]   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  •  
  • 7

根据式(2)~(8)定义决策变量,并加入模型当中:

约束一(vehicle_depart):

for k in range(data.vehicleNum):
	//同样先定义一个线性表达式
    lhs = LinExpr(0) 
    for j in range(data.nodeNum):
        if(j != 0):
       		//约束系数与决策变量相乘	
            lhs.addTerms(1, x[0,j,k])  
    //将约束加入模型
    model.addConstr(lhs == 1, name= 'vehicle_depart_' + str(k)) 
k in range(data.vehicleNum):
    for h in range(1, data.nodeNum - 1):
        expr1 = LinExpr(0)
        expr2 = LinExpr(0)
        for i in range(data.nodeNum):
            if (h != i):
                expr1.addTerms(1, x[i,h,k])

        for j in range(data.nodeNum):
            if (h != j):
                expr2.addTerms(1, x[h,j,k])

        model.addConstr(expr1 == expr2, name= 'flow_conservation_' + str(i))
        expr1.clear()
        expr2.clear()

 

作者:夏旸,清华大学,工业工程系/深圳国际研究生院 (硕士在读) 刘兴禄,清华大学,清华伯克利深圳学院(博士在读)

 



相关教程