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();
                }
            }
        }
Beispiel #5
0
        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();
                }
            }
        }
Beispiel #7
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 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;
            }
            }
        }