http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&user=Rodrigozferreira&feedformat=atomFísica Computacional - Contribuições do usuário [pt-br]2024-03-29T00:55:40ZContribuições do usuárioMediaWiki 1.39.4http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2293Grupo - Tráfego2018-01-25T10:30:02Z<p>Rodrigozferreira: /* Simulações Iniciais */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 9 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 10 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|center|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:pistadupla.gif|center|550x550px|center|Gráfico 12.1: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|400x400px|center|Gráfico 13: 9 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Através desses quatro gráficos, podemos observar claramente que uma rua com pista dupla é mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
<br />
[[Gnuplot - Plot base Matrizes de dados]]<br />
<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2292Grupo - Tráfego2018-01-25T10:29:32Z<p>Rodrigozferreira: /* Simulações Iniciais */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 9 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 10 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|center|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
[[Arquivo:pistadupla.gif|center|550x550px|center|Gráfico 12.1: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|400x400px|center|Gráfico 13: 9 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Através desses quatro gráficos, podemos observar claramente que uma rua com pista dupla é mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
<br />
[[Gnuplot - Plot base Matrizes de dados]]<br />
<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2291Grupo - Tráfego2018-01-25T10:26:46Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 9 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 10 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|400x400px|right|Gráfico 13: 9 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:pistadupla.gif|center|550x550px|center|Gráfico 12.1: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Através desses quatro gráficos, podemos observar claramente que uma rua com pista dupla é mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
<br />
[[Gnuplot - Plot base Matrizes de dados]]<br />
<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2290Grupo - Tráfego2018-01-25T10:26:08Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|400x400px|right|Gráfico 13: 9 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:pistadupla.gif|center|550x550px|center|Gráfico 12.1: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Através desses quatro gráficos, podemos observar claramente que uma rua com pista dupla é mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
<br />
[[Gnuplot - Plot base Matrizes de dados]]<br />
<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2289Grupo - Tráfego2018-01-25T10:25:35Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|400x400px|right|Gráfico 13: 9 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:pistadupla.gif|center|550x550px|center|Gráfico 12.1: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Através desses quatro gráficos, podemos observar claramente que uma rua com pista dupla é mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
<br />
[[Gnuplot - Plot base Matrizes de dados]]<br />
<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2288Grupo - Tráfego2018-01-25T10:25:05Z<p>Rodrigozferreira: /* Comparação entre faixa simples e dupla */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|400x400px|right|Gráfico 13: 9 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:pistadupla.gif|center|550x550px|center|Gráfico 12.1: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Fluxo, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Através desses quatro gráficos, podemos observar claramente que uma rua com pista dupla é mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
<br />
[[Gnuplot - Plot base Matrizes de dados]]<br />
<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2081Grupo - Tráfego2018-01-24T20:58:55Z<p>Rodrigozferreira: /* Comparação entre faixa simples e dupla */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Através desses quatro gráficos, podemos observar claramente que uma rua com pista dupla é mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2080Grupo - Tráfego2018-01-24T20:58:26Z<p>Rodrigozferreira: /* Comparação entre faixa simples e dupla */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2079Grupo - Tráfego2018-01-24T20:57:29Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2078Grupo - Tráfego2018-01-24T20:56:50Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100, com probabilidade de redução de 0.3]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: L = 100]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2077Grupo - Tráfego2018-01-24T20:55:41Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17: L = 100]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18: L = 100]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2076Grupo - Tráfego2018-01-24T20:55:15Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, em <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2075Grupo - Tráfego2018-01-24T20:54:20Z<p>Rodrigozferreira: /* Simulações Iniciais */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2074Grupo - Tráfego2018-01-24T20:53:15Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9: L = 100]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10: L = 100]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2071Grupo - Tráfego2018-01-24T20:52:02Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Medidas de Velocidade===<br />
<br />
Da mesma forma que foi feita para pista única, podemos medir a velocidade média em função de diversos parâmetros. Os resultados são semelhantes aos obtidos anteriormente, mas têm uma diferença, que será explorada na próxima seção.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2068Grupo - Tráfego2018-01-24T20:46:31Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7: <math>t_{final} = 100</math>, com probabilidade de redução de 0.3]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8: <math>v_{max} = 6</math>, com probabilidade de redução de 0.3]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Medidas de Velocidade===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2065Grupo - Tráfego2018-01-24T20:35:55Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
O pico que aparece neste gráfico pode ser atribuído ao fato de que uma velocidade máxima mais alta faz com que os carros possam atingir velocidades mais altas, e isso pode fazer com que os carros fiquem mais próximos uns dos outros, diminuindo a velocidade média.<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Medidas de Velocidade===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2064Grupo - Tráfego2018-01-24T20:32:25Z<p>Rodrigozferreira: /* Análise de Velocidades */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Medidas de Velocidade===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2063Grupo - Tráfego2018-01-24T20:31:25Z<p>Rodrigozferreira: /* Funcionamento */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 23: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2062Grupo - Tráfego2018-01-24T20:31:13Z<p>Rodrigozferreira: /* Comparação entre faixa simples e dupla */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 19: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 20: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 21: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 22: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 15: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2061Grupo - Tráfego2018-01-24T20:30:27Z<p>Rodrigozferreira: /* Medidas de Velocidade */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 8]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 9]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 15: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Gnuplot_-_N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2060Gnuplot - N pistas: Velocidade média em função do tempo2018-01-24T20:26:28Z<p>Rodrigozferreira: </p>
<hr />
<div><source><br />
set title 'Pista dupla, 100.000 amostragens, v_max = 6'<br />
set yl 'Velocidade media'<br />
set xl 'Tempo'<br />
set yr [:7]<br />
<br />
<br />
set terminal jpeg enh medium size 800,600<br />
set output "2_lanes_v_med_t.jpg"<br />
<br />
plot '2_lanes_v_med_t_dens_01.dat' w lp title 'densidade = 0.1', 0.0001846*x+5.5894 title 'valor de equilibrio = 5.5894', 'n_lanes_v_med_t_dens_03.dat' w lp title 'densidade = 0.3', 0.0009827*x+1.4395 title 'valor de equilibrio = 1.4395'<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Gnuplot_-_N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2059Gnuplot - N pistas: Velocidade média em função do tempo2018-01-24T20:26:14Z<p>Rodrigozferreira: Criou página com 'set title 'Pista dupla, 100.000 amostragens, v_max = 6' set yl 'Velocidade media' set xl 'Tempo' set yr [:7] set terminal jpeg enh medium size 800,600 set output "2_lanes_v_...'</p>
<hr />
<div>set title 'Pista dupla, 100.000 amostragens, v_max = 6'<br />
set yl 'Velocidade media'<br />
set xl 'Tempo'<br />
set yr [:7]<br />
<br />
<br />
set terminal jpeg enh medium size 800,600<br />
set output "2_lanes_v_med_t.jpg"<br />
<br />
plot '2_lanes_v_med_t_dens_01.dat' w lp title 'densidade = 0.1', 0.0001846*x+5.5894 title 'valor de equilibrio = 5.5894', 'n_lanes_v_med_t_dens_03.dat' w lp title 'densidade = 0.3', 0.0009827*x+1.4395 title 'valor de equilibrio = 1.4395'</div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Gnuplot_-_N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_velocidade_m%C3%A1xima&diff=2058Gnuplot - N pistas: Velocidade média em função da velocidade máxima2018-01-24T20:25:29Z<p>Rodrigozferreira: Criou página com '<source> set title 'Pista dupla, 100.000 amostragens' set yl 'Velocidade media' set xl 'Velocidade maxima' set yr [:7] set terminal jpeg enh medium size 800,600 set output "...'</p>
<hr />
<div><source><br />
set title 'Pista dupla, 100.000 amostragens'<br />
set yl 'Velocidade media'<br />
set xl 'Velocidade maxima'<br />
set yr [:7]<br />
<br />
<br />
set terminal jpeg enh medium size 800,600<br />
set output "2_lanes_v_med_max.jpg"<br />
<br />
plot '2_lanes_v_med_max_dens_01.dat' w lp title 'densidade = 0.1', 7.0258e-05*x+5.9055 title 'valor de equilibrio = 5.9055', '2_lanes_v_med_max_dens_03.dat' w lp title 'densidade = 0.3', 1.2222e-05*x+1.5396 title 'valor de equilibrio = 1.5396'<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Gnuplot_-_N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_densidade_e_fluxo_em_fun%C3%A7%C3%A3o_da_densidade&diff=2057Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade2018-01-24T20:24:38Z<p>Rodrigozferreira: Criou página com '<source> set title 'Pista dupla V_max = 6, 100.000 amostragens' set yl 'Velocidade media' set xl 'Densidade de carros' set terminal jpeg enh medium size 800,600 set output "2...'</p>
<hr />
<div><source><br />
set title 'Pista dupla V_max = 6, 100.000 amostragens'<br />
set yl 'Velocidade media'<br />
set xl 'Densidade de carros'<br />
<br />
set terminal jpeg enh medium size 800,600<br />
set output "2_lanes_dens_vel.jpg"<br />
<br />
plot '2_lanes_dens.dat' u 1:2 w lp title ''<br />
<br />
set output "2_lanes_dens_fluxo.jpg"<br />
<br />
plot '2_lanes_dens.dat' u 1:3 w lp title ''<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Compara%C3%A7%C3%A3o_entre_pista_simples_e_dupla&diff=2056Comparação entre pista simples e dupla2018-01-24T20:23:38Z<p>Rodrigozferreira: Criou página com '<source> set title 'Comparacao, 100.000 amostragens' set yl 'Velocidade media' set xl 'Densidade de carros' set terminal jpeg enh medium size 800,600 set output "comparacao_...'</p>
<hr />
<div><source><br />
set title 'Comparacao, 100.000 amostragens'<br />
<br />
set yl 'Velocidade media'<br />
set xl 'Densidade de carros'<br />
<br />
set terminal jpeg enh medium size 800,600<br />
set output "comparacao_dens_vel.jpg"<br />
<br />
plot '1_lane_dens.dat' u 1:2 w lp title '1 faixa', '2_lanes_dens.dat' u 1:2 w lp title '2 faixas'<br />
<br />
<br />
set output "comparacao_dens_fluxo.jpg"<br />
<br />
plot '1_lane_dens.dat' u 1:3 w lp title '1 faixa', '2_lanes_dens.dat' u 1:3 w lp title '2 faixas'<br />
<br />
<br />
set yl 'Velocidade media'<br />
set xl 'Tempo'<br />
set yr[:7]<br />
<br />
set output "comparacao_v_med_t.jpg"<br />
<br />
plot '1_lane_v_med_t_prob_03_dens_01.dat' w lp title '1 faixa, densidade = 0.1, equilibrio = 5.4997', '2_lanes_v_med_t_dens_01.dat' w lp title '2 faixas, densidade = 0.1, equilibrio = 5.5894', '1_lane_v_med_t_prob_03_dens_03.dat' w lp title '1 faixa, densidade = 0.3, equilibrio = 1.3395', '2_lanes_v_med_t_dens_03.dat' w lp title '2 faixas densidade = 0.3, equilibrio = 1.4395'<br />
<br />
set yl 'Velocidade media'<br />
set xl 'Velocidade maxima'<br />
<br />
set output "comparacao_v_med_max.jpg"<br />
<br />
plot '1_lane_v_med_max_dens_01.dat' w lp title '1 faixa, densidade = 0.1, equilibrio = 5.124', '2_lanes_v_med_max_dens_01.dat' w lp title '2 faixas, densidade = 0.1, equilibrio = 5.9055', '1_lane_v_med_max_dens_03.dat' w lp title '1 faixa, densidade = 0.3, equilibrio = 1.3287', 'n_lanes_v_med_max_dens_03.dat' w lp title '2 faixas, densidade = 0.3, equilibrio = 1.5396'<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_densidade_e_fluxo_em_fun%C3%A7%C3%A3o_da_densidade&diff=2055N pistas: Velocidade média em função da densidade e fluxo em função da densidade2018-01-24T20:20:31Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
#define veloc_max 6<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
//definimos vel[comprimento_rua*num_faixas], pois o numero maximo de carros = comprimento_rua*num_faixas<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[comprimento_rua*num_faixas];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas], num_carros;<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
//print[0][i] guarda a velocidade media<br />
//print[1][i] guarda o fluxo<br />
double v_media, fluxo, print[2][num_faixas*comprimento_rua];<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "%d_lanes_dens.dat", num_faixas);<br />
vm = fopen(arq, "w+"); <br />
<br />
double v_media;<br />
<br />
for(num_carros = 1; num_carros < num_faixas*comprimento_rua; num_carros++)<br />
{<br />
print[0][num_carros] = 0;<br />
print[1][num_carros] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
for(num_carros = 1; num_carros < num_faixas*comprimento_rua; num_carros++)<br />
{<br />
<br />
<br />
v_media = 0;<br />
fluxo = 0;<br />
<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
<br />
passo();<br />
<br />
}<br />
<br />
//fluxo = numero de carros/(area*tempo)<br />
//area da secao transversal dada pelo numero de faixas<br />
fluxo /= (tempo_max*num_faixas);<br />
<br />
//calculo da velocidade media<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[0][num_carros] += v_media;<br />
print[1][num_carros] += fluxo;<br />
}<br />
}<br />
<br />
for(num_carros = 1; num_carros < num_faixas*comprimento_rua; num_carros++)<br />
{<br />
fprintf(vm, "%lf %lf %lf\n", ((double)num_carros)/(num_faixas*comprimento_rua), print[0][num_carros]/z_max, print[1][num_carros]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[k][i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[k][i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
//como somente os carros que atravessam a secao transversal entre a ultima e a primeira celula da rua entram nesse if, podemos contar o fluxo aqui<br />
fluxo++;<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */ <br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2054Grupo - Tráfego2018-01-24T20:19:53Z<p>Rodrigozferreira: /* Códigos para Gnuplot */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:3carros_prob.jpg|frame|400x400px|center|Gráfico 3: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
[[Arquivo:Gif_3carros_pistaunica.gif |frame|200x200px|center|Gráfico 3.1: 3 Carros em faixa única, com probabilidade de redução 0.3]]<br />
<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 11]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Sinaleira==<br />
===Funcionamento===<br />
<br />
[[Arquivo:sinaleirafaixadupla.jpg|frame|400x400px|center|Gráfico 15: Sinaleira na posição 50, Sinal fechado entre tempos 5 e 20 (indicado por linha vermelha)]]<br />
<br />
<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre pista simples e dupla]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Rua_com_sinaleira&diff=2051Rua com sinaleira2018-01-24T20:01:25Z<p>Rodrigozferreira: Criou página com '<source lang = c> #include<stdio.h> #include<stdlib.h> #include<math.h> /* declaracao de funcoes */ void passo(FILE *arq); void inicializacao(FILE *arq); void atualizar_pos...'</p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(FILE *arq);<br />
void inicializacao(FILE *arq);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define veloc_max 6<br />
#define tempo_max 50<br />
#define num_carros 30<br />
#define comprimento_rua 60<br />
#define num_faixas 2<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
//nao podemos printar assim que mudamos a velocidade do carro, como no caso de uma pista, ja que os carros podem mudar de pista. So podemos printar no final do passo<br />
int print[num_faixas][comprimento_rua];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//posicao da sinaleira<br />
int pos_sinaleira = 50;<br />
<br />
//tempo em que a sinaleira abre e fecha<br />
int sinaleira_fecha = 5, sinaleira_abre = 20;<br />
<br />
//probab_vel = probabilidade de reduzir a velocidade<br />
double probab_vel = 0.3;<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *arq;<br />
char nome[30];<br />
sprintf(nome, "%d_lanes_sinaleira.dat", num_faixas);<br />
arq = fopen(nome,"w+"); <br />
<br />
inicializacao(arq);<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
<br />
passo(arq);<br />
<br />
}<br />
<br />
fclose(arq);<br />
}<br />
<br />
<br />
<br />
void inicializacao(FILE *arq){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[k][i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[k][i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
//printando a condição inicial, no terminal e no arquivo<br />
for(k = 0; k < num_faixas; k++){<br />
for (i = 0; i < comprimento_rua; i++){<br />
if(rua[k][i] == -1){<br />
<br />
printf(".");<br />
fprintf(arq, "-1 ");<br />
<br />
}<br />
else{<br />
printf("%d", vel[rua[k][i]]);<br />
fprintf(arq, "%d ", (vel[rua[k][i]]));<br />
}<br />
} <br />
printf("\n");<br />
fprintf(arq, "\n");<br />
}<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
<br />
<br />
void passo(FILE *arq)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
<br />
/* realiza até percorrer todos os carros. */<br />
/* tem carro na posição 'i'? */<br />
<br />
if (rua[k][i] == -1){ <br />
<br />
/* não, não tem carro em 'i' */<br />
/* vai pra prox posicao 'i' */<br />
<br />
//so printar -1 se o carro anterior nao tiver trocado para essa pista<br />
if(k_novo != k)<br />
{<br />
print[k][i] = -1;<br />
}<br />
k_novo = k;<br />
<br />
}<br />
<br />
else{<br />
k_novo = k;<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//caso k = k_novo, o que conta sera o ultimo comando<br />
//caso k != k_novo, o primeiro colocara -1 na posicao anterior, e o carro na posicao nova<br />
print[k][i] = -1;<br />
print[k_novo][i] = vel[rua[k][i]];<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
//printando<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i < comprimento_rua; i++)<br />
{<br />
if(print[k][i] == -1)<br />
{<br />
printf(".");<br />
fprintf(arq, "-1 ");<br />
}<br />
else<br />
{<br />
printf("%d", print[k][i]);<br />
fprintf(arq, "%d ", print[k][i]);<br />
}<br />
<br />
}<br />
<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */<br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
<br />
//implementacao da sinaleira<br />
if((i == pos_sinaleira) && (t >= sinaleira_fecha) && (t < sinaleira_abre))<br />
{<br />
x = 0;<br />
}<br />
<br />
else<br />
{<br />
<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_densidade_e_fluxo_em_fun%C3%A7%C3%A3o_da_densidade&diff=2050N pistas: Velocidade média em função da densidade e fluxo em função da densidade2018-01-24T19:51:58Z<p>Rodrigozferreira: Criou página com '<source lang = c> #include<stdio.h> #include<stdlib.h> #include<math.h> /* declaracao de funcoes */ void passo(void); void inicializacao(void); void atualizar_posicao(void)...'</p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
#define veloc_max 6<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
//definimos vel[comprimento_rua*num_faixas], pois o numero maximo de carros = comprimento_rua*num_faixas<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[comprimento_rua*num_faixas];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas], num_carros;<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
//print[0][i] guarda a velocidade media<br />
//print[1][i] guarda o fluxo<br />
double v_media, fluxo, print[2][num_faixas*comprimento_rua];<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "%d_lanes_dens.dat", num_faixas);<br />
vm = fopen(arq, "w+"); <br />
<br />
double v_media;<br />
<br />
for(num_carros = 1; num_carros < num_faixas*comprimento_rua; num_carros++)<br />
{<br />
print[0][num_carros] = 0;<br />
print[1][num_carros] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
for(num_carros = 1; num_carros < num_faixas*comprimento_rua; num_carros++)<br />
{<br />
<br />
<br />
v_media = 0;<br />
fluxo = 0;<br />
<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
<br />
passo();<br />
<br />
}<br />
<br />
//fluxo = numero de carros/(area*tempo)<br />
//area da secao transversal dada pelo numero de faixas<br />
fluxo /= (tempo_max*num_faixas);<br />
<br />
//calculo da velocidade media<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[0][num_carros] += v_media;<br />
print[1][num_carros] += fluxo;<br />
}<br />
}<br />
<br />
for(num_carros = 1; num_carros < num_faixas*comprimento_rua; num_carros++)<br />
{<br />
fprintf(vm, "%lf %lf %lf\n", ((double)num_carros)/(num_faixas*comprimento_rua), print[0][num_carros]/z_max, print[1][num_carros]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[k][i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[k][i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
//como somente os carros que atravessam a secao transversal entre a ultima e a primeira celula da rua entram nesse if, podemos contar o fluxo aqui<br />
fluxo++;<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */ <br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2049N pistas: Velocidade média em função do tempo2018-01-24T19:49:39Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 60<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
#define veloc_max 6<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reduzir a velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double v_media, print[tempo_max];<br />
<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "%d_lanes_v_med_t_dens_0%.0lf.dat", num_faixas, 10*((double)num_carros)/(num_faixas*comprimento_rua));<br />
vm = fopen(arq, "w+");<br />
<br />
double v_media;<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
print[t] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
v_media = 0;<br />
<br />
//calculo da velocidade media ao longo do tempo<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[t] += v_media;<br />
<br />
passo();<br />
<br />
}<br />
}<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
fprintf(vm, "%d %lf\n", t, print[t]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - ru[k][i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[k][i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */<br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */ <br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_velocidade_m%C3%A1xima&diff=2048N pistas: Velocidade média em função da velocidade máxima2018-01-24T19:49:23Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 20<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
<br />
//maximo valor que a velocidade maxima assume<br />
#define veloc_max_max 40<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada, veloc_max;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double v_media, print[veloc_max_max];<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "%d_lanes_v_med_max_dens_0%.0lf.dat", num_faixas, 10*((double)num_carros)/(num_faixas*comprimento_rua));<br />
vm = fopen(arq, "w+");<br />
<br />
double v_media;<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
print[veloc_max] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo();<br />
<br />
}<br />
<br />
v_media = 0;<br />
//calculo da velocidade media<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[veloc_max] += v_media;<br />
}<br />
}<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
fprintf(vm, "%d %lf\n", veloc_max, print[veloc_max]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[k][i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[k][i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */ <br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Simula%C3%A7%C3%A3o&diff=2047N pistas: Simulação2018-01-24T19:49:11Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(FILE *arq);<br />
void inicializacao(FILE *arq);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define veloc_max 6<br />
#define tempo_max 50<br />
#define num_carros 60<br />
#define comprimento_rua 60<br />
#define num_faixas 3<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
//nao podemos printar assim que mudamos a velocidade do carro, como no caso de uma pista, ja que os carros podem mudar de pista. So podemos printar no final do passo<br />
int print[num_faixas][comprimento_rua];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//probab_vel = probabilidade de reduzir a velocidade<br />
double probab_vel = 0.3;<br />
<br />
<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *arq;<br />
char nome[30];<br />
sprintf(nome, "%d_lanes.dat", num_faixas);<br />
arq = fopen(nome,"w+");<br />
<br />
inicializacao(arq);<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo(arq); <br />
}<br />
<br />
fclose(arq);<br />
}<br />
<br />
<br />
<br />
void inicializacao(FILE *arq){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[k][i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[k][i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua*(k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
//printando a condição inicial, no terminal e no arquivo<br />
for(k = 0; k < num_faixas; k++){<br />
for (i = 0; i < comprimento_rua; i++){<br />
if(rua[k][i] == -1){<br />
<br />
printf(".");<br />
fprintf(arq, "-1 ");<br />
<br />
}<br />
else{<br />
printf("%d", vel[rua[k][i]]);<br />
fprintf(arq, "%d ", (vel[rua[k][i]]));<br />
}<br />
} <br />
printf("\n");<br />
fprintf(arq, "\n");<br />
}<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
<br />
<br />
void passo(FILE *arq)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
<br />
/* realiza até percorrer todos os carros. */<br />
/* tem carro na posição 'i'? */<br />
<br />
if (rua[k][i] == -1){ <br />
<br />
/* não, não tem carro em 'i' */<br />
/* vai pra prox posicao 'i' */<br />
<br />
//so printar -1 se o carro anterior nao tiver trocado para essa pista<br />
if(k_novo != k)<br />
{<br />
print[k][i] = -1;<br />
}<br />
k_novo = k;<br />
<br />
}<br />
<br />
else{<br />
k_novo = k;<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//caso k = k_novo, o que conta sera o ultimo comando<br />
//caso k != k_novo, o primeiro colocara -1 na posicao anterior, e o carro na posicao nova<br />
print[k][i] = -1;<br />
print[k_novo][i] = vel[rua[k][i]];<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
//printando<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i < comprimento_rua; i++)<br />
{<br />
if(print[k][i] == -1)<br />
{<br />
printf(".");<br />
fprintf(arq, "-1 ");<br />
}<br />
else<br />
{<br />
printf("%d", print[k][i]);<br />
fprintf(arq, "%d ", print[k][i]);<br />
}<br />
<br />
}<br />
<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */<br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
//indica o ultimo carro<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, a velocidade nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y; <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_velocidade_m%C3%A1xima&diff=2044Velocidade média em função da velocidade máxima2018-01-24T19:43:07Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 10<br />
#define comprimento_rua 100<br />
<br />
//maximo valor que a velocidade maxima assume<br />
#define veloc_max_max 40<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
int rua[comprimento_rua], vel[num_carros];<br />
int prim_carro, dist, veloc_max;<br />
int i, j, t;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double print[veloc_max_max], v_media;<br />
<br />
void main(void)<br />
{<br />
//srand48(time(NULL));<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "1_lane_v_med_max_dens_0%.0lf.dat", 10*((double)num_carros)/comprimento_rua);<br />
vm = fopen(arq, "w+");<br />
<br />
for(veloc_max = 0; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
print[veloc_max] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max ++)<br />
{<br />
v_media = 0;<br />
inicializacao();<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo();<br />
<br />
}<br />
<br />
//calculo da velocidade media<br />
for(j = 0; j < num_carros; j++)<br />
{<br />
v_media += vel[j];<br />
}<br />
v_media /= num_carros;<br />
print[veloc_max] += v_media;<br />
<br />
}<br />
}<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
fprintf(vm, "%d %lf\n", veloc_max, print[veloc_max]/z_max);<br />
}<br />
<br />
fclose(vm);<br />
}<br />
<br />
void inicializacao(void){<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
for(i = 0; i < num_carros; i++)<br />
{<br />
vel[i] = 0;<br />
rua[i*comprimento_rua/num_carros] = i;<br />
<br />
}<br />
<br />
<br />
}<br />
<br />
void passo(void)<br />
{<br />
<br />
i = 0;//posicoes na rua<br />
prim_carro = -1; //para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros) <br />
<br />
while(i < comprimento_rua){<br />
<br />
/* Para descobrir a posicao do primeiro carro */<br />
/* tem carro na posição 'i'? */<br />
<br />
if (rua[i] == -1){ <br />
<br />
/* não, não tem carro em 'i' */<br />
/* vai pra prox posicao 'i' */<br />
<br />
i++;<br />
<br />
}<br />
<br />
else{<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro == -1){<br />
<br />
prim_carro = i;<br />
}<br />
<br />
<br />
//calculando distancia ate o proximo carro<br />
<br />
dist = calculo_distancia();<br />
<br />
//mudando velocidades<br />
<br />
vel[rua[i]] = mudar_velocidade(vel[rua[i]]);<br />
<br />
//atualizando posicoes<br />
<br />
atualizar_posicao();<br />
<br />
//pula para o proximo carro<br />
i+=dist; <br />
} <br />
}<br />
<br />
}<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
<br />
if( vel[rua[i]] != 0 ){<br />
<br />
//para o ultimo carro, condicoes de contorno periodicas<br />
if( i + vel[rua[i]] >= comprimento_rua ){<br />
<br />
rua[(i+ vel[rua[i]]) % comprimento_rua] = rua[i];<br />
}<br />
else{<br />
<br />
rua[i + vel[rua[i]]] = rua[i];<br />
}<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j], sendo que j < comprimento_rua; */<br />
<br />
<br />
if( i + 1 < comprimento_rua ){<br />
<br />
j = i + 1;<br />
<br />
while ( (rua[j] == -1) && (j < comprimento_rua) ){<br />
<br />
j++; <br />
}<br />
<br />
if ( j != comprimento_rua ){<br />
<br />
dist = j - i;<br />
}<br />
<br />
}<br />
<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
<br />
//ultimo carro, e existe um primeiro carro<br />
if( ((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro != -1)){<br />
<br />
dist = comprimento_rua - (i - prim_carro);<br />
} <br />
<br />
//caso so haja um carro ou a pista esteja vazia<br />
else if(((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro == -1))<br />
{<br />
dist = comprimento_rua;<br />
}<br />
return dist;<br />
<br />
<br />
}<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist < v + 1 ){<br />
<br />
x = dist - 1;<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
if( ( x > 0 ) && ( drand48() < probab_vel )){<br />
<br />
x--;<br />
}<br />
<br />
return x;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_velocidade_m%C3%A1xima&diff=2043N pistas: Velocidade média em função da velocidade máxima2018-01-24T19:42:57Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 20<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
<br />
//maximo valor que a velocidade maxima assume<br />
#define veloc_max_max 40<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada, veloc_max;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double v_media, print[veloc_max_max];<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "%d_lanes_v_med_max_dens_0%.0lf.dat", num_faixas, 10*((double)num_carros)/(num_faixas*comprimento_rua));<br />
vm = fopen(arq, "w+");<br />
<br />
double v_media;<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
print[veloc_max] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo();<br />
<br />
}<br />
<br />
v_media = 0;<br />
//calculo da velocidade media<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[veloc_max] += v_media;<br />
}<br />
}<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
fprintf(vm, "%d %lf\n", veloc_max, print[veloc_max]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */ <br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_velocidade_m%C3%A1xima&diff=2040N pistas: Velocidade média em função da velocidade máxima2018-01-24T19:36:53Z<p>Rodrigozferreira: Criou página com '<source lang = c> #include<stdio.h> #include<stdlib.h> #include<math.h> /* declaracao de funcoes */ void passo(void); void inicializacao(void); void atualizar_posicao(void)...'</p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 20<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
<br />
//maximo valor que a velocidade maxima assume<br />
#define veloc_max_max 40<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada, veloc_max;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double v_media, print[veloc_max_max];<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "%d_lanes_v_med_max_dens_0%.0lf.dat", num_faixas, 10*((double)num_carros)/(num_faixas*comprimento_rua));<br />
vm = fopen(arq, "w+");<br />
<br />
double v_media;<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
print[veloc_max] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo();<br />
<br />
}<br />
<br />
v_media = 0;<br />
//calculo da velocidade media<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[veloc_max] += v_media;<br />
}<br />
}<br />
<br />
for(veloc_max = 0; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
fprintf(vm, "%d %lf\n", veloc_max, print[veloc_max]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */ <br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2039N pistas: Velocidade média em função do tempo2018-01-24T19:27:09Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 60<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
#define veloc_max 6<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reduzir a velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double v_media, print[tempo_max];<br />
<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "%d_lanes_v_med_t_dens_0%.0lf.dat", num_faixas, 10*((double)num_carros)/(num_faixas*comprimento_rua));<br />
vm = fopen(arq, "w+");<br />
<br />
double v_media;<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
print[t] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
v_media = 0;<br />
<br />
//calculo da velocidade media ao longo do tempo<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[t] += v_media;<br />
<br />
passo();<br />
<br />
}<br />
}<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
fprintf(vm, "%d %lf\n", t, print[t]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */<br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */ <br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2038N pistas: Velocidade média em função do tempo2018-01-24T19:25:57Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 60<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
#define veloc_max 6<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reduzir a velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double v_media, print[tempo_max];<br />
<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "n_lanes_v_med_t_dens_0%.0lf.dat", 10*((double)num_carros)/(num_faixas*comprimento_rua));<br />
vm = fopen(arq, "w+");<br />
<br />
double v_media;<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
print[t] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
v_media = 0;<br />
<br />
//calculo da velocidade media ao longo do tempo<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[t] += v_media;<br />
<br />
passo();<br />
<br />
}<br />
}<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
fprintf(vm, "%d %lf\n", t, print[t]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */<br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */ <br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2036N pistas: Velocidade média em função do tempo2018-01-24T19:22:43Z<p>Rodrigozferreira: Criou página com '<source lang = c> #include<stdio.h> #include<stdlib.h> #include<math.h> /* declaracao de funcoes */ void passo(void); void inicializacao(void); void atualizar_posicao(void)...'</p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 60<br />
#define comprimento_rua 100<br />
#define num_faixas 2<br />
#define veloc_max 6<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reduzir a velocidade<br />
double probab_vel = 0.3<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double v_media, print[tempo_max];<br />
<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "n_lanes_v_med_t_dens_0%.0lf.dat", ((double)num_carros)/(num_faixas*comprimento_rua));<br />
vm = fopen(arq, "w+");<br />
<br />
double v_media;<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
print[t] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
inicializacao();<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
v_media = 0;<br />
<br />
//calculo da velocidade media ao longo do tempo<br />
for(k = 0; k < num_carros; k++)<br />
{<br />
v_media += vel[k];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[t] += v_media;<br />
<br />
passo();<br />
<br />
}<br />
}<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
fprintf(vm, "%d %lf\n", t, print[t]/z_max);<br />
}<br />
<br />
<br />
fclose(vm);<br />
}<br />
<br />
<br />
<br />
void inicializacao(void){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua* (k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
void passo(void)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
k_novo = k;<br />
<br />
if (rua[k][i] != -1){<br />
<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */<br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */ <br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y;<br />
//verificacao para trocar de faixa <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=N_pistas:_Simula%C3%A7%C3%A3o&diff=2027N pistas: Simulação2018-01-24T18:39:11Z<p>Rodrigozferreira: Criou página com '<source lang = c> #include<stdio.h> #include<stdlib.h> #include<math.h> /* declaracao de funcoes */ void passo(FILE *arq); void inicializacao(FILE *arq); void atualizar_pos...'</p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
<br />
/* declaracao de funcoes */<br />
void passo(FILE *arq);<br />
void inicializacao(FILE *arq);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
int trocar_faixa(void);<br />
<br />
<br />
/* declaracao var global */<br />
#define veloc_max 6<br />
#define tempo_max 50<br />
#define num_carros 60<br />
#define comprimento_rua 60<br />
#define num_faixas 3<br />
<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//precisamos guardar as posicoes anteriores, por isso rua e rua_nova<br />
int rua[num_faixas][comprimento_rua], rua_nova[num_faixas][comprimento_rua], vel[num_carros];<br />
<br />
//nao podemos printar assim que mudamos a velocidade do carro, como no caso de uma pista, ja que os carros podem mudar de pista. So podemos printar no final do passo<br />
int print[num_faixas][comprimento_rua];<br />
<br />
int prim_carro[num_faixas], dist[num_faixas];<br />
int i, j, k, t, ultimo, k_novo, faz_nada;<br />
<br />
//probab_vel = probabilidade de reduzir a velocidade<br />
double probab_vel = 0.3;<br />
<br />
<br />
<br />
void main(void)<br />
{<br />
<br />
FILE *arq;<br />
char nome[30];<br />
sprintf(nome, "%d_lanes.dat", num_faixas);<br />
arq = fopen(nome,"w+");<br />
<br />
inicializacao(arq);<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo(arq); <br />
}<br />
<br />
fclose(arq);<br />
}<br />
<br />
<br />
<br />
void inicializacao(FILE *arq){<br />
<br />
//srand48(time(NULL));<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
for(j = 0; j < num_faixas; j++){<br />
<br />
rua[j][i] = -1;<br />
rua_nova[j][i] = rua[j][i];<br />
<br />
}<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
//da forma como fazemos aqui, iniciamos os carros distribuidos em todas as pistas e equidistantes (aproximadamente)<br />
k = 0;<br />
for(i = 0; (i < num_carros) && (k < num_faixas); i++)<br />
{<br />
<br />
vel[i] = 0; <br />
<br />
<br />
rua[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
rua_nova[k][(i*comprimento_rua*num_faixas/num_carros) % comprimento_rua] = i;<br />
<br />
//para trocar de faixa quando a condicao for satisfeita<br />
if((i+1)*comprimento_rua*num_faixas/num_carros >= comprimento_rua*(k + 1))<br />
{<br />
k++;<br />
}<br />
}<br />
<br />
//printando a condição inicial, no terminal e no arquivo<br />
for(k = 0; k < num_faixas; k++){<br />
for (i = 0; i < comprimento_rua; i++){<br />
if(rua[k][i] == -1){<br />
<br />
printf(".");<br />
fprintf(arq, "-1 ");<br />
<br />
}<br />
else{<br />
printf("%d", vel[rua[k][i]]);<br />
fprintf(arq, "%d ", (vel[rua[k][i]]));<br />
}<br />
} <br />
printf("\n");<br />
fprintf(arq, "\n");<br />
}<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
<br />
<br />
void passo(FILE *arq)<br />
{<br />
<br />
//atualizando a matriz rua, trocando -2 por -1<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
if(rua_nova[k][i] == -2)<br />
{<br />
rua_nova[k][i] = -1;<br />
}<br />
<br />
rua[k][i] = rua_nova[k][i];<br />
}<br />
<br />
//para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
prim_carro[k] = -1;<br />
}<br />
<br />
//iterando pela avenida, fixando a posicao ao longo da avenida e variando as pistas<br />
for(i = 0; i< comprimento_rua; i++)<br />
{<br />
<br />
//calculando a distancia a partir daquela posicao ate o proximo carro, para todas as pistas<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
dist[k] = calculo_distancia();<br />
}<br />
<br />
<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
//precisamos de k_novo, ja que o carro pode trocar de pista, mudando seu k<br />
<br />
/* realiza até percorrer todos os carros. */<br />
/* tem carro na posição 'i'? */<br />
<br />
if (rua[k][i] == -1){ <br />
<br />
/* não, não tem carro em 'i' */<br />
/* vai pra prox posicao 'i' */<br />
<br />
//so printar -1 se o carro anterior nao tiver trocado para essa pista<br />
if(k_novo != k)<br />
{<br />
print[k][i] = -1;<br />
}<br />
k_novo = k;<br />
<br />
}<br />
<br />
else{<br />
k_novo = k;<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro[k] == -1){<br />
<br />
prim_carro[k] = i;<br />
}<br />
<br />
//mudando velocidades<br />
vel[rua[k][i]] = mudar_velocidade(vel[rua[k][i]]);<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
<br />
/* fazemos isso aqui por causa da possibilidade de troca de pista: */<br />
/* ao trocar de pista, o carro vai ter sua velocidade verificada e */<br />
/* modificada novamente - se a regra 3 estivesse dentro da funcao */<br />
/* mudar_velocidade, ela seria aplicada duas vezes nesse caso */<br />
if( ( vel[rua[k][i]] > 0 ) && ( drand48() < probab_vel )){<br />
<br />
vel[rua[k][i]]--;<br />
}<br />
<br />
//caso k = k_novo, o que conta sera o ultimo comando<br />
//caso k != k_novo, o primeiro colocara -1 na posicao anterior, e o carro na posicao nova<br />
print[k][i] = -1;<br />
print[k_novo][i] = vel[rua[k][i]];<br />
<br />
//atualizando posicoes<br />
atualizar_posicao();<br />
<br />
} <br />
}<br />
}<br />
<br />
//printando<br />
for(k = 0; k < num_faixas; k++)<br />
{<br />
for(i = 0; i < comprimento_rua; i++)<br />
{<br />
if(print[k][i] == -1)<br />
{<br />
printf(".");<br />
fprintf(arq, "-1 ");<br />
}<br />
else<br />
{<br />
printf("%d", print[k][i]);<br />
fprintf(arq, "%d ", print[k][i]);<br />
}<br />
<br />
}<br />
<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
printf("\n");<br />
fprintf(arq, "\n");<br />
<br />
}<br />
<br />
<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
if(vel[rua[k][i]] != 0){<br />
<br />
//se for o ultimo carro, usamos condicoes de contorno periodicas<br />
if( i + vel[rua[k][i]] >= comprimento_rua ){<br />
<br />
rua_nova[k_novo][(i+ vel[rua[k][i]]) % comprimento_rua] = rua[k][i];<br />
<br />
j = i+1;<br />
while(j < (i+ vel[rua[k][i]]) % comprimento_rua)<br />
{<br />
/* -2 indica o caminho percorrido por um carro (para que nenhum */<br />
/* outro consiga trocar de pista para essa posicao) */<br />
rua_nova[k_novo][j] = - 2;<br />
<br />
/* caso estejamos na ultima celula, se fizermos j = -1, */ <br />
/* no proximo passo j = 0 e voltaremos ao inicio da rua */<br />
if(j==comprimento_rua - 1)<br />
{<br />
j = -1;<br />
}<br />
<br />
j++;<br />
}<br />
}<br />
else{<br />
<br />
rua_nova[k_novo][i + vel[rua[k][i]]] = rua[k][i];<br />
for(j = i + 1; j < i + vel[rua[k][i]]; j++)<br />
{<br />
rua_nova[k_novo][j] = -2;<br />
}<br />
<br />
}<br />
<br />
//-2 indica que havia um carro ali <br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
/* caso v=0. mas troque de pista, (ja que pode ser que o carro */<br />
/* troque de pista com v=1, mas tenha sua velocidade diminuida */<br />
/* para 0 por causa da Regra 3) */<br />
else if((vel[rua[k][i]] == 0) && (k != k_novo))<br />
{<br />
rua_nova[k_novo][i] = rua[k][i];<br />
rua_nova[k][i] = -2;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
int x;<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j][k], sendo que j < comprimento_rua */<br />
/* */<br />
/* se i = comprimento_rua - 1, j = comprimento_rua*/<br />
/* e j deve ser < comprimento_rua */<br />
<br />
//indica o ultimo carro<br />
ultimo = 0;<br />
<br />
if( i + 1 < comprimento_rua )<br />
{<br />
<br />
j = i + 1;<br />
<br />
while ( rua[k][j] == -1 ){<br />
<br />
if( j == comprimento_rua - 1 ){<br />
ultimo = 1;<br />
break;<br />
}<br />
j++; <br />
}<br />
<br />
if ( ultimo == 0 ){<br />
<br />
x = j - i;<br />
}<br />
<br />
}<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
//aqui devemos tomar cuidado, pois caso a pista esteja vazia, <br />
//ultimo = 1, mas nao existe prim_carro[k]. Por isso <br />
//definimos prim_carro[k] inicialmente como -1<br />
<br />
else if(i == comprimento_rua - 1)<br />
{<br />
ultimo = 1;<br />
}<br />
<br />
//ultimo carro, e existe um primeiro carro (numero de carros > 1)<br />
if((ultimo == 1) && (prim_carro[k] != -1)){<br />
<br />
x = comprimento_rua - (i - prim_carro[k]);<br />
}<br />
<br />
//caso a pista esteja vazia ou numero de carros = 1<br />
else if((ultimo == 1) && (prim_carro[k] == -1))<br />
{<br />
x = comprimento_rua;<br />
} <br />
<br />
return x;<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist[k_novo] > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist[k_novo] < v + 1 ){<br />
<br />
//indica se a verificacao de troca de pista resultou em algo<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
//verificacao para trocar de faixa<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
<br />
//se nao deu pra trocar de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = dist[k_novo] - 1;<br />
}<br />
}<br />
<br />
<br />
/*Caso em que v=dist-1, ou seja, a velocidade nao se alteraria*/<br />
else if((dist[k_novo] == v + 1) && (v != veloc_max))<br />
{<br />
faz_nada = 0;<br />
<br />
//para garantir que um carro que ja trocou de faixa nao entre aqui<br />
if(k == k_novo)<br />
{<br />
x = trocar_faixa();<br />
}<br />
//caso o carro ja tenha trocado de faixa<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
//se nao deu pra trocar de faixa ou se o carro ja trocou de faixa<br />
if(faz_nada == 1)<br />
{<br />
x = v;<br />
}<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
return x;<br />
}<br />
<br />
<br />
int trocar_faixa(void)<br />
{<br />
int y; <br />
<br />
//tem duas pistas de cada lado<br />
if((k_novo - 1 >= 0) && (k_novo + 1 < num_faixas))<br />
{<br />
//ambas vazias<br />
if((rua_nova[k_novo-1][i] == -1) && (rua_nova[k_novo+1][i] == -1))<br />
{<br />
<br />
//ambas com mais espaço<br />
if((dist[k_novo-1] > dist[k_novo]) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
if(dist[k_novo-1] > dist[k_novo+1])<br />
{<br />
k_novo--;<br />
}<br />
else if(dist[k_novo+1] > dist[k_novo-1])<br />
{<br />
k_novo++;<br />
}<br />
//caso dist[k+1]=dist[k-1], escolha aleatoria<br />
else if(drand48() < 0.5)<br />
{<br />
k_novo--;<br />
}<br />
else<br />
{<br />
k_novo++;<br />
}<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k-1 com mais espaco<br />
else if(dist[k_novo-1] > dist[k_novo])<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 com mais espaco<br />
else if(dist[k_novo+1] > dist[k_novo])<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhuma com espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so o lado k-1 vazio<br />
else if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//so o lado k+1 vazio<br />
else if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nenhum lado vazio<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k-1<br />
else if(k_novo - 1 >= 0)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo-1][i] == -1) && (dist[k_novo-1] > dist[k_novo]))<br />
{<br />
k_novo--;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/ sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
//so pista do lado k+1<br />
else if(k_novo + 1 < comprimento_rua)<br />
{<br />
//se esta vazia e se ha mais espaco<br />
if((rua_nova[k_novo+1][i] == -1) && (dist[k_novo+1] > dist[k_novo]))<br />
{<br />
k_novo++;<br />
<br />
y = mudar_velocidade(vel[rua[k][i]]);<br />
}<br />
//nao esta vazia/sem espaco<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
}<br />
else<br />
{<br />
faz_nada = 1;<br />
}<br />
<br />
return y;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_densidade_e_fluxo_em_fun%C3%A7%C3%A3o_da_densidade&diff=2026Velocidade média em função da densidade e fluxo em função da densidade2018-01-24T18:24:07Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define comprimento_rua 100<br />
#define veloc_max 6<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
<br />
//definimos vel[comprimento_rua], pois o numero maximo de carros = comprimento_rua<br />
int rua[comprimento_rua], vel[comprimento_rua];<br />
int prim_carro, dist, num_carros;<br />
int i, j, t;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 1000;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
//print[0][i] guarda a velocidade media<br />
//print[1][i] guarda o fluxo<br />
double probab_vel = 0.3, print[2][comprimento_rua], v_media, fluxo;<br />
<br />
void main(void)<br />
{<br />
//srand48(time(NULL));<br />
<br />
FILE *vm;<br />
vm = fopen("1_lane_dens.dat", "w+");<br />
<br />
for(num_carros = 1; num_carros < comprimento_rua; num_carros++)<br />
{<br />
print[0][num_carros] = 0;<br />
print[1][num_carros] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
<br />
for(num_carros = 1; num_carros < comprimento_rua; num_carros++)<br />
{<br />
v_media = 0;<br />
fluxo = 0;<br />
inicializacao();<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo();<br />
<br />
}<br />
<br />
//fluxo medio<br />
fluxo /= tempo_max;<br />
<br />
//calculo da velocidade media<br />
for(j = 0; j < num_carros; j++)<br />
{<br />
v_media += vel[j];<br />
}<br />
v_media /= num_carros;<br />
<br />
print[0][num_carros] += v_media;<br />
print[1][num_carros] += fluxo;<br />
<br />
}<br />
}<br />
<br />
for(num_carros = 1; num_carros < comprimento_rua; num_carros++)<br />
{<br />
fprintf(vm, "%lf %lf %lf\n", ((double)num_carros)/comprimento_rua, print[0][num_carros]/z_max, print[1][num_carros]/z_max);<br />
}<br />
<br />
fclose(vm);<br />
}<br />
<br />
void inicializacao(void){<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
for(i = 0; i < num_carros; i++)<br />
{<br />
vel[i] = 0;<br />
rua[i*comprimento_rua/num_carros] = i;<br />
<br />
}<br />
<br />
<br />
}<br />
<br />
void passo(void)<br />
{<br />
i = 0;//posicoes na rua<br />
prim_carro = -1; //para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
<br />
while(i < comprimento_rua){<br />
<br />
/* Para descobrir a posicao do primeiro carro */<br />
/* tem carro na posição 'i'? */<br />
<br />
if (rua[i] == -1){ <br />
<br />
/* não, não tem carro em 'i' */<br />
/* vai pra prox posicao 'i' */<br />
<br />
i++;<br />
<br />
}<br />
<br />
else{<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro == -1){<br />
<br />
prim_carro = i;<br />
}<br />
<br />
<br />
//calculando distancia ate o proximo carro<br />
<br />
dist = calculo_distancia();<br />
<br />
//mudando velocidades<br />
<br />
vel[rua[i]] = mudar_velocidade(vel[rua[i]]);<br />
<br />
//atualizando posicoes<br />
<br />
atualizar_posicao();<br />
<br />
//pulando para o proximo carro<br />
i+=dist; <br />
} <br />
}<br />
<br />
}<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
<br />
if( vel[rua[i]] != 0 ){<br />
<br />
//para o ultimo carro, condicoes de contorno periodicas<br />
if( i + vel[rua[i]] >= comprimento_rua ){<br />
//como somente os carros que atravessam a secao transversal entre a ultima e a primeira celula da rua entram nesse if, podemos contar o fluxo aqui<br />
fluxo++;<br />
<br />
rua[(i+ vel[rua[i]]) % comprimento_rua] = rua[i];<br />
}<br />
else{<br />
<br />
rua[i + vel[rua[i]]] = rua[i];<br />
}<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j], sendo que j < comprimento_rua; */<br />
<br />
<br />
if( i + 1 < comprimento_rua ){<br />
<br />
j = i + 1;<br />
<br />
while ( (rua[j] == -1) && (j < comprimento_rua) ){<br />
<br />
j++; <br />
}<br />
<br />
if ( j != comprimento_rua ){<br />
<br />
dist = j - i;<br />
}<br />
<br />
}<br />
<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
<br />
//ultimo carro, e existe um primeiro carro<br />
if( ((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro != -1)){<br />
<br />
dist = comprimento_rua - (i - prim_carro);<br />
} <br />
<br />
//caso so haja um carro ou a pista esteja vazia<br />
else if(((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro == -1))<br />
{<br />
dist = comprimento_rua;<br />
}<br />
return dist;<br />
<br />
<br />
}<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist < v + 1 ){<br />
<br />
x = dist - 1;<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
if( ( x > 0 ) && ( drand48() < probab_vel )){<br />
<br />
x--;<br />
}<br />
<br />
return x;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2025Velocidade média em função do tempo2018-01-24T18:23:55Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 30<br />
#define comprimento_rua 100<br />
#define veloc_max 6<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
int rua[comprimento_rua], vel[num_carros];<br />
int prim_carro, dist;<br />
int i, j, t; <br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 10000;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3; <br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double print[tempo_max], v_media;<br />
<br />
void main(void)<br />
{<br />
//srand48(time(NULL));<br />
<br />
FILE *vm;<br />
char arq[30];<br />
<br />
//para comparacao das probabilidade de reduzir velocidade e densidades<br />
sprintf(arq, "1_lane_v_med_t_prob_0%.0lf_dens_0%.0lf.dat", probab_vel*10, 10*((double)num_carros)/comprimento_rua);<br />
<br />
vm = fopen(arq, "w+");<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
print[t] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
<br />
inicializacao();<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo();<br />
<br />
v_media = 0;<br />
//calculo da velocidade media<br />
for(j = 0; j < num_carros; j++)<br />
{<br />
v_media += vel[j];<br />
}<br />
v_media /= num_carros;<br />
print[t] += v_media;<br />
<br />
}<br />
<br />
}<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{<br />
fprintf(vm, "%d %lf\n", t, print[t]/z_max);<br />
}<br />
<br />
fclose(vm);<br />
}<br />
<br />
void inicializacao(void){<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
for(i = 0; i < num_carros; i++)<br />
{<br />
vel[i] = 0;<br />
rua[i*comprimento_rua/num_carros] = i;<br />
<br />
}<br />
<br />
<br />
}<br />
<br />
void passo(void)<br />
{<br />
i = 0;//posicoes na rua<br />
prim_carro = -1; //para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros)<br />
<br />
while(i < comprimento_rua){<br />
<br />
/* Para descobrir a posicao do primeiro carro */<br />
/* tem carro na posição 'i'? */<br />
<br />
if (rua[i] == -1){ <br />
<br />
/* não, não tem carro em 'i' */<br />
/* vai pra prox posicao 'i' */<br />
<br />
i++;<br />
<br />
}<br />
<br />
else{<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro == -1){<br />
<br />
prim_carro = i;<br />
}<br />
<br />
//calculando distancia ate o proximo carro<br />
<br />
dist = calculo_distancia();<br />
<br />
//mudando velocidades<br />
<br />
vel[rua[i]] = mudar_velocidade(vel[rua[i]]);<br />
<br />
//atualizando posicoes<br />
<br />
atualizar_posicao();<br />
<br />
//pulando para o proximo carro<br />
i+=dist; <br />
} <br />
}<br />
<br />
}<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
<br />
if( vel[rua[i]] != 0 ){<br />
<br />
//para o ultimo carro, condicoes de contorno periodicas<br />
if( i + vel[rua[i]] >= comprimento_rua ){<br />
<br />
rua[(i+ vel[rua[i]]) % comprimento_rua] = rua[i];<br />
}<br />
else{<br />
<br />
rua[i + vel[rua[i]]] = rua[i];<br />
}<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j], sendo que j < comprimento_rua; */<br />
<br />
<br />
if( i + 1 < comprimento_rua ){<br />
<br />
j = i + 1;<br />
<br />
while ( (rua[j] == -1) && (j < comprimento_rua) ){<br />
<br />
j++; <br />
}<br />
<br />
if ( j != comprimento_rua ){<br />
<br />
dist = j - i;<br />
}<br />
<br />
}<br />
<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
<br />
//ultimo carro, e existe um primeiro carro<br />
if( ((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro != -1)){<br />
<br />
dist = comprimento_rua - (i - prim_carro);<br />
} <br />
<br />
//caso so haja um carro ou a pista esteja vazia<br />
else if(((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro == -1))<br />
{<br />
dist = comprimento_rua;<br />
}<br />
return dist;<br />
<br />
}<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist < v + 1 ){<br />
<br />
x = dist - 1;<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
if( ( x > 0 ) && ( drand48() < probab_vel )){<br />
<br />
x--;<br />
}<br />
<br />
return x;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_da_velocidade_m%C3%A1xima&diff=2024Velocidade média em função da velocidade máxima2018-01-24T18:23:45Z<p>Rodrigozferreira: </p>
<hr />
<div><source lang = c><br />
#include<stdio.h><br />
#include<stdlib.h><br />
#include<math.h> <br />
<br />
/* declaracao de funcoes */<br />
void passo(void);<br />
void inicializacao(void);<br />
void atualizar_posicao(void);<br />
int mudar_velocidade(int(v));<br />
int calculo_distancia(void);<br />
<br />
/* declaracao var global */<br />
#define tempo_max 100<br />
#define num_carros 10<br />
#define comprimento_rua 100<br />
<br />
//maximo valor que a velocidade maxima assume<br />
#define veloc_max_max 40<br />
<br />
/* velocidade: numero de posições */<br />
/* que o carro andará num passo */<br />
int rua[comprimento_rua], vel[num_carros];<br />
int prim_carro, dist, veloc_max;<br />
int i, j, t;<br />
<br />
//z_max = numero de amostragens<br />
int z, z_max = 100000;<br />
<br />
//probab_vel = probabilidade de reducao da velocidade<br />
double probab_vel = 0.3;<br />
<br />
//print: precisamos primeiro coletar todos os resultados, fazermos a media, para so entao printarmos<br />
double print[veloc_max_max], v_media;<br />
<br />
void main(void)<br />
{<br />
//srand48(time(NULL));<br />
<br />
FILE *vm;<br />
char arq[30];<br />
sprintf(arq, "1_lane_v_med_max_dens_0%.0lf.dat", 10*((double)num_carros)/comprimento_rua);<br />
vm = fopen(arq, "w+");<br />
<br />
for(veloc_max = 0; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
print[veloc_max] = 0;<br />
}<br />
<br />
for(z = 0; z < z_max; z++)<br />
{<br />
<br />
for(veloc_max = 1; veloc_max < veloc_max_max; veloc_max ++)<br />
{<br />
v_media = 0;<br />
inicializacao();<br />
<br />
for(t = 0; t < tempo_max; t++)<br />
{ <br />
passo();<br />
<br />
}<br />
<br />
//calculo da velocidade media<br />
for(j = 0; j < num_carros; j++)<br />
{<br />
v_media += vel[j];<br />
}<br />
v_media /= num_carros;<br />
print[veloc_max] += v_media;<br />
<br />
}<br />
}<br />
<br />
for(veloc_max = 0; veloc_max < veloc_max_max; veloc_max++)<br />
{<br />
fprintf(vm, "%d %lf\n", veloc_max, print[veloc_max]/z_max);<br />
}<br />
<br />
fclose(vm);<br />
}<br />
<br />
void inicializacao(void){<br />
<br />
// zerando vetores<br />
//-1 significa que a posicao esta vazia<br />
<br />
for(i = 0; i < comprimento_rua; i++){<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
//iniciando os carros - rua[i] representa o indice do carro, atraves do qual acessaremos sua velocidade em vel[rua[i]]<br />
for(i = 0; i < num_carros; i++)<br />
{<br />
vel[i] = 0;<br />
rua[i*comprimento_rua/num_carros] = i;<br />
<br />
}<br />
<br />
<br />
}<br />
<br />
void passo(void)<br />
{<br />
<br />
i = 0;//posicoes na rua<br />
prim_carro = -1; //para que caso ainda nao haja um primeiro carro, prim_carro assuma um valor que nao se confunda com nenhum indice de carro (que vao de 0 a num_carros) <br />
<br />
while(i < comprimento_rua){<br />
<br />
/* Para descobrir a posicao do primeiro carro */<br />
/* tem carro na posição 'i'? */<br />
<br />
if (rua[i] == -1){ <br />
<br />
/* não, não tem carro em 'i' */<br />
/* vai pra prox posicao 'i' */<br />
<br />
i++;<br />
<br />
}<br />
<br />
else{<br />
<br />
/* caso for o primeiro carro, */<br />
/* salvar sua posicao para */<br />
/* calcularmos a distancia do */<br />
/* ultimo carro ao primeiro */<br />
<br />
if(prim_carro == -1){<br />
<br />
prim_carro = i;<br />
}<br />
<br />
<br />
//calculando distancia ate o proximo carro<br />
<br />
dist = calculo_distancia();<br />
<br />
//mudando velocidades<br />
<br />
vel[rua[i]] = mudar_velocidade(vel[rua[i]]);<br />
<br />
//atualizando posicoes<br />
<br />
atualizar_posicao();<br />
<br />
//pula para o proximo carro<br />
i+=dist; <br />
} <br />
}<br />
<br />
}<br />
<br />
<br />
void atualizar_posicao(void){<br />
<br />
/* atualiza apenas se a velocidade */<br />
/* for diferente de zero */<br />
<br />
if( vel[rua[i]] != 0 ){<br />
<br />
//para o ultimo carro, condicoes de contorno periodicas<br />
if( i + vel[rua[i]] >= comprimento_rua ){<br />
<br />
rua[(i+ vel[rua[i]]) % comprimento_rua] = rua[i];<br />
}<br />
else{<br />
<br />
rua[i + vel[rua[i]]] = rua[i];<br />
}<br />
<br />
rua[i] = -1;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
int calculo_distancia(void){<br />
<br />
/* RETORNA A DISTANCIA ENTRE O */<br />
/* CARRO 'i' E O QUE ESTA NA */<br />
/* SUA FRENTE NA FAIXA 'x' */ <br />
<br />
/* caso não for o ultimo carro */<br />
/* procura posição do prox. e */<br />
/* calcula a distancia até ele */<br />
<br />
/* temos que isolar o caso i = comprimento_rua - 1,*/<br />
/* já que j = i + 1 = comprimento_rua, e usamos */<br />
/* rua[j], sendo que j < comprimento_rua; */<br />
<br />
<br />
if( i + 1 < comprimento_rua ){<br />
<br />
j = i + 1;<br />
<br />
while ( (rua[j] == -1) && (j < comprimento_rua) ){<br />
<br />
j++; <br />
}<br />
<br />
if ( j != comprimento_rua ){<br />
<br />
dist = j - i;<br />
}<br />
<br />
}<br />
<br />
<br />
/* para o ultimo carro a distan- */<br />
/* cia é calculada em relacao ao */<br />
/* primeiro, pois são C.C. perio- */<br />
/* dicas. */<br />
<br />
//ultimo carro, e existe um primeiro carro<br />
if( ((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro != -1)){<br />
<br />
dist = comprimento_rua - (i - prim_carro);<br />
} <br />
<br />
//caso so haja um carro ou a pista esteja vazia<br />
else if(((i == comprimento_rua - 1) || (j == comprimento_rua)) && (prim_carro == -1))<br />
{<br />
dist = comprimento_rua;<br />
}<br />
return dist;<br />
<br />
<br />
}<br />
<br />
int mudar_velocidade(int(v)){<br />
<br />
int x;<br />
/* RETORNA NOVA VELOCIDADE */ <br />
<br />
/* Regra 1 */<br />
/* caso dê pra acelerar, acelere */<br />
if( ( v < veloc_max ) && ( dist > v + 1 ) ){<br />
<br />
x = v + 1;<br />
}<br />
<br />
/* Regra 2 */<br />
/* caso pouco espaço, desacelere */<br />
else if( dist < v + 1 ){<br />
<br />
x = dist - 1;<br />
}<br />
else<br />
{<br />
x = v;<br />
}<br />
<br />
/* Regra 3 */<br />
/* redução de velocidade randomica */<br />
if( ( x > 0 ) && ( drand48() < probab_vel )){<br />
<br />
x--;<br />
}<br />
<br />
return x;<br />
}<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Gnuplot_-_Velocidade_m%C3%A9dia_em_fun%C3%A7%C3%A3o_do_tempo&diff=2018Gnuplot - Velocidade média em função do tempo2018-01-24T18:12:08Z<p>Rodrigozferreira: Criou página com '<source> set title 'Pista unica, 100.000 amostragens' set yl 'Velocidade media' set xl 'Tempo' set yr[:7] set terminal jpeg enh medium size 800,600 set output "1_lane_v_med_t...'</p>
<hr />
<div><source><br />
set title 'Pista unica, 100.000 amostragens'<br />
set yl 'Velocidade media'<br />
set xl 'Tempo'<br />
set yr[:7]<br />
<br />
set terminal jpeg enh medium size 800,600<br />
set output "1_lane_v_med_t.jpg"<br />
<br />
plot '1_lane_v_med_t_prob_03_dens_01.dat' w lp title 'densidade = 0.1', 0.000899*x+5.4997 title 'valor de equilibrio = 5.4997', '1_lane_v_med_t_prob_03_dens_03.dat' w lp title 'densidade = 0.3', -0.0001093*x + 1.3395 title 'valor de equilibrio = 1.3395'<br />
</source></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2017Grupo - Tráfego2018-01-24T18:12:03Z<p>Rodrigozferreira: /* Códigos para Gnuplot */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:2_carros_prob.jpg|frame|400x400px|center|Gráfico 3: 2 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 11]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2016Grupo - Tráfego2018-01-24T18:11:42Z<p>Rodrigozferreira: /* Códigos em C */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:2_carros_prob.jpg|frame|400x400px|center|Gráfico 3: 2 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 11]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[Velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2015Grupo - Tráfego2018-01-24T18:11:36Z<p>Rodrigozferreira: /* Códigos para Gnuplot */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:2_carros_prob.jpg|frame|400x400px|center|Gráfico 3: 2 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 11]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2013Grupo - Tráfego2018-01-24T18:11:23Z<p>Rodrigozferreira: /* Uma pista */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:2_carros_prob.jpg|frame|400x400px|center|Gráfico 3: 2 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 11]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2012Grupo - Tráfego2018-01-24T18:10:43Z<p>Rodrigozferreira: /* Códigos */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:2_carros_prob.jpg|frame|400x400px|center|Gráfico 3: 2 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 11]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
====Códigos em C====<br />
[[N pistas: Simulação]]<br />
<br />
[[N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[N pistas: Velocidade média em função do tempo]]<br />
<br />
[[N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Rua com sinaleira]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - N pistas: Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - N pistas: Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreirahttp://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_Tr%C3%A1fego&diff=2011Grupo - Tráfego2018-01-24T18:09:09Z<p>Rodrigozferreira: /* Códigos */</p>
<hr />
<div>Integrantes: Rodrigo Zamin Ferreira (262692) e Maurício Gomes de Queiroz (264889)<br />
<br />
==Introdução==<br />
<br />
O estudo de caso do comportamento do tráfego urbano se mostra de grande utilidade nos dias atuais, onde metrópoles apresentam grandes volumes de veículos se deslocando pela cidade. Em horários de pico, por exemplo, às 18h, Porto Alegre apresenta média de lentidão de 83km<ref>http://transito.maplink.global/RS/porto_alegre/Estatisticas</ref>, enquanto São Paulo chega a incríveis 485km<ref>http://transito.maplink.global/SP/sao_paulo/Estatisticas</ref>. <br />
<br />
A modelagem de tal comportamento permite um estudo das regras básicas que motoristas tendem a seguir em situações reais, levando assim a um melhor entendimento da formação e desenvolvimento de congestionamentos, além da obtenção de outras informações interessantes, como a velocidade média em função do número de carros. <br />
<br />
Aqui é proposto um modelo simples do funcionamento normal de uma avenida utilizando autômatos celulares, inicialmente com apenas uma faixa, sendo após estendido para n faixas.<br />
<br />
===Autômatos Celulares===<br />
<br />
Weimar<ref>Weimar, Jörg R. (1998). "Simulation with Cellular Automata". Berlin: Logos-Verlag.</ref> define um autômato celular em "Simulation with Cellular Automata", informalmente, como um vetor de células sendo caracterizado pelas seguintes propriedades básicas:<br />
<br />
<br />
• A evolução se dá em passos discretos de tempo;<br />
<br />
• Cada célula é caracterizada por um estado pertencente a um conjunto finito de estados; <br />
<br />
• Cada célula evolui de acordo com as mesmas regras que dependem somente do estado em que a célula se encontra e de um número finito de vizinhos; <br />
<br />
• A relação com a vizinhança é local e uniforme.<br />
<br />
<br />
Apesar de simples, autômatos celulares (AC) são capazes de simular sistemas dinâmicos complexos e são extensivamente utilizados aqui, onde cada célula representa uma posição na avenida, que pode conter um veículo ou não. Caso contenha um veículo, a célula possui um estado associado a si que representa o índice do veículo, através do qual podemos acessar sua velocidade, a qual pode assumir valores discretos de 0 a <math>v_{max}</math>; caso contrário, a célula possui um estado que indica que está vazia, sendo utilizado o estado -1 para esse objetivo. A velocidade de um carro representa o número de células que o carro andará num passo.<br />
<br />
A atualização dos estados é feita de forma não-síncrona (os estados das células são atualizados um após o outro) e homogênea (as regras de atualização não dependem da posição espacial da própria célula, somente da posição relativa dos vizinhos) <ref>https://www.ppgee.ufmg.br/defesas/113M.PDF</ref>.<br />
<br />
A mudança dos estados é feita com base em regras que se baseiam nos estados da vizinhança, tendo também algumas mudanças estocásticas, caracterizando um método de Monte Carlo.<br />
<br />
==Regras de Aceleração==<br />
Estabelecemos as regras de mudança da velocidade com base no artigo de Nagel e Schreckenberg (1992)<ref name=nagel>Nagel, K.; Schreckenberg, M. (1992). A cellular automaton model for freeway traffic. J. Phys I France (2221-2229)</ref>. São três os casos em que um autômato do modelo descrito aqui muda de velocidade:<br />
<br />
'''Regra 1:''' A velocidade é '''reduzida''' caso a distância entre um carro e o veículo que vai à sua frente seja suficientemente pequena para que haja colisão durante a atualização de posições da simulação, sendo necessária a redução da velocidade para impedir que isso ocorra.<br />
<br />
'''Regra 2:''' De modo análogo, '''aumenta-se''' a velocidade caso a velocidade atual for menor que a máxima e seja suficientemente grande para que não haja colisão durante a atualização de posições da simulação usando a velocidade nova.<br />
<br />
'''Regra 3:''' É também introduzido no modelo um fator que '''aleatoriamente reduz''' a velocidade do veículo, para que seja levado em conta flutuações da velocidade devido ao comportamento humano. Esse passo é essencial, já que sem ele o modelo seria determinístico.<br />
<br />
Ou seja, sendo <math>dist</math> a distância entre um carro e o que está à sua frente, <math>v</math> a velocidade do carro, e <math>\Delta t = 1</math> o tempo de um passo,<br />
<br />
<br />
'''Regra 1:''' Caso <math>dist \leq v</math>, então <math>v \rightarrow \frac{dist}{\Delta t} - 1</math><br />
<br />
'''Regra 2:''' Caso <math>dist > v + 1</math>, então <math>v \rightarrow v + 1</math><br />
<br />
'''Regra 3:''' Com uma probabilidade <math>p</math>, <math>v \rightarrow v - 1</math><br />
<br />
==Faixa Única==<br />
<br />
O problema de faixa única, mesmo que simples, gera discussões muito boas quando simulado. O cenário consiste em uma avenida de uma faixa, com <math>L</math> células, com carros que se movem da esquerda para a direita, submetidos às regras citadas anteriormente. Além disso, foram utilizadas condições de contorno periódicas, e os carros foram inicializados em posições aproximadamente equidistantes. Os valores dos parâmetros utilizados foram <math>L = 15</math> e <math>v_{max} = 3</math>.<br />
<br />
Uma primeira abordagem, com finalidade situar a simulação, é com um único carro, sem implementação da redução de velocidade randômica (Regra 3). <br />
No gráfico abaixo, o carro se desloca, partindo do repouso (representado pela cor preta no gráfico) e com aceleração, até atingir a velocidade máxima, com valor 3, que é mantida no decorrer do tempo.<br />
Tal gráfico mostra o funcionamento base dos autômatos e da visualização da evolução temporal dos mesmos.<br />
<br />
Foi gerado uma simples animação para ilustrar o funcionamento da visualização.<br />
<br />
[[Arquivo:1_carro.jpg|frame|400x400px|center|Gráfico 1: 1 Carro em faixa única]]<br />
<br />
[[Arquivo:Gif_carropistaunica.gif|frame|200x200px|center|Gráfico 1.1: 1 Carro em faixa única]]<br />
<br />
O próximo passo é estendermos o modelo para o caso com 7 carros, isto é, uma densidade de quase 0.5 carros/célula (Gráfico 2).<br />
[[Arquivo:7_carros.jpg|frame|400x400px|center|Gráfico 2: 7 Carros em faixa única]]<br />
<br />
Observamos que a distância até o próximo carro é 2 para todos os carros (a distância é calculada pela diferença das posições dos carros; embora no gráfico somente haja uma célula entre eles, a distância é 2-0 = 2 para o primeiro carro, por exemplo), exceto para o carro que inicia mais à direita, com distância 3. Por isso ele é o primeiro a alcançar uma velocidade de 2, enquanto os outros estavam a velocidade 1. Esse carro então, percorre essa distância maior do que os demais, ficando a uma distância 2 do veículo à sua frente, enquanto o carro que está atrás dele tem uma distância de 3, podendo agora aumentar sua velocidade para 2, e assim por diante; por isso a zona em que os carros tem velocidade 3 se propaga no sentido contrário do seu movimento.<br />
<br />
Agora, podemos introduzir a probabilidade de redução de velocidade, em uma situação com dois carros. Percebe-se no gráfico abaixo, por exemplo, que o carro iniciado na posição 0 permanece dois passos de tempo com velocidade 0, enquanto o segundo carro já havia mudado de velocidade, algo causado pela probabilidade de redução da velocidade. Nestes gráficos ainda não há grande redução de velocidade e congestionamentos, já que a densidade é baixa; porém, ao decorrer do tempo, os carros oscilam sua velocidade entre 3 e 2. A probabilidade de redução de velocidade utilizada aqui é a de 0.3, a qual''' é a mesma para todas as simulações analisadas nesta página'''. Na próxima seção analisaremos também a influência da variação desse parâmetro na velocidade média.<br />
<br />
[[Arquivo:2_carros_prob.jpg|frame|400x400px|center|Gráfico 3: 2 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Ao aplicarmos a simulação para 5 carros (Gráfico 4), observamos que já há pontos de lentidão (ou seja, regiões em que os carros se movem com baixa velocidade, representado pela cor vermelho escuro) e congestionamento (trechos que apresentam velocidade zero), causados pela probabilidade de redução da velocidade e maior densidade de carros. Esses trechos se propagam, de acordo com a simulação, contra o sentido de movimentação dos carros.<br />
<br />
[[Arquivo:5_carros_prob.jpg|frame|400x400px|center|Gráfico 4: 5 Carros em faixa única, com probabilidade de redução de 0.3]]<br />
<br />
Finalmente, estendemos o modelo para um sistema com <math>L = 100</math>, <math>n_{carros} = 60</math> e <math>v_{max} = 6</math> (Gráfico 5), juntando todas as análise feitas anteriormente.<br />
<br />
[[Arquivo:60_carros_prob.jpg|frame|400x400px|center|Gráfico 5: 60 Carros em faixa única, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Após o início, mesmo deixando <math>v_{max} = 6</math>, os carros permanecem principalmente com velocidade 1 e 2. Além de trechos grandes de congestionameto, trechos menores são espontaneamente criados devido a probabilidade de redução de velocidade. Todos os trechos de lentidão/congestionamento são propagados contra o fluxo dos carros.<br />
<br />
===Medidas de Velocidade===<br />
<br />
Por fim, foi medida a velocidade média como função do tempo (fixando a velocidade máxima em 6) e como função da velocidade máxima (sendo medida em <math>t_{final} = 100</math>) (Gráficos 6 e 7). Com o intuito de fazer uma análise por método de Monte Carlo, somos levados a utilizar grande quantidade de amostragens para obter um resultado, ainda que estimado, mais próximo do real. Aqui são utilizadas 100.000 amostragens e então foi calculada a média da velocidade entre elas. Com mais amostragens reduz-se o ruído, porém o tempo gasto com seu cálculo é significantemente aumentado.<br />
<br />
[[Arquivo:1_med_t.jpg|frame|400x400px|center|Gráfico 6, <math>v_{max} = 6</math>]]<br />
<br />
[[Arquivo:1_med_max.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Em ambos os casos, a velocidade média tende a um valor de equilíbrio. Para o caso do Gráfico 7, inicialmente o aumento da velocidade máxima tem grande impacto na velocidade média, mas a medida que a velocidade máxima aumenta, é atingido um ponto em que o aumento da velocidade máxima não é mais significativo para a velocidade média, já que dificilmente os carros atingem velocidades tão altas.<br />
<br />
<br />
<br />
'''COMENTAR PICO''''<br />
<br />
<br />
Podemos também analisar a influência da probabilidade de redução da velocidade na velocidade média em função do tempo. Como seria de se esperar, quanto menor essa probabilidade, maior a velocidade média de equilíbrio.<br />
[[Arquivo:compar_prob.jpg|frame|400x400px|center|Gráfico 7]]<br />
<br />
Outras medidas interessantes são a velocidade média em função da densidade de carros (número de carros/número de células) e o fluxo em função da densidade de carros. O fluxo é medido como o número de carros que atravessou a seção transversal da rua entre as posições 100 e 0 do vetor que descreve a rua (já que consideramos aqui condições de contorno periódicas) ao longo de toda a simulação, dividindo pelo tempo total. Os gráficos abaixo foram feitos a partir da média de 100000 amostragens.<br />
<br />
[[Arquivo:1_v_med_dens.jpg|frame|400x400px|center|Gráfico 10]]<br />
<br />
[[Arquivo:1_fluxo.jpg|frame|400x400px|center|Gráfico 11]]<br />
<br />
O gráfico 10 indica que, quanto maior a densidade, menor a velocidade média dos carros, o que é intuitivo. Também observamos que, para baixas densidades, a velocidade média se aproxima da velocidade máxima do sistema. O Gráfico 11 é mais interessante, indicando que existe uma densidade que maximiza o fluxo de carros: abaixo dela, o número baixo de veículos causa um pequeno fluxo; acima dela, a grande densidade faz com que a velocidade média seja pequena, diminuindo o fluxo de carros. Este gráfico é semelhante ao de uma situação real, conforme gráfico no artigo de Nagel e Schreckenberg<ref name=nagel></ref>, mostrado abaixo.<br />
<br />
[[Arquivo:real.jpg|frame|400x400px|center|Gráfico 11<ref name=nagel></ref>: ''Occupancy'' corresponde à densidade, enquanto ''flow'' ao fluxo de carros]]<br />
<br />
==Faixa Dupla==<br />
<br />
É natural então, querermos simular o tráfego em uma pista com duas faixas, de mesmo sentido. Permitir que carros troquem faixa, à princípio, tornaria o sistema mais fluido.<br />
<br />
===Regras de Troca de Faixa===<br />
<br />
Surge então a necessidade de definir quando permitiremos que uma carro se mude para a faixa ao lado. Apenas definir uma probabilidade para tal evento não faz jus à realidade pois, mesmo que possível, a tendencia não é que pessoas troquem de faixa por motivo algum. Aqui foi utilizada a regra de que, ao reduzir a velocidade devido à falta de distância (ou seja, a regra 1), ou se o carro for obrigado a manter sua velocidade (ou seja, não se encaixar nem na regra 1 nem na regra 2), o motorista checa a faixa vizinha, medindo a distância ao próximo carro; se ela for maior do que a distância atual (medida a partir da faixa em que o carro se encontra), e se a faixa vizinha possuir espaço livre, a troca de pista ocorre. Na sequência, é refeito o processo de mudança de velocidade, levando em conta agora a nova pista em que o carro se encontra.<br />
<br />
===Simulações Iniciais===<br />
<br />
[[Arquivo:5carros_pistadupla.jpg|frame|300x300px|right|Gráfico 12: 5 Carros em faixa dupla, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
Os gráficos a seguir mostram implementações de faixa dupla. Nota-se, caso acompanhar um carro em específico, que ele troca de faixa quando necessário. Como exemplo, tome o carro que inicia na posição 12, no gráfico 12. Do tempo 2 ao 3 ele troca de faixa ao perceber que (lembrando das condições de contorno periódicas) há um carro bloqueando seu caminho.<br />
<br />
O mesmo pode ser feito com uma densidade de carros/celula maior.<br />
<br />
Comparado com o gráfico 5, o gráfico 14 mostra o resultado da duplicação de faixa. Temos um claro aumento na fluidez. Carros se ajeitam procurando a melhor configuração. Não deixa de gerar lentidão, até com trechos de congestionamento, mas a situação é bem melhor.<br />
<br />
<br />
<br />
[[Arquivo:9carros_pistadupla.jpg|frame|300x300px|right|Gráfico 13: 9 Carros em faixa única, L = 15, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:60carros_pistadupla.jpg|frame|400x400px|center|Gráfico 14: 60 Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
===Análise de Velocidades===<br />
<br />
Há a possibilidade de estudar os efeitos na velocidade de adicionar uma nova faixa, o gráfico 15 traz o gráfico 8 juntamente com o mesmo método aplicado para uma situação com duas faixas. É claro o aumento da velocidade média dos carros, tanto quanto uma menor variação na mesma, com o decorrer do tempo.<br />
<br />
[[Arquivo:Comparacao_vmax_MC.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também, variando-se a velocidade máxima definida há o mesmo comportamento que para uma faixa. O deslocamento do platô atingido pelo gráfico para cima indica uma maior fluidez no sistema. <br />
<br />
[[Arquivo:2_lanes_vmed_vmax.jpg|frame|400x400px|center|Gráfico 16: Velocidade média em Carros em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Também pode ser feito o mesmo estudo do fluxo e da velocidade média em função da densidade de carros, conforme os gráficos abaixo.<br />
<br />
[[Arquivo:2_v_med_dens.jpg|frame|400x400px|center|Gráfico 17]]<br />
<br />
[[Arquivo:2_fluxo.jpg|frame|400x400px|center|Gráfico 18]]<br />
<br />
===Comparação entre faixa simples e dupla===<br />
Após realizarmos essas medidas de velocidade média e fluxo de carros, é natural compararmos os resultados para pista simples e pista dupla. Abaixo, mostramos essas comparações, simplesmente unindo os gráficos para esses dois tipos de pista.<br />
<br />
[[Arquivo:Comparacao_t.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_vmax.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_dens.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
[[Arquivo:Comparacao_fluxo.jpg|frame|400x400px|center|Gráfico 15: Velocidade média em faixa dupla, L = 100, com probabilidade de redução de 0.3]]<br />
<br />
Aqui podemos observar claramente que uma rua com pista dupla é claramente mais fluida do que uma de pista simples.<br />
<br />
==N faixas==<br />
<br />
O programa foi estendido para comportar uma simulação de <math>N</math> faixas. Análises futuras podem, por exemplo, verificar a eficácia da adição de uma faixa à uma avenida, informação valiosa para coordenadores de trafego em uma cidade movimentada que buscam informações sobre custo/benefício de tal obra. Também é possível analisar os impactos da redução de uma faixa, ou do bloqueio de lugares pontuais, comparando diversas simulações.<br />
<br />
==Códigos==<br />
===Uma pista===<br />
<br />
====Códigos em C====<br />
[[Simulação]]<br />
<br />
[[Velocidade média em função da velocidade máxima]]<br />
<br />
[[velocidade média em função do tempo]]<br />
<br />
[[Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
====Códigos para Gnuplot====<br />
[[Gnuplot - Velocidade média em função da velocidade máxima]]<br />
<br />
[[Gnuplot - velocidade média em função do tempo]]<br />
<br />
[[Gnuplot - Velocidade média em função da densidade e fluxo em função da densidade]]<br />
<br />
[[Comparação entre diferentes probabilidades de redução de velocidade]]<br />
<br />
===N pistas===<br />
<br />
====Códigos em C====<br />
<br />
====Códigos para Gnuplot====<br />
<br />
==Bibliografia==<br />
<references/></div>Rodrigozferreira