private void SimulationStep() { int moveDistance = int.Parse(this.textBox2.Text); //Dictionary<MyLine, double> Costs = new Dictionary<MyLine, double>(); double mincost = 100000; MyLine minline = null; //make threadpool like - room pool //fix number of modells, (number of threads) move elemnet, calculate cost //https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-foreach-loop double actualCost = model.CalculateCost().First(); foreach (MyLine line in model.modelLines) { MyLine newMyLine; Model tempModel = model.DeepCopy(line, out newMyLine); tempModel.MoveLine(moveDistance, newMyLine); double cost = tempModel.CalculateCost().First(); //Costs.Add(myLine, cost); if (mincost > cost) { mincost = cost; minline = line; } } if (mincost >= actualCost) { actualSimulationThreshold++; } //model.MoveLine(moveDistance, model.GetRandomLine()); model.MoveLine(moveDistance, minline); }
private void SimulationStepMove() { Dictionary <string, double> Costs = new Dictionary <string, double>(); MyLine minline = null; int currentMoveDistance = moveDistance; double actualCost = CostCalculationService.CalculateCost(model).First(); double mincost = actualCost; Parallel.For(0, model.modelLines.Count, index => { MyLine myLine = model.modelLines.ElementAt(index); MyLine newMyLine = null; Model tempModel = model.DeepCopy(myLine, out newMyLine); tempModel.MoveLine(moveDistance, newMyLine); double cost = CostCalculationService.CalculateCost(tempModel).First(); lock (locker) { Costs.Add("+" + myLine.ToString(), cost); if (mincost > cost) { mincost = cost; minline = myLine; currentMoveDistance = moveDistance; } } }); Parallel.For(0, model.modelLines.Count, index => { MyLine myLine = model.modelLines.ElementAt(index); MyLine newMyLine = null; Model tempModel = model.DeepCopy(myLine, out newMyLine); tempModel.MoveLine(-moveDistance, newMyLine); double cost = CostCalculationService.CalculateCost(tempModel).First(); lock (locker) { Costs.Add("-" + myLine.ToString(), cost); if (mincost > cost) { mincost = cost; minline = myLine; currentMoveDistance = -moveDistance; } } }); if (mincost >= actualCost) { actualSimulationThreshold++; } if (minline != null) { model.MoveLine(currentMoveDistance, minline); } else { MessageBox.Show("no line to move"); } LineAndCostActualStep.Clear(); foreach (var item in Costs) { LineAndCostActualStep.Add(new LineAndCost(item.Key, item.Value, actualSimulationIndex)); } //System.Windows.Forms.MessageBox.Show(mincost.ToString()); //SimulationCosts.Add(new Costs(actualSimulationIndex, mincost)); double[] costArray = CostCalculationService.CalculateCost(model); SimulationCosts.Add(new Costs(actualSimulationIndex, costArray[0], costArray[1], costArray[2], costArray[3])); actualSimulationIndex++; }