Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Clase para el algoritmo: Busqueda en anchura
- public class BFS {
- // variables del algoritmo
- int j, n, m, s;
- int Step;
- String miObjetivo;
- Nodo nodo, suc, actual;
- LinkedList<String> cola;
- Graphics g;
- // inicializa el algoritmo
- public BFS() {
- // inicializa el algoritmo en caso de que haya uno cargado
- if (ListaNodos.size() > 0)
- inicio();
- }
- // metodos para gestionar variables
- public String getCola() {
- int temp;
- String cadena;
- if ((Step == 0) || (Step > 3)) {
- cadena = "QUEUE={";
- for (temp = 0; temp < cola.size(); temp++) {
- cadena += cola.get(temp);
- if (temp < cola.size() - 1)
- cadena += ", ";
- }
- cadena += "}";
- } else {
- cadena = "";
- }
- return cadena;
- }
- // reinicia el algoritmo
- public void reset() {
- // inicia el algoritmo;
- if (ListaNodos.size() > 0)
- inicio();
- }
- // ejecuta el algoritmo en modo temporizador
- public void run() {
- while (Step < 4) {
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- case 3:
- paso3();
- break;
- default:
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // retardo de un segundo
- try {
- Thread.sleep(Temporizador);
- } catch (Exception e) {
- }
- }
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // ejecuta el algoritmo en modo paso por paso
- public boolean step() {
- boolean ejecutandose = true;
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- case 3:
- paso3();
- break;
- default: {
- ejecutandose = false;
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- }
- return ejecutandose;
- }
- // metodos para desglosar el algoritmo en pasos
- private void inicio() {
- // inicializa el objetivo
- miObjetivo = "";
- // inicializa variables para explorar sucesores
- j = 0;
- m = 0;
- nodo = null;
- suc = null;
- actual = null;
- // inicializa objetos
- cola = new LinkedList<String>();
- g = Grafo.this.getGraphics();
- // comienza por el nodo raiz
- nodo = ListaNodos.get(0);
- cola.add(nodo.toString());
- // siguiente paso
- Step = 0;
- }
- // metodos para desglosar el algoritmo en pasos
- private void paso0() {
- if (cola.size() != 0) {
- // extrae el primer elemento de la cola
- n = IndiceNodos.indexOf(cola.poll());
- nodo = ListaNodos.get(n);
- // establece el nodo actual
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- actual = nodo;
- // si el nodo raiz es objetivo
- if (nodo.getEsObjetivo()) {
- // establece el nodo objetivo
- miObjetivo = nodo.toString();
- // termina con exito
- Step = 4;
- } else {
- // explora todos los nodos sucesores
- m = nodo.maxSucesores();
- j = 0;
- // establece el siguiente paso
- Step = 1;
- }
- } else {
- // termina sin exito
- Step = 4;
- }
- }
- private void paso1() {
- if (j < m) {
- s = IndiceNodos.indexOf(nodo.getIdSucesor(j));
- suc = ListaNodos.get(s);
- // establece puntero a nodo si el sucesor no se ha generado
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- suc.setEstado(Nodo.TEstado.ABIERTO);
- suc.pintarNodo(g);
- cola.add(suc.toString());
- // comprueba si es objetivo
- if (suc.getEsObjetivo()) {
- // establece el nodo objetivo
- miObjetivo = suc.toString();
- // establece paso 2
- Step = 2;
- }
- j++;
- } else {
- // establece siguiente paso
- Step = 2;
- paso2();
- }
- }
- private void paso2() {
- // actualiza el nodo actual
- actual.setEstado(Nodo.TEstado.CERRADO);
- actual.pintarNodo(g);
- // establece el siguiente paso
- if (miObjetivo != "")
- Step = 3;
- else
- Step = 0;
- }
- private void paso3() {
- if (miObjetivo != "") {
- // establece el estado de exito
- n = IndiceNodos.indexOf(miObjetivo);
- nodo = ListaNodos.get(n);
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- }
- // terminan con exito
- Step = 4;
- }
- }
- // Clase para el algoritmo: Busqueda en profundidad
- public class DFS {
- // variables del algoritmo
- int j, n, m, s;
- int Step;
- String miObjetivo;
- Nodo nodo, suc, actual;
- Stack<String> pila;
- Stack<String> buffer;
- Graphics g;
- // inicializa el algoritmo
- public DFS() {
- // inicializa el algoritmo en caso de que haya uno cargado
- if (ListaNodos.size() > 0)
- inicio();
- }
- // metodos para gestionar variables
- public String getPila() {
- int temp;
- String cadena;
- if ((Step == 0) || (Step > 3)) {
- cadena = "STACK={";
- for (temp = pila.size() - 1; temp >= 0; temp--) {
- cadena += pila.get(temp);
- if (temp > 0)
- cadena += ", ";
- }
- cadena += "}";
- } else {
- cadena = "";
- }
- return cadena;
- }
- // reinicia el algoritmo
- public void reset() {
- // inicia el algoritmo;
- if (ListaNodos.size() > 0)
- inicio();
- }
- // ejecuta el algoritmo en modo temporizador
- public void run() {
- while (Step < 4) {
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- case 3:
- paso3();
- break;
- default:
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // retardo de un segundo
- try {
- Thread.sleep(Temporizador);
- } catch (Exception e) {
- }
- }
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // ejecuta el algoritmo en modo paso por paso
- public boolean step() {
- boolean ejecutandose = true;
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- case 3:
- paso3();
- break;
- default: {
- ejecutandose = false;
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- }
- return ejecutandose;
- }
- // metodos para desglosar el algoritmo en pasos
- private void inicio() {
- // inicializa el objetivo
- miObjetivo = "";
- // inicializa variables
- j = 0;
- m = 0;
- nodo = null;
- suc = null;
- actual = null;
- // inicializa objetos
- pila = new Stack<String>();
- buffer = new Stack<String>();
- g = Grafo.this.getGraphics();
- // comienza por el nodo raiz
- nodo = ListaNodos.get(0);
- pila.push(nodo.toString());
- // siguiente paso
- Step = 0;
- }
- // metodos para desglosar el algoritmo en pasos
- private void paso0() {
- if (pila.size() != 0) {
- // extrae el primer elemento de la pila
- n = IndiceNodos.indexOf(pila.pop());
- nodo = ListaNodos.get(n);
- // establece el nodo actual
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- actual = nodo;
- // si el nodo raiz es objetivo
- if (nodo.getEsObjetivo()) {
- // establece el nodo objetivo
- miObjetivo = nodo.toString();
- // termina con exito
- Step = 4;
- } else {
- // explora todos los nodos sucesores
- m = nodo.maxSucesores();
- j = 0;
- // establece el siguiente paso
- Step = 1;
- }
- } else {
- // termina sin exito
- Step = 4;
- }
- }
- private void paso1() {
- if (j < m) {
- s = IndiceNodos.indexOf(nodo.getIdSucesor(j));
- suc = ListaNodos.get(s);
- // establece puntero a nodo si el sucesor no se ha generado
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- suc.setEstado(Nodo.TEstado.ABIERTO);
- suc.pintarNodo(g);
- buffer.add(suc.toString());
- // comprueba si es objetivo
- if (suc.getEsObjetivo()) {
- // establece el nodo objetivo
- miObjetivo = suc.toString();
- // establece siguiente paso
- Step = 2;
- }
- j++;
- } else {
- // establece siguiente paso
- Step = 2;
- paso2();
- }
- }
- private void paso2() {
- // actualiza el nodo actual
- actual.setEstado(Nodo.TEstado.CERRADO);
- actual.pintarNodo(g);
- // copia el buffer en la pila del algoritmo
- while (buffer.size() > 0)
- pila.push(buffer.pop());
- // establece el siguiente paso
- if (miObjetivo != "")
- Step = 3;
- else
- Step = 0;
- }
- private void paso3() {
- if (miObjetivo != "") {
- // establece el estado de exito
- n = IndiceNodos.indexOf(miObjetivo);
- nodo = ListaNodos.get(n);
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- }
- // terminan con exito
- Step = 4;
- }
- }
- // Clase para el algoritmo: Escalada simple
- public class SHC {
- // variables del algoritmo
- int j, n, m, s;
- int Step;
- String miObjetivo;
- String actual;
- Nodo nodo, suc;
- Graphics g;
- // inicializa el algoritmo
- public SHC() {
- // inicializa el algoritmo en caso de que haya uno cargado
- if (ListaNodos.size() > 0)
- inicio();
- }
- // reinicia el algoritmo
- public void reset() {
- // inicia el algoritmo;
- if (ListaNodos.size() > 0)
- inicio();
- }
- // ejecuta el algoritmo en modo temporizador
- public void run() {
- while (Step < 3) {
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- default:
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // retardo de un segundo
- try {
- Thread.sleep(Temporizador);
- } catch (Exception e) {
- }
- }
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // ejecuta el algoritmo en modo paso por paso
- public boolean step() {
- boolean ejecutandose = true;
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- default: {
- ejecutandose = false;
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- }
- return ejecutandose;
- }
- // metodos para desglosar el algoritmo en pasos
- private void inicio() {
- // inicializa el objetivo
- miObjetivo = "";
- // inicializa variables para explorar sucesores
- j = 0;
- m = 0;
- nodo = null;
- suc = null;
- // inicializa objetos
- actual = "";
- g = Grafo.this.getGraphics();
- // comienza por el primer nodo
- nodo = ListaNodos.get(0);
- actual = nodo.toString();
- // siguiente paso
- Step = 0;
- }
- private void paso0() {
- // extrae el nodo de la cola
- n = IndiceNodos.indexOf(actual);
- nodo = ListaNodos.get(n);
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- // comprueba si es objetivo
- if (nodo.getEsObjetivo()) {
- // establece el objetivo encontrado
- miObjetivo = nodo.toString();
- // termina con exito
- Step = 3;
- } else {
- // se prepara para explorar los sucesores
- m = nodo.maxSucesores();
- j = 0;
- // siguiente paso
- Step = 1;
- }
- }
- private void paso1() {
- if (j < m) {
- // seleccionar un operador que no haya sido aplicado con
- // aterioridad
- do {
- s = IndiceNodos.indexOf(nodo.getIdSucesor(j));
- suc = ListaNodos.get(s);
- if (suc.getEstado() != Nodo.TEstado.NOGENERADO) {
- // siguiente sucesor
- j++;
- }
- } while ((j < m)
- && (suc.getEstado() != Nodo.TEstado.NOGENERADO));
- if (suc.getEstado() == Nodo.TEstado.NOGENERADO) {
- // establece puntero a nodo
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- // pinta el nodo abierto
- suc.setEstado(Nodo.TEstado.ABIERTO);
- suc.pintarNodo(g);
- // si es un estado objetivo, devolverlo y terminar
- if (suc.getEsObjetivo()
- || (suc.getValor() < nodo.getValor())) {
- // siguiente paso
- Step = 2;
- } else {
- // si no es objetivo ni es mejor continuar bucle
- j++;
- }
- } else {
- // termina con fracaso
- Step = 3;
- }
- } else {
- // termina con fracaso
- Step = 3;
- }
- }
- private void paso2() {
- // pinta el nodo
- nodo.setEstado(Nodo.TEstado.CERRADO);
- nodo.pintarNodo(g);
- // actualiza la cola
- actual = suc.toString();
- // siguiente paso
- Step = 0;
- }
- }
- // Clase para el algoritmo: Escalada por la maxima pendiente
- public class SAHC {
- // variables del algoritmo
- int j, n, m, s;
- int Step;
- String miObjetivo;
- String actual;
- Nodo nodo, suc, succ;
- Graphics g;
- // inicializa el algoritmo
- public SAHC() {
- // inicializa el algoritmo en caso de que haya uno cargado
- if (ListaNodos.size() > 0)
- inicio();
- }
- // reinicia el algoritmo
- public void reset() {
- // inicia el algoritmo;
- if (ListaNodos.size() > 0)
- inicio();
- }
- // ejecuta el algoritmo en modo temporizador
- public void run() {
- while (Step < 4) {
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- case 3:
- paso3();
- break;
- default:
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // retardo de un segundo
- try {
- Thread.sleep(Temporizador);
- } catch (Exception e) {
- }
- }
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // ejecuta el algoritmo en modo paso por paso
- public boolean step() {
- boolean ejecutandose = true;
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- case 2:
- paso2();
- break;
- case 3:
- paso3();
- break;
- default: {
- ejecutandose = false;
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- }
- return ejecutandose;
- }
- // metodos para desglosar el algoritmo en pasos
- private void inicio() {
- // inicializa el objetivo
- miObjetivo = "";
- // inicializa variables para explorar sucesores
- j = 0;
- m = 0;
- nodo = null;
- suc = null;
- succ = null;
- // inicializa objetos
- actual = "";
- g = Grafo.this.getGraphics();
- // comienza por el primer nodo
- nodo = ListaNodos.get(0);
- actual = nodo.toString();
- // siguiente paso
- Step = 0;
- }
- private void paso0() {
- // extrae el nodo actual
- n = IndiceNodos.indexOf(actual);
- nodo = ListaNodos.get(n);
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- // comprueba si es objetivo
- if (nodo.getEsObjetivo()) {
- // establece el objetivo encontrado
- miObjetivo = nodo.toString();
- // termina con exito
- Step = 4;
- } else {
- // se prepara para explorar los sucesores
- m = nodo.maxSucesores();
- j = 0;
- // siguiente paso
- Step = 1;
- }
- }
- private void paso1() {
- if ((j < m) && (j == 0)) {
- // asigna el primer sucesor a succ para comparar
- s = IndiceNodos.indexOf(nodo.getIdSucesor(0));
- succ = ListaNodos.get(s);
- // establece puntero a nodo
- succ.setIdPuntero(nodo.toString());
- succ.setCostePuntero(nodo.getCosteSucesor(j));
- succ.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- // pinta el nodo abierto
- succ.setEstado(Nodo.TEstado.ABIERTO);
- succ.pintarNodo(g);
- j++;
- // siguiente paso
- Step = 2;
- } else {
- // termina con fracaso
- Step = 4;
- }
- }
- private void paso2() {
- // explora los sucesores
- if (j < m) {
- s = IndiceNodos.indexOf(nodo.getIdSucesor(j));
- suc = ListaNodos.get(s);
- // establece puntero a nodo
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- // pinta el nodo abierto
- suc.setEstado(Nodo.TEstado.ABIERTO);
- suc.pintarNodo(g);
- // si es un estado objetivo, devolverlo y terminar
- if (suc.getEsObjetivo()) {
- // selecciona el mejor estado
- succ = suc;
- // siguiente paso
- Step = 3;
- } else if (suc.getValor() < succ.getValor()) {
- // selecciona el mejor estado
- succ = suc;
- }
- // siguiente sucesor
- j++;
- } else {
- if (succ.getValor() < nodo.getValor()) {
- // siguiente paso
- Step = 3;
- paso3();
- } else {
- // termina con fracaso
- Step = 4;
- }
- }
- }
- private void paso3() {
- // pinta el nodo
- nodo.setEstado(Nodo.TEstado.CERRADO);
- nodo.pintarNodo(g);
- // actualiza el nodo actual
- actual = succ.toString();
- // siguiente paso
- Step = 0;
- }
- }
- // Clase para el algoritmo: Primero el mejor
- public class BF {
- // variables del algoritmo
- int j, n, m, s;
- int Step;
- String miObjetivo;
- Nodo nodo, suc;
- Vector<String> abiertos;
- Vector<String> cerrados;
- Graphics g;
- // inicializa el algoritmo
- public BF() {
- // inicializa el algoritmo en caso de que haya uno cargado
- if (ListaNodos.size() > 0)
- inicio();
- }
- // metodos para gestionar variables
- public String getAbierta() {
- int temp;
- String cadena;
- int itemp;
- Nodo ntemp;
- if (Step == 0) {
- cadena = "OPENED={";
- for (temp = 0; temp < abiertos.size(); temp++) {
- cadena += abiertos.get(temp) + "(";
- itemp = IndiceNodos.indexOf(abiertos.get(temp));
- ntemp = ListaNodos.get(itemp);
- cadena += Double.toString(ntemp.getValor());
- cadena += ")";
- if (temp < abiertos.size() - 1)
- cadena += ", ";
- }
- cadena += "}";
- } else {
- cadena = "";
- }
- return cadena;
- }
- public String getCerrada() {
- int temp;
- String cadena;
- if (Step == 0) {
- cadena = "CLOSED={";
- for (temp = 0; temp < cerrados.size(); temp++) {
- cadena += cerrados.get(temp);
- if (temp < cerrados.size() - 1)
- cadena += ", ";
- }
- cadena += "}";
- } else {
- cadena = "";
- }
- return cadena;
- }
- // reinicia el algoritmo
- public void reset() {
- // inicia el algoritmo;
- if (ListaNodos.size() > 0)
- inicio();
- }
- // ejecuta el algoritmo en modo temporizador
- public void run() {
- while (Step < 2) {
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- default:
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // retardo de un segundo
- try {
- Thread.sleep(Temporizador);
- } catch (Exception e) {
- }
- }
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // ejecuta el algoritmo en modo paso por paso
- public boolean step() {
- boolean ejecutandose = true;
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- default: {
- ejecutandose = false;
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- }
- return ejecutandose;
- }
- // metodos para desglosar el algoritmo en pasos
- private void inicio() {
- // inicializa el objetivo
- miObjetivo = "";
- // inicializa variables para explorar sucesores
- j = 0;
- m = 0;
- nodo = null;
- suc = null;
- // inicializa objetos
- abiertos = new Vector<String>();
- cerrados = new Vector<String>();
- g = Grafo.this.getGraphics();
- // comienza por el primer nodo
- nodo = ListaNodos.get(0);
- // encola el primer nodo
- abiertos.add(nodo.toString());
- // siguiente paso
- Step = 0;
- }
- private void paso0() {
- if (abiertos.size() != 0) {
- // extrae el primer nodo de la pila abiertos
- n = IndiceNodos.indexOf(abiertos.remove(0));
- nodo = ListaNodos.get(n);
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- if (!nodo.getEsObjetivo()) {
- // se inserta en la lista de cerrados
- cerrados.add(nodo.toString());
- // se prepara para explorar los sucesores
- m = nodo.maxSucesores();
- j = 0;
- // siguiente paso
- Step = 1;
- } else {
- // establece el objetivo encontrado
- miObjetivo = nodo.toString();
- // termina con exito
- Step = 2;
- }
- } else {
- // termina con fracaso
- Step = 2;
- }
- }
- private void paso1() {
- if (j < m) {
- // obtiene el nodo sucesor
- s = IndiceNodos.indexOf(nodo.getIdSucesor(j));
- suc = ListaNodos.get(s);
- if (suc.getEstado() == Nodo.TEstado.NOGENERADO) {
- // establece puntero a nodo si el sucesor no se ha generado
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- // inserta el elemento en la lista ABIERTOS
- suc.setEstado(Nodo.TEstado.ABIERTO);
- suc.pintarNodo(g);
- // inserta el sucesor en la lista de abiertos
- abiertos.add(suc.toString());
- } else if ((suc.getEstado() == Nodo.TEstado.ABIERTO)) {
- // modifica el puntero del sucesor a nodo
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- suc.pintarNodo(g);
- } else if ((suc.getEstado() == Nodo.TEstado.CERRADO)) {
- // no se que hacer
- }
- j++;
- } else {
- if (abiertos.size() != 0) {
- // pinta el nodo
- nodo.setEstado(Nodo.TEstado.CERRADO);
- nodo.pintarNodo(g);
- // reordena la lista de abiertos en funcion de: f = h + g
- reordenar(abiertos);
- // siguiente paso
- Step = 0;
- } else {
- // termina con fracaso
- Step = 2;
- }
- }
- }
- private void reordenar(Vector<String> vector) {
- // Ordenacion por seleccion
- Nodo ntemp;
- int itemp;
- String nodoi, nodoj, minn;
- double valori, valorj;
- int minj;
- double minx;
- int N = vector.size();
- int i, j;
- for (i = 0; i < N - 1; i++) {
- nodoi = (String) vector.get(i);
- itemp = IndiceNodos.indexOf(nodoi);
- ntemp = ListaNodos.get(itemp);
- valori = ntemp.getValor();
- minj = i;
- minx = valori;
- minn = nodoi;
- for (j = i; j < N; j++) {
- nodoj = vector.get(j);
- itemp = IndiceNodos.indexOf(nodoj);
- ntemp = ListaNodos.get(itemp);
- valorj = ntemp.getValor();
- if (valorj <= minx) {
- minj = j;
- minx = valorj;
- minn = nodoj;
- }
- }
- vector.set(minj, nodoi);
- vector.set(i, minn);
- }
- }
- }
- // Clase para el algoritmo: A* (A estrella)
- public class AE {
- // variables del algoritmo
- int j, n, m, s, k;
- int Step;
- String miObjetivo;
- Nodo nodo, suc, prop;
- Vector<String> abiertos;
- Vector<String> cerrados;
- Graphics g;
- // inicializa el algoritmo
- public AE() {
- // inicializa el algoritmo en caso de que haya uno cargado
- if (ListaNodos.size() > 0)
- inicio();
- }
- // metodos para gestionar variables
- public String getAbierta() {
- int temp;
- String cadena;
- int itemp;
- Nodo ntemp;
- if (Step == 0) {
- cadena = "OPENED={";
- for (temp = 0; temp < abiertos.size(); temp++) {
- cadena += abiertos.get(temp) + "(";
- itemp = IndiceNodos.indexOf(abiertos.get(temp));
- ntemp = ListaNodos.get(itemp);
- cadena += Double.toString(ntemp.getValor()
- + ntemp.getCosteCamino());
- cadena += ")";
- if (temp < abiertos.size() - 1)
- cadena += ", ";
- }
- cadena += "}";
- } else {
- cadena = "";
- }
- return cadena;
- }
- public String getCerrada() {
- int temp;
- String cadena;
- if (Step == 0) {
- cadena = "CLOSED={";
- for (temp = 0; temp < cerrados.size(); temp++) {
- cadena += cerrados.get(temp);
- if (temp < cerrados.size() - 1)
- cadena += ", ";
- }
- cadena += "}";
- } else {
- cadena = "";
- }
- return cadena;
- }
- // reinicia el algoritmo
- public void reset() {
- // inicia el algoritmo;
- if (ListaNodos.size() > 0)
- inicio();
- }
- // ejecuta el algoritmo en modo temporizador
- public void run() {
- while (Step < 2) {
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- default:
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // retardo de un segundo
- try {
- Thread.sleep(Temporizador);
- } catch (Exception e) {
- }
- }
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- // ejecuta el algoritmo en modo paso por paso
- public boolean step() {
- boolean ejecutandose = true;
- switch (Step) {
- case 0:
- paso0();
- break;
- case 1:
- paso1();
- break;
- default: {
- ejecutandose = false;
- Grafo.this.NodoObjetivo = miObjetivo;
- Grafo.this.paintGrafo();
- }
- }
- return ejecutandose;
- }
- // metodos para desglosar el algoritmo en pasos
- private void inicio() {
- // inicializa el objetivo
- miObjetivo = "";
- // inicializa variables para explorar sucesores
- j = 0;
- m = 0;
- nodo = null;
- suc = null;
- prop = null;
- // inicializa objetos
- abiertos = new Vector<String>();
- cerrados = new Vector<String>();
- g = Grafo.this.getGraphics();
- // comienza por el primer nodo
- nodo = ListaNodos.get(0);
- // encola el primer nodo
- abiertos.add(nodo.toString());
- // siguiente paso
- Step = 0;
- }
- private void paso0() {
- if (abiertos.size() != 0) {
- // extrae el primer nodo de la pila abiertos
- n = IndiceNodos.indexOf((String) abiertos.remove(0));
- nodo = ListaNodos.get(n);
- nodo.setEstado(Nodo.TEstado.ACTUAL);
- nodo.pintarNodo(g);
- if (!nodo.getEsObjetivo()) {
- // se inserta en la lista de cerrados
- cerrados.add(nodo.toString());
- // se prepara para explorar los sucesores
- m = nodo.maxSucesores();
- j = 0;
- // siguiente paso
- Step = 1;
- } else {
- // establece el objetivo encontrado
- miObjetivo = nodo.toString();
- // termina con exito
- Step = 2;
- }
- } else {
- // termina con fracaso
- Step = 2;
- }
- }
- private void paso1() {
- if (j < m) {
- // obtiene el nodo sucesor
- s = IndiceNodos.indexOf(nodo.getIdSucesor(j));
- suc = ListaNodos.get(s);
- if (suc.getEstado() == Nodo.TEstado.NOGENERADO) {
- // establece puntero a nodo si el sucesor no se ha generado
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- // inserta el elemento en la lista ABIERTOS
- suc.setEstado(Nodo.TEstado.ABIERTO);
- suc.pintarNodo(g);
- // inserta el sucesor en la lista de abiertos
- abiertos.add(suc.toString());
- } else if ((suc.getEstado() == Nodo.TEstado.ABIERTO)) {
- // modifica el puntero del sucesor a nodo
- if (suc.getCosteCamino() > (nodo.getCosteSucesor(j) + nodo
- .getCosteCamino())) {
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- suc.pintarNodo(g);
- }
- } else if ((suc.getEstado() == Nodo.TEstado.CERRADO)) {
- // modifica el puntero del sucesor a nodo
- if (suc.getCosteCamino() > (nodo.getCosteSucesor(j) + nodo
- .getCosteCamino())) {
- suc.setIdPuntero(nodo.toString());
- suc.setCostePuntero(nodo.getCosteSucesor(j));
- suc.setCosteCamino(nodo.getCosteSucesor(j)
- + nodo.getCosteCamino());
- suc.pintarNodo(g);
- // propagar nuevo camino a sucesores de sucesor
- for (k = 0; k < suc.maxSucesores(); k++) {
- prop = ListaNodos.get(IndiceNodos.indexOf(suc
- .getIdSucesor(k)));
- prop.setIdPuntero(suc.toString());
- prop.setCostePuntero(suc.getCosteSucesor(k));
- prop.setCosteCamino(suc.getCosteSucesor(k)
- + suc.getCosteCamino());
- }
- }
- }
- j++;
- } else {
- if (abiertos.size() != 0) {
- // pinta el nodo
- nodo.setEstado(Nodo.TEstado.CERRADO);
- nodo.pintarNodo(g);
- // reordena la lista de abiertos en funcion de: f = h + g
- reordenar(abiertos);
- // siguiente paso
- Step = 0;
- } else {
- // termina con fracaso
- Step = 2;
- }
- }
- }
- private void reordenar(Vector<String> vector) {
- // Ordenacion por seleccion
- Nodo ntemp;
- int itemp;
- String nodoi, nodoj, minn;
- double valori, valorj;
- int minj;
- double minx;
- int N = vector.size();
- int i, j;
- for (i = 0; i < N - 1; i++) {
- nodoi = vector.get(i);
- itemp = IndiceNodos.indexOf(nodoi);
- ntemp = ListaNodos.get(itemp);
- valori = ntemp.getValor() + ntemp.getCosteCamino();
- minj = i;
- minx = valori;
- minn = nodoi;
- for (j = i; j < N; j++) {
- nodoj = vector.get(j);
- itemp = IndiceNodos.indexOf(nodoj);
- ntemp = ListaNodos.get(itemp);
- valorj = ntemp.getValor() + ntemp.getCosteCamino();
- if (valorj <= minx) {
- minj = j;
- minx = valorj;
- minn = nodoj;
- }
- }
- vector.set(minj, nodoi);
- vector.set(i, minn);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement