1 Emulador de Botoeiras no VISSIM

Este projeto visa fornecer um mecanismo para simular o acionamento de botoeiras de pedestres no vissim. Para este fim foram gerados dois ciclos com tempos que consideram o tempo de ciclo com acionamento da botoeira e sem acionamento de botoeira.

Primeiramente foi criado o tempo de ciclo normal de 70 segundos como demonstrado (Figura 1).

Figura 1: Tempo de ciclo sem acionamente de pedestres

Figura 1: Tempo de ciclo sem acionamente de pedestres

Na sequencia foi criado o tempo de ciclo de pedestres de 92 segundos como demonstrado (Figura 2).

Figura 2: Tempo de ciclo com acionamente de pedestres

Figura 2: Tempo de ciclo com acionamente de pedestres

Após em Daily Signal Program foi criada uma sequencia de troca de programações (Figura 3). Note que esta sequencia visa alterar a programação semafórica ao longo do dia. O intuito foi utilizar este instrumento para alterar a programação a cada ciclo gerando de forma randomizada, a simulação de ciclos com e sem acionamento de botoeiras de pedestres.
Figura 3: Sequencia de programações diárias

Figura 3: Sequencia de programações diárias

As configurações de Signal Controles ficam armazenadas em arquivos .sig no diretório dos arquivos do projeto. A Figura 4 apresenta parte do codigo XML do arquivo com a tag dailyProgLists que exibe a ID cada programação e o instante de inicialização. O objetivo é gerar uma sequência de programações curtas que permitam intercalar estágios com e sem acionamento de botoeiras e estejam aninhados como atributos do tipo dailyProgListItem

Figura 4: Arquivo de configuração do Signal Controller

Figura 4: Arquivo de configuração do Signal Controller

1.1 Gerando os elementos dailyProgListItem

Como a inteção é facilitar a criação de atributs dailyProgListItem ao longo de períodos de 30/60 minutos recorreu-se ao uso de um script para obter esta programação, evitando cálculos e configurações excessivas na interface do VISSIM.

Para tanto, alguns parametros necessários para o signal controller foram definidos, permitindo gerar uma sequencia de programações de ciclos desejados no formato do arquivo de configurção de semáforos do VISSIM.

O usuário ao definir a duração de um cilo semafórico no VISSIM fornece o tempo em segundos, posteriormente este tempo é convertido em milissegundos pelo próprio programa. Para lidar com isso, inicialmente cria-se a variável milisegundos para obter o produto \(tempo*milisegundos\)

milissegundos = 1000

Como o tempo de ciclo se altera com o acionamento da botoeira e deseja-se simular ciclos com e sem acionamento, é criada uma variável do tipo lista com os tempos dos dois ciclos em segundos.

segundos = c(70,92)

Como diferentes cenários podem iniciar em diferentes horários, foi criada a variável start que armazena o instante de inicialização da simulação. Este valor deverá ser alterado de acordo com o horário da simulação definido em Silulation/Parameters/Start Time no VISSIM.

start = 00000000

Posteriormente é criada uma lista com as IDs das programações que correspondem aos ciclos com e sem acionamento por pedestres,

prog = c(1, 2)

Por fim é criada a variável informando o limite do tempo de simulação, responsável por encerrar o laço que irá criar os atributos de programação de sequencia dos estágios.

limite = 1800000

Para garantir que os resultados sejam impressos como valores inteiros, é setado o parametro scipen.

options(scipen = 999)

Criação da distribição de probabilidade de cada um dis ciclos:

probabilidade = c(0.5,0.5)

Feito isso, é criada afunção que irá gerar o código desejado

gerador = function(ciclo, ch, inicio, programas, teto, probs){
  for (i in 1:1000) {
    a = sample(c(1, 2), 1, replace=TRUE, prob=probs) # randomização do acionamento da botoeira
    pedestre = prog[a] # obtenção do ciclo com ou sem pedestre de acordo com a randomização
    t = segundos[a]*milissegundos # obtenção do tempo correspondente ao ciclo definido como com ou sem pedestre
    time = ifelse(i == 1, start, start+t) # definição do tempo de inicio do ciclo definido
    start = time
    if (start > teto) {
      break() # encerramento da iteração ao atingir o limite maximo de tempo
    }else{ # criação da linha de código para configuração do arquivo .sig
      cat('<dailyProgListItem time="' , start, '" prog_id="', pedestre, '" />',sep = "")
      cat("\n")  
    }
  }  
}

1.1.1 Emulando o pico manhã

Ao executar o laço, iterativamente é criado o código desejado:

gerador(ciclo = segundos, ch = r, inicio = start, programas = prog, teto = limite, probs = probabilidade)
## <dailyProgListItem time="0" prog_id="2" />
## <dailyProgListItem time="70000" prog_id="1" />
## <dailyProgListItem time="140000" prog_id="1" />
## <dailyProgListItem time="210000" prog_id="1" />
## <dailyProgListItem time="280000" prog_id="1" />
## <dailyProgListItem time="350000" prog_id="1" />
## <dailyProgListItem time="420000" prog_id="1" />
## <dailyProgListItem time="490000" prog_id="1" />
## <dailyProgListItem time="582000" prog_id="2" />
## <dailyProgListItem time="674000" prog_id="2" />
## <dailyProgListItem time="744000" prog_id="1" />
## <dailyProgListItem time="836000" prog_id="2" />
## <dailyProgListItem time="906000" prog_id="1" />
## <dailyProgListItem time="976000" prog_id="1" />
## <dailyProgListItem time="1046000" prog_id="1" />
## <dailyProgListItem time="1138000" prog_id="2" />
## <dailyProgListItem time="1208000" prog_id="1" />
## <dailyProgListItem time="1300000" prog_id="2" />
## <dailyProgListItem time="1370000" prog_id="1" />
## <dailyProgListItem time="1462000" prog_id="2" />
## <dailyProgListItem time="1554000" prog_id="2" />
## <dailyProgListItem time="1624000" prog_id="1" />
## <dailyProgListItem time="1694000" prog_id="1" />
## <dailyProgListItem time="1786000" prog_id="2" />

A próxima etapa consiste em copiar o código e inserir no arquivo .sig (Figura 5), definindo configuração gerada

Figura 5: Arquivo de Signal Controller editado

Figura 5: Arquivo de Signal Controller editado

Após salvo o arquivo .sig basta abrir o VISSIM e verificar no signal controler (Figura 6) que a programação foi efetivamente configurada. O próximo passo é ativar a varição dinâmica dos ciclos no VISSIM.

Figura 6: Daily signal program atualizado

Figura 6: Daily signal program atualizado

Para ativar a alteração dinâmica de ciclos, basta abrir a lista de Signal Controllers e no signal controller desejado alterar o atributo ProgNo para o ID do Daily signal program list, nesse exemplo iqual a 1000.

Figura 7: Lista de Signal controllers

Figura 7: Lista de Signal controllers

Após basta salvar o arquivo VISSIM para que as alterações sejam definidas (Figura 8).

Figura 8: Atualização do parâmetro ProgNo

Figura 8: Atualização do parâmetro ProgNo

1.1.2 Emulando período de meio-dia

segundos = c(70,92)
prog = c(3, 4)
probabilidade = c(0.3,0.7)
gerador(ciclo = segundos, ch = r, inicio = start, programas = prog, teto = limite, probs = probabilidade)
## <dailyProgListItem time="0" prog_id="4" />
## <dailyProgListItem time="92000" prog_id="4" />
## <dailyProgListItem time="184000" prog_id="4" />
## <dailyProgListItem time="276000" prog_id="4" />
## <dailyProgListItem time="346000" prog_id="3" />
## <dailyProgListItem time="438000" prog_id="4" />
## <dailyProgListItem time="508000" prog_id="3" />
## <dailyProgListItem time="600000" prog_id="4" />
## <dailyProgListItem time="692000" prog_id="4" />
## <dailyProgListItem time="762000" prog_id="3" />
## <dailyProgListItem time="854000" prog_id="4" />
## <dailyProgListItem time="946000" prog_id="4" />
## <dailyProgListItem time="1038000" prog_id="4" />
## <dailyProgListItem time="1130000" prog_id="4" />
## <dailyProgListItem time="1222000" prog_id="4" />
## <dailyProgListItem time="1292000" prog_id="3" />
## <dailyProgListItem time="1384000" prog_id="4" />
## <dailyProgListItem time="1476000" prog_id="4" />
## <dailyProgListItem time="1568000" prog_id="4" />
## <dailyProgListItem time="1660000" prog_id="4" />
## <dailyProgListItem time="1730000" prog_id="3" />

1.1.3 Emulando pico tarde

segundos = c(85,107)
prog = c(5, 6)
probabilidade = c(0.05,0.95)
gerador(ciclo = segundos, ch = r, inicio = start, programas = prog, teto = limite, probs = probabilidade)
## <dailyProgListItem time="0" prog_id="6" />
## <dailyProgListItem time="107000" prog_id="6" />
## <dailyProgListItem time="214000" prog_id="6" />
## <dailyProgListItem time="321000" prog_id="6" />
## <dailyProgListItem time="428000" prog_id="6" />
## <dailyProgListItem time="535000" prog_id="6" />
## <dailyProgListItem time="642000" prog_id="6" />
## <dailyProgListItem time="749000" prog_id="6" />
## <dailyProgListItem time="856000" prog_id="6" />
## <dailyProgListItem time="963000" prog_id="6" />
## <dailyProgListItem time="1048000" prog_id="5" />
## <dailyProgListItem time="1133000" prog_id="5" />
## <dailyProgListItem time="1240000" prog_id="6" />
## <dailyProgListItem time="1347000" prog_id="6" />
## <dailyProgListItem time="1454000" prog_id="6" />
## <dailyProgListItem time="1561000" prog_id="6" />
## <dailyProgListItem time="1668000" prog_id="6" />
## <dailyProgListItem time="1753000" prog_id="5" />

1.1.3.1 Dados da Sessão

## Warning: package 'pander' was built under R version 3.6.3

R version 3.6.2 (2019-12-12)

Platform: x86_64-w64-mingw32/x64 (64-bit)

locale: LC_COLLATE=Portuguese_Brazil.1252, LC_CTYPE=Portuguese_Brazil.1252, LC_MONETARY=Portuguese_Brazil.1252, LC_NUMERIC=C and LC_TIME=Portuguese_Brazil.1252

attached base packages:

  • stats
  • graphics
  • grDevices
  • utils
  • datasets
  • methods
  • base

other attached packages:

  • pander(v.0.6.3)

loaded via a namespace (and not attached):

  • compiler(v.3.6.2)
  • magrittr(v.1.5)
  • tools(v.3.6.2)
  • htmltools(v.0.4.0)
  • yaml(v.2.2.0)
  • Rcpp(v.1.0.4.6)
  • stringi(v.1.4.4)
  • rmarkdown(v.2.2.2)
  • highr(v.0.8)
  • knitr(v.1.30)
  • stringr(v.1.4.0)
  • xfun(v.0.19)
  • digest(v.0.6.27)
  • rlang(v.0.4.10)
  • evaluate(v.0.14)