/// <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 } } } } } } }
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); }
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(); } } } } } } } } }
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); }
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 }