/// <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); } }
/// <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; }
/// <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; } } } }