Beispiel #1
0
        /**************************************************************************
        *  Calcula la probabilidad de un vehiculo de ser escogido con base en        *
        *  la cantidad de lineas que pueden atender ese vehiculo mas un # aleatorio  *
        *  entre -10 y 10                                                            *
        **************************************************************************/
        private double GetProbVehiculo(vehiculo v, List <Linea> lineas)
        {
            int    countOfLines        = lineas.Count;
            double countOfCoincidences = 0.0;

            for (int i = 0; i < countOfLines; i++)
            {
                List <char> tiposVehiculos = lineas.ElementAt(i).getTiposVehiculos();
                for (int j = 0; j < tiposVehiculos.Count; j++)
                {
                    if (tiposVehiculos.ElementAt(j) == v.GetTipo())
                    {
                        countOfCoincidences++;
                    }
                }
            }
            // Aplica lo aleatorio
            int    rand = rnd.Next(-10, 0);
            double res  = 100 * (countOfCoincidences / countOfLines) + rand;

            return(res);
        }
Beispiel #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 ");
                    }
                }
            }
        }