Podręcznik
3. Algorytmy genetyczne
3.10. Prosty przykład AG
W przypadku algorytmów genetycznych - to co Wam pokażę to rozwiązanie problemu dyskretnego - problemu komiwojażera. Zaczniemy od definicji problemu:
import numpy as np
from scipy import spatial
import matplotlib.pyplot as plt
num_points = 50
points_coordinate = np.random.rand(num_points, 2)
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')
def cal_total_distance(routine):
'''Funkcja celu. Parametrem wejściowym jest trasa, zwracana jest jej długość
'''
num_points, = routine.shape
return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])
W następnym kroku uruchamiany jest algorytm genetyczny. My stosujemy wersję dedykowaną do optymalizacji permutyzacyjnej - kiedy genom jest zakodowany w formie listy.
- func - funkcja celu
- n_dim - liczba wymiarów funkcji celu
- size_pop - wielkość populacji
- max_iter - liczba iteracji
- prob_mut - prawdopodobieństwo mutacji
from sko.GA import GA_TSP
ga_tsp = GA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=50, max_iter=1000, prob_mut=1)
best_points, best_distance = ga_tsp.run()
Pozostaje nam narysowanie wyników
fig, ax = plt.subplots(1, 2)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
ax[1].plot(ga_tsp.generation_best_Y)
plt.show()