private string handleNodeCoordSection(StreamReader reader) { String actualLine = reader.ReadLine(); int i = 1; if (mFileHeader.dimension == 0) { mFileHeader.dimension = Int32.MaxValue; } while ((!(actualLine == "EOF")) && (i <= mFileHeader.dimension)) { CTSPPoint point = parseLineToPoint(actualLine); CTSPPointList.getInstance().addPoint(point); actualLine = reader.ReadLine(); i++; } // Nachdem alle Punkte eingefügt wurden noch die Liste optimieren, // da sich hier eigentlich nichts mehr ändern sollte CTSPPointList.getInstance().optimizeList(); // Nachdem wir alle Punkte ausgelesen haben, können wir nun die Verbindungen nach // im FileHeader angegebenen Algorithmus berechnen CConnectionList.getInstance().generateFromPointList(mFileHeader.edgeWeightType); PerformanceCounter freeMemory = new PerformanceCounter("Memory", "Available Bytes"); Debug.WriteLine("Am Ende RAM frei: " + freeMemory.RawValue); Debug.WriteLine("Endspeicher: " + GC.GetTotalMemory(true)); return(actualLine); }
/// <summary> /// füllt die Liste der Punkte mit dem Datensatz aus der "*.tsp"-Datei /// </summary> public void fillTSPPointList() { // erstmal den aktuellen Stand an Punkten löschen CTSPPointList.getInstance().removeAll(); CConnectionList.getInstance().removeAll(); Debug.WriteLine("Startspeicher: " + GC.GetTotalMemory(true)); readFile(); }
private string handleEdgeWeightSection(StreamReader reader) { // bevor wir mit dem Parsen anfangen, prüfen wir erstmal ein paar sachen // Der Typ muss korrekt sein if (mFileHeader.edgeWeightType != E_EDGE_WEIGHT_TYPE.E_EXPLICIT) { throw new Exception("Fileformat Fehler! Datei kann nicht gelesen werden."); } // Damit wir die Verbindungen erzeugen können müssen Punkte vorhanden sein. // Das machen wir aber nur wenn nicht schon Punkte vorhanden sind // (z.B. durch eine DISPLAY_DATA_SECTION) if (CTSPPointList.getInstance().length() == 0) { for (int point = 1; point <= mFileHeader.dimension; point++) { CTSPPointList.getInstance().addPoint(new CTSPPoint(point.ToString())); } // Nachdem alle Punkte eingefügt wurden noch die Liste optimieren, // da sich hier eigentlich nichts mehr ändern sollte CTSPPointList.getInstance().optimizeList(); } // Damit wir später die Verbindungen einfügen können, muss die Liste der Verbindungen // erstmal, für die Anzahl initialisert werden CConnectionList.getInstance().initList(mFileHeader.dimension); int expectedWeightElements = getNumberElementsToRead(); int weightElementsRead = 0; // Es gibt kein wirkliches Stoppkriterum.. es muss mitgezählt werden wieviele Element bereites ausgelesen wurden String actualLine = reader.ReadLine(); while ((actualLine != null) && (weightElementsRead < expectedWeightElements)) { actualLine = actualLine.Trim(); string[] elements = actualLine.Split(COORD_SPLIT_CHARACTERS); elements = removeSpacesInString(elements); foreach (string element in elements) { handleEdgeWeightElement(element, weightElementsRead); // ein Element wurde gelesen weightElementsRead++; } // nächste Zeile lesen actualLine = reader.ReadLine(); } return(actualLine); }
private void drawAllConnections() { CConnectionList connList = CConnectionList.getInstance(); // zuerst bestimmen wie hoch der höchste Pheromonwert aller Verbindungen ist // damit wir beim zeichnen der Verbindungen diese Abhängig von ihrem Wert, dunkler // oder heller zeichnen können float highestPhermone = 0; foreach (CConnection connection in connList) { if (connection.getPheromone() > highestPhermone) { highestPhermone = connection.getPheromone(); } } Gl.glLineWidth(1f); // Verbindungen Zeichnen foreach (CConnection connection in connList) { // Farbe abhängig vom Pheromonwert der Verbindung setzen // => hohe Werte werden dunkel dagestellt // => niedrige hell float pheromonLevel = 1; if (highestPhermone != 0f) { pheromonLevel = connection.getPheromone() / highestPhermone; } // Die Verbindungen die einen geringen Pheromonwert haben sollen nicht angezeigt werden //if (pheromonLevel > 0.1) { // 0.0 == schwarz // 1.0 == weiß float color = 1 - pheromonLevel; Gl.glColor3f(color, color, color); // Eckpunkte bestimmen CTSPPoint sourcePoint = null; CTSPPoint destinationPoint = null; connection.getPoints(out sourcePoint, out destinationPoint); float depth = CONNECTION_DRAW_LAYER - (color * 100f); // Linien Zeichnen Gl.glBegin(Gl.GL_LINES); Gl.glVertex3d(sourcePoint.x, sourcePoint.y, depth); Gl.glVertex3d(destinationPoint.x, destinationPoint.y, depth); Gl.glEnd(); } } }
public void addPoint(CTSPPoint point) { if (mPoints.length() == 0) { mTourLength = 0; } else { CTSPPoint lastPointInList = mPoints.getPoint(mPoints.length() - 1); CConnection additinalConnection = CConnectionList.getInstance().getConnection(lastPointInList, point); mTourLength += additinalConnection.getDistance(); } mPoints.addPoint(point); }
public void click(object sender, EventArgs args) { if (mCursorAction.change || mCursorAction.add || mCursorAction.del) { System.Windows.Forms.MouseEventArgs mouseArgs = (System.Windows.Forms.MouseEventArgs)args; if (mouseArgs.Button == System.Windows.Forms.MouseButtons.Left) { CVector2f position = getPositionFromMouseClick(mouseArgs); //Debug.Write("pos - X: " + position.x + " Y: " + position.y + "\n"); handleCursorAction(position); CConnectionList.getInstance().generateFromPointList(CTSPLibFileParser.E_EDGE_WEIGHT_TYPE.E_EUC_2D); this.Refresh(); } } }
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 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; } } }