Example #1
0
        private void drawTour(CTour tour, float depth, float red, float green, float blue, bool specialColor = false)
        {
            if (tour == null)
            {
                return;
            }

            Gl.glLineWidth(3f);
            Gl.glColor3f(red, green, blue);

            Gl.glBegin(Gl.GL_LINE_STRIP);



            for (int pointIndex = 0; pointIndex < tour.getListLength(); pointIndex++)
            {
                if (specialColor == true)
                {
                    float color = (float)pointIndex / (float)tour.getListLength();
                    Gl.glColor3f(color, color, 0.5f);
                }

                CTSPPoint point = tour.getPoint(pointIndex);
                Gl.glVertex3f(point.x, point.y, depth);
            }
            Gl.glEnd();
        }
        private string handleTourSection(StreamReader reader)
        {
            String actualLine = reader.ReadLine();

            if (mFileHeader.dimension == 0)
            {
                mFileHeader.dimension = Int32.MaxValue;
            }

            // Die Anzahl der Knoten in der Datei muss mit der Anzahl der Einträge in der Punktliste übereinstimmen.
            // Sonst greifen wir eventuell noch auf Punkte zu die es nicht gibt.
            if (mFileHeader.dimension != CTSPPointList.getInstance().length())
            {
                throw new Exception("Tour-Datei ist nicht kompatibel mit der geladenen TSP-Datei!");
            }

            CTour optTour = new CTour();

            int i = 1;

            while ((!(actualLine == "-1")) && (i <= mFileHeader.dimension))
            {
                actualLine = actualLine.Trim();

                // Punkt suchen
                CTSPPoint point = CTSPPointList.getInstance().getPoint(actualLine);

                if (point != null)
                {
                    // Punkt in Tour einfügen
                    optTour.addPoint(point);
                }
                else
                {
                    throw new Exception("Fehler beim auslesen der Optimalen Tour!");
                }

                actualLine = reader.ReadLine();
                i++;
            }

            // prüfen ob die Tour ein Kreis ist (erstes == letztes Element)
            if (optTour.getPoint(0) != optTour.getPoint(optTour.getListLength() - 1))
            {
                // Nein, also den Kreis herstellen
                optTour.addPoint(optTour.getPoint(0));
            }

            // Tour abspeichern
            CAntAlgorithmParameters.getInstance().optTour = optTour;

            return(actualLine);
        }
        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");
        }