Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class ACO implements datos{
- grafico ciudad[];//Ciudades
- double fero[][];//Feromona
- double dist[][];//Distancia entre los nodos
- double invdist[][];//1/Distancia
- double disttotal=0.0;
- int visitar,visitado,dest,pos,r;
- public ACO()
- {ciudad=iniciociudades();//Iniciar puntos de la ciudad
- dist=calcdistan();//Calcula distancia entre las ciudades
- invdist=calcnoddist();//Probabilidad para la cual el nodo es visitado
- fero=iniciarfero();//Inicia las feromonas iniciales en la matriz
- pos=posinicial();//Obtener posicion inicial aleatoria
- r=0;
- ruta[r]=pos;//Determina la ciudad aleatoria como punto a comenzar
- ciudad[pos].setstatus(true);//Determina las ciudades visitadas
- visitar=ciu-1;//Ciudades que no han sido visitadas
- visitado=1;//Ciudades que ya han sido visitadas
- System.out.println("Ciudad inicial:"+pos);
- }
- private int posinicial()
- {int d;
- do{d=(int)(10*Math.random());}while(d<0&&d>=ciu);
- return d;
- }
- private grafico[] iniciociudades()
- {grafico local[]=new grafico[ciu];
- for(int i=0;i<ciu;i++)
- { local[i]=new grafico(puntos[i][1],puntos[i][2]);
- local[i].setstatus(false);
- }
- return local;
- }
- private double[][] calcdistan()
- {double local[][]=new double[ciu][ciu];
- for(int i=0;i<ciu;i++)
- for(int j=0;j<ciu;j++)
- local[i][j]=calceuclideandist(ciudad[i],ciudad[j]);
- return local;
- }
- double calceuclideandist(grafico a,grafico b)
- {
- return (Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2)));
- }
- private double[][] calcnoddist()
- {double local[][]=new double[ciu][ciu];
- for(int i=0;i<ciu;i++)
- for(int j=0;j<ciu;j++)
- {if(i!=j)
- local[i][j]=1.0/dist[i][j];
- else
- local[i][j]=0.0;
- }
- return local;
- }
- private double[][] iniciarfero()
- { double local[][]=new double[ciu][ciu];
- for(int i=0;i<ciu;i++)
- for(int j=0;j<ciu;j++)
- local[i][j]=inicia_feromona;
- return local;
- }
- private double calcularprob(int position,int dest)
- {double p,sum=0.00;
- for(int i=0;i<ciu;i++)
- sum+=((Math.pow(fero[position][i], alfa))*(Math.pow((invdist[position][i]),beta)));
- p=(Math.pow(fero[position][dest], alfa))*(Math.pow((invdist[position][dest]),beta))/sum;
- return p;
- }
- private int obtposi(int posicion)
- {int i,p=posicion; double probalta=10e-10,prob;
- for(i=0;i<ciu;i++)
- {prob=calcularprob(posicion,i);
- if(prob>probalta&&!ciudad[i].getstatus())
- {probalta=prob;p=i;}
- }return p;
- }
- public void emp()
- {int dest=-1;
- while(visitado<ciu)
- {dest=obtposi(pos);
- System.out.println("Proxima ciudad:"+dest);
- muevehormiga(dest);
- visitado++;
- dest=-1;
- }
- resultados();
- }
- private void muevehormiga(int dest)
- {
- ruta[r++]=dest;
- actualizarferomona(pos,dest);
- disttotal+=calceuclideandist(ciudad[pos],ciudad[dest]);
- pos=dest;
- ciudad[pos].setstatus(true);
- }
- private void resultados()
- {
- System.out.println("La ruta final es:");
- for(int i=0;i<ciu;i++)
- {
- System.out.println((i+1)+"\t"+ciudad[ruta[i]].getx()+"\t"+ciudad[ruta[i]].gety());
- }
- System.out.println("Distancia Total="+disttotal);
- }
- void actualizarferomona(int p,int d)
- {double delT=Q/calceuclideandist(ciudad[p],ciudad[d]);
- double calcfero=((1-ev)*fero[p][d])+delT;
- fero[p][d]=calcfero;
- fero[d][p]=calcfero;
- }
- public static void main(String args[])
- {
- ACO obj=new ACO();
- obj.emp();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement