示例#1
0
        /****************************************************************
        *  Evalua si la población es buena o no                            *
        *  Retorna True si la población cumple con las caracteristicas     *
        *  Retorna False si la población no cumple con las caracteristicas *
        ****************************************************************/
        public bool Fitness(Poblacion poblacion, int generation)
        {
            // Busca la linea con menor capacidad
            Linea lineaConMenoCapacidad = this.GetLineaConMenoCapacidad();
            int   maximoValorPorLinea   = lineaConMenoCapacidad.GetTiempoAtencion();


            // Busca si alguna linea se pasa del rango
            int rango = maximoValorPorLinea + 20;

            if (this.LineasFueraDeRango(rango) == false)
            {
                return(false);
            }


            // Verifica que cada lineas esté en el rango
            if (this.LineasEnRango(rango) == false)
            {
                return(false);
            }


            // Verifico la equivalencia final
            int mayorCargaPosible = lineaConMenoCapacidad.GetTiempoAtencion() - lineaConMenoCapacidad.GetTiempoRestante() + 20;

            if (this.VerificarEquivalencia(mayorCargaPosible))
            {
                // Si llega aqui, es una solucion valida
                return(true);
            }


            // Si se acabaron las generaciones
            if (generation == this.numGenerations)
            {
                return(true);
            }
            return(false);
        }
示例#2
0
        /****************************************************
        *  Asigna los vehiculos de una poblacion a las lineas  *
        ****************************************************/
        public void AsignarVehiculosALineas(Poblacion poblacion)
        {
            // Asigna el valor inicial a cada linea
            foreach (Linea l in poblacion.GetLineas())
            {
                l.RestablecerTiemporestante();
            }
            foreach (vehiculo v in this.listaEspera)
            {
                v.SetLineaAsignada(null);
            }

            // Ordena la lista de menor a mayor segun las probabilidades del vehiculo
            IEnumerable <vehiculo> sorted          = poblacion.GetVehiculos().OrderBy(x => x.GetProbAsignado());
            List <vehiculo>        tempListaEspera = new List <vehiculo>();

            foreach (vehiculo v in sorted)
            {
                tempListaEspera.Add(v);
            }

            for (int i = 0; i < tempListaEspera.Count; i++)
            {
                // Aleatorio segun la probabilidad del vehiculo
                int rand = rnd.Next(0, 101);
                if ((rand < tempListaEspera.ElementAt(i).GetProbAsignado()))
                {
                    vehiculo tempVehiculo = tempListaEspera.ElementAt(i);

                    // Busco las lineas en que puede entrar
                    List <Linea> tempLineas = new List <Linea>();
                    for (int j = 0; j < poblacion.GetLineas().Count; j++)
                    {
                        if (poblacion.GetLineas().ElementAt(j).GetEstaActiva())
                        {
                            List <char> opciones = poblacion.GetLineas().ElementAt(j).getTiposVehiculos();
                            if (opciones.Contains(tempVehiculo.GetTipo()))
                            {
                                if ((poblacion.GetLineas().ElementAt(j).GetTiempoRestante() - tempVehiculo.GetTiempo()) >= 0)
                                {
                                    tempLineas.Add(poblacion.GetLineas().ElementAt(j));
                                }
                            }
                        }
                    }

                    // Lista de lineas donde el vehiculo puede entrar
                    if (tempLineas.Count > 0)
                    {
                        // ver cual está vacia
                        Linea tempMenorLinea = tempLineas.ElementAt(0);
                        bool  asignado       = false;
                        foreach (Linea l in tempLineas)
                        {
                            if (l.GetTiempoAtencion() == l.GetTiempoRestante())
                            {
                                tempVehiculo.SetLineaAsignada(l);
                                l.RestarTiempo(tempVehiculo.GetTiempo());
                                l.IncrementarVehiculos();
                                asignado = true;
                                break;
                            }
                            int tiempoAsignado = tempMenorLinea.GetTiempoAtencion() - tempMenorLinea.GetTiempoRestante();
                            if (tiempoAsignado > (l.GetTiempoAtencion() - l.GetTiempoRestante()))
                            {
                                tempMenorLinea = l;
                            }
                        }
                        // si no, ver la que tenga menor carga y que no sobrepase el limite

                        if (asignado == false)
                        {
                            int futuroValorLinea = (tempMenorLinea.GetTiempoAtencion() - tempMenorLinea.GetTiempoRestante()) + tempVehiculo.GetTiempo();
                            int maximoConsumo    = this.GetTiempoatencionLineaMasPequena() + 20;
                            if (futuroValorLinea <= maximoConsumo)
                            {
                                tempVehiculo.SetLineaAsignada(tempMenorLinea);
                                tempMenorLinea.RestarTiempo(tempVehiculo.GetTiempo());
                                tempMenorLinea.IncrementarVehiculos();
                            }
                        }
                    }


                    Console.WriteLine("El vehiculo: " + tempVehiculo.GetId());
                    if (tempVehiculo.GetLineaAsignada() != null)
                    {
                        Console.WriteLine("Fué asignado en la linea: " + tempVehiculo.GetLineaAsignada().GetTiempoAtencion());
                        Console.WriteLine("#");
                        Console.WriteLine("--------------------------------------");
                    }
                    else
                    {
                        Console.WriteLine("- - - > No se asignó el vehiculo ");
                    }
                }
            }
        }