Package algoritmos

Source Code of algoritmos.AlgoritmoDijkstra

package algoritmos;




import java.util.Collection;
import java.util.Iterator;

import algoritmos.AlgoritmoResolucion.Nodo;
import tablero.CasillaTablero.ColorLinea;
import tablero.CasillaTablero.TipoLinea;
import traza.TrazaAlgoritmo;

public class AlgoritmoDijkstra extends AlgoritmoResolucion {
 
  /**
   * TODO: cambiar el contenido de cerrados por un nodo para poder saber si
   * el camino recorrido hasta ese nodo es menor que el que acabamos de encontrar
   */
 
 
 
   
  public AlgoritmoDijkstra(TrazaAlgoritmo traza,String cadenaHorizontal,String cadenaVertical){
   
    this.traza=traza;
   
    this.cadenaHorizontal=cadenaHorizontal;
    this.cadenaVertical=cadenaVertical;
 
   
   
   
  }
  @Override
  public void run() {
    super.iniciarEstructurasDeDatos();
    // TODO Auto-generated method stub
    this.traza.iniciarAlgoritmo("Dijkstra");
    Nodo nodoInicio=new Nodo();
    nodoInicio.setFilaColumna(1, 1);
   
    Nodo nodoObjetivo=new Nodo();
    nodoObjetivo.setFilaColumna(this.cadenaVertical.length()+1, this.cadenaHorizontal.length()+1);
   
    //System.out.println(nodoObjetivo.toString());
    VariablesProblema variables=new VariablesProblema(nodoInicio,nodoObjetivo);
     
      super.setVariablesProblema(variables);
     
      //System.out.println(nodoObjetivo.toString());
     
      resolverAlgoritmo();
       
      pintarSolucion();
  }
 

  public int funcionCoste(Nodo nodoActual,Nodo nodoSiguiente){
    int coste=0;
    if((nodoSiguiente.getFila()==nodoActual.getFila()+1 && nodoSiguiente.getColumna()==nodoActual.getColumna()) ||
        (nodoSiguiente.getFila()==nodoActual.getFila() && nodoSiguiente.getColumna()==nodoActual.getColumna()+1)  ){
      coste+=2;
    }
    else{
      if( this.cadenaHorizontal.substring(nodoActual.getColumna()-1, nodoActual.getColumna()) !=
        this.cadenaVertical.substring(nodoActual.getFila()-1, nodoActual.getFila())){
        coste++;
      }
    }
    return coste;
   
  }
  @Override
  public void insertarEnAbiertos(Nodo nuevoNodo, Nodo nodoActual) {
    // TODO Auto-generated method stub
   
    int coste=funcionCoste(nodoActual,nuevoNodo);
   
   
    TipoLinea tipoLinea=seleccionarTipoLinea(nodoActual,nuevoNodo);
   
   
    if(!this.abiertos.containsKey(nuevoNodo.getCoordenadas())){
      //Comprobamos que no se haya expandido ya
      if(!this.cerrados.containsKey(nuevoNodo.getCoordenadas())){
        //Lo insertamos ya que su coste es infinito
        nuevoNodo.setGn(nodoActual.getGn()+coste);
        //Pintamos la l�nea
        this.traza.pintarLinea(nodoActual.getFila(),nodoActual.getColumna(),nuevoNodo.getFila(),nuevoNodo.getColumna(),tipoLinea,ColorLinea.ABIERTO);
       
       
        this.abiertos.put(nuevoNodo.getCoordenadas(), nuevoNodo);
      }
      else{
        /**
         * TODO: hacer que se borren los nodos que cuelgan del nuevoNodo
         * y asignarle como padre el nodoActual. Sacar el nodod de cerrados y meterlo en abiertos
         */
     
       
      }
    }
    else{
      Nodo nodoTemp=this.abiertos.get(nuevoNodo.getCoordenadas());
      if(nodoTemp.getGn()>(nodoActual.getGn()+coste)){
        nodoTemp.setGn(nodoActual.getGn()+coste);
        //Borramos la l�nea anterior que lo conectaba al padre
        this.traza.pintarLinea(nodoTemp.getFilaPadre(), nodoTemp.getColumnaPadre(), nodoTemp.getFila(), nodoTemp.getColumna(), TipoLinea.INVISIBLE,ColorLinea.ABIERTO);
        //Pintamos la l�nea
        this.traza.pintarLinea(nodoActual.getFila(),nodoActual.getColumna(),nuevoNodo.getFila(),nuevoNodo.getColumna(),tipoLinea,ColorLinea.ABIERTO);
       
        this.abiertos.put(nodoTemp.getCoordenadas(), nodoTemp);
       
      }
     
     
     
    }
   
  }
 
 
 
 
 
  public Nodo siguienteNodo(){
   
    Integer menorNodorNoVisitado=Integer.MAX_VALUE;
    Nodo nodoSeleccionado=null;
    Collection<Nodo> c=this.abiertos.values();
   
    Iterator<Nodo> itr=c.iterator();
   
    while(itr.hasNext()){
      Nodo n=itr.next();
     
      if(!n.getVisitado() && n.getGn()<menorNodorNoVisitado ){
        menorNodorNoVisitado=n.getGn();
        nodoSeleccionado=n;
      }
     
    }
   
   
    return nodoSeleccionado;
  }
 
 
}
TOP

Related Classes of algoritmos.AlgoritmoDijkstra

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.