// Entspricht in der Formel: // Sum l( (t il) ^ alpha * (n il) ^ beta ) private double calculateSumFactorOfPossibleConnections(CTSPPoint currentPoint, CTSPPoint startPoint, CTSPPointList listOfPointsToTravel) { double sumFactorOfPossibleConnections = 0; foreach (CTSPPoint possiblePoint in listOfPointsToTravel) { CConnection connection = mConnectionList.getConnection(currentPoint, possiblePoint); double n_il = calculateLocalInformation(connection); double t_il = calculatePheromoneTrail(connection); sumFactorOfPossibleConnections += n_il * t_il; } // wir müssen natürlich auch den Weg zurück zum Startpunkt beachten, der darf aber nicht in der // Liste der noch zu besuchenden Punkte stehen. // Daher müssen wir diesen nochmal explizit am ende einbeziehen CConnection startConnection = mConnectionList.getConnection(startPoint, currentPoint); if (startConnection != null) { double start_n_il = calculateLocalInformation(startConnection); double start_t_il = calculatePheromoneTrail(startConnection); sumFactorOfPossibleConnections += start_n_il * start_t_il; } return(sumFactorOfPossibleConnections); }
/// <summary> /// fügt eine Verbindung in die Liste ein /// </summary> /// <param name="newConnection"></param> public bool addConnection(CConnection newConnection) { if (mConnectionList != null) { if (mConnectionsAdded < mConnectionList.LongLength) { mConnectionList[mConnectionsAdded] = newConnection; mConnectionsAdded++; return(true); } } return(false); }
public void addPoint(CTSPPoint point) { if (mPoints.length() == 0) { mTourLength = 0; } else { CTSPPoint lastPointInList = mPoints.getPoint(mPoints.length() - 1); CConnection additinalConnection = CConnectionList.getInstance().getConnection(lastPointInList, point); mTourLength += additinalConnection.getDistance(); } mPoints.addPoint(point); }
public CTSPPoint decisionNextPoint(CTSPPoint currentPoint, CTSPPoint startPoint, CTSPPointList listOfPointsToTravel) { // Formel: // (t ij) ^ alpha * (n ij) ^ beta // p ij = ---------------------------------- // Sum l( (t il) ^ alpha * (n il) ^ beta ) // // i = Startpunkt // j = Zielpunkt // l = ein Punkt von den noch zu Besuchenden Punkten // zuerst berechnen wir mal den Divisor der Formel, da dieser einmal pro Bewegung berechnet werden muss double sumFactorOfPossibleConnections = calculateSumFactorOfPossibleConnections(currentPoint, startPoint, listOfPointsToTravel); // jetzt berechnen wir die probability p von allen Verbindungen und bestimmen die beste double bestProbability = 0; CTSPPoint bestTarget = null; foreach (CTSPPoint possibleTarget in listOfPointsToTravel) { CConnection connection = mConnectionList.getConnection(currentPoint, possibleTarget); // von diesem Punkt erstmal die Werte für (t ij) ^ alpha und (n ij) ^ beta berechnen. // Damit haben wir dann die Werte für den Dividenten double t_ij = calculatePheromoneTrail(connection); double n_ij = calculateLocalInformation(connection); // die probability berechnen double probability = (t_ij * n_ij) / sumFactorOfPossibleConnections; // die der probability-Wert höher besser? if (probability > bestProbability) { // dann merken wir uns diesen Punkt bestProbability = probability; bestTarget = possibleTarget; } } return(bestTarget); }
public void startAlgorithm() { CProgressManager.setStepsIteration(mMaxIterations); mConnectionList.SetInitialPheromone(mInitialPheromone); mItertationsTextbox.Invoke(new Action(delegate() { mItertationsTextbox.Text = "0/" + mMaxIterations; })); DateTime startTime = DateTime.Now; int iteration = 0; bool bStopAlgorithm = false; while ((iteration < mMaxIterations) && (bStopAlgorithm == false)) { NewIteration(); // Evaporation (verdunstung) //-------------------------------- // Dazu iterieren wir durch alle Verbindungen und lassen das Pheromon verdunsten foreach (CConnection connection in mConnectionList) { connection.evaporate(mEvaporationFactor); } // Pheromon-Update //-------------------------------- // Dazu durch alle Touren von allen Ameisen nachgehen und für jede Verbindung die // Pheromonwerte neu berechnen // Formel: delta(t ij) = Q / (distance ij) foreach (CAnt ant in arrayOfAnts) { CTour antTour = ant.GetTour(); // wir fangen mit Index 1 an! Damit die Punkte der Verbindungen mit den Indizies // index -1 und index geholt werden können for (int pointIndex = 1; pointIndex < antTour.getListLength(); pointIndex++) { CTSPPoint fromPoint = antTour.getPoint(pointIndex - 1); CTSPPoint toPoint = antTour.getPoint(pointIndex); CConnection tourConnection = mConnectionList.getConnection(fromPoint, toPoint); tourConnection.addPheromone(mPhermomoneUpdate); } } CIterationList.getInstance().refreshStatisticNumbers(); mRenderWindow.Invoke(mRenderWindow.refreshDelegate); CProgressManager.stepDone(); mItertationsTextbox.Invoke(new Action(delegate() { mItertationsTextbox.Text = (iteration + 1) + "/" + mMaxIterations; })); Debug.WriteLine("Iteration done: " + (iteration + 1)); // Stopkriterien testen bStopAlgorithm = checkStopCriteria(); // Iterationszähler erhöhen iteration++; } Debug.WriteLine("Dauer: " + (DateTime.Now - startTime).TotalSeconds + " sek"); }
// entspricht in der Formel // (t ij) ^ alpha public double calculatePheromoneTrail(CConnection connection) { float connectionPheromone = connection.getPheromone(); return(Math.Pow(connectionPheromone, mAlgorithmParam.pheromoneParameter)); }
// entspricht in der Formel // (n ij) ^ beta public double calculateLocalInformation(CConnection connection) { float connectionDistance = connection.getDistance(); return(Math.Pow((1 / connectionDistance), mAlgorithmParam.localInformation)); }