Ich habe einen Aco-Algorithmus entwickelt. Ich denke, es funktioniert nicht richtig ... es wird schwer zu erklären sein, aber ich werde es versuchen.
Das Problem ist, dass der Pheromonpegel schwankt. Ich nehme an, dass das Pheromonniveau auf dem besten Weg mehr und mehr erhöht werden muss, aber in meinem Programm ist es nicht.
Optimal path
ist ein Pfad, der durch das Finden der maximalen Pheromonebene an Kanten zwischen Startknoten und Zielknoten erstellt wird.
Beispiel:
%Vor% Optimal path
wird 1 -> 2 -> 3
sein.
Gewichtsmatrix:
%Vor% Der beste Pfad ist: 1 -> 2 -> 3 (length: 6)
Ein anderer Pfad (nicht optimal): 1 -> 3 (length: 10)
Pheromonebenen nach 10 Ameisen:
%Vor% Optimaler Pfad: 1 -> 2 -> 3
Pheromonebenen nach 20 Ameisen (10 mehr):
%Vor% Optimaler Pfad: 1 -> 3
Pheromonlevel nach 30 Ameisen:
%Vor% Optimaler Pfad: 1 -> 2 -> 3
Pheromonlevel nach 30 Ameisen:
%Vor% Optimaler Pfad: 1 -> 3
Dies ist nur ein Beispiel, aber es stellt dar, wie die Pheromonenmatrix in meinem Programm aussieht.
Pseudocode meines Programms:
%Vor%Warum schweben also die Pheromonstufen in meinem Programm? Warum hat der beste Weg nicht die meisten Pheromonstufen? Ich verstehe, dass es einen Wahrscheinlichkeitsfaktor in diesem Algorithmus gibt, aber er muss trotzdem das korrekte Ergebnis zeigen.
Was mache ich in meinem Programm? Hier finden Sie die vollständige Haupt-Loop-Quelle meines Programms.
1) Hauptzyklus ist ein Zyklus, der bis dahin läuft alle für die aktuelle Iteration verfügbaren Ameisen.
1.1) In diesem Zyklus habe ich einen weiteren Zyklus (innerer Zyklus) , die gefeuert werden, bis die aktuelle Ameise Scheitelpunkte hat, um zu ihnen zu gelangen (Scheitelpunkte dürfen von der aktuellen Ameise nicht besucht werden).
Im inneren Zyklus mache ich das:
1.1.1) Den Nenner der Gleichung unten berechnen
>
Diese Formel berechnet die Wahrscheinlichkeit für die Auswahl von ij
path ( i
ist aktueller Knoten, j
ist nächster Knoten).
Code:
%Vor%Außerdem füge ich alle Wahrscheinlichkeitswerte zu einem Intervall hinzu, was mir helfen wird, zu entscheiden, welchen Eckpunkt ich wählen soll.
Code:
%Vor% 1.1.3) Erstellen einer Zufallszahl von 0 bis 1 und Auswählen eines Eckpunkts basierend auf
intervals
array, definiert im vorherigen Teil des Codes
Code:
%Vor%1.1.4) Einige Anweisungen, Einstellungshelfer (Pfadhelfer, besucht geholfen) usw
1.1.5) Im nächsten Schritt überprüfe ich, ob der Basisknoten der Zielknoten
Wenn ja (das heißt, diese Ameise hat einen Zielknoten gefunden), mache ich das:
1.1.5.1) Länge des aktuellen Ameisenpfads erhalten
>Code:
%Vor%1.1.5.2) Aktualisierung des Pheromonlevels auf diesem Pfad
>Code:
%Vor%1.2) Am Ende des Hauptzyklus mache ich Verdunstung von Pheromonen:
Code:
%Vor% Wenn Sie den folgenden Pfad auswählen, wählt Ihr Code immer den ersten benachbarten Eckpunkt unter einem zufälligen Schwellenwert aus. Ich bin mir nicht sicher, wie dies Ameisen darstellen soll, die zu Scheitelpunkten mit mehr Pheromon gehen. Diese Methode funktioniert bis zu einem gewissen Grad in einem Bereich, in dem die Pheromonkonzentration relativ niedrig ist (unter 0,5). in Gebieten mit hoher Pheromonkonzentration (nahe oder über 1), da Ihre random()
-Zahl zwischen 0 und 1 liegt, kehren Sie zu zurück und wählen immer den ersten verfügbaren Knoten . Dies ist wahrscheinlich, warum Sie nicht konvergieren.
Tags und Links algorithm ant-colony