Example #1
0
        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="label">Label des Punktes</param>
        public CTSPPoint(string label = "")
        {
            mLabel = label;

            // es wurde ein Punkt erzeugt .. also ein Schritt erfolgreich abgearbeteitet
            CProgressManager.stepDone();
        }
Example #2
0
 public Form1()
 {
     InitializeComponent();
     postInitialize();
     Application.Idle += new EventHandler(Application_Idle);
     CProgressManager.setProgressBar(pIterationProgressBar);
     CIterationList.setForm(this);
     refreshDelegateStatistic = new delegateRefreshStatistic(refreshStatisticNumbers);
 }
Example #3
0
        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="tspPoint1">Punkt 1 der Verbindung</param>
        /// <param name="tspPoint2">Punkt 2 der Verbindung</param>
        /// <param name="distanceCalculation">Gibt an auf welche Art die Entfernung zwischen den Punkten berechnet werden soll</param>
        /// <param name="initialPheromone">Pheromon das die Verbindung von Beginn an haben soll</param>
        public CConnection(CTSPPoint tspPoint1, CTSPPoint tspPoint2, CTSPLibFileParser.E_EDGE_WEIGHT_TYPE distanceCalculation, float initialPheromone = 0)
        {
            mTSPPoint1           = tspPoint1;
            mTSPPoint2           = tspPoint2;
            mDistanceCalculation = distanceCalculation;

            if (initialPheromone <= 0)
            {
                mPheromone = MIN_PHEROMONE;
            }
            else
            {
                mPheromone = initialPheromone;
            }

            calculateDistance();

            // es wurde eine Verbindung erzeugt .. also ein Schritt erfolgreich abgearbeteitet
            CProgressManager.stepDone();
        }
Example #4
0
        public static void generateTSP()
        {
            try
            {
                CProgressManager.setStepsConnections(mNumPoints);

                // erstmal alles altes löschen
                CTSPPointList.getInstance().removeAll();
                CConnectionList.getInstance().removeAll();

                GC.Collect();


                CMemoryTester.fitMemory(mNumPoints);

                generatePoints();
                CConnectionList.getInstance().generateFromPointList(CTSPLibFileParser.E_EDGE_WEIGHT_TYPE.E_EUC_2D);
            }
            catch (CInsufficientMemoryException memoryException)
            {
                if (memoryException.getType() == CInsufficientMemoryException.E_EXCEPTION_TYPE.E_32_BIT_ERROR)
                {
                    MessageBox.Show("Um ein Projekt mit der angegeben größe erzeugen zu können, benötigen Sie ca. " + memoryException.getMemoryNeeded()
                                    + " MByte. 32-Bit-Anwendungen können aber maximal " + memoryException.getMemoryAvailable() + " MByte verwalten. "
                                    + "Bitte verwenden sie die 64-Bit Version oder wählen Sie ein geringe Anzahl an Punkten.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("Auf ihrem System stehen noch " + memoryException.getMemoryAvailable() + " MByte zur Verfügung. Es werden aber ca. "
                                    + memoryException.getMemoryNeeded() + " MByte benötigt. "
                                    + "Wenn Sie dieses Projekt mit dieser Anzahl von Punkten erstellen 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);
            }

            CProgressManager.setFinished();
        }
        private void readFile()
        {
            StreamReader reader = new StreamReader(mFile);

            string actualLine       = "";
            bool   bLineAlreadyRead = false;

            while (!(actualLine == "EOF"))
            {
                string readLine = actualLine;
                if (bLineAlreadyRead == false)
                {
                    readLine = reader.ReadLine();
                }

                // wenn wir das Ende der Datei erreicht habe
                if (readLine == null)
                {
                    // brechen wir ab
                    break;
                }

                bLineAlreadyRead = false;

                actualLine = readLine.Trim().Replace(" ", "");
                string[] actualLineSplit = actualLine.Split(new Char[] { ':' });

                switch (actualLineSplit[0])
                {
                // Fileheader Einträge
                case "NAME":
                    mFileHeader.name = actualLineSplit[1];
                    break;

                case "TYPE":
                    HandleTspType(actualLineSplit[1]);
                    break;

                case "COMMENT":
                    mFileHeader.comment = actualLineSplit[1];
                    break;

                case "DIMENSION":
                    mFileHeader.dimension = Int32.Parse(actualLineSplit[1]);
                    CProgressManager.setStepsPointsAndConnections(mFileHeader.dimension);
                    CMemoryTester.fitMemory(mFileHeader.dimension);
                    break;

                case "EDGE_WEIGHT_TYPE":
                    handleEdgeWeightType(actualLineSplit[1]);
                    break;

                case "EDGE_WEIGHT_FORMAT":
                    handleEdgeWeightFormat(actualLineSplit[1]);
                    break;

                case "EDGE_DATA_FORMAT":
                    handleEdgeDataFormat(actualLineSplit[1]);
                    break;

                case "NODE_COORD_TYPE":
                    handleNoordCoordType(actualLineSplit[1]);
                    break;

                case "DISPLAY_DATA_TYPE":
                    handleDisplayDataType(actualLineSplit[1]);
                    break;

                // Dateneinträge
                case "NODE_COORD_SECTION":
                    actualLine       = handleNodeCoordSection(reader);
                    bLineAlreadyRead = true;
                    break;

                case "EDGE_WEIGHT_SECTION":
                    actualLine       = handleEdgeWeightSection(reader);
                    bLineAlreadyRead = true;
                    break;

                case "DISPLAY_DATA_SECTION":
                    actualLine       = handleDisplayDataSection(reader);
                    bLineAlreadyRead = true;
                    break;

                case "TOUR_SECTION":
                    actualLine       = handleTourSection(reader);
                    bLineAlreadyRead = true;
                    break;
                }  // switch
            }   // while
        }
Example #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();
        }
        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");
        }