예제 #1
0
        private void drawBestPaths()
        {
            CIterationList iterationList = CIterationList.getInstance();

            if (mDraw.optPath)
            {
                CTour optimumTour = CAntAlgorithmParameters.getInstance().optTour;
                drawTour(optimumTour, OPT_TOUR_DRAW_LAYER, 0f, 0f, 1f);
            }

            if (mDraw.bestPathOfIteration)
            {
                CTour bestIterationTour = iterationList.getBestLastIterationTour();
                drawTour(bestIterationTour, BEST_GLOBAL_TOUR_DRAW_LAYER, 0f, 1f, 0f);
            }

            if (mDraw.bestPathOfAllIterations)
            {
                CTour bestGlobalTour = iterationList.getBestGlobalTour();
                drawTour(bestGlobalTour, BEST_ITERATION_TOUR_DRAW_LAYER, 1f, 0f, 0f);
            }

#if DEBUG
            if (debugTour != null)
            {
                drawTour(debugTour, OPT_TOUR_DRAW_LAYER - 0.5f, 1f, 1f, 0f, true);
            }
#endif
        }
예제 #2
0
        private void button_Start_Click(object sender, EventArgs e)
        {
            CAntAlgorithmParameters antAlgorithmParameters = CAntAlgorithmParameters.getInstance();

            antAlgorithmParameters.numberAnts          = Convert.ToInt32(uAntsQuantity.Value);
            antAlgorithmParameters.numberMaxIterations = Convert.ToInt32(uQuantityIterations.Value);
            antAlgorithmParameters.pheromoneParameter  = pheromonValue;
            antAlgorithmParameters.pheromoneUpdate     = heuristicPheromonUpdateValue;
            antAlgorithmParameters.initialPheromone    = initialPheromonValue;
            antAlgorithmParameters.localInformation    = heuristicValue;
            antAlgorithmParameters.evaporationFactor   = evaporationValue;
            antAlgorithmParameters.bBestTourStop       = cStoppLoesung.Checked;
            antAlgorithmParameters.bLimitStop          = cStopSchwellenwert.Checked;
            antAlgorithmParameters.iLimitStop          = 0;
            if (antAlgorithmParameters.bLimitStop == true)
            {
                antAlgorithmParameters.iLimitStop = Convert.ToInt32(tThreshold.Text);
            }
            //MessageBox.Show("Ants: " + CAntAlgorithmParameters.getInstance().numberAnts + "\n" + CAntAlgorithmParameters.getInstance().numberMaxIterations + "\n" + CAntAlgorithmParameters.getInstance().pheromoneParameter + " \n" + "usw usw");

            if (!(mAntAlgorithmThread == null) && (mAntAlgorithmThread.IsAlive == true) && (button_Start.Text == BUTTON_START_TEXT_STOP))
            {
                mAntAlgorithmThread.Abort();
                CIterationList.getInstance().Clear();
                GC.Collect();
            }
            if (CTSPPointList.getInstance().length() < 2)
            {
                MessageBox.Show("Anzahl der Städte beträgt weniger als 2.");
                return;
            }

            if (((mAntAlgorithmThread == null) || (mAntAlgorithmThread.IsAlive == false)) && (button_Start.Text == BUTTON_START_TEXT_START))
            {
                CAntAlgorithm antAlgorithm = new CAntAlgorithm(mRenderWindow, tNumberOfIteration);
                mAntAlgorithmThread          = new Thread(antAlgorithm.startAlgorithm);
                mAntAlgorithmThread.Name     = "AntAlgorithmThread";
                mAntAlgorithmThread.Priority = ThreadPriority.Normal;
                mAntAlgorithmThread.Start();

                mTimerThread          = new Thread(this.timerThread);
                mTimerThread.Name     = "TimerThread";
                mTimerThread.Priority = ThreadPriority.Lowest;
                mTimerThread.Start();
            }

            if (button_Start.Text == BUTTON_START_TEXT_START)
            {
                button_Start.Text = BUTTON_START_TEXT_STOP;
            }
            else
            {
                button_Start.Text = BUTTON_START_TEXT_START;
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
 private void setStopCriteriaSolutionFound()
 {
     if (CAntAlgorithmParameters.getInstance().optTour == null)
     {
         cStoppLoesung.Checked = false;
         cStoppLoesung.Enabled = false;
     }
     else
     {
         cStoppLoesung.Enabled = true;
     }
 }
예제 #5
0
        private void handleEdgeWeightElement(string element, int elementIndex)
        {
            CTSPPointList   pointList = CTSPPointList.getInstance();
            CConnectionList connList  = CConnectionList.getInstance();

            float distance = float.Parse(element);

            switch (mFileHeader.edgeWeightFormat)
            {
            case E_EDGE_WEIGHT_FORMAT.E_FULL_MATRIX:
            {
                int row        = elementIndex / mFileHeader.dimension;
                int pointIndex = elementIndex % mFileHeader.dimension;

                // Es werden nur die Punkte unter der Diagonalen betrachtet.
                // damit werden keine Verbindungen Doppelt eingefügt und Verbindungen
                // auf den gleichen Punkt, also Distanz = 0, vermieden
                if (pointIndex < row)
                {
                    CTSPPoint point1 = pointList.getPoint(row);
                    CTSPPoint point2 = pointList.getPoint(pointIndex);
                    connList.addConnection(new CConnection(point1, point2, distance, CAntAlgorithmParameters.getInstance().initialPheromone));
                }
                break;
            }

            case E_EDGE_WEIGHT_FORMAT.E_UPPER_ROW:
            {
                int row = 0;
                while ((elementIndex / (mFileHeader.dimension - 1 - row)) > 0)
                {
                    elementIndex -= (mFileHeader.dimension - 1 - row);
                    row++;
                }
                // Index des Punktes ist der Offset bis zur Diagonalen + den Index des Elementes
                int pointIndex = row + 1 + elementIndex;

                CTSPPoint point1 = pointList.getPoint(row);
                CTSPPoint point2 = pointList.getPoint(pointIndex);
                connList.addConnection(new CConnection(point1, point2, distance, CAntAlgorithmParameters.getInstance().initialPheromone));
                break;
            }

            case E_EDGE_WEIGHT_FORMAT.E_UPPER_DIAG_ROW:
            {
                int row = 0;
                while ((elementIndex / (mFileHeader.dimension - row)) > 0)
                {
                    elementIndex -= (mFileHeader.dimension - row);
                    row++;
                }
                // Index des Punktes ist der Offset bis zur Diagonalen + den Index des Elementes
                int pointIndex = row + elementIndex;

                if (pointIndex != row)
                {
                    CTSPPoint point1 = pointList.getPoint(row);
                    CTSPPoint point2 = pointList.getPoint(pointIndex);
                    connList.addConnection(new CConnection(point1, point2, distance, CAntAlgorithmParameters.getInstance().initialPheromone));
                }
                break;
            }

            case E_EDGE_WEIGHT_FORMAT.E_LOWER_DIAG_ROW:
            {
                int row        = 0;
                int pointIndex = elementIndex;
                while ((pointIndex / (row + 1)) > 0)
                {
                    pointIndex -= row + 1;
                    row++;
                }

                if (pointIndex != row)
                {
                    CTSPPoint point1 = pointList.getPoint(pointIndex);
                    CTSPPoint point2 = pointList.getPoint(row);
                    connList.addConnection(new CConnection(point1, point2, distance, CAntAlgorithmParameters.getInstance().initialPheromone));
                }

                break;
            }
            }
        }
예제 #6
0
        private void openTSPFile()
        {
            CIterationList.getInstance().Clear();

            // Open the selected file to read.
            System.IO.Stream myResult = openTspFileDialog1.OpenFile();

            string tspFilePath  = openTspFileDialog1.FileName;
            string tourFilePath = tspFilePath.Substring(0, tspFilePath.LastIndexOf('.')) + ".opt.tour";

            try
            {
                // zuerst mal das TSPfile parsen
                CTSPLibFileParser tspParser = new CTSPLibFileParser(myResult);
                tspParser.fillTSPPointList();

                // prüfen ob eine Datei mit der optimalen Tour existiert
                if (File.Exists(tourFilePath) == true)
                {
                    // Dann die Optimale Tour parsen
                    FileStream        optTourFile = File.Open(tourFilePath, FileMode.Open);
                    CTSPLibFileParser tourParser  = new CTSPLibFileParser(optTourFile);
                    tourParser.getOptTour();
                }
                else
                {
                    CAntAlgorithmParameters.getInstance().optTour = null;
                }
            }
            catch (ThreadAbortException)
            {
                // wir machen nichts .. das ist nur zum verhindern das eine Meldung angezeigt wird
            }
            catch (CInsufficientMemoryException exception)
            {
                if (exception.getType() == CInsufficientMemoryException.E_EXCEPTION_TYPE.E_32_BIT_ERROR)
                {
                    MessageBox.Show("Um dieses Projekt laden zu können werden ca. " + exception.getMemoryNeeded()
                                    + " MByte benötigt. 32-Bit-Anwendungen können aber maximal " + exception.getMemoryAvailable() + " MByte verwalten. "
                                    + "Bitte verwenden sie die 64-Bit Version oder öffnen Sie ein kleineres Projekt.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("Auf ihrem System stehen noch " + exception.getMemoryAvailable() + " MByte zur Verfügung. Es werden aber ca. "
                                    + exception.getMemoryNeeded() + " MByte benötigt. "
                                    + "Wenn Sie dieses Projekt laden möchten stellen Sie Bitte mehr RAM zur Verfügung.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message, "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                CAntAlgorithmParameters.getInstance().optTour = null;
            }
            finally
            {
                // stream wieder schließen
                myResult.Close();
            }

            // Schaltfläche der Stoppkriterien, Lösung gefunden, (de)aktivieren
            this.Invoke(new Action(setStopCriteriaSolutionFound));

            // Länge der optimalen Tour anzeigen
            tOptimalerPfad.Invoke(new Action(delegate()
            {
                if (CAntAlgorithmParameters.getInstance().optTour != null)
                {
                    tOptimalerPfad.Text = CAntAlgorithmParameters.getInstance().optTour.getTourLength().ToString();
                }
                else
                {
                    tOptimalerPfad.Text = "";
                }
            }));

            // neu Rendern
            mRenderWindow.Invoke(new Action(delegate()
            {
                mRenderWindow.initViewPort();
                mRenderWindow.Refresh();
            }));

            CProgressManager.setFinished();
        }