// IMPRIME UNA SOLUCION en consola
        public void PrintIndividuo()
        {
            List <Vehiculo> listaEsperaTemp = this.vehiculos;
            List <Linea>    lineasTemp      = this.lineas;

            Console.WriteLine("##############################################################");
            Console.WriteLine("##############################################################");
            Console.WriteLine("LINEAS");
            for (int i = 0; i < lineasTemp.Count; i++)
            {
                Console.WriteLine("---------------------------------------------------------------");
                Console.WriteLine("Linea: " + i);
                Console.WriteLine("Tiempo de atencion: " + lineasTemp.ElementAt(i).GetTiempoAtencion());
                Console.WriteLine("Tiempo restante: " + lineasTemp.ElementAt(i).GetTiempoRestante());
                Console.WriteLine("¿Está activa?: " + lineasTemp.ElementAt(i).GetEstaActiva());
                Console.WriteLine("---------------------------------------------------------------");
            }

            Console.WriteLine(""); Console.WriteLine("");
            Console.WriteLine("VEHICULOS");
            for (int i = 0; i < listaEsperaTemp.Count; i++)
            {
                Console.WriteLine("---------------------------------------------------------------");
                Console.WriteLine("Vehiculo: " + listaEsperaTemp.ElementAt(i).GetId());
                Console.WriteLine("Tipo: " + listaEsperaTemp.ElementAt(i).GetTipo());
                Console.WriteLine("Tiempo total: " + listaEsperaTemp.ElementAt(i).GetTiempo());
                Console.WriteLine("Probabilidad: " + listaEsperaTemp.ElementAt(i).GetProbAsignado());
                Linea linea = listaEsperaTemp.ElementAt(i).GetLineaAsignada();
                if (linea != null)
                {
                    Console.WriteLine("Tiempo restante de linea asignada: " + linea.GetTiempoRestante());
                }
                Console.WriteLine("---------------------------------------------------------------");
            }
            Console.WriteLine("FITNESS: " + this.fitness);

            Console.WriteLine("##############################################################");
            Console.WriteLine("##############################################################");
        }
예제 #2
0
 public void SetLineaAsignada(Linea pLinea)
 {
     this.lineaAsignada = pLinea;
 }
        /****************************************************
        *  Asigna los vehiculos de una poblacion a las lineas  *
        ****************************************************/
        public void AsignarVehiculosALineas()
        {
            // Asigna el valor inicial a cada linea
            foreach (Linea l in this.lineas)
            {
                l.RestablecerTiemporestante();
                l.SetNumVehiculosAsignados(0);
            }
            foreach (Vehiculo v in this.vehiculos)
            {
                v.SetLineaAsignada(null);
            }

            // Ordena la lista de menor a mayor segun las probabilidades del vehiculo
            IEnumerable <Vehiculo> sorted          = this.vehiculos.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 < this.lineas.Count; j++)
                    {
                        if (this.lineas.ElementAt(j).GetEstaActiva())
                        {
                            List <char> opciones = this.lineas.ElementAt(j).getTiposVehiculos();
                            if (opciones.Contains(tempVehiculo.GetTipo()))
                            {
                                if ((this.lineas.ElementAt(j).GetTiempoRestante() - tempVehiculo.GetTiempo()) >= 0)
                                {
                                    tempLineas.Add(this.lineas.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
                        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());
                     * Console.WriteLine("Puede entrar en las lineas: ");
                     * foreach (Linea l in tempLineas)
                     * {
                     *  Console.WriteLine("Tiempo Atención--> " + l.GetTiempoAtencion());
                     *  Console.WriteLine("Tiempo restante--> " + l.GetTiempoRestante());
                     *  Console.WriteLine("#");
                     * }
                     * Console.WriteLine("--------------------------------------");
                     * Console.WriteLine("--------------------------------------");*/
                }
            }

            // Busca la linea con menor capacidad
            Linea lineaConMenoCapacidad = this.GetLineaConMenorCapacidad();
            int   maximoValorPorLinea   = lineaConMenoCapacidad.GetTiempoAtencion();
            int   rango = maximoValorPorLinea + 20;

            this.LineasEnRango(rango);
        }