Machine Learning¶
https://mlrose.readthedocs.io/en/stable/source/tutorial2.html
- package for ML
- easily apply popular randomized optimization and search problems
- like Travelling Salesman
- uses scikit-learn
import six # use Python 2 code with Python 3 (backwards compatible so that we can use some sklearn)
import sys
sys.modules['sklearn.externals.six'] = six
import mlrose # depends on scikit-learn
import numpy as np
import pandas as pd
city_mapper = {
0:'Vancouver',
1:'Toronto',
2:'Munich',
3:'London',
4:'Barcelona',
5:'Paris',
6:'Florence',
7:'Dubai',
8:'Perth',
9:'Melbourne',
10:'New Zealand',
11:'India',
12:'Nepal',
13:'Japan',
14:'Thailand',
15:'Hawaii',
16:'Seattle'
}
# ditance between all cities in hours.
dist_list = [
(0,1,4.0000),(0,2,10.0000),(0,3,9.3330),(0,4,13.0000),(0,5,9.7500),(0,6,12.5000),
(0,7,17.5000),(0,8,22.0000),(0,9,18.7500),(0,10,16.7500),(0,11,24.0000),(0,12,22.0000),(0,13,10.0000),
(0,14,25.0000),(0,15,6.0000),(0,16,0.5000),(1,2,8.7500),(1,3,6.7500),(1,4,10.0000),
(1,5,7.2500),(1,6,10.0000),(1,7,12.7500),(1,8,29.0000),(1,9,25.0000),(1,10,24.0000),(1,11,22.5000),
(1,12,19.0000),(1,13,16.0000),(1,14,22.0000),(1,15,10.0000),(1,16,5.0000),(2,3,2.0000),(2,4,2.0000),
(2,5,1.5000),(2,6,1.2500),(2,7,6.0000),(2,8,18.5000),(2,9,21.5000),(2,10,30.0000),(2,11,12.0000),
(2,12,12.2500),(2,13,14.0000),(2,14,13.5000),(2,15,18.5000),(2,16,13.0000),(3,4,2.0000),(3,5,1.0000),
(3,6,2.0000),(3,7,6.7500),(3,8,18.7500),(3,9,21.5000),(3,10,27.0000),(3,11,13.0000),(3,12,11.5000),
(3,13,12.0000),(3,14,12.0000),(3,15,17.5000),(3,16,10.0000),(4,5,2.3000),(4,6,1.7500),
(4,7,6.5000),(4,8,19.7500),(4,9,21.0000),(4,10,31.0000),(4,11,17.0000),(4,12,12.2500),(4,13,15.5000),
(4,14,14.0000),(4,15,21.5000),(4,16,13.5000),(5,6,1.7500),(5,7,6.6600),(5,8,18.5000),
(5,9,21.7500),(5,10,30.0000),(5,11,16.0000),(5,12,12.0000),(5,13,12.0000),(5,14,13.6600),(5,15,18.0000),
(5,16,12.7500),(6,7,10.7500),(6,8,25.0000),(6,9,25.0000),(6,10,34.0000),(6,11,17.0000),
(6,12,15.5000),(6,13,15.7500),(6,14,15.0000),(6,15,21.7500),(6,16,14.0000),(7,8,10.5000),
(7,9,13.4500),(7,10,21.7500),(7,11,7.8000),(7,12,3.7500),(7,13,9.5000),(7,14,6.0000),(7,15,18.7500),
(7,16,14.7500),(8,9,3.5000),(8,10,19.0000),(8,11,22.0000),(8,12,12.7500),(8,13,13.7500),(8,14,10.5000),
(8,15,16.3300),(8,16,22.5000),(9,10,6.0000),(9,11,26.0000),(9,12,16.0000),(9,13,10.0000),(9,14,9.0000),
(9,15,10.2500),(9,16,19.5000),(10,11,33.0000),(10,12,20.4400),(10,13,15.0000),(10,14,20.0000),(10,15,22.0000),
(10,16,19.5000),(11,12,5.0000),(11,13,17.7500),(11,14,9.2500),(11,15,36.0000),(11,16,28.0000),(12,13,6.3300),
(12,14,10.3300),(12,15,24.0000),(12,16,24.0000),(13,14,10.5000),(13,15,6.7500),(13,16,9.0000),
(14,15,27.0000),(14,16,25.0000),(15,16,5.5000)
]
df = pd.DataFrame(dist_list, columns=['depart', 'dest', 'distance_in_hours'])
def calculate_actual_time():
"""
0->1->2->3->4, ... ->16->0
"""
actual_travel_time = 0
for i in range(len(city_mapper)):
depart = i
dest = i + 1
if dest == len(city_mapper):
depart = 0
dest = 16
actual_travel_time += df.loc[(df.depart == depart) & (df.dest == dest), 'distance_in_hours'].values[0]
return actual_travel_time
print(calculate_actual_time() - 136.12) # 3.26
3.259999999999991
# Initialize fitness function object using dist_list
fitness_dists = mlrose.TravellingSales(distances = dist_list)
problem_fit = mlrose.TSPOpt(length = len(city_mapper), fitness_fn = fitness_dists, maximize=False)
# Solve problem using the genetic algorithm
best_state, best_fitness = mlrose.genetic_alg(problem_fit, random_state = 2, mutation_prob = 0.3, max_attempts = 100)
print('The best state found is: ', best_state)
print('The fitness at the best state is: ', best_fitness)
Last update:
2023-04-24