/// <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(); }
public Form1() { InitializeComponent(); postInitialize(); Application.Idle += new EventHandler(Application_Idle); CProgressManager.setProgressBar(pIterationProgressBar); CIterationList.setForm(this); refreshDelegateStatistic = new delegateRefreshStatistic(refreshStatisticNumbers); }
/// <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(); }
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 }
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"); }