/// <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 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 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 }
public Rua GetRua(int origem, int destino) { return(RuasSimulacao.Where((x) => x.IdAresta == grafo.ObtenhaAresta(origem, destino)?.Id).FirstOrDefault()); }