private void CalculateSwitchCosts() { int rooms = Model.rooms.Count; for (int index = 0; index < rooms; index++) { for (int secondindex = index + 1; secondindex < rooms; secondindex++) { _Room r1 = Model.rooms.ElementAt(index); _Room r2 = Model.rooms.ElementAt(secondindex); _Model tempModel = Model.DeepCopy(r1, r2, out _Room r1target, out _Room r2target); tempModel.SwitchRooms(ref r1target, ref r2target); if (tempModel.IsInInvalidState) { continue; } Cost cost = CostCalculationService.CalculateCostNew(tempModel); lock (locker) { Actions.Add(new Switch(ref r1, ref r2, cost)); } } } }
private void CalculateDoorCosts() { //calculate every possible scenario, every yesno, the outer lines are not nessesary 2,3,7,8 _Model tempModel = Model;//.DeepCopy(); List <_Line> allLinesFlat = tempModel.AllLinesFlat(); int[] arr = Enumerable.Range(0, allLinesFlat.Count).ToArray(); //TODO: we could ommit outside lines List <int[]> indicesToSetAsDoors = CFG.printCombination(arr, allLinesFlat.Count, Model.rooms.Count); for (int index = 0; index < indicesToSetAsDoors.Count; index++) { List <_Line> currentLines = new List <_Line>(); int[] elementAt = indicesToSetAsDoors.ElementAt(index); if (elementAt.Contains(1) && elementAt.Contains(2) && elementAt.Contains(7) && elementAt.Contains(8)) { int breakpointint = 0; } foreach (int i in elementAt) { currentLines.Add(allLinesFlat.ElementAt(i)); } tempModel.MakeLineDoor(currentLines); Cost c = CostCalculationService.CalculateDoorCost(tempModel); DoorActions.Add(new MakeDoor(currentLines, c)); } int breakpoint = DoorActions.Count; }
public void RunSteps() { st.Start(); while (exitCondition == ExitCondition.Running) { Actions.Clear(); DoorActions.Clear(); SaveState(); actualCost = CostCalculationService.CalculateCostNew(Model); actualCost.Index = CurrentIndex; CalculateCostsForState(); bool m = Model.IsInInvalidState; MakeAStepByTheCalculatedCosts(); //CalculateDoorCosts(); //MakeStepByDoorChanges(); HandleModelChangeUpdate(); if (CurrentIndex >= MaxIndex) { exitCondition = ExitCondition.isFinished; } if (st.ElapsedMilliseconds > maxSeconds * 1000) { exitCondition = ExitCondition.isTimeout; } if (ActualTreshold >= MaxTreshold) { exitCondition = ExitCondition.isTreshold; } CurrentIndex++; Thread.Sleep(5); } Logger.WriteLog($"Run Ended.\nExitCondition : {exitCondition}"); exitCondition = ExitCondition.Running; ActualTreshold = 0; MaxIndex += MaxIndex; st.Reset(); }
private void CalculateMoveCosts() { List <_Line> allLinesFlat = Model.AllLinesFlat(); for (int index = 0; index < allLinesFlat.Count; index++) { _Line myLine = allLinesFlat.ElementAt(index); _Model tempModel = Model.DeepCopy(myLine, out _Line newMyLine); tempModel.MoveLine(baseMoveDistance, newMyLine); if (tempModel.IsInInvalidState) { continue; } Cost costsnew = CostCalculationService.CalculateCostNew(tempModel); lock (locker) { Actions.Add(new Move(myLine, costsnew, baseMoveDistance)); } } for (int index = 0; index < allLinesFlat.Count; index++) { _Line myLine = allLinesFlat.ElementAt(index); _Model tempModel = Model.DeepCopy(myLine, out _Line newMyLine); tempModel.MoveLine(-baseMoveDistance, newMyLine); if (tempModel.IsInInvalidState) { continue; } Cost costsnew = CostCalculationService.CalculateCostNew(tempModel); lock (locker) { Actions.Add(new Move(myLine, costsnew, -baseMoveDistance)); } } }