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 }
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; } }
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); }
private void setStopCriteriaSolutionFound() { if (CAntAlgorithmParameters.getInstance().optTour == null) { cStoppLoesung.Checked = false; cStoppLoesung.Enabled = false; } else { cStoppLoesung.Enabled = true; } }
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; } } }
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(); }