/// <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