/* * 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); }
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); }
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"); } } }