algoritmo genético para resolver el tsp

Upload: josue-julcarima

Post on 05-Jul-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    1/18

     

    05 de noviembre de 2015

    Algoritmo genético paraTSP en c++ Inteligencia Artificial

    Julcarima Calle, Josué.

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    2/18

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    3/18

    Inteligencia Artificial

    2  

    PRESENTACIÓN

    Resumen

    El presente informe tiene como objetivo especificar el proceso de solución llevado a cabo para resolverel problema del agente viajero por medio de un algoritmo genético e implementarlo en C++.

    Introducción

    El problema del agente viajero es un problema NP-Hard de optimización combinatoria, el tiemporequerido para resolverlo es super-polinomial. Resolver el peor caso para un algoritmo determinístico

    tarda en proporción exponencial a la cantidad ciudades (un parámetro de la entrada que se explica másadelante).

    El problema fue formulado matemáticamente en el 1800 por el matemático irlandés WR Hamilton y porel matemático británico Thomas Kirkman.

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    4/18

    Informe Algoritmo Genético

    3  

    EL PROBLEMA

    Especificación del problema

    El problema del agente viajero en ciencias de la computación puede ser planteado de la siguientemanera:1 

     Dada una lista de las ciudades y las distancias entre cada par de ciudades, ¿cuál es el camino

    más corto que visita cada ciudad exactamente una vez y vuelve a la ciudad de origen?

    En términos de teoría de grafos se puede plantear como sigue:

     Dado una grafo ponderado completo (donde los vértices representan las ciudades, las aristas

    representan los caminos y los pesos son el costo o las distancias de estos caminos), encontrar

    un ciclo de Hamilton con menor peso.

    Sin embargo pueden existir variaciones al problema como por ejemplo que el grafo sea dirigido ó que elgrafo no sea necesariamente completo, este último caso se puede incluir en el planteamiento originalconsiderando que las aristas que faltan tienen peso infinito.

    En el caso del presente informe se resolverá el problema de forma no determinística tomando en cuentaque los puntos o ciudades pertenecen a un espacio bidimensional y el peso de las aristas es la distanciapitagórica (norma 2) entre los puntos.

    1 (Wikipedia)

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    5/18

    Inteligencia Artificial

    4  

    SOLUCIÓN AL PROBLEMA

    Especificación del conocimiento declarativo

    Respecto a la declaración de variables de entrada se tiene:

      Un conjunto de puntos todos en un espacio bidimensional.

    Respecto a las variables de salida del algoritmo se tienen:

     

    Una permutación del conjunto de puntos de la entrada denotando el camino hamiltonianoóptimo.

    Estrategia de la solución

    Las soluciones existentes en la literatura son muy amplias y se pueden dividir en 2:

    1.  Determinísticas. – Es decir para una entrada dada siempre obtienen la misma salida.o

      Heurísticaso

      Exactas.- Este tipo de algoritmos son los únicos que aseguran obtener la soluciónóptima

    2.  No determinísticas (aleatorizados).- Nótese que estos algoritmos pueden utilizaraproximaciones heurísticas en su procedimiento.

    Para el desarrollo del presente trabajo se escogió la estrategia no determinística del algoritmo genético.

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    6/18

    Informe Algoritmo Genético

    5  

    Plantear el conocimiento procedural

    El algoritmo planteado es a grandes rasgos:

    Descripción del conocimiento procedural

    Cada uno de los pasos anteriores se especifica como sigue:

    1.  Generación de la población iniciala.  De manera aleatoria se generan los individuos iniciales barajando la permutación

    (identificador de un camino/ciclo Hamiltoniano).2.  Evolución de la población hasta una condición de parada predefinida. Cada evolución a la

    siguiente generación consta de los siguientes pasos.a.  Pase de una élite a la siguiente generación (los ELITE mejores siempre pasan a la

    siguiente generación). b.

     

    Cruce. Se cruzan los individuos donde la probabilidad de cada participante de unapareamiento es proporcional a su fitness (función de aptitud, la cual en el problema

    actual es el recíproco de la distancia).c.  Mutación. Después de cada cruce se realiza una mutación en los hijos dependiendo dela probabilidad de mutación.

    3.  Obtención del mejor individuo de la población final. La condición de parada establecida en estecaso es el número de generaciones o poblaciones (NUMBER_OF_GENERATIONS) 

    Generación de lapoblación inicial

    Evolución de lapoblación hasta una

    condición deparada predefinida

    Obtención delmejor individuo dela población final

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    7/18

    Inteligencia Artificial

    6  

    RESULTADOS

    Resultados obtenidos

    Se probó el algoritmo para el caso de xqf1312  (la entrada posee 131 nodos y se encuentra enhttp://www.math.uwaterloo.ca/tsp/vlsi/xqf131.tsp) con los siguientes parámetros:

      int TOTAL_POPULATION = 5000;

      double MUTATION_PROBABILITY = 0.07;

      int NUMBER_OF_GENERATIONS = 10000;

      int ELITE = 3; 

    Obteniendo los siguientes resultados:

     

    Mejores distancias encontradas por generación (población)

    GenerationBest distance

    found

    0 3891.81

    1000 2827.73

    2000 2623.44

    3000 2466.63

    4000 2332.91

    5000 2185.81

    6000 2141.97

    7000 2059.38

    8000 1991.88

    9000 1922.1

    9999 1890.8

    Conclusiones

    Se concluye que en la mayoría de los casos a mayor tiempo gastado en buscar una solución se obtieneuna solución más óptima al final.

    Para el caso propuesto la solución óptima tiene una distancia de 564 según 3, mientras el programadiseñado con los parámetros dados solo logró encontrar una solución con distancia de 1890. Estocomprueba que la probabilidad de necesitar un tiempo muy alto para hallar la solución óptima es muyalta.

    2

     (Math U. Waterloo)3 (xqf131 TSP Problem Optimal Tour)

    http://www.math.uwaterloo.ca/tsp/vlsi/xqf131.tsphttp://www.math.uwaterloo.ca/tsp/vlsi/xqf131.tsphttp://www.math.uwaterloo.ca/tsp/vlsi/xqf131.tsp

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    8/18

    Informe Algoritmo Genético

    7  

    REFERENCIAS Math U. Waterloo. (s.f.). Obtenido de http://www.math.uwaterloo.ca/tsp/vlsi/index.html 

     Math U. Waterloo. (s.f.). Obtenido de http://www.math.uwaterloo.ca/tsp/vlsi/xqf131.tour

     Wikipedia. (s.f.). Obtenido de https://en.wikipedia.org/wiki/Travelling_salesman_problem

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    9/18

    Inteligencia Artificial

    8  

    CÓDIGO FUENTE

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    using namespace std;

    /** Parameters **/

    int TOTAL_POPULATION = 500;

    double MUTATION_PROBABILITY = 0.07;

    int NUMBER_OF_GENERATIONS = 1000;

    int ELITE = 1; // the best ones which always pass to the next generation

    struct Point{

    double x, y;

    Point(){}

    Point(double _x, double _y): x(_x), y(_y) {}

    double dist(Point p){

    return hypot(p.x - x, p.y - y );

    }

    };

    struct Population{

    private:

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    10/18

    Informe Algoritmo Genético

    9  

    vector &points;

    vector routes;

    vector prob;

    int n; // size of the route

    public:

    /** Freeing memory **/

    ~Population(){

    routes.clear();

    prob.clear();

    }

    /** Constructors **/

    Population(vector &_points): points(_points){}

    Population(int routeSize, vector &_points): n(routeSize),

    points(_points){}

    Population(int popuSize, int routeSize, vector &_points):

    points(_points) {

    n = routeSize;

    routes.clear();

    vector ind; // indexes to shuffle

    for(int i = 0; i < n; i++) ind.push_back(i);

    // random init

    for(int i = 0; i < popuSize; i++){

    random_shuffle ( ind.begin(), ind.end() );

    vector newRoute = ind;

    routes.push_back( newRoute );

    }

    }

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    11/18

    Inteligencia Artificial

    10  

    vector getRoutes() const{

    return routes;

    }

    int getRouteSize() const{

    return n;

    }

    vector getProb() const{

    return prob;

    }

    void operator=(const Population& pob){

    routes = pob.getRoutes();

    n = pob.getRouteSize();

    prob = pob.getProb();

    }

    // OX1 type crossover

    void crossover(vector &p1, vector &p2,

    vector &h1, vector &h2

    ){

    h1.clear();

    h2.clear();

    int a = rand()%(n-1), b = rand()%(n-1) ;

    if( a > b ) swap(a,b);

    bool oc1[n];

    bool oc2[n];

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    12/18

    Informe Algoritmo Genético

    11  

    memset(oc1, 0, sizeof(oc1));

    memset(oc2, 0, sizeof(oc2));

    for(int i = 0; i < n; i++){

    h1.push_back( -1 );

    h2.push_back( -1 );

    }

    for(int i = a+1; i

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    13/18

    Inteligencia Artificial

    12  

    }*/

    /** mutation **/

    double r;

    r = (double)rand()/(double)RAND_MAX;

    if( r

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    14/18

    Informe Algoritmo Genético

    13  

    vector h1,h2;

    double r;

    r = (double)rand()/(double)RAND_MAX;

    int ind1 = lower_bound( prob.begin(), prob.end(), r) -

    prob.begin();

    int ind2 = ind1;

    while( ind2 == ind1){

    r = (double)rand()/(double)RAND_MAX;

    ind2 = lower_bound( prob.begin(), prob.end(), r) -prob.begin();

    }

    //cout

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    15/18

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    16/18

    Informe Algoritmo Genético

    15  

    routes.push_back(nRuta);

    }

    int getSize(){

    return (int)routes.size();

    }

    /** You have to order before calling to this method **/

    vector getFirst(){

    vector res;

    for(int i = 0; i < n; i++) res.push_back( points[ routes[0][i] ]);

    return res;

    }

    vector getFirstIndexes(){

    return routes[0];

    }

    Point getPoint(int i){

    return points[i];

    }

    };

    /** Genetic algorithm **/

    vector ga_tsp(vector &points){

    int n = (int)points.size();

    Population pActual (TOTAL_POPULATION, n, points);

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    17/18

    Inteligencia Artificial

    16  

    pActual.order();

    vector result = pActual.getFirst();

    vector rIndexes = pActual.getFirstIndexes();

    cout

  • 8/16/2019 Algoritmo Genético para resolver el TSP

    18/18

    Informe Algoritmo Genético

    17  

    vector points;

    /** Reading input **/

    double x, y;

    while( cin >>x >> y ){

    points.push_back( Point(x,y) );

    }

    vector result = ga_tsp( points );

    cout