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
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 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
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")
}
}
}
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
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
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
Após basta salvar o arquivo VISSIM para que as alterações sejam definidas (Figura 8).
Figura 8: Atualização do parâmetro ProgNo
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" />
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" />
## 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:
other attached packages:
loaded via a namespace (and not attached):