AttributeError: Unable to retrieve attribute 'ObjVal'
AnsweredThe modeling is feasible but AttributeError: Unable to retrieve attribute 'ObjVal'.
The optimization problem are shown as follows.
The code is shown as follows.
# _*_coding:utf-8 _*_
from __future__ import print_function
from typing import List, Any
from gurobipy import *
import re
import math
import matplotlib.pyplot as plt
import numpy
import pandas as pd
class Data:
vehicleNum = 3 # 卡车数量
droneNum = 2 # 无人车数量
capacity = 200 # 卡车容量
capacity_1 = 50 # 无人车容量
W = 30 # 无人车释放所需时间
w = 40 # 无人车回收所需时间
cor_X = []
cor_Y = []
demand = []
serviceTime = []
readyTime = [0, 448, 652, 30, 567, 384, 475, 99, 179, 278, 912]
dueTime = [1236, 505, 721, 92, 620, 429, 528, 148, 254, 345, 967]
disMatrix = [[]]
# function to read data from .txt files
def readData(data, path, customerNum):
data.customerNum = customerNum
data.nodeNum = customerNum + 2
f = open(path, 'r')
lines = f.readlines()
count = 0
# read the info
for line in lines:
count = count + 1
if (count == 5):
line = line[:-1].strip()
str = re.split(r" +", line)
data.vehicleNum = 3
data.capacity = float(str[1])
elif (count >= 9 and count <= 9 + customerNum):
line = line[:-1]
str = re.split(r" +", line)
data.cor_X.append(float(str[2]))
data.cor_Y.append(float(str[3]))
data.demand.append(float(str[4]))
data.readyTime.append(float(str[5]))
data.dueTime.append(float(str[6]))
data.serviceTime.append(float(str[7]))
data.cor_X.append(data.cor_X[0])
data.cor_Y.append(data.cor_Y[0])
data.demand.append(data.demand[0])
data.readyTime.append(data.readyTime[0])
data.dueTime.append(data.dueTime[0])
data.serviceTime.append(data.serviceTime[0])
# compute the distance matrix
data.disMatrix = [([0] * data.nodeNum) for p in range(data.nodeNum)] # 初始化距离矩阵的维度,防止浅拷贝
# data.disMatrix = [[0] * nodeNum] * nodeNum]; 这个是浅拷贝,容易重复
for i in range(data.nodeNum):
for j in range(data.nodeNum):
temp = (data.cor_X[i] - data.cor_X[j]) ** 2 + (data.cor_Y[i] - data.cor_Y[j]) ** 2
data.disMatrix[i][j] = math.sqrt(temp)
temp = 0
return data
def printData(data, customerNum):
print("下面打印数据")
for i in range(len(data.demand)):
print('{0}\t{1}\t{2}\t{3}'.format(data.demand[i], data.readyTime[i], data.dueTime[i], data.serviceTime[i]))
print("-------距离矩阵-------\n")
for i in range(data.nodeNum):
for j in range(data.nodeNum):
# print("%d %d" % (i, j))
print("%6.2f" % (data.disMatrix[i][j]), end=" ")
print()
class Solution:
ObjVal = 0
X = [[[]]]
Y = [[[[]]]]
C = [[]]
Ct = [[[]]]
Vl = [[[]]]
Vr = [[[]]]
route_Truck = []
route_UAV = []
def getSolution(self, data, model):
solution = Solution()
solution.ObjVal = model.ObjVal
# X_ijk
solution.X = [[([0] * data.vehicleNum) for j in range(data.nodeNum)] for i in range(data.nodeNum)]
# Y_ijkd
solution.Y = [[[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)]
for j in range(data.nodeNum)] for i in range(data.nodeNum)]
# C_ik, C_ikd
solution.C = [([0] * data.vehicleNum) for i in range(data.nodeNum)]
solution.Ct = [[([0] * data.droneNum) for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
# Vl, Vr
solution.Vl = [[([0] * data.droneNum) for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
solution.Vr = [[([0] * data.droneNum) for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
for m in model.getVars():
str = re.split(r"_", m.VarName)
if (str[0] == "X" and m.x == 1):
solution.X[int(str[1])][int(str[2])][int(str[3])] = m.x
print(str, end="")
print(" = %d" % m.x)
elif (str[0] == "Y" and m.x == 1):
solution.Y[int(str[1])][int(str[2])][int(str[3])][int(str[4])] = m.x
print(str, end="")
print(" = %d" % m.x)
elif (str[0] == "C" and m.x == 1):
solution.C[int(str[1])][int(str[2])] = m.x
print(str, end="")
print(" = %d" % m.x)
elif (str[0] == "Ct" and m.x == 1):
solution.Ct[int(str[1])][int(str[2])][int(str[3])] = m.x
print(str, end="")
print(" = %d" % m.x)
elif (str[0] == "Vl" and m.x == 1):
solution.Vl[int(str[1])][int(str[2])][int(str[3])] = m.x
print(str, end="")
print(" = %d" % m.x)
elif (str[0] == "Vr" and m.x == 1):
solution.Vr[int(str[1])][int(str[2])][int(str[3])] = m.x
print(str, end="")
print(" = %d" % m.x)
elif (str[0] == "z" and m.x > 0):
solution.z = m.x
print(str, end="")
print(" = %d" % m.x)
return solution
data = Data()
path = 'c101_1.txt'
customerNum = 9
readData(data, path, customerNum)
printData(data, customerNum)
# =========build the model===========
big_M = 10000
# construct the model object
model = Model("FSTSP")
# Initialize variables
# create variables: Muiti-dimension vector: from inner to outer
# X_ijk
X = [[[[] for k in range(data.vehicleNum)] for j in range(data.nodeNum)] for i in range(data.nodeNum)]
# Y_ijkd
Y = [[[[[]for d in range(data.droneNum)] for k in range(data.vehicleNum)] for j in range(data.nodeNum)] for i in range(data.nodeNum)]
# C_i(k), C_i'(d)
C = [[[] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
Ct = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
# vL(释放节点), vR(回收节点)
Vl = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
Vr = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
# Pkd
P = [[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)]
# A_ik, a_ikd (卡车无人车到达i的时间)
A = [[[] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
a = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
# R_ik, r_ikd (卡车无人车到达i的时间)
R = [[[] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
r = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
# z
z: float
# D'
Dk = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
temp = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
temp_1 = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
temp_2 = [[[[] for d in range(data.droneNum)] for k in range(data.vehicleNum)] for i in range(data.nodeNum)]
for k in range(data.vehicleNum):
for d in range(data.droneNum):
name1 = 'P_' + str(k) + '_' + str(d)
P[k][d] = model.addVar(0, 1, vtype=GRB.BINARY, name=name1)
for i in range(data.nodeNum):
name2 = 'C_' + str(i) + '_' + str(k)
name3 = 'Ct_' + str(i) + '_' + str(k) + '_' + str(d)
name4 = 'Vl_' + str(i) + '_' + str(k) + '_' + str(d)
name5 = 'Vr_' + str(i) + '_' + str(k) + '_' + str(d)
name10 = 'A_' + str(i) + '_' + str(k)
name11 = 'a_' + str(i) + '_' + str(k) + '_' + str(d)
name12 = 'R_' + str(i) + '_' + str(k)
name13 = 'r_' + str(i) + '_' + str(k) + '_' + str(d)
name16 = 'Dk_' + str(i) + '_' + str(k) + '_' + str(d)
name17 = 'temp_' + str(i) + '_' + str(k) + '_' + str(d)
name18 = 'temp_1_' + str(i) + '_' + str(k) + '_' + str(d)
name19 = 'temp_2_' + str(i) + '_' + str(k) + '_' + str(d)
C[i][k] = model.addVar(0, 1, vtype=GRB.BINARY, name=name2)
Ct[i][k][d] = model.addVar(0, 1, vtype=GRB.BINARY, name=name3)
Vl[i][k][d] = model.addVar(0, 1, vtype=GRB.BINARY, name=name4)
Vr[i][k][d] = model.addVar(0, 1, vtype=GRB.BINARY, name=name5)
A[i][k] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name10)
a[i][k][d] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name11)
R[i][k] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name12)
r[i][k][d] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name13)
Dk[i][k][d] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name16)
temp[i][k][d] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name17)
temp_1[i][k][d] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name18)
temp_2[i][k][d] = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name=name19)
for j in range(data.nodeNum):
name6 = 'X_' + str(i) + '_' + str(j) + '_' + str(k)
name7 = 'Y_' + str(i) + '_' + str(j) + '_' + str(k) + '_' + str(d)
X[i][j][k] = model.addVar(0, 1, vtype=GRB.BINARY, name=name6)
Y[i][j][k][d] = model.addVar(0, 1, vtype=GRB.BINARY, name=name7)
model.update()
z = model.addVar(0, big_M, vtype=GRB.CONTINUOUS, name='z')
b = model.addVar(0, 1, vtype=GRB.BINARY, name="b")
eps = 0.0001
M = 10 + eps
# constraint (1.2)
# for i in range(1, 6):
# for j in range(6, 10):
# for k in range(data.vehicleNum):
# for d in range(data.droneNum):
# if(i!=j):
# model.addConstr(a[i][k][d] == (A[i][k] + data.W + data.disMatrix[i][j]) * P[k][d], name='1.2')
# create the objective expression(1.3)
for k in range(data.vehicleNum):
expr5 = LinExpr(0)
expr6 = LinExpr(0)
for i in range(data.nodeNum):
for j in range(data.nodeNum):
if (i != j):
expr5.addTerms(1, X[i][j][k])
expr1 = LinExpr(0)
expr2 = LinExpr(0)
for l in range(1, data.nodeNum):
if (i != j):
expr1.addTerms(1, C[l][k])
expr3 = LinExpr(0)
expr4 = LinExpr(0)
for d in range(data.droneNum):
for i in range(1, 6):
expr2.addTerms(1, Vr[i][k][d])
for j in range(0, 5):
expr3.addTerms(1, Vl[j][k][d])
for i in range(data.nodeNum):
for n in range(data.droneNum):
# 建模如果 A_ik > a_ikm, 则 b = 1,否则 b = 0
model.addConstr(temp[i][k][n] == a[i][k][n] - (A[i][k] + data.serviceTime[i]), name='1.3_1')
model.addConstr(temp_1[i][k][n] == max_(temp[i][k][n], constant=0), name='1.3_2')
model.addConstr(A[i][k] >= a[i][k][n] + eps - M * (1 - b), name='1.3_3')
model.addConstr(A[i][k] <= a[i][k][n] + M * b, name='1.3_4')
model.addConstr((b == 1) >> (Dk[i][k][n] == data.W), name='1.3_5')
model.addConstr((b == 0) >> (Dk[i][k][n] == temp_1[i][k][n] + data.W), name='1.3_6')
model.addConstr(z >= expr5 * data.disMatrix[i][j] + expr1 * data.serviceTime[l] + expr2 * Dk[i][k][n] + expr3 * data.w, name='objective')
expr1.clear()
expr2.clear()
expr3.clear()
expr4.clear()
expr5.clear()
expr6.clear()
model.setObjective(z, GRB.MINIMIZE)
# constraint (1.4)
for k in range(data.vehicleNum):
expr1 = LinExpr(0)
expr2 = LinExpr(0)
for j in range(1, data.nodeNum):
expr1.addTerms(1, X[0][j][k])
for i in range(0, data.nodeNum - 1):
expr2.addTerms(1, X[i][0][k])
model.addConstr(expr1 == expr2, "c1.4")
expr1.clear()
expr2.clear()
for k in range(data.vehicleNum):
expr = LinExpr(0)
for i in range(1, 6):
expr.addTerms(1, X[i][0][k])
model.addConstr(expr == 1, "c1.4_1")
expr.clear()
# constraint (1.5)
for i in range(1, data.nodeNum - 1):
expr1 = LinExpr(0)
expr2 = LinExpr(0)
for k in range(data.vehicleNum):
expr1.addTerms(1, C[i][k])
for d in range(data.droneNum):
expr2.addTerms(1, Ct[i][k][d])
model.addConstr(expr1 + expr2 == 1, "c1.5")
expr1.clear()
expr2.clear()
for i in range(1, 6):
expr = LinExpr(0)
for k in range(data.vehicleNum):
expr.addTerms(1, C[i][k])
model.addConstr(expr == 1, "c1.5_1")
expr.clear()
for i in range(6, 10):
expr = LinExpr(0)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
expr.addTerms(1, Ct[i][k][d])
model.addConstr(expr == 1, "c1.5_2")
expr.clear()
# constraint (1.6)
for k in range(data.vehicleNum):
for j in range(1, 6): # j∈Ct, 非隔离区节点集合
expr1 = LinExpr(0)
expr2 = LinExpr(0)
for i in range(0, data.nodeNum - 1):
if(i!=j):
expr1.addTerms(1, X[i][j][k])
for l in range(1, data.nodeNum):
if(l!=i):
expr2.addTerms(1, X[j][l][k])
model.addConstr(expr1 == expr2, "c1.6")
expr1.clear()
expr2.clear()
# constraint (1.7)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
for j in range(6, 10):
expr1 = LinExpr(0)
expr2 = LinExpr(0)
for i in range(6, 10):
if(i!=j):
expr1.addTerms(1, Y[i][j][k][d])
expr2.addTerms(1, Y[j][i][k][d])
model.addConstr(expr1 == expr2, "c1.7")
expr1.clear()
expr2.clear()
# constraint (1.8)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
expr1 = LinExpr(0)
expr2 = LinExpr(0)
for i in range(0, 5):
expr1.addTerms(1, Vl[i][k][d])
for j in range(1, 6):
expr2.addTerms(1, Vr[j][k][d])
model.addConstr(expr1 == expr2, "c1.8")
model.addConstr(expr1 <= 1, "c1.8_1")
expr1.clear()
expr2.clear()
# constraint (1.9)
for k in range(data.vehicleNum):
for j in range(1, 6):
expr = LinExpr(0)
for i in range(data.nodeNum - 1):
if(i!=j):
expr.addTerms(1, X[i][j][k])
model.addConstr(C[j][k] * (expr - 1) == 0, "c1.9")
expr.clear()
# constraint (1.10)
for k in range(data.vehicleNum):
for j in range(1, 6):
expr = LinExpr(0)
for i in range(data.nodeNum - 1):
if (i != j):
expr.addTerms(1, X[j][i][k])
model.addConstr(C[j][k] * (expr - 1) == 0, "c1.10")
expr.clear()
# constraint (1.11)
for d in range(data.droneNum):
for j in range(6, 10):
for k in range(data.vehicleNum):
expr = LinExpr(0)
for i in range(data.nodeNum - 1):
if (i != j):
expr.addTerms(1, Y[i][j][k][d])
model.addConstr(Ct[j][k][d] * (expr - 1) == 0, "c1.11")
expr.clear()
# constraint (1.12)
for d in range(data.droneNum):
for j in range(6, 10):
for k in range(data.vehicleNum):
expr = LinExpr(0)
for i in range(data.nodeNum - 1):
if (i != j):
expr.addTerms(1, Y[j][i][k][d])
model.addConstr(Ct[j][k][d] * (expr - 1) == 0, "c1.12")
expr.clear()
# constraint (1.13)
for d in range(data.droneNum):
for k in range(data.vehicleNum):
for i in range(1, 6): # Vl
expr = LinExpr(0)
for j in range(6, 10): # Cd
if (i != j):
expr.addTerms(1, Y[i][j][k][d])
model.addConstr(expr == Vl[i][k][d], "c1.13")
expr.clear()
# constraint (1.14)
for d in range(data.droneNum):
for k in range(data.vehicleNum):
for i in range(1, 6): # Vr
expr = LinExpr(0)
for j in range(6, 10): # Cd
if (i != j):
expr.addTerms(1, Y[j][i][k][d])
model.addConstr(expr == Vr[i][k][d], "c1.14")
expr.clear()
# constraint (1.15)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
for i in range(1, 6): # Vl
expr = LinExpr(0)
for j in range(data.nodeNum - 1):
if (i != j):
expr.addTerms(1, X[j][i][k])
model.addConstr(expr >= P[k][d] * Vl[i][k][d], "c1.15")
expr.clear()
# constraint (1.16)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
for i in range(1, 6): # Vr
expr = LinExpr(0)
for j in range(data.nodeNum - 1):
if (i != j):
expr.addTerms(1, X[j][i][k])
model.addConstr(expr >= P[k][d] * Vr[i][k][d], "c1.16")
expr.clear()
# constraint (1.17)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
for i in range(1, 6):
for j in range(1, 6):
for p in range(data.nodeNum - 1):
if(i != j):
model.addConstr(temp_2[p][k][d] == Vl[i][k][d] * Vr[j][k][d], name="c1.17")
model.addConstr(temp_2[p][k][d] >= 0 + eps - M * (1 - b), name="c1.17_1")
model.addConstr((b == 1) >> (A[j][k] - A[i][k] >= 0), name='c1.17_2')
# constraint (1.18)
for i in range(1, 6):
for k in range(data.vehicleNum):
for d in range(data.droneNum):
model.addConstr(temp[i][k][d] == a[i][k][d] - (A[i][k] + data.serviceTime[i]), name='1.18_1')
model.addConstr(temp_1[i][k][d] == max_(temp[i][k][d], constant=0), name='1.18_2')
model.addConstr(A[i][k] >= a[i][k][d] + eps - M * (1 - b), name="conStr1")
model.addConstr(A[i][k] <= a[i][k][d] + M * b, name="conStr2")
model.addConstr((b == 0) >> (r[i][k][d] == A[i][k] + temp_1[i][k][d] + data.W), name="conStr3")
model.addConstr((b == 1) >> (r[i][k][d] == A[i][k] + data.W), name="conStr4")
# constraint (1.19)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
for i in range(data.nodeNum - 1):
for j in range(data.nodeNum - 1):
if (i != j):
model.addConstr(a[j][k][d] - a[i][k][d] >= data.serviceTime[i] + data.disMatrix[i][j] - big_M + big_M * Y[i][j][k][d], "c1.19")
# constraint (1.20)
for k in range(data.vehicleNum):
for i in range(data.nodeNum - 1):
for j in range(data.nodeNum - 1):
if(i != j):
model.addConstr(A[j][k] - A[i][k] >= data.serviceTime[i] + data.disMatrix[i][j] - big_M + big_M * X[i][j][k], "c1.20")
# constraint (1.21)
for i in range(data.vehicleNum):
expr = LinExpr(0)
for j in range(data.droneNum):
expr.addTerms(1, P[i][j])
model.addConstr(expr <= data.capacity, "c1.21")
expr.clear()
# constraint (1.22)
for k in range(data.vehicleNum):
for d in range(data.droneNum):
expr = LinExpr(0)
for i in range(1, data.nodeNum - 1):
expr.addTerms(1, Ct[i][k][d])
model.addConstr(30 * expr <= data.capacity_1, "c1.22")
expr.clear()
# =========solve the model===========
model.write('a.lp')
model.Params.timelimit = 3600
# get the solution info
solution = Solution()
solution = solution.getSolution(data, model)
print("\n-----optimal value-----")
print("Obj: %g" % solution.ObjVal)
0
-
Hi,
At some point you need to call optimize().
- Riley
0
Please sign in to leave a comment.
Comments
1 comment