示例#1
0
        /// <summary>
        /// remove os veículos da rua quando já estão no final da rua.
        /// se for final do trajeto finaliza percurso
        /// se tiver mais percurso coloca na proxima rua
        /// </summary>
        private void TrocaVeiculosRua()
        {
            foreach (var rua in RuasSimulacao)
            {
                var  sema   = Semaforos.Where(x => x.RuasOrigem.Contains(rua.Id)).FirstOrDefault();
                bool temSem = sema != null;
                for (int i = 0; i < rua.NumeroFaixas; i++)
                {
                    var veiculos = rua.VeiculosNaRua[i].ToList();
                    foreach (var veiculo in veiculos)
                    {
                        if ((rua.EspacoOcupado[i] + MargemErroViaLotada) >= rua.Comprimento)
                        {
                            bool removeVeiculo = true;
                            if (temSem && sema.EstadoSemaforo != Entidades.Enuns.EstadosSemaforo.ABERTO)
                            {
                                removeVeiculo = false;
                            }

                            if (removeVeiculo)
                            {
                                var arestaRuaAt             = grafo.ObtenhaAresta(rua.IdAresta);
                                int verticeOrigemProximaRua = arestaRuaAt.Destino;
                                veiculo.VerticeAtual = veiculo.ProximoDestinoVeiculo();
                                int verticeDestinoProximaRua = veiculo.ProximoDestinoVeiculo();
                                var procimaAresta            = grafo.ObtenhaAresta(verticeOrigemProximaRua, verticeDestinoProximaRua);
                                if (procimaAresta is object)
                                {
                                    var prua = RuasSimulacao.Where(x => x.IdAresta == procimaAresta.Id).FirstOrDefault();
                                    if (prua is object)
                                    {
                                        if (prua.AdicionaVeiculo(veiculo, SegundoSimulacao))
                                        {
                                            rua.RemoveVeiculo();
                                        }
                                        // o veículo precisa trocar de rua mas a proxima rua não tem espaço suficiente
                                        else
                                        {
                                            //veiculo permanece onde está
                                        }
                                    }
                                }// fim percurso do veículo
                                else
                                {
                                    rua.RemoveVeiculo(); // veiculo removido da simulação, chegou ao destino
                                }
                            }
                        }
                    }
                }
            }
        }
示例#2
0
        private List <Chromosome <string> > CriaPopulacaoInicial(int numeroIndividuos)
        {
            int ValorMinimo           = 30;
            int valorMaximo           = 120;
            int numeroGenesCromossomo = 14;// cada tempo tem o valor mázimo de 127 (7 bits)
            List <Chromosome <string> > populacaoinicial = new List <Chromosome <string> >();
            Random rand = new Random();

            for (int i = 0; i < numeroIndividuos; i++)
            {
                var           novo          = new Chromosome <string>(numeroGenesCromossomo * Semaforos.Count);
                StringBuilder strcromossomo = new StringBuilder();
                for (int j = 0; j < Semaforos.Count(); j++)
                {
                    int tempoaberto  = 0;
                    int tempofechado = 0;
                    while (tempoaberto < ValorMinimo)
                    {
                        tempoaberto = rand.Next() % valorMaximo;
                    }
                    while (tempofechado < ValorMinimo)
                    {
                        tempofechado = rand.Next() % valorMaximo;
                    }
                    string cromossomo = $"{Convert.ToString(tempoaberto, 2)}{Convert.ToString(tempofechado, 2)}";
                    while (cromossomo.Count() < numeroGenesCromossomo)
                    {
                        if (rand.Next() % 2 == 0)
                        {
                            cromossomo = cromossomo.Insert(0, "0");
                        }
                        else
                        {
                            cromossomo = cromossomo.Insert(1, "1");
                        }
                    }
                    strcromossomo.Append(cromossomo);
                }
                var str = strcromossomo.ToString();
                for (int j = 0; j < str.Length; j++)
                {
                    novo.AddGene(str[j].ToString());
                }
                populacaoinicial.Add(novo);
            }
            return(populacaoinicial);
        }
示例#3
0
        private void  TrocaVeiculosRua(int instanteSimulacao)
        {
            foreach (var rua in RuasSimulacao)
            {
                var  sema   = Semaforos.Where(x => x.RuasOrigem.Contains(rua.Id)).FirstOrDefault();
                bool temSem = sema != null;
                for (int i = 0; i < rua.NumeroFaixas; i++)
                {
                    var veiculos = rua.VeiculosNaRua[i].ToList();
                    foreach (var veiculo in veiculos)
                    {
                        if ((rua.EspacoOcupado[i] + MargemErroViaLotada) >= rua.Comprimento)
                        {
                            bool removeVeiculo = true;
                            if (temSem && sema.EstadoSemaforo != Entidades.Enuns.EstadosSemaforo.ABERTO)
                            {
                                removeVeiculo = false;
                            }

                            if (removeVeiculo)
                            {
                                var arestaRuaAt             = grafo.ObtenhaAresta(rua.IdAresta);
                                int verticeOrigemProximaRua = arestaRuaAt.Destino;
                                veiculo.VerticeAtual = veiculo.ProximoDestinoVeiculo();
                                int verticeDestinoProximaRua = veiculo.ProximoDestinoVeiculo();
                                var procimaAresta            = grafo.ObtenhaAresta(verticeOrigemProximaRua, verticeDestinoProximaRua);
                                if (procimaAresta is object)
                                {
                                    var prua = RuasSimulacao.Where(x => x.IdAresta == procimaAresta.Id).FirstOrDefault();
                                    if (prua is object)
                                    {
                                        if (prua.AdicionaVeiculo(veiculo, instanteSimulacao))
                                        {
                                            rua.RemoveVeiculo();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
示例#4
0
        public override float CalculatesEvaluation(Chromosome <string> chromosome)
        {
            if (Param1 == null || Param2 == null)
            {
                return(base.CalculatesEvaluation(chromosome));
            }
            Semaforos = (List <Semaforo>)Param1;
            Ruas      = (List <Rua>)Param2;
            if (Semaforos == null || Ruas == null)
            {
                throw new NullReferenceException("Null parameters");
            }
            float avaliacao           = 0;
            var   semaforosCromossomo = ConverteCromossomoParaSemaforo(chromosome.Genes);

            for (int i = 0; i < Semaforos.Count() - 1; i++)
            {
                avaliacao += FatorCromossomo(i, semaforosCromossomo[i], semaforosCromossomo[i + 1]);
            }
            return(avaliacao);
        }
示例#5
0
        public void CarregaMapaSimulacao(string CaminhoArquivoSimulacao)
        {
            Entrada DadosEntrada = new Entrada();;

            using (StreamReader file = new StreamReader(CaminhoArquivoSimulacao))
            {
                if (file == null)
                {
                    throw new Exception($"Arquivo {CaminhoArquivoSimulacao} não foi encontrado!");
                }
                string conteudoArquivo = file.ReadToEnd();
                DadosEntrada = JsonConvert.DeserializeObject <Entrada>(conteudoArquivo);
                file.Close();
            }
            if (DadosEntrada == null)
            {
                throw new Exception("Não foi possível realizar a serialização do arquivo de entrada de dados");
            }

            #region ProcessaEntrada
            int auxId = 0;

            /// grafo e ruas
            foreach (var item in DadosEntrada.Ruas)
            {
                grafo.AdicionaAresta(item.VerticeOrigem, item.VerticeDestino, item.Distancia, auxId);
                Aresta aresta       = grafo.ObtenhaAresta(item.VerticeOrigem, item.VerticeDestino);
                Rua    ruaAdicionar = new Rua()
                {
                    Comprimento      = aresta.Peso,
                    NumeroFaixas     = item.NumeroVias,
                    IdAresta         = aresta.Id,
                    VelocidadeMaxima = item.VelocidadeMaxima,
                    Id        = auxId++,
                    Descricao = $"Rua sentido {aresta.Origem} até {aresta.Destino}",
                };
                ruaAdicionar.PreparaRua();
                RuasSimulacao.Add(ruaAdicionar);
            }

            /// comprimento veiculos
            foreach (var item in DadosEntrada.ComprimentosVeiculos)
            {
                if (item <= 0)
                {
                    throw new Exception("Um comprimento não pode ser menor ou igual a zero");
                }
                geradorVeiculos.AdicionarComprimentoPossivel(item);
            }

            /// velocidade inicial
            foreach (var item in DadosEntrada.VelocidadeInicial)
            {
                if (item <= 0)
                {
                    throw new Exception("A velocidade inicial não pode ser menor ou igual a zero");
                }
                geradorVeiculos.AdicionarVelocidadePossivel(item);
            }

            /// Semaforos
            auxId = 0;
            foreach (var item in DadosEntrada.Semaforos)
            {
                Semaforo auxSema = new Semaforo()
                {
                    Id                  = auxId++,
                    TempoAberto         = item.TempoAberto,
                    TempoAmarelo        = item.TempoAmarelo,
                    TempoFechado        = item.TempoFechado,
                    EstadoSemaforo      = Entidades.Enuns.EstadosSemaforo.ABERTO,
                    ProximoTempoAberto  = item.TempoAberto,
                    ProximoTempoFechado = item.TempoFechado,
                    TempoAtual          = 0
                };
                auxSema.LogSemaforos.Add(new LogSemaforos {
                    InstanteTempo = 0,
                    TempoAberto   = item.TempoAberto,
                    TempoFechado  = item.TempoFechado
                });

                Rua RuaOrigem  = GetRua(item.VerticeOrigemOrigem, item.VerticeDestinoOrigem);
                Rua RuaDestino = GetRua(item.VerticeOrigemDestino, item.VerticeDestinoDestino);
                if (item.VerticeOrigemDestino == item.VerticeDestinoDestino && RuaDestino == null)//Ultimo semáforo e sem rua depois do semáforo
                {
                    throw new Exception("Não existe uma rua após o último semáforo.");
                }
                if (RuaOrigem == null || RuaDestino == null)
                {
                    throw new Exception("Rua de Origem/Destino não foi encontrada.");
                }
                auxSema.RuasOrigem.Add(RuaOrigem.Id);
                auxSema.RuasDestino.Add(RuaDestino.Id);
                Semaforos.Add(auxSema);
            }
            // taxa de geracao veiculos
            TaxaGeracao.AddRange(DadosEntrada.TaxasGeracao.OrderBy((x) => x.Vertice).Select((x) => x.Taxa));
            if (TaxaGeracao.Count != grafo.NumeroVertices)
            {
                throw new Exception("Quantidade de taxas de geração está inclopeta");
            }
            #endregion ProcessaEntrada
        }