Ejemplo n.º 1
0
        /// <summary>
        /// Μέθοδος που επιστρέφει το μέτωπο ταξινομημένο. Με χρήση της ευρετικής συνάρτησης,
        /// το μέτωπο αναζήτησης ταξινομείται ώστε να γίνει επίσκεψη πρώτα στον κατάλληλο κόμβο ( βάση αλγορίθμου).
        /// </summary>
        /// <param name="method"> αλγόριθμος </param>
        /// <returns> το μέτωπο </returns>
        public Frontier SortedFrontier(Αuxiliary.methodEnum method)
        {
            Frontier resultFrontier = new Frontier();

            switch (method)
            {
            case Αuxiliary.methodEnum.Breadth:
                resultFrontier = this;
                break;

            case Αuxiliary.methodEnum.Depth:
                resultFrontier = this;
                break;

            case Αuxiliary.methodEnum.Best:
                var test = from state in this orderby state.h select state;
                foreach (State s in test)
                {
                    resultFrontier.AddLast(s);
                }
                break;

            case Αuxiliary.methodEnum.AStar:
                test = from state in this orderby state.f select state;
                foreach (State s in test)
                {
                    resultFrontier.AddLast(s);
                }
                break;
            }
            return(resultFrontier);
        }
        /// <summary>
        /// Η μέθοδος αυτή εξετάζει τους κόμβους στο μέτωπο αναζήτησης μέχρι να βρει λύση στο παιχνίδι ή να φτάσει σε timeout.
        /// </summary>
        private static void solveProblem()
        {
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start(); // ξεκινάει η χρονομέτρηση.

            Frontier gameFrontier = new Frontier();

            Αuxiliary.gameHistory = new Frontier();

            int step = 0;

            gameFrontier.AddLast(initialState);
            method = getMethod();

            // Επανάληψη που εξετάζει όλους τους κόμβους (καταστάσεις) που υπάρχουν στο μέτωπο αναζήτησης.
            while (gameFrontier.Count > 0)
            {
                State currentState = gameFrontier.Pop();
                Αuxiliary.gameHistory.AddLast(currentState);
                step++;

                if (step % 100 == 0)
                {
                    System.Console.WriteLine("Step " + step);
                }

                // αν έχει βρεθεί λύση.
                if (currentState.Status() == State.stateStatusEnum.SolutionFound)
                {
                    System.Console.WriteLine("Βρέθηκε λύση σε " + Convert.ToString(stopWatch.ElapsedMilliseconds / 1000) + " δευτερόλεπτα");
                    State lastState  = currentState;
                    State t          = lastState.Parent;
                    int   totalSteps = 0;
                    while (t.Parent != initialState)
                    {
                        t.SolutionChild = lastState;
                        lastState       = t;
                        t = lastState.Parent;
                        totalSteps++;
                    }
                    System.Console.WriteLine("Βήματα από την αρχική κατάσταση εως τη λύση " + Convert.ToString(totalSteps));
                    System.Console.WriteLine("Κόμβοι που εξετάστηκαν: " + Convert.ToString(step));
                    t.SolutionChild = lastState;
                    string solutionText = totalSteps.ToString() + Environment.NewLine;

                    // μαζεύω τα βήματα μέχρι την λύση.
                    while (t.SolutionChild != null)
                    {
                        //Stopwatch s = new Stopwatch();
                        //s.Start();

                        solutionText = solutionText + t.TotalMove() + Environment.NewLine;
                        t            = t.SolutionChild;
                    }

                    // εξαγωγή σε αρχείο.
                    solutionText = solutionText + t.TotalMove() + Environment.NewLine;
                    System.IO.File.WriteAllText(outputFileName, solutionText);
                    System.Diagnostics.Process.Start(outputFileName);
                    return;
                } // if

                // αν δεν βρέθηκε λύση εξετάζω τα παιδιά του κόμβου ανάλογα με τον αλγόριθμο πάντα.
                Frontier childrenFrontier = currentState.GetChildrenStates(method);
                switch (method)
                {
                case Αuxiliary.methodEnum.Breadth:     // αν έχει επιλεγεί πρώτα σε πλάτος, τότε προσθέτω στην αρχή (εξετάζεται στο τέλος) του μετώπου το State εκείνο.
                    foreach (State state in childrenFrontier)
                    {
                        gameFrontier.AddFirst(state);
                    }
                    break;

                case Αuxiliary.methodEnum.Depth:     // αν έχει επιλεγεί πρώτα σε βάθος, τότε βάζω το State στο τέλος (άρα θα είναι το επόμενο που θα εξεταστεί).
                    foreach (State state in childrenFrontier)
                    {
                        gameFrontier.AddLast(state);
                    }
                    break;

                case Αuxiliary.methodEnum.AStar:     // Για ευρετικούς αλγορίθμους προσθέτω το Stat στο τέλος και μετά ταξινομώ με βάση την ευρετική συνάρτηση.
                    foreach (State state in childrenFrontier)
                    {
                        gameFrontier.AddLast(state);
                    }
                    gameFrontier = gameFrontier.SortedFrontier(method);
                    break;

                case Αuxiliary.methodEnum.Best:     // Για ευρετικούς αλγορίθμους προσθέτω το State στο τέλος και μετά ταξινομώ με βάση την ευρετική συνάρτηση.
                    foreach (State state in childrenFrontier)
                    {
                        gameFrontier.AddLast(state);
                    }
                    gameFrontier = gameFrontier.SortedFrontier(method);
                    break;

                case Αuxiliary.methodEnum.Empty:
                    break;
                }


                if (stopWatch.ElapsedMilliseconds > Αuxiliary.TIMEOUT * 1000)
                {
                    System.Console.WriteLine("Δεν ήταν δυνατή η επίλυση του προβλήματος σε " + Convert.ToString(Αuxiliary.TIMEOUT) + " δευτερόλεπτα");
                    return;
                }
            } // while
        }     // solveProblem method