/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package modelo;
import baseconocimiento.utilidades.Mapeo;
import java.util.ArrayList;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import modelo.utilidades.NodoArbol;
/**
*
* @author UNL
*
*/
public class BusquedaAestrella {
private Mapa mapa;
private ArrayList<Localidad> localidades;
private JTextArea areaConsola;
public BusquedaAestrella(Mapa mapa, JTextArea areaConsola) {
this.mapa = mapa;
this.localidades = this.mapa.getLocalidades();
this.areaConsola = areaConsola;
}
public ArrayList<Integer> buscarRutaOptima(Localidad puntoOrigen, Localidad puntoDestino) {
areaConsola.append("[\n");
ArrayList<Integer> recorrido = new ArrayList<Integer>();
ArrayList<Integer> estadosYaEstudiados = new ArrayList<Integer>();
int estadoActual = puntoOrigen.getBarrio().getId();
int estadoDestino = puntoDestino.getBarrio().getId();
areaConsola.append("\t[");
areaConsola.append("\t\tESTADO INICIAL: " + puntoOrigen.getBarrio() + "\n");
areaConsola.append("\t\tESTADO DESTINO: " + puntoOrigen.getBarrio() + "\n");
areaConsola.append("\t]");
int estadoSucesor;
Localidad estadoSucesorLocalidad = null;
int contador = 0;
recorrido.add(estadoActual);
areaConsola.append("\t[ ITERACIONES\n");
while (estadoActual != estadoDestino) {
areaConsola.append("\t\t[ iteracion: " + contador);
System.out.println("-" + contador++ + "-");
System.out.println("Estado actual: " + estadoActual);
areaConsola.append("\t\t\t[ESTADO ACTUAL: " + estadoActual + "]\n");
ArrayList<Integer> reglas = localidades.get(estadoActual - 1).getVecinosID();
System.out.println("Reglas-----------------");
areaConsola.append("\t\t\t[REGLAS: " + estadoActual + "\n");
int contador1 = 0;
for (Integer idRegla : reglas) {
areaConsola.append("Regla " + contador1 + " :" + idRegla);
System.out.println("Regla " + contador1++ + " :" + idRegla);
}
areaConsola.append("\t\t\t]\n");
System.out.println("Fin reglas-----------------");
ArrayList<Coste> listaCostes = new ArrayList<Coste>();
while (!reglas.isEmpty()) {
estadoSucesor = reglas.get(0);
estadoSucesorLocalidad = this.localidades.get(estadoSucesor - 1);
estadosYaEstudiados.add(estadoSucesor);
Coste coste = new Coste();
int coste1 = estadoSucesorLocalidad.getHeuristicaDLR().get(estadoActual - 1);
int coste2 = estadoSucesorLocalidad.getHeuristicaDLR().get(estadoDestino - 1);
System.out.println("Coste 1: " + coste1);
System.out.println("Coste 2: " + coste2);
coste.setIdBarrio(estadoSucesor);
coste.setDistancia(coste1 + coste2);
listaCostes.add(coste);
reglas.remove(0);
}
System.out.println("Lista de costes-----------------");
for (Coste coste : listaCostes) {
System.out.println("Coste: " + coste.getIdBarrio() + "|" + coste.getDistancia());
}
System.out.println("fin lista costes----------------");
estadoActual = buscarMenorCoste(listaCostes).getIdBarrio();
recorrido.add(estadoActual);
areaConsola.append("\t\t]");
}
areaConsola.append("\t]");
areaConsola.append("]");
return recorrido;
}
public boolean buscarRepetido(ArrayList<Integer> estadosYaEstudiados, int estadoacomprobar) {
for (Integer elemento : estadosYaEstudiados) {
if (elemento == estadoacomprobar) {
return true;
}
}
return false;
}
public Coste buscarMenorCoste(ArrayList<Coste> listaCostes) {
Coste menorCoste = listaCostes.get(0);
for (Coste coste : listaCostes) {
if (coste.getDistancia() < menorCoste.getDistancia()) {
menorCoste = coste;
}
}
return menorCoste;
}
public static void main(String[] args) {
Mapa mapa = new Mapa(1, "Mapa Loja", new Mapeo().mapearLocalidades());
Localidad localidadInicio = mapa.getLocalidades().get(4);
Localidad localidadDestino = mapa.getLocalidades().get(1);
System.out.println("-------------------------------------------------------------------------------------------------------");
System.out.println("| EJECUCION DE LA BUSQUEDA A* |");
System.out.println("-------------------------------------------------------------------------------------------------------");
System.out.println("Localidad Inicio: " + localidadInicio.getBarrio());
System.out.println("Localidad Destino: " + localidadDestino.getBarrio());
/*BusquedaAestrella busqueda = new BusquedaAestrella(mapa, new JTextArea(), new JTree());
ArrayList<Integer> recorrido = busqueda.buscarRutaOptima(localidadInicio, localidadDestino);
System.out.println("Recorrido: ");
for (Integer integer : recorrido) {
System.out.print(integer + "-");
}
*
*/
}
}