Skip to content

Commit 6600405

Browse files
authored
Add files via upload
1 parent 7df8eed commit 6600405

8 files changed

Lines changed: 5273 additions & 0 deletions

code/1. GG API.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/usr/bin/env python
2+
# coding: utf-8
3+
4+
import os
5+
import pandas as pd
6+
import time
7+
8+
s = time.time()
9+
# Importing googlemaps module
10+
import googlemaps
11+
12+
# Requires API key
13+
gmaps = googlemaps.Client(key='AIzaSyBSzEO6ecgV6Kr8Vg-5dmb2ww4YFhyOM6s')
14+
15+
dir_name = os.path.dirname(os.path.realpath('__file__'))
16+
file ="9Aug19"
17+
18+
file_name = os.path.join(dir_name, 'Real Dataset\\',file +'.csv')
19+
df = pd.read_csv(file_name, encoding ='latin1', error_bad_lines=False)
20+
21+
d = {'Name': 'first', 'Post Code': 'first', 'Date': 'first', 'Reference': 'first', 'Type': 'first', 'Value' : 'sum'}
22+
df_new = df.groupby('No', as_index=False).aggregate(d).reindex(columns=df.columns)
23+
print(df_new)
24+
25+
cust_size = df_new.shape[0]
26+
27+
postcode = df_new['Post Code']
28+
29+
dist_matrix = pd.DataFrame(0, index=range(cust_size), columns=range(cust_size))
30+
time_matrix = pd.DataFrame(0, index=range(cust_size), columns=range(cust_size))
31+
32+
for i in range(cust_size):
33+
for j in range(cust_size):
34+
if i!= j:
35+
my_dist = gmaps.distance_matrix(postcode[i],postcode[j])['rows'][0]['elements'][0]
36+
#print(i, j, my_dist)
37+
dist_matrix[i][j] = my_dist['distance']['value']
38+
time_matrix[i][j] = my_dist['duration']['value']
39+
40+
e =time.time()
41+
42+
print(e-s)
43+
dist_matrix.to_csv('Real Dataset\\9AugDist.csv', index=False, header=False)
44+
time_matrix.to_csv('Real Dataset\\9AugTime.csv', index=False, header=False)
45+
46+
47+

code/2. Test_ExactMethod.py

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#!/usr/bin/env python
2+
# coding: utf-8
3+
4+
import os
5+
import numpy as np
6+
import pandas as pd
7+
import sklearn as sk
8+
import matplotlib.pyplot as plt
9+
import time
10+
11+
from scipy.spatial import distance_matrix
12+
13+
# In[14]:
14+
15+
16+
import sys
17+
import docplex.mp
18+
19+
# try:
20+
# import docplex.mp
21+
# except:
22+
# if hasattr(sys, 'real_prefix'):
23+
# get_ipython().system('pip install docplex -q')
24+
# else:
25+
# get_ipython().system('pip install --user docplex -q')
26+
27+
from docplex.mp.model import Model
28+
29+
dir_name = os.path.dirname(os.path.realpath('__file__'))
30+
31+
# folder = ["R101", "R102", "R103", "R104", "R105", "R106", "R107", "R108", "R109", "R110", "R111", "R112",
32+
# "R201", "R202", "R203", "R204", "R205", "R206", "R207", "R208", "R209", "R210", "R211",
33+
# "RC101", "RC102", "RC103", "RC104", "RC105", "RC106", "RC107", "RC108",
34+
# "RC201", "RC202", "RC203", "RC204", "RC205", "RC206", "RC207", "RC208",
35+
# "C201", "C202", "C203", "C204", "C205", "C206", "C207", "C208",
36+
# "C101", "C102", "C103", "C104", "C105", "C106", "C107", "C108", "C109"]
37+
38+
file_names = ["R101", "R106", "C101", "C106", "RC101", "RC106", "R201", "R206", "C201", "C206", "RC201", "RC206"]
39+
40+
K = 10000
41+
42+
for file in file_names:
43+
file_name = os.path.join(dir_name, 'Sample Dataset\\', file + '.csv')
44+
df = pd.read_csv(file_name, encoding='latin1', error_bad_lines=False);
45+
46+
df = df[0:26]
47+
48+
cust_size = df.shape[0] - 1
49+
# print('Number of customers:', cust_size)
50+
df.head()
51+
52+
n = cust_size
53+
Q = df['CAPACITY'][0]
54+
C = [i for i in range(1, n + 1)]
55+
Cc = [0] + C + [n + 1]
56+
V = [i for i in range(1, 26)]
57+
58+
df2 = df.iloc[:, 1:3]
59+
df2.loc[n + 1, :] = df2.loc[0, :]
60+
61+
dist_matrix = pd.DataFrame(distance_matrix(df2.values, df2.values), index=df2.index, columns=df2.index)
62+
63+
# dist_matrix.head()
64+
65+
time_start = time.time()
66+
mdl = Model('VRPTW')
67+
68+
# Start time
69+
70+
e = [df['READYTIME'][i] for i in range(n + 1)]
71+
e.append(df['READYTIME'][0])
72+
73+
# Due time
74+
75+
l = [df['DUETIME'][i] for i in range(n + 1)]
76+
l.append(df['DUETIME'][0])
77+
78+
# Service time
79+
ser = [df['SERVICETIME'][i] for i in range(n + 1)]
80+
ser.append(df['SERVICETIME'][0])
81+
82+
# Demand
83+
84+
#r = {i: df['DEMAND'][i] for i in range(1, n + 1)}
85+
r = [df['DEMAND'][i] for i in range(n + 1)]
86+
r.append(0)
87+
88+
# Variable set
89+
X = [(i, j, k) for i in Cc for j in Cc for k in V if i != j]
90+
S = [(i, k) for i in Cc for k in V]
91+
92+
# Calculate distance and time
93+
c = {(i, j): dist_matrix[i][j] for i in Cc for j in Cc}
94+
t = {(i, j): dist_matrix[i][j] for i in Cc for j in Cc}
95+
96+
# Variables
97+
x = mdl.binary_var_dict(X, name='x')
98+
s = mdl.continuous_var_dict(S, name='s')
99+
100+
# Constraints
101+
mdl.sum(c[i, j] * x[i, j, k] for i, j, k in X)
102+
103+
mdl.add_constraints(mdl.sum(x[i, j, k] for j in Cc for k in V if j != i) == 1 for i in C)
104+
105+
mdl.add_constraints(mdl.sum(r[i] * mdl.sum(x[i, j, k]) for i in C for j in Cc if i != j) <= Q for k in V)
106+
107+
mdl.add_constraints(mdl.sum(x[0, j, k] for j in Cc if j != 0) == 1 for k in V)
108+
109+
mdl.add_constraints(
110+
(mdl.sum(x[i, p, k] for i in Cc if i != p) - mdl.sum(x[p, j, k] for j in Cc if p != j)) == 0 for p in C for k in
111+
V)
112+
113+
mdl.add_constraints(mdl.sum(x[i, n + 1, k] for i in Cc if i != n + 1) == 1 for k in V)
114+
115+
mdl.add_constraints(s[i, k] + ser[i] + t[i, j] - K * (1 - x[i, j, k]) - s[j, k] <= 0 for i, j, k in X if i != j)
116+
117+
#mdl.add_constraints(s[i,k] + ser[i] + t[i,j] - (max(0, (l[i] + ser[i] + t[i,j] - e[j])))*(1-x[i,j,k]) - s[j,k] <=0 for i,j,k in X if i!=j if i!=n+1 if j!=0)
118+
119+
mdl.add_constraints(s[0, k] == 0 for k in V)
120+
121+
mdl.add_constraints(s[i, k] >= e[i] for i, k in S if i != 0)
122+
123+
mdl.add_constraints(s[i, k] <= l[i] for i, k in S if i != 0)
124+
125+
# Objective Function
126+
obj_function = mdl.sum(c[i, j] * x[i, j, k] for i, j, k in X)
127+
128+
# Set time limit
129+
mdl.parameters.timelimit.set(1000)
130+
#mdl.parameters.emphasis.mip.set(3)
131+
#mdl.parameters.mip.tolerances.mipgap.set(0.4)
132+
#mdl.parameters.mip.strategy.probe.set(3)
133+
134+
135+
# Solve
136+
mdl.minimize(obj_function)
137+
138+
time_solve = time.time()
139+
140+
solution = mdl.solve(log_output = True)
141+
142+
time_end = time.time()
143+
# print(solution)
144+
145+
running_time = round(time_end - time_solve, 2)
146+
elapsed_time = round(time_end - time_start, 2)
147+
148+
if solution != None:
149+
route = [x[0, i, k] for i in C for k in V if x[0, i, k].solution_value == 1]
150+
no_vehicles = len(route)
151+
obj = round(obj_function.solution_value, 2)
152+
print(file, cust_size, no_vehicles, obj, elapsed_time, running_time)
153+
else:
154+
print(file, cust_size, 'NA', 'NA', elapsed_time, running_time)
155+

0 commit comments

Comments
 (0)