/// <summary> /// Crea un cromosoma relleno aleatoriamente con los puntos especificados /// </summary> /// <param name="puntos">Los puntos que almacenará el cromosoma</param> /// <param name="probabilidadMutacion">Probabilidad de mutar</param> /// <param name="puntoCorte">Punto de corte</param> public Cromosoma(Punto[] puntos, double probabilidadMutacion, int puntoCorte) { this.ProbabilidadMutacion = probabilidadMutacion; this.PuntoCorte = puntoCorte; this.estaciones = new Punto[puntos.Length]; bool[] usadas = new bool[puntos.Length]; for (int i = 0; i < this.Longitud; i++) usadas[i] = false; for (int i = 0; i < this.Longitud; i++) { int candidata; do { candidata = NextInt(0, this.Longitud); ; } while (usadas[candidata]); this[i] = puntos[candidata];//.Clone(); usadas[candidata] = true; PuntoCorte = 1; } }
/// <summary> /// Genera un arreglo de puntos aleatorios /// </summary> /// <param name="numeroPuntos">El número de puntos a generar</param> /// <param name="width">El valor máximo que puede tomar un punto en su coordenada Y</param> /// <param name="height">El valor máximo que puede tomar un punto en su coordenada X</param> /// <param name="offset"></param> /// <returns>El set de puntos aleatorios</returns> public static Punto[] PuntosAleatorios(int numeroPuntos, int width, int height, int offset) { Punto[] aleatorias = new Punto[numeroPuntos]; for (int i = 0; i < numeroPuntos; i++) { aleatorias[i] = new Punto(i , ((int)(r.NextDouble() * (width - offset * 2)) + offset) , ((int)(r.NextDouble() * (height - offset * 2)) + offset)); } return aleatorias; }
/// <summary> /// Calcula la distancia entre dos puntos /// </summary> /// <param name="punto">El punto al cual se desea medir la distancia</param> /// <returns>El valor total de la distancia</returns> public double Distancia(Punto punto) { return this.Distancia(punto.X, punto.Y); }
/// <summary> /// Obtiene el índice en el que se encuetra la estación proporcionada /// </summary> /// <param name="estacion"></param> /// <returns>Un entero de 0 a la longitud del cromosoma menos uno, menos uno en caso de que no se encuentre</returns> private int IndexEstacion(Punto estacion) { for (int i = 0; i < estaciones.Length; i++) { if (estaciones[i].Equals(estacion)) { return i; } } return -1; }
/// <summary> /// Obtiene el índice en el que se encuetra la estación proporcionada /// </summary> /// <param name="estacion"></param> /// <returns>Un entero de 0 a la longitud del cromosoma menos uno, menos uno en caso de que no se encuentre</returns> public int this[Punto estacion] { get { return IndexEstacion(estacion); } }