コード例 #1
0
        /*
         * Führt den 2-Opt Algorithmus aus, um eine lokal optimale Bahnplanung zu erreichen
         */
        public Druckfolge _2Opt(Druckfolge initialLösung, Graph_ graph, bool isInfill)
        {
            Druckfolge _2optLösung = new Druckfolge(initialLösung);
            Druckfolge neueLösung  = _2optLösung.DeepCopy();

            /*
             * Die Inkremente für i,j bestimmten fast vollständig die Laufzeit des gesamten Programms und sind deshalb
             * je nach Fall anzupassen.
             * Kleine Inkremente: Liefern eine Bahnplanung mit geringeren Kosten, aber die Laufzeit des Programms steigt exponentiell
             * Große Inkremente: Liefern eine Bahnplanung mit höheren Kosten, aber die Laufzeit bleibt sehr gering
             */
            for (int i = 0; i < graph.GetVoxelKoordinaten().Count; i += graph.GetVoxelKoordinaten().Count / 20)
            {
                for (int j = 1; j < graph.GetVoxelKoordinaten().Count; j += graph.GetVoxelKoordinaten().Count / 40)
                {
                    neueLösung = _2optLösung.DeepCopy();
                    _2OptSwap(neueLösung, graph.GetVoxelKoordinaten(), isInfill, i, j);
                    if (!(neueLösung.GetGesamtkosten() > _2optLösung.GetGesamtkosten()))
                    {
                        _2optLösung = neueLösung.DeepCopy();
                    }
                }
            }
            return(_2optLösung);
        }
コード例 #2
0
        public Druckfolge _2Opt(Druckfolge initialLösung, Graph_ graph)
        {
            Druckfolge _2optLösung = new Druckfolge(initialLösung);
            Druckfolge neueLösung  = _2optLösung.DeepCopy();

            for (int improve = 0; improve < 5; improve++)
            {
                for (int i = 0; i < graph.GetVoxelKoordinaten().Count; i++)
                {
                    for (int j = i + 1; j < graph.GetVoxelKoordinaten().Count; j++)
                    {
                        neueLösung = _2optLösung.DeepCopy();
                        _2OptSwap(neueLösung, graph.GetVoxelKoordinaten(), i, j);
                        if (!(neueLösung.GetGesamtkosten() > _2optLösung.GetGesamtkosten()))
                        {
                            _2optLösung = neueLösung.DeepCopy();
                        }
                    }
                }
            }
            return(_2optLösung);
        }
コード例 #3
0
        public void Bahnplanung(List <Voxel> voxelList)
        {
            /*
             * Teilen der gesamten Voxelliste in Randvoxel und Rest, damit unterschiedliche Bahnen geplant werden können
             * splitList[0] enthält Schichtränder
             * splitList[1] enthält alle anderen Voxel
             */
            List <List <Voxel> > splitList = new List <List <Voxel> >(SplitVoxelList(voxelList));

            // Erstelle zwei Graphen : Randvoxel-Graph und Restvoxel-Graph
            Graph_ randGraph = new Graph_(VoxelToGraph(splitList[0]));
            Graph_ restGraph = new Graph_(VoxelToGraph(splitList[1]));

            // Erstellen der Druckfolgen
            Druckfolge initialRand = new Druckfolge();
            Druckfolge initialRest = new Druckfolge();

            Druckfolge _2optRand = new Druckfolge();
            Druckfolge _2optRest = new Druckfolge();

            Druckfolge optimizedRand = new Druckfolge();
            Druckfolge optimizedRest = new Druckfolge();

            for (int NNRUNS = 0; NNRUNS < 10; NNRUNS++)
            {
                Random randomizer = new Random();
                int    startNode  = (randomizer.Next(0, restGraph.GetGraph().Count));
                // Generieren einer NN-Tour mit random Startknoten
                initialRand = NearestNeighbor(randGraph.DeepCopy(), startNode);
                initialRest = NearestNeighbor(restGraph.DeepCopy(), startNode);

                // Verbesserung der initialen Lösung durch 2-opt
                _2optRand = _2Opt(initialRand, randGraph.DeepCopy());
                _2optRest = _2Opt(initialRest, restGraph.DeepCopy());

                //Behalten des besten lokalen Optimums
                if (_2optRand.GetGesamtkosten() < optimizedRand.GetGesamtkosten())
                {
                    optimizedRand = _2optRand.DeepCopy();
                }
                if (_2optRest.GetGesamtkosten() < optimizedRest.GetGesamtkosten())
                {
                    optimizedRest = _2optRest.DeepCopy();
                }
            }
            // Textoutput für Koordinate(X,Y,Z), Priority
            string path = "F:\\Uni\\Uni WS 17_18\\Studienprojekt\\ProgrammierKram\\GraphUmwandlung";

            using (StreamWriter outputFile = new StreamWriter(path + @"\Data.txt"))
            {
                uint index = 0;
                for (int i = 0; i < restGraph.GetVoxelKoordinaten().Count; i++)
                {
                    index = optimizedRest.GetPriorityItem(i);
                    outputFile.Write(restGraph.GetVoxelKoordinate(0, (int)index) + " " +
                                     restGraph.GetVoxelKoordinate(1, (int)index) + " " +
                                     restGraph.GetVoxelKoordinate(2, (int)index) + "\r\n");
                }
            }

            using (StreamWriter outputFile = new StreamWriter(path + @"\DataINIT.txt"))
            {
                uint index = 0;
                for (int i = 0; i < restGraph.GetVoxelKoordinaten().Count; i++)
                {
                    index = initialRest.GetPriorityItem(i);
                    outputFile.Write(restGraph.GetVoxelKoordinate(0, (int)index) + " " +
                                     restGraph.GetVoxelKoordinate(1, (int)index) + " " +
                                     restGraph.GetVoxelKoordinate(2, (int)index) + "\r\n");
                }
            }
        }