Beispiel #1
0
        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));
                    }
                }
            }
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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();
        }
Beispiel #4
0
        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));
                }
            }
        }