[PYTHON] Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (résultat de l'exécution)

introduction

J'ai essayé de faire beaucoup de hits en googlé avec "Circular Salesman Problem Genetic Algorithm".

Résultat d'exécution

[Code Python] Ceci est le résultat de la recherche de certains points sur Google Colaboratory avec le code créé dans ().

--time ... temps d'exécution --epoch ... nombre de générations --fitness ... adaptabilité de la solution approximative --length ... Longueur du chemin de la solution approximative --path ... Chemin de la solution approximative --Graphe ... $ p_1, p_2, \ dots, p_N $, et le chemin de la solution optimale dans la génération intermédiaire

Puisque l'algorithme génétique a un fort élément aléatoire, le temps de calcul et la solution approximative changent à chaque fois qu'il est exécuté. Si vous ne parvenez pas à reproduire des résultats similaires, réessayez plusieurs fois.

25 points de grille

import numpy as np
from GaTsp import *

loggers = (Logger_trace(level=2), Logger_leaders())
pts_m = np.array([(x+random.random()/5-2.09, y+random.random()/5-2.09) for x in range(5) for y in range(5)])
spc_m = Species(points=pts_m)  # matrix points
mdl = Model(species=spc_m)
mdl.fit(loggers=loggers)
Logger.plot_all(loggers=loggers)

image.png

30 points au hasard

Il s'agit d'un chemin de groupe de points généré aléatoirement. L'état initial est désordonné, mais vous pouvez voir comment il est organisé à chaque génération. La rangée inférieure montre la transition de l'adaptabilité, le nombre d'individus dans la génération, le nombre de descendants produits et la répartition de l'adaptabilité dans la génération finale.

import numpy as np
from GaTsp import *

loggers = (
    Logger_trace(level=2),
    Logger_leaders(),
    Logger_fitness(),
    Logger_population(),
    Logger_population(show_breeded=True),
    Logger_last_fitness_histgram(),
)
loggers = (Logger_trace(level=2), Logger_leaders())
spc_r = Species(N=30, seed=30)
mdl = Model(species=spc_r)
mdl.fit(loggers=loggers)
Logger.plot_all(loggers=loggers)

image.png

30 points au hasard: route droite

Nous avons recherché une route à sens unique avec l'un des $ p_1, \ points et p_N $ comme points de départ et d'arrivée, au lieu de la route avec l'origine comme points de départ et d'arrivée. Dans le graphique, seule la ligne bleue correspond à l'itinéraire recherché. Vous pouvez voir comment il converge vers un chemin différent du chemin dont les points de départ et d'arrivée sont l'origine.

import numpy as np
from GaTsp import *

class SpeciesPolyline(Species):
    def measure(self, path:np.ndarray, *args, **kwargs):
        length = self._distance_map[path[:-1], path[1:]].sum()
        return length

loggers = (Logger_trace(level=2), Logger_leaders())
spc_p = SpeciesPolyline(N=30, seed=30)
mdl = Model(species=spc_p)
mdl.fit(loggers=loggers)
Logger.plot_all(loggers=loggers)

image.png

Aléatoire 30 points: Route droite: pénalité

Il s'agit d'un itinéraire à sens unique comme ci-dessus, mais si vous vous éloignez de l'origine, la différence de distance par rapport à l'origine est ajoutée à la longueur de l'itinéraire comme pénalité. Vous pouvez voir comment il converge sur un chemin différent de celui sans pénalité. En comparant les 47e et 95e générations, l'adaptabilité a diminué, mais la longueur de l'itinéraire a augmenté. La sanction semble fonctionner.

class SpeciesSpiral(SpeciesPolyline):
    def penalty(self, path:np.ndarray, *args, **kwargs):
        penalties = self._to_origin[path[1:]] - self._to_origin[path[:-1]]
        penalty = penalties[penalties > 0].sum()
        return penalty

loggers = (Logger_trace(level=2), Logger_leaders())
spc_s = SpeciesSpiral(N=30, seed=30)
mdl = Model(species=spc_s)
mdl.fit(loggers=loggers)
Logger.plot_all(loggers=loggers)

image.png

en conclusion

Bien qu'il s'agisse d'une implémentation simple, vous pouvez trouver la solution optimale en un temps étonnamment court. Cependant, à mesure que le nombre de points augmente, le temps de recherche augmentera de façon exponentielle. Ensuite, nous visons à réduire le temps de recherche en ajustant les hyper paramètres et en concevant l'implémentation.

Recommended Posts

Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (résultat de l'exécution)
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
J'ai essayé "Implémentation d'un algorithme génétique (GA) en python pour résoudre le problème du voyageur de commerce (TSP)"
Trouver une solution au problème N-Queen avec un algorithme génétique (2)
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
Résolvez le problème du voyageur de commerce avec OR-Tools
Essayez de résoudre le problème du fizzbuzz avec Keras
Une histoire dans laquelle l'algorithme est arrivé à une conclusion ridicule en essayant de résoudre correctement le problème du voyageur de commerce
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Résolution du problème du voyageur de commerce avec l'algorithme génétique (GA) et sa bibliothèque (vcopt)
Résolvez le problème du voyageur de commerce asymétrique Python avec la méthode de branche et de liaison
Résolution du problème d'horaire des infirmières (optimisation des équipes) avec un algorithme génétique
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Je voulais résoudre le problème ABC164 A ~ D avec Python
Résolvez un simple problème de voyageur de commerce à l'aide d'une machine Boltzmann avec recuit simulé
Comment réparer la population initiale avec un algorithme génétique utilisant DEAP
Essayez de résoudre un problème défini de mathématiques au lycée avec Python
Essayez de résoudre le problème de l'héritage de classe Python
Essayez de résoudre le diagramme homme-machine avec Python
Comment essayer l'algorithme des amis d'amis avec pyfof
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de résoudre le problème avec Python Vol.1
À propos du problème du voyageur de commerce
[Python] Essayez d'optimiser les paramètres de systole FX avec un algorithme génétique
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
Une histoire sur la façon de traiter le problème CORS
Essayez de modéliser une distribution multimodale à l'aide de l'algorithme EM
À propos du problème du vendeur de patrouille commandé
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 2. Algorithme
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
Résolvez le problème du sac à dos Python avec la méthode de branche et liée
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Résolvez les problèmes de somme partielle avec une recherche complète en Python
Essayez de résoudre le problème de minimisation des fonctions en utilisant l'optimisation des groupes de particules
Vous voulez résoudre un problème de classification simple?
Comment résoudre le problème d'emballage du bac
Essayez l'algorithme Variational-Quantum-Eigensolver (VQE) avec Blueqat
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Rechercher le labyrinthe avec l'algorithme python A *
[AtCoder] Résoudre ABC1 ~ 100 Un problème avec Python
Python: j'ai essayé le problème du voyageur de commerce
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Une solution de contournement simple pour que les robots essaient de publier des tweets avec le même contenu
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
Calculons en fait le problème statistique avec Python
Essayez de dessiner une courbe de vie avec python
Essayez de créer un code de "décryptage" en Python
Enregistrer l'objet dans un fichier avec pickle
Essayez de créer un groupe de dièdre avec Python
Essayez de créer un problème FizzBuzz avec un programme shell
Résolvez le problème du sac à dos Python avec l'algorithme glouton
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
J'ai essayé de résoudre le problème d'optimisation du placement de la machine virtuelle (version simple) avec blueqat
Un mémo sur la façon de surmonter le problème difficile de la capture d'effets avec l'IA
Essayez de créer une forme d'onde (spectre audio) qui se déplace en fonction du son avec python