示例#1
0
        // 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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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");
        }
示例#6
0
        // entspricht in der Formel
        // (t ij) ^ alpha
        public double calculatePheromoneTrail(CConnection connection)
        {
            float connectionPheromone = connection.getPheromone();

            return(Math.Pow(connectionPheromone, mAlgorithmParam.pheromoneParameter));
        }
示例#7
0
        // entspricht in der Formel
        // (n ij) ^ beta
        public double calculateLocalInformation(CConnection connection)
        {
            float connectionDistance = connection.getDistance();

            return(Math.Pow((1 / connectionDistance), mAlgorithmParam.localInformation));
        }