viernes, 6 de julio de 2012

Metaheurística Genética Básica

La Metaheurística Genética Básica Genera una Población de soluciones iniciales después así 
poder elegir al azar una de estas soluciones y mutarlas o cruzarlas y generar mas nuevas  soluciones para despues eliminar y solo conservar las generaciones que contengan las mejores soluciones este es el avance de la clase.

//
genera una poblacion inicial

    public static ArrayList<ArrayList<Integer>> poblacion(ArrayList <Arista> grafo,int tam)//verif
    {
 ArrayList<ArrayList<Integer>> lista= new ArrayList<ArrayList<Integer>>();
 while(lista.size()<=tam)
     {
  lista.add(Arista.inicial(grafo));
     }
 //System.out.println("Poblacion @_@");
 // Arista.imprime(lista);
 return lista;
    }
    //cromosoma
    public static ArrayList<String> cromosoma(ArrayList<Integer> seleccion, int cantidad)
    //cantidad total de vertices 
    {
 ArrayList<String> ref = new ArrayList<String>();
 for(int i=0;i<cantidad;i++)
     {
  if(seleccion.contains(i))
     {
         ref.add("1");
     }
     else
         ref.add("0");
     }
 //Arista.imprime(ref);
        return ref;
    }

    public static ArrayList<Integer> cubierta (ArrayList<String> cromosoma)
    {
 ArrayList<Integer> selection= new ArrayList<Integer>();
 int pos =0;
  for (int i=0;i<cromosoma.size();i++)
     {
  if((cromosoma.get(i)).equals("1"))
      selection.add(pos);
  pos+=1;
     }
 //System.out.println("cubierta");
 //Arista.imprime(selection);
 return selection;
    }

    public static void mutacion(ArrayList<ArrayList<Integer>>poblacion,int verticestotales,ArrayList<Arista> g)
    {
 int individuo = Arista.r.nextInt(poblacion.size());
 ArrayList<Integer> id = poblacion.get(individuo);
 //System.out.println("id");
 //Arista.imprime(id);
 ArrayList<String> cr =cromosoma(id,verticestotales);
 int ubic= Arista.r.nextInt(verticestotales);
 if (cr.get(ubic)== "0")//si el individuo seleccionado es igual a 0
     {
  cr.set(ubic,"1"); 
     }
 else
     {
  cr.set(ubic,"0");
     }
 //System.out.println("cadenita");
 //Arista.imprime(cr);
 ArrayList <Integer> mutante = Arista.cubierta(cr);
 // System.out.println("mutante");
 //Arista.imprime(mutante);
 int objetivo = Arista.objetivo(mutante);
 boolean fact = Arista.factible(mutante,g);
 if(fact==true )
     poblacion.add(mutante);
 return;
    }
    
    public static void nacimiento(ArrayList<ArrayList<Integer>>poblacion,int n,ArrayList<Arista> g)
    {
 int i=0;
 ArrayList<String> papa = cromosoma(poblacion.get(Arista.r.nextInt(poblacion.size())),n);
 ArrayList<String> mama = cromosoma(poblacion.get(Arista.r.nextInt(poblacion.size())),n);
 int pos = Arista.r.nextInt(n);
 //mama
 ArrayList<String> hija=null;
 ArrayList<String> hijo=null;
 Iterator<String> pa = papa.iterator();//recorre 
 Iterator<String> ma = mama.iterator();
 while (pa.hasNext() && ma.hasNext()) {
     if(i<pos)
  {
      hija.add(pa.next());
      hijo.add(ma.next());
     i++;
  }
     else
  {
      hija.add(ma.next());
      hijo.add(pa.next());
      i++;
  }
 }
 System.out.println("mama");
 Arista.imprime(mama);
 System.out.println("papa");
 Arista.imprime(papa);
 System.out.println("hija");
 Arista.imprime(hija);
 System.out.println("hijo");
 Arista.imprime(hijo);
 poblacion.add(hija);
 poblacion.add(hijo);   
 return ;
 }

1 comentario: