Init: // Initialisierung
t := 0; NC := 0 // Zeitzähler, Zyklenzähler
for every edge(i,j) do
phero_edge (i,j,t) = c // Kantenmark. zur Zeit t, c = const.
phero_delta (i,j) = 0 // deltaKantenmark. nach einer Tour
od
place m ants on n nodes // m <= n, meist m = n und 1 je Stadt
s := 1 // Zeiger in TabuListe auf 1. Eintrag
for every ant k do
insert start town in tabu(k,s) // Startpunkt -> TabuListe
od
Cycle: // Ant-Cycle - Rundreise für alle J
repeat until tour completed // solange bis TabuListe voll, (n-1)*
s += 1 // nächster Eintrag in TabuListe
for every ant k do
choose town j to move to with probability p(i,j,k,t) // siehe Formel
move ant k to town j; insert town j in tabu(k,s) // Reisefieber
od
teaper // Tour beendet fuer alle Ameisen
Evaluation: // Bewertung, Häufigkeit der Nutzung
for every ant k do
move k-th ant from tabu(k,n) to tabu(k,1) // Rücklauf auf Startpunkt
compute full length of the tour by ant k // Gesamtlänge jd. AntTour
if (tour < shortest tour so far) // besser als bisher beste?
update shortest tour // speichere beste Tour
fi
od
for every edge(i,j) do
for every ant k do
phero_delta (i,j,k) := Q/full length // Längenabh. Bewertung
phero_delta (i,j) += phero_delta (i,j,k) // addiere Ges.delta auf
od
od
Evaporation: // Verflücht. Mark_old, Addieren Mark_new
for every edge(i,j) do
phero_edge (i,j,t+n) := p * phero_edge (i,j,t) + phero_delta (i,j)
phero_delta(i,j) := 0 // Rücksetzen für den nächsten Zyklus
od
t += n; NC += 1 // Zeit += Anz_Städte, Zyklenzähler erhöhen
Termination Condition: // Termin.: Max_Zyklen | All_Equal_Tour
if (NC < Ncmax) and (not stagnation behavior) then
empty all tabus
goto Cycle // Wiederhole Ant-Cycle (Neue Tour)
else
print shortest tour so far // Gib bislang beste Tour aus
stop
fi