[PYTHON] Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Ausführungsergebnis)

Einführung

Ich habe versucht, viele Treffer zu erzielen, indem ich mit "Circular Salesman Problem Genetic Algorithm" gegoogelt habe.

Ausführungsergebnis

[Python-Code] Dies ist das Ergebnis der Suche nach einigen Punkten in Google Colaboratory mit dem in () erstellten Code.

--time ... Ausführungszeit --epoch ... Anzahl der Generationen --fitness ... Anpassungsfähigkeit der Näherungslösung --length ... Pfadlänge der ungefähren Lösung --path ... Pfad der ungefähren Lösung --Graph ... $ p_1, p_2, \ dots, p_N $ und der Pfad der optimalen Lösung in der mittleren Generation

Da der genetische Algorithmus ein starkes zufälliges Element aufweist, ändern sich die Berechnungszeit und die ungefähre Lösung bei jeder Ausführung. Wenn Sie ähnliche Ergebnisse nicht reproduzieren können, versuchen Sie es einige Male erneut.

25 Gitterpunkte

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

Zufällige 30 Punkte

Dies ist ein zufällig generierter Punktgruppenpfad. Der Ausgangszustand ist chaotisch, aber Sie können sehen, wie er mit jeder Generation organisiert ist. Die untere Reihe zeigt den Übergang der Anpassungsfähigkeit, die Anzahl der Individuen in der Generation, die Anzahl der produzierten Nachkommen und die Verteilung der Anpassungsfähigkeit in der letzten Generation.

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

Zufällige 30 Punkte: gerade Straße

Wir suchten nach einer Einwegroute mit einem von $ p_1, \ dots und p_N $ als Start- und Endpunkt anstelle der Route mit dem Ursprung als Start- und Endpunkt. In der Grafik ist nur die blaue Linie die gesuchte Route. Sie können sehen, wie es zu einem Pfad konvergiert, der sich von dem Pfad unterscheidet, dessen Start- und Endpunkt der Ursprung sind.

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

Zufällige 30 Punkte: Gerade Straße: Strafe

Es ist eine Einbahnstraße wie oben, aber wenn Sie vom Ursprung weggehen, wird der Unterschied in der Entfernung vom Ursprung als Länge zur Routenlänge addiert. Sie können sehen, wie es auf einem anderen Weg konvergiert als ohne Strafe. Im Vergleich zur 47. und 95. Generation hat die Anpassungsfähigkeit abgenommen, aber die Streckenlänge hat zugenommen. Die Strafe scheint zu funktionieren.

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

abschließend

Obwohl es sich um eine einfache Implementierung handelt, können Sie in überraschend kurzer Zeit die optimale Lösung finden. Mit zunehmender Punktzahl steigt die Suchzeit jedoch exponentiell an. Als nächstes wollen wir die Suchzeit reduzieren, indem wir die Hyperparameter anpassen und die Implementierung entwickeln.

Recommended Posts

Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Ausführungsergebnis)
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.
Ich habe versucht, "einen genetischen Algorithmus (GA) in Python zu implementieren, um das Problem des Handlungsreisenden (TSP) zu lösen".
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (2)
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (1)
Lösen Sie das Problem des Handlungsreisenden mit OR-Tools
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Eine Geschichte, in der der Algorithmus zu einem lächerlichen Ergebnis kam, als er versuchte, das Problem der reisenden Verkäufer richtig zu lösen
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Lösung des Problems des Handlungsreisenden mit dem genetischen Algorithmus (GA) und seiner Bibliothek (vcopt)
Lösen Sie das asymmetrische Python-Problem für reisende Verkäufer mit der Branch-and-Bound-Methode
Lösung des Planungsproblems der Krankenschwester (Schichtoptimierung) mit einem genetischen Algorithmus
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Wie man die anfängliche Population mit einem genetischen Algorithmus unter Verwendung von DEAP fixiert
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Über das Problem der reisenden Verkäufer
[Python] Versuchen Sie, die FX-Systolenparameter mit einem genetischen Algorithmus zu optimieren
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Eine Geschichte über den Umgang mit dem CORS-Problem
Versuchen Sie, eine multimodale Verteilung mithilfe des EM-Algorithmus zu modellieren
Über das bestellte Patrouillenverkäuferproblem
Schreiben Sie ein Programm, um den 4x4x4 Rubik Cube zu lösen! 2. Algorithmus
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Lösen Sie das Python-Rucksackproblem mit der Branch-and-Bound-Methode
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Lösen Sie Teilsummenprobleme mit der vollständigen Suche in Python
Versuchen Sie, das Problem der Funktionsminimierung mithilfe der Partikelgruppenoptimierung zu lösen
Möchten Sie ein einfaches Klassifizierungsproblem lösen?
So lösen Sie das Problem beim Verpacken des Behälters
Probieren Sie den Variational-Quantum-Eigensolver (VQE) -Algorithmus mit Blueqat aus
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
[AtCoder] Löse ABC1 ~ 100 Ein Problem mit Python
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Eine einfache Problemumgehung für Bots, um zu versuchen, Tweets mit demselben Inhalt zu veröffentlichen
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
Berechnen wir das statistische Problem mit Python
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Speichern Sie das Objekt in einer Datei mit pickle
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Versuchen Sie, ein FizzBuzz-Problem mit einem Shell-Programm zu erstellen
Lösen Sie das Python-Rucksackproblem mit dem Greedy-Algorithmus
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Ich habe versucht, das Problem der Optimierung der Platzierung virtueller Maschinen (einfache Version) mit blueqat zu lösen
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
Versuchen Sie, mit Python eine Wellenform (Audiospektrum) zu erstellen, die sich entsprechend dem Klang bewegt