// Resuelve el puzle, en su configuración actual, utilizando la estrategia introducida como parámetro public List <Operator> Solve(SlidingPuzzle initialSetup, SlidingPuzzleSolver.Strategy strategy) { // Construimos el problema a partir del puzle que nos llega, que actúa como configuración inicial // No se indica función de coste de paso, con lo que se utilizará la que viene por defecto Problem problem = new Problem(initialSetup, aoFunction, tModel, gTest); // Se crea la búsqueda según la estrategia escogida Search search = null; switch (strategy) { case Strategy.BFS: search = new BreadthFirstSearch(); break; // Por defecto se usa un GraphSearch case Strategy.DFS: search = new DepthFirstSearch(new GraphSearch()); break; // Por defecto se usa un GraphSearch // ... hay cabida para otras estrategias } // Se realiza la búsqueda sobre el problema List <Operator> operators = search.Search(problem); // Al terminar, se guardan las métricas resultantes metrics = search.GetMetrics(); return(operators); }
/* * // Para copiar el puzle con el que este trabajando otro resolutor... raro * public TankPuzzleSolver(TankPuzzleSolver copyBoard) : this(copyBoard.getPuzle()) { * * } */ // A ver si esto tiene que estar aquí o puede ser otra cosa (en el propio TankPuzzleManager) public List <Operator> Solve(TankPuzzle setup, TankPuzzleSolver.Strategy strategy) { // Construimos el problema a partir del puzle. //Pieza a pieza (el puzle tal cual será el initialSetup -lo mismo debería sacar el array-) //Aquí construimos el problema en base al puzle actual (la CONFIGURACIÓN del puzle actual), que no me gusta como es porque es el puzle con unas pocas cosas por encima!!! El dominio de problema no es un objeto Problem problem = new Problem(setup, oFunction, rFunction, goalTest); //Me molaría más que el problema no sea el solver, sino el puzle... pero bueno, quizá sea PROBLEM lo que debería llamarse el solver //public Problem(Object initialSetup, OperatorsFunction operatorsFunction, ResultFunction resultFunction, GoalTest goalTest) // AQUÍ CREARÍAMOS LA ESTRATEGIA, EL TIPO DE BÚSQUEDA, pidiéndole que use búsqueda de coste uniforme por ejemplo. Y lo llamamos Search search = null; switch (strategy) { case Strategy.BFS: search = new BreadthFirstSearch(); break; //por defecto te crea un GraphSearch, no hay que meterle nada case Strategy.DFS: search = new DepthFirstSearch(new GraphSearch()); break; // NO ENTIENDO PORQUE ESTE CONSTRUCTOR NO TE HACE NADA POR DEFECTO, Y SOY YO QUE LE ESTOY METIENDO UN GRAPHSEARCH // ... } List <Operator> operators = search.Search(problem); metrics = search.GetMetrics(); return(operators); // Deberíamos devolver también las métricas, seguramente }