Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <stdio.h>
- #include <string>
- using namespace std;
- typedef struct
- {
- long double peso,feromona;
- }Dato;
- int nodo_i,nodo_j;//N es la cantidad de nodos/vertices del grafo
- long double feromona_init;
- vector< int > recorrido(52),temporal(52);
- vector< vector< int > > hormigas(10),opciones(10);//las hormigas poseen la ruta recorrida
- vector< vector< Dato > > ciudad(52);
- long double feromona_inicial()
- {
- vector<int> caminos_disponibles=temporal,elegido;
- random_shuffle(caminos_disponibles.begin(),caminos_disponibles.end());
- elegido.push_back(caminos_disponibles[0]);
- caminos_disponibles.erase(caminos_disponibles.begin());
- long double distancia_inicial=0;
- int posicion;
- while(!caminos_disponibles.empty())
- {
- long double peso_menor=100000;
- for (int j = 0; j < caminos_disponibles.size(); ++j)
- if (ciudad[elegido.back()][caminos_disponibles[j]].peso<peso_menor)
- {
- peso_menor=ciudad[elegido.back()][caminos_disponibles[j]].peso;
- posicion=j;
- }
- distancia_inicial+=ciudad[elegido.back()][caminos_disponibles[posicion]].peso;
- elegido.push_back(caminos_disponibles[posicion]);
- caminos_disponibles.erase(caminos_disponibles.begin()+posicion);
- }
- distancia_inicial+=ciudad[elegido[0]][elegido.back()].peso;
- return distancia_inicial;
- }
- void asignar_hormigas()
- {
- random_shuffle(temporal.begin(),temporal.end());
- for (int i = 0; i < 10; ++i)
- {
- hormigas[i][0]=temporal[i];//todas las hormigas tendran asignado un nodo distinto al principio
- opciones[i].erase(opciones[i].begin()+temporal[i]);//elimino la opción elegida para que no se repita más adelante
- }
- }
- long double ecuacion1_y_2(int i,int pos_anterior,int numero_nodo)//i es numero de hormiga y pos anterior es el nodo en que esta parada
- {//numero nodo es cual numero de nodo estamos eligiendo para caminar sobre él
- int posicion,coeficiente;
- if((rand()%100)<=90)
- {
- posicion=opciones[i][0],coeficiente=0;
- long double max=(ciudad[pos_anterior][opciones[i][0]].feromona)*pow(1/(ciudad[pos_anterior][opciones[i][0]].peso),2.5);
- for (int j = 1; j < opciones[i].size(); ++j)
- {
- long double valor=(ciudad[pos_anterior][opciones[i][j]].feromona)*pow(1/(ciudad[pos_anterior][opciones[i][j]].peso),2.5);
- if(valor>max)
- {
- max=valor;
- posicion=opciones[i][j];
- coeficiente=j;
- }
- }
- }
- else//ecuacion 2
- {
- long double sumatoria=0;
- vector< pair<int,int> > porciones_ruleta;
- posicion=opciones[i][0],coeficiente=0;//asumo el primer recorrido disponible como el primer candidato
- for (int j = 0; j < opciones[i].size(); ++j)//aca se calcula sumatoria de ecuacion 2
- sumatoria+=(ciudad[pos_anterior][opciones[i][j]].feromona)*pow(1/(ciudad[pos_anterior][opciones[i][j]].peso),2.5);
- for (int j = 0; j < opciones[i].size(); ++j)
- {
- long double valor=(ciudad[pos_anterior][opciones[i][j]].feromona)*pow(1/(ciudad[pos_anterior][opciones[i][j]].peso),2.5);
- valor/=sumatoria;valor*=100;
- porciones_ruleta.push_back(make_pair(valor,j));
- }
- sort(porciones_ruleta.begin(), porciones_ruleta.end());
- int ruleta=rand()%100;
- for (int inicio = 0; inicio < porciones_ruleta.size(); ++inicio)
- {
- if(ruleta<=porciones_ruleta[inicio].first)
- coeficiente=porciones_ruleta[inicio].second;
- }
- posicion=opciones[i][coeficiente];
- }
- hormigas[i][numero_nodo]=posicion;
- ciudad[pos_anterior][posicion].feromona=0.9*(ciudad[pos_anterior][posicion].feromona)+0.1*feromona_init; //actualizacion local de feromona
- ciudad[posicion][pos_anterior].feromona=ciudad[pos_anterior][posicion].feromona;//actualizacion local de feromona
- opciones[i].erase(opciones[i].begin()+coeficiente);//elimino el nodo elegido por la hormiga para que no se repita
- //cout<<"hormiga "<<i<<" camino:"<<posicion<<endl;
- return (ciudad[pos_anterior][posicion].peso);
- }
- int main()
- {
- long double peso,peso_menor=100000;
- srand(time(NULL));
- for (int i = 0; i < 52; ++i)
- {
- temporal[i]=i;
- if(i<10)
- {
- opciones[i].resize(52);
- hormigas[i].resize(52);
- }
- ciudad[i].resize(52);
- for (int j = 0; j < 52; ++j)
- if(i<10)
- opciones[i][j]=j;
- }
- while(scanf("%d %d %Lf",&nodo_i,&nodo_j,&peso)!=EOF)
- {
- ciudad[nodo_i-1][nodo_j-1].peso=peso;
- ciudad[nodo_j-1][nodo_i-1].peso=peso;
- }
- feromona_init=1/feromona_inicial();
- for (int i = 0; i < 52; ++i)
- for (int j = i+1; j < 52; ++j)
- {
- ciudad[i][j].feromona=feromona_init;
- ciudad[j][i].feromona=feromona_init;
- }
- short int iteracion=0;
- while(iteracion++!=100)
- {
- asignar_hormigas();
- for (int i = 0; i < 10; ++i)//para cada hormiga
- {
- long double distancia=0,feromona_total=0;
- for (int j = 1; j <52; ++j)//considerando que ya tiene un nodo de partida
- distancia+=ecuacion1_y_2(i,hormigas[i][j-1],j);//criterio de seleccion de camino
- distancia+=ciudad[hormigas[i][0]][hormigas[i][51]].peso;//le agrego distancia del inicio al fin
- ciudad[hormigas[i][0]][hormigas[i][51]].feromona=0.9*(ciudad[hormigas[i][0]][hormigas[i][51]].feromona)+0.1*feromona_init;
- ciudad[hormigas[i][51]][hormigas[i][0]].feromona=0.9*(ciudad[hormigas[i][51]][hormigas[i][0]].feromona)+0.1*feromona_init;
- if(distancia<peso_menor)
- {
- peso_menor=distancia;
- recorrido=hormigas[i];
- for (int inicio = 1; inicio < 52; ++inicio)//aumento feromona global al camino recorrido por la hormiga
- {
- ciudad[hormigas[i][inicio-1]][hormigas[i][inicio]].feromona=0.9*ciudad[hormigas[i][inicio-1]][hormigas[i][inicio]].feromona+0.1*(1/peso_menor);
- ciudad[hormigas[i][inicio]][hormigas[i][inicio-1]].feromona=ciudad[hormigas[i][inicio-1]][hormigas[i][inicio]].feromona;
- }
- ciudad[hormigas[i][0]][hormigas[i][51]].feromona=0.9*ciudad[hormigas[i][0]][hormigas[i][51]].feromona+0.1*(1/peso_menor);
- ciudad[hormigas[i][51]][hormigas[i][0]].feromona=ciudad[hormigas[i][0]][hormigas[i][51]].feromona;
- for (int inicio = 0; inicio < 52; ++inicio)//aca se evapora la feromona de los caminos no elegidos
- for (int j = inicio+1; j < 52; ++j)
- {
- int flag=0;
- for(int k=1;k<hormigas[i].size();k++)
- if((inicio==hormigas[i][k] and j==hormigas[i][k-1])or(inicio==hormigas[i][k-1] and j==hormigas[i][k]))
- {//verifica que no sea un camino elegido por la hormiga el que se va a evaporar
- flag=1;
- break;
- }
- if(!flag)//si no fue uno elegido por la hormiga entonces lo evapora
- {
- ciudad[inicio][j].feromona=0.9*ciudad[inicio][j].feromona;
- ciudad[j][inicio].feromona=0.9*ciudad[j][inicio].feromona;
- }
- }
- }
- opciones[i].clear();
- opciones[i].resize(52);
- }
- for (int i = 0; i < 10; ++i)//se vuelven a crear los valores validos de opciones para las hormigas
- for (int j = 0; j < 52; ++j)
- opciones[i][j]=j;
- }
- cout<<"La distancia menor es:"<<peso_menor<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement