Advertisement
aveenger17

ACO.java

May 23rd, 2013
976
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.47 KB | None | 0 0
  1. public class ACO implements datos{
  2.    
  3.     grafico ciudad[];//Ciudades
  4.     double fero[][];//Feromona
  5.     double dist[][];//Distancia entre los nodos
  6.     double invdist[][];//1/Distancia
  7.     double disttotal=0.0;
  8.     int visitar,visitado,dest,pos,r;
  9.    
  10.    
  11. public ACO()
  12. {ciudad=iniciociudades();//Iniciar puntos de la ciudad
  13.      dist=calcdistan();//Calcula distancia entre las ciudades
  14.      invdist=calcnoddist();//Probabilidad para la cual el nodo es visitado
  15.      fero=iniciarfero();//Inicia las feromonas iniciales en la matriz
  16.      pos=posinicial();//Obtener posicion inicial aleatoria
  17.      r=0;
  18.      ruta[r]=pos;//Determina la ciudad aleatoria como punto a comenzar
  19.      ciudad[pos].setstatus(true);//Determina las ciudades visitadas
  20.      visitar=ciu-1;//Ciudades que no han sido visitadas
  21.      visitado=1;//Ciudades que ya han sido visitadas
  22.      System.out.println("Ciudad inicial:"+pos);
  23.     }
  24. private int posinicial()
  25. {int d;
  26.     do{d=(int)(10*Math.random());}while(d<0&&d>=ciu);
  27.     return d;
  28.     }
  29.  
  30. private grafico[] iniciociudades()
  31. {grafico local[]=new grafico[ciu];
  32.     for(int i=0;i<ciu;i++)
  33.     {   local[i]=new grafico(puntos[i][1],puntos[i][2]);
  34.         local[i].setstatus(false);
  35.      }
  36.   return local;
  37. }
  38. private double[][] calcdistan()
  39. {double local[][]=new double[ciu][ciu];
  40. for(int i=0;i<ciu;i++)
  41. for(int j=0;j<ciu;j++)
  42.  local[i][j]=calceuclideandist(ciudad[i],ciudad[j]);
  43. return local;
  44. }
  45.  
  46. double calceuclideandist(grafico a,grafico b)
  47. {
  48.     return (Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2)));
  49. }
  50.  
  51. private double[][] calcnoddist()
  52. {double local[][]=new double[ciu][ciu];
  53. for(int i=0;i<ciu;i++)
  54. for(int j=0;j<ciu;j++)
  55. {if(i!=j)
  56.     local[i][j]=1.0/dist[i][j];
  57. else
  58.     local[i][j]=0.0;
  59. }
  60. return local;
  61. }
  62.  
  63. private double[][] iniciarfero()
  64. {   double local[][]=new double[ciu][ciu];
  65.     for(int i=0;i<ciu;i++)
  66.         for(int j=0;j<ciu;j++)
  67.         local[i][j]=inicia_feromona;
  68.         return local;
  69. }
  70.  
  71. private double calcularprob(int position,int dest)
  72. {double p,sum=0.00;
  73. for(int i=0;i<ciu;i++)
  74.     sum+=((Math.pow(fero[position][i], alfa))*(Math.pow((invdist[position][i]),beta)));
  75. p=(Math.pow(fero[position][dest], alfa))*(Math.pow((invdist[position][dest]),beta))/sum;
  76.     return p;
  77. }
  78.  
  79. private int obtposi(int posicion)
  80. {int i,p=posicion; double probalta=10e-10,prob;
  81. for(i=0;i<ciu;i++)
  82. {prob=calcularprob(posicion,i);
  83.     if(prob>probalta&&!ciudad[i].getstatus())
  84.     {probalta=prob;p=i;}
  85. }return p;
  86. }
  87.  
  88. public void emp()
  89. {int dest=-1;
  90.     while(visitado<ciu)
  91.     {dest=obtposi(pos);
  92.         System.out.println("Proxima ciudad:"+dest);
  93.         muevehormiga(dest);
  94.         visitado++;
  95.         dest=-1;
  96.  }
  97.     resultados();
  98. }
  99.  
  100. private void muevehormiga(int dest)
  101. {
  102.     ruta[r++]=dest;
  103.     actualizarferomona(pos,dest);
  104.     disttotal+=calceuclideandist(ciudad[pos],ciudad[dest]);
  105.     pos=dest;
  106.     ciudad[pos].setstatus(true);
  107. }
  108.  
  109. private void resultados()
  110. {
  111.     System.out.println("La ruta final es:");
  112.     for(int i=0;i<ciu;i++)
  113.     {
  114.         System.out.println((i+1)+"\t"+ciudad[ruta[i]].getx()+"\t"+ciudad[ruta[i]].gety());
  115.     }
  116.     System.out.println("Distancia Total="+disttotal);
  117. }
  118.  
  119. void actualizarferomona(int p,int d)
  120. {double delT=Q/calceuclideandist(ciudad[p],ciudad[d]);
  121.         double calcfero=((1-ev)*fero[p][d])+delT;
  122.         fero[p][d]=calcfero;
  123.         fero[d][p]=calcfero;
  124. }
  125.  
  126. public static void main(String args[])
  127. {
  128.     ACO obj=new ACO();
  129.              obj.emp();
  130. }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement