Пример #1
0
        /// <summary>
        /// Ordena de menor a mayor los cromosomas, basado en el costo que representa recorrer la ruta que en ellos se almacena.
        /// <para>Método que usa quick sort</para>
        /// </summary>
        /// <param name="poblacion"></param>
        /// <param name="left"></param>
        /// <param name="right"></param>
        public static void QuickSort(Cromosoma[] poblacion, int left, int right)
        {
            int i = left, j = right;
            Cromosoma pivote = poblacion[(left + right) / 2];

            while (i <= j)
            {
                while (poblacion[i].Costo < pivote.Costo)
                {
                    i++;
                }

                while (poblacion[j].Costo > pivote.Costo)
                {
                    j--;
                }

                if (i <= j)
                {
                    Cromosoma tmp = poblacion[i];
                    poblacion[i] = poblacion[j];
                    poblacion[j] = tmp;

                    i++;
                    j--;
                }
            }
            if (left < j)
            {
                QuickSort(poblacion, left, j);
            }

            if (i < right)
            {
                QuickSort(poblacion, i, right);
            }

        }
Пример #2
0
        /// <summary>
        /// Cruza cíclica
        /// </summary>
        /// <param name="padre">Cromosoma padre</param>
        /// <param name="madre">Cromosoma madre</param>
        /// <returns>Un par de hijos nuevos, resultado de la cruza de los dos cromosomas proporcionados</returns>
        public static Cromosoma[] CruzaCiclica(Cromosoma padre, Cromosoma madre)
        {
            Cromosoma[] hijos = new Cromosoma[] { 
                new Cromosoma(padre.Longitud,padre.ProbabilidadMutacion,padre.PuntoCorte), 
                new Cromosoma(padre.Longitud,madre.ProbabilidadMutacion, padre.PuntoCorte) 
            };



            int longitudCromosoma = padre.Longitud;
            int inicioCruzaHijo1 = NextInt(0, longitudCromosoma - 1);
            int inicioCruzaHijo2 = inicioCruzaHijo1;

            Punto aux = padre[inicioCruzaHijo1];
            Punto aux2 = null;

            while (!aux.Equals(aux2))
            {
                aux2 = padre[inicioCruzaHijo1];
                hijos[0][inicioCruzaHijo1] = aux2;
                Punto i = madre[inicioCruzaHijo1];
                inicioCruzaHijo1 = padre[i];
                aux2 = i;
            }

            aux = madre[inicioCruzaHijo2];
            aux2 = null;

            while (!aux.Equals(aux2))
            {
                aux2 = madre[inicioCruzaHijo2];
                hijos[1][inicioCruzaHijo2] = aux2;
                Punto i = padre[inicioCruzaHijo2];
                inicioCruzaHijo2 = madre[i];
                aux2 = i;
            }

            for (int i = 0; i < padre.Longitud; i++)
            {
                if (hijos[0][i] == null)
                {
                    hijos[0][i] = madre[i];
                }
                if (hijos[1][i] == null)
                {
                    hijos[1][i] = padre[i];
                }
            }
            return hijos;
        }
Пример #3
0
 /// <summary>
 /// Ordena de menor a mayor los cromosomas, basado en el costo que representa recorrer la ruta que en ellos se almacena.
 /// <para>Método que usa bubble sort</para>
 /// </summary>
 /// <param name="poblacion"></param>
 /// <param name="numero"></param>
 public static void Sort(Cromosoma[] poblacion, int numero)
 {
     Cromosoma temporal;
     bool cambio = true;
     while (cambio)
     {
         cambio = false;
         for (int i = 0; i < numero - 1; i++)
         {
             if (poblacion[i].Costo > poblacion[i + 1].Costo)
             {
                 temporal = poblacion[i];
                 poblacion[i] = poblacion[i + 1];
                 poblacion[i + 1] = temporal;
                 cambio = true;
             }
         }
     }
 }