Sunteți pe pagina 1din 5

import java.util.

LinkedList;

import es.uniovi.busqueda.*;
import es.uniovi.busqueda.algoritmos.*;

public class NPuzzle


extends Problema
{
private int[][] puzzle;
static private int[][]obje;
private int fi;
private int co;

public NPuzzle(int[][] matriz, int[][] obj){

puzzle = matriz;
obje = obj;
nombre = new String("N-Puzzle");
prof=0;

for (int i=0; i < matriz.length; ++i){


for (int j=0; j < matriz[i].length; ++j){
if (matriz[i][j]==0){
fi = i;
co = j;
}
}
}
}

private NPuzzle (int[][] matriz, int p, int f, int c){


puzzle = matriz;
prof = p;
fi = f;
co = c;
}

public boolean EsObjetivo(){


if (obje.length!=puzzle.length) return false;
for (int i=0; i < obje.length; ++i)
for (int j=0; j < obje[i].length; ++j)
if (obje[i][j]!=puzzle[i][j]) return false;
return true;
}

public LinkedList<InfNodo> Sucesores(){


LinkedList<InfNodo> succ = new LinkedList<InfNodo>();

if((fi+1)<puzzle.length){
int[][] copia = new int[puzzle.length][puzzle[0].length];

for (int i=0; i < puzzle.length; ++i)


for (int j=0; j < puzzle[i].length; ++j)
copia[i][j]=puzzle[i][j];

copia[fi][co] = copia[fi+1][co];
copia[fi+1][co] = 0;
NPuzzle t = new NPuzzle(copia,prof+1,fi+1,co);
succ.add(new InfNodo(t,1,new String("Mover "+ copia[fi][co] +"
hacia arriba")));
}

if((co+1)<puzzle[0].length){
int[][] copia = new int[puzzle.length][puzzle[0].length];

for (int i=0; i < puzzle.length; ++i)


for (int j=0; j < puzzle[i].length; ++j)
copia[i][j]=puzzle[i][j];

copia[fi][co] = copia[fi][co+1];
copia[fi][co+1] = 0;
NPuzzle t = new NPuzzle(copia,prof+1,fi,co+1);
succ.add(new InfNodo(t,1,new String("Mover " + copia[fi][co] + "
hacia izquierda")));
}

if((fi-1)>=0){
int[][] copia = new int[puzzle.length][puzzle[0].length];

for (int i=0; i < puzzle.length; ++i)


for (int j=0; j < puzzle[i].length; ++j)
copia[i][j]=puzzle[i][j];

copia[fi][co] = copia[fi-1][co];
copia[fi-1][co] = 0;
NPuzzle t = new NPuzzle(copia,prof+1,fi-1,co);
succ.add(new InfNodo(t,1,new String("Mover " + copia[fi][co] + "
hacia abajo")));
}

if((co-1)>=0){
int[][] copia = new int[puzzle.length][puzzle[0].length];

for (int i=0; i < puzzle.length; ++i)


for (int j=0; j < puzzle[i].length; ++j)
copia[i][j]=puzzle[i][j];

copia[fi][co] = copia[fi][co-1];
copia[fi][co-1] = 0;
NPuzzle t = new NPuzzle(copia,prof+1,fi,co-1);
succ.add(new InfNodo(t,1,new String("Mover " + copia[fi][co] + "
hacia derecha")));
}

return succ;
}

public double Heuristico(){


// Algoritmo que calcula la suma de las distancias manhattan
// hasta la solucion
double suma=0;

for (int i=0; i < puzzle.length; ++i){


for (int j=0; j < puzzle[i].length; ++j){
if(obje[i][j]!=puzzle[i][j]){
//Buscamos la posici�n correcta para la ficha en
puzzle[i][j]
int i2=0, j2=0;
while(i2<obje.length && (obje[i2][j2]!=puzzle[i][j]))
{
j2++;
if (j2 >= obje[i2].length) {
i2++;
j2=0;
}
}
//En [i2][j2] est� la posici�n correcta
suma+=Math.abs(i2-i)+Math.abs(j2-j);
}
}
}

return suma;
}

public int hashCode(){


int suma = 0, num;
for (int i=0; i < puzzle.length; ++i){
num = 0;
for (int j=0; j < puzzle[i].length; ++j)
num += puzzle[i][j] * Math.pow(10,puzzle[i].length-(j+1));
suma+=num*(i+1);
}

return suma;
}

public boolean equals( Object c ){


if ( c instanceof NPuzzle ){
NPuzzle n = (NPuzzle)c;
if (n.puzzle.length!=puzzle.length) return false;
for (int i=0; i < puzzle.length; ++i)
for (int j=0; j < puzzle[i].length; ++j)
if (n.puzzle[i][j]!=puzzle[i][j]) return false;
return true;
}
return false;
}

public String Informacion(){


String retorno = new String();

for (int i=0; i < puzzle.length; ++i){


for (int j=0; j < puzzle[i].length; ++j)
retorno= retorno + new String(puzzle[i][j]+" ");
retorno = retorno + new String(" ");
for (int j=0; j < obje[i].length; ++j)
retorno= retorno + new String(obje[i][j]+" ");
if(i!=(puzzle.length-1))retorno= retorno +
System.getProperty("line.separator");
}

return retorno;
}
public static void main(String[] args) {
long inicio, fin;
LinkedList<InfNodo> sol;
int[][] inicial = new int[3][3];
int[][] objetiv = new int[3][3];

inicial[0][0] = 1;
inicial[0][1] = 2;
inicial[0][2] = 3;

inicial[1][0] = 4;
inicial[1][1] = 5;
inicial[1][2] = 6;

inicial[2][0] = 0;
inicial[2][1] = 7;
inicial[2][2] = 8;
/*
inicial[0][0] = 1;
inicial[0][1] = 3;
inicial[0][2] = 6;

inicial[1][0] = 5;
inicial[1][1] = 2;
inicial[1][2] = 8;

inicial[2][0] = 4;
inicial[2][1] = 7;
inicial[2][2] = 0;
*/
// Objetivo

objetiv[0][0] = 1;
objetiv[0][1] = 2;
objetiv[0][2] = 3;

objetiv[1][0] = 4;
objetiv[1][1] = 5;
objetiv[1][2] = 6;

objetiv[2][0] = 7;
objetiv[2][1] = 8;
objetiv[2][2] = 0;

NPuzzle a = new NPuzzle(inicial,objetiv);

/* System.out.println("--------------------------------------------");
inicio = System.currentTimeMillis();
sol = PrimeroEnAnchura.Resuelve(a,"npuzzle_anchura.xml");
fin = System.currentTimeMillis();
System.out.println("Una soluci�n por Primero en Anchura: "+sol);
System.out.println("Y ha tardado: "+ ((fin-inicio)/1000.0) +"
segundos");

System.out.println("--------------------------------------------");

inicio = System.currentTimeMillis();
sol = PrimeroEnProfundidad.Resuelve(a,8,"npuzzle_profundidad_2.xml");
fin = System.currentTimeMillis();
System.out.println("Una soluci�n por Primero en Profundidad con plim=8:
"+sol);
System.out.println("Y ha tardado: "+ ((fin-inicio)/1000.0) +"
segundos");

System.out.println("--------------------------------------------");

inicio = System.currentTimeMillis();
sol = PrimeroEnProfundidad.Resuelve(a,"npuzzle_profundidad.xml");
fin = System.currentTimeMillis();
System.out.println("Una soluci�n por Primero en Profundidad: "+sol);
System.out.println("Y ha tardado: "+ ((fin-inicio)/1000.0) +"
segundos");

System.out.println("--------------------------------------------");
inicio = System.currentTimeMillis();
sol = ProfundidadIterativa.Resuelve(a);
fin = System.currentTimeMillis();
System.out.println("Una soluci�n por Primero en Profundidad Iterativa:
"+sol);
System.out.println("Y ha tardado: "+ ((fin-inicio)/1000.0) +"
segundos");
*/
System.out.println("--------------------------------------------");
inicio = System.currentTimeMillis();
sol = CosteUniforme.Resuelve(a,"npuzzle_coste_uniforme.xml");
fin = System.currentTimeMillis();
System.out.println("Una soluci�n por Coste Uniforme: "+sol);
System.out.println("Y ha tardado: "+ ((fin-inicio)/1000.0) +"
segundos");

System.out.println("--------------------------------------------");

inicio = System.currentTimeMillis();
sol = PrimeroElMejor.Resuelve(a,"npuzzle_primero_el_mejor.xml");
fin = System.currentTimeMillis();
System.out.println("Una soluci�n por Primero el Mejor: "+sol);
System.out.println("Y ha tardado: "+ ((fin-inicio)/1000.0) +"
segundos");

System.out.println("--------------------------------------------");

inicio = System.currentTimeMillis();
sol = AEstrella.Resuelve(a,"npuzzle_aestrella.xml");
fin = System.currentTimeMillis();
System.out.println("Una soluci�n por A*: "+sol);
System.out.println("Y ha tardado: "+ ((fin-inicio)/1000.0) +"
segundos");
System.out.println("Numero de pasos para la solucion: "+sol.size());

}
}

S-ar putea să vă placă și