Adaptado do Livro Planejamento de Transportes: Conceitos e Modelos Campos (2013).

1 Geração de Viagens

1.1 Taxas de Viagens por dia e Categoria de Residênca

library(DT)
library('stringr')
IntervaloDeConvergencia =0.01
multiplicador = 1000
VeicHab = matrix(c(2.7,4.1,5.7,6.5,3.9,5.8,7.3,9.4,3.8,6.7,8.3,11.1,4.2,7.1,9.6,12.7),4,4)
datatable(as.data.frame(VeicHab), class = 'cell-border stripe', colnames = c("0", "1", "2", "3ou+"), rownames = c("1", "2", "3", "4ou+"))

1.2 Taxa de viagens por dia por Categoria de Residência

rownames(VeicHab) <- c("1", "2", "3", "4ou+")
colnames(VeicHab) <- c("0", "1", "2", "3ou+")

dimnames(VeicHab) <- list("Habitantes por Residência"=c("1","2", "3", "4 ou +"), "Veiculos por Residência"=c("0","1","2","3 ou +")) 
VeicHab
##                          Veiculos por Residência
## Habitantes por Residência   0   1    2 3 ou +
##                    1      2.7 3.9  3.8    4.2
##                    2      4.1 5.8  6.7    7.1
##                    3      5.7 7.3  8.3    9.6
##                    4 ou + 6.5 9.4 11.1   12.7
datatable(as.data.frame(VeicHab))

1.3 Taxa de viagens por dia por Tipo de Residência

ViagemTipoResidencia = matrix(c("<1000,00", "1000,00 a 2000,00", "2000,00 a 5000,00", ">5000,00", "Todas Residências",5.5,7.5,9.4,10.5,7.6,0.125,0.058,0.046,0.037,0.066),5,3)
ViagemTipoResidencia = as.data.frame(ViagemTipoResidencia)
names(ViagemTipoResidencia) = c("Renda por Residência", "Total de Viagens", "Proporção de Transp. Pub.")
datatable(as.data.frame(ViagemTipoResidencia))

\[P_i = 120+0.155Pi+0.142Hi \\ A_i = 85+0.065Pi+0+.80Ei\]

1.4 Estimativa Furura de Variáveis do Modelo

EstimativaFutura = matrix(c(1, 2, 3, 4, 5,400,2760,4050,1570,855,280,940,1405,865,380,2200,510,650,332,228),5,4)
EstimativaFutura = as.data.frame(EstimativaFutura)
names(EstimativaFutura) = c("Zona", "População (PI)", "Habitacão (Hi)", "Emprego Ei")
datatable(as.data.frame(EstimativaFutura))

2 Geração de Viagens Futuras

GerViaFut = matrix(c(1,2,3,4,5, 0,0,0,0,0,0,0,0,0,0),5,3)
GerViaFut = as.data.frame(GerViaFut)
GerViaFut$V2 = round(120 + EstimativaFutura$`População (PI)`*0.155 + EstimativaFutura$`Habitacão (Hi)`*0.142, 0)
GerViaFut$V3 = round(85 + EstimativaFutura$`População (PI)`*0.065 + EstimativaFutura$`Emprego Ei`*0.380, 0)
names(GerViaFut) = c("Zonas", "Produção Futura", "Atração Futura")
computo = c("Total", sum(GerViaFut$`Produção Futura`), sum(GerViaFut$`Atração Futura`))
GerViaFut = rbind(GerViaFut, computo)
GerViaFut[, 2] = as.numeric(GerViaFut[, 2])
GerViaFut[, 3] = as.numeric(GerViaFut[, 3])
datatable(as.data.frame(GerViaFut))

2.1 Fator de Equilibrio

Como o número de viagens geradas e atraidas difere, é calculado o fator de equilíbrio a ser aplicado sobre as viagens atraídas e assim equilibrar o número de viagens geradas e atraídas.

fim = dim(GerViaFut)[1]
FatEquilibrio = GerViaFut$`Produção Futura`[fim]/GerViaFut$`Atração Futura`[fim]
FatEquilibrio
## [1] 1.040157
GerViaFut$`Atração Futura`[1:(fim-1)] = round(GerViaFut$`Atração Futura`[1:(fim-1)]*FatEquilibrio, 0)
GerViaFut$`Atração Futura`[fim] = sum(GerViaFut$`Atração Futura`[1:(fim-1)])
datatable(as.data.frame(GerViaFut))

3 Distribuição de Viagens

3.1 Matriz O/D Atual e Futura

MatrizOD = matrix(c(0,12,10,16,12,0,15,7,10,15,0,18,16,7,18,0),4,4)
MatrizOD = MatrizOD*multiplicador
futuro = c(80,46,108,45)*multiplicador
cbind(c("A", "B", "C", "D"),MatrizOD, rowSums(MatrizOD), futuro)
##                                                  futuro  
## [1,] "A" "0"     "12000" "10000" "16000" "38000" "80000" 
## [2,] "B" "12000" "0"     "15000" "7000"  "34000" "46000" 
## [3,] "C" "10000" "15000" "0"     "18000" "43000" "108000"
## [4,] "D" "16000" "7000"  "18000" "0"     "41000" "45000"
datatable(as.data.frame(cbind(c("A", "B", "C", "D"),MatrizOD, rowSums(MatrizOD), futuro)), colnames = c("Zona", "A", "B", "C", "D", "ATUAL", "FUTURO"), rownames = 1:length(MatrizOD[1,]))

3.2 Calculo do Fator de Crescimento Uniforme

FatCrescMedio =  futuro/rowSums(MatrizOD)
FatCrescMedio
## [1] 2.105263 1.352941 2.511628 1.097561
dimmatriz = dim(MatrizOD)[2]
for (r in 1:dimmatriz) {
  for (c in 1:dimmatriz) {
    #print(paste(r, c, MatrizOD[r, c], sep = " "))
    MatrizOD[r, c] = round((MatrizOD[r, c]*(FatCrescMedio[r]+FatCrescMedio[c]))/2,0)
  }
}
datatable(as.data.frame(MatrizOD))

3.2.1 Produção Total Estimada

rowSums(MatrizOD)
## [1] 69456 58310 84551 66683

3.2.2 Fator Linha

all((1-abs(futuro / rowSums(MatrizOD)))<IntervaloDeConvergencia)
## [1] FALSE
dimmatriz = dim(MatrizOD)[2]
intervalo = FALSE
controle = 1
while (intervalo!=TRUE) {   
  FatCrescMedio =  futuro/rowSums(MatrizOD)
  for (r in 1:dimmatriz) {
    for (c in 1:dimmatriz) {
      #print(paste(r, c, MatrizOD[r, c], sep = " "))
      MatrizOD[r, c] = round((MatrizOD[r, c]*(FatCrescMedio[r]+FatCrescMedio[c]))/2,0)
    }
  }
  (1-abs(futuro / rowSums(MatrizOD)))<IntervaloDeConvergencia
  intervalo = all((1-abs(futuro / rowSums(MatrizOD)))<IntervaloDeConvergencia)
  print(paste0("Iteracão:", controle ))
  print(paste("Atende Criério:", intervalo, "Fator de Crescimento:", str_c(FatCrescMedio,collapse=','), sep = " "))
  print(MatrizOD)
  controle = controle+1
}
## [1] "Iteracão:1"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.15180833909238,0.788886983364774,1.27733557261298,0.674834665506951"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 20134 28037 23402
## [2,] 20134     0 29944  6277
## [3,] 28037 29944     0 31706
## [4,] 23402  6277 31706     0
## [1] "Iteracão:2"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.11773992986182,0.816254103451335,1.20418789791163,0.733078113545654"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 19470 32550 21656
## [2,] 19470     0 30250  4863
## [3,] 32550 30250     0 30711
## [4,] 21656  4863 30711     0
## [1] "Iteracão:3"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.08583527878821,0.842753238187714,1.15494433809926,0.78630089114101"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 18775 36469 20271
## [2,] 18775     0 30215  3961
## [3,] 36469 30215     0 29809
## [4,] 20271  3961 29809     0
## [1] "Iteracão:4"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.05939217374032,0.86872769163944,1.11925217373281,0.832701097315002"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 18100 39726 19177
## [2,] 18100     0 30033  3370
## [3,] 39726 30033     0 29093
## [4,] 19177  3370 29093     0
## [1] "Iteracão:5"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.03892056153656,0.893151855231734,1.09254238659815,0.87141750580945"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 17485 42337 18317
## [2,] 17485     0 29818  2973
## [3,] 42337 29818     0 28569
## [4,] 18317  2973 28569     0
## [1] "Iteracão:6"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.02381653207745,0.914949478876601,1.07223700409039,0.902545177400269"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 16950 44370 17643
## [2,] 16950     0 29627  2702
## [3,] 44370 29627     0 28209
## [4,] 17643  2702 28209     0
## [1] "Iteracão:7"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.01313273305219,0.933460500415999,1.05668943114886,0.926803147011575"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 16497 45919 17113
## [2,] 16497     0 29481  2513
## [3,] 45919 29481     0 27976
## [4,] 17113  2513 27976     0
## [1] "Iteracão:8"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.00592236794125,0.948629642614093,1.04472991796935,0.945338431158355"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 16122 47082 16696
## [2,] 16122     0 29383  2380
## [3,] 47082 29383     0 27837
## [4,] 16696  2380 27837     0
## [1] "Iteracão:9"
## [1] "Atende Criério: FALSE Fator de Crescimento: 1.00125156445557,0.960634854338519,1.03545473720542,0.959222390382197"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 15815 47946 16366
## [2,] 15815     0 29326  2285
## [3,] 47946 29326     0 27763
## [4,] 16366  2285 27763     0
## [1] "Iteracão:10"
## [1] "Atende Criério: FALSE Fator de Crescimento: 0.998415016161843,0.969932104752667,1.0282286856762,0.969535054078511"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 15565 48585 16104
## [2,] 15565     0 29299  2216
## [3,] 48585 29299     0 27732
## [4,] 16104  2216 27732     0
## [1] "Iteracão:11"
## [1] "Atende Criério: FALSE Fator de Crescimento: 0.996835048720313,0.977060322854715,1.02257233752462,0.977156258142969"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 15362 49056 15895
## [2,] 15362     0 29294  2165
## [3,] 49056 29294     0 27728
## [4,] 15895  2165 27728     0
## [1] "Iteracão:12"
## [1] "Atende Criério: FALSE Fator de Crescimento: 0.996102747998456,0.982465133166741,1.01811874281189,0.982790250720713"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 15197 49405 15727
## [2,] 15197     0 29303  2127
## [3,] 49405 29303     0 27741
## [4,] 15727  2127 27741     0
## [1] "Iteracão:13"
## [1] "Atende Criério: FALSE Fator de Crescimento: 0.995904343387818,0.986552855641581,1.01457035763605,0.986950323500384"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 15064 49664 15592
## [2,] 15064     0 29319  2099
## [3,] 49664 29319     0 27762
## [4,] 15592  2099 27762     0
## [1] "Iteracão:14"
## [1] "Atende Criério: TRUE Fator de Crescimento: 0.99601593625498,0.989630394561336,1.01175699095976,0.990033661144479"
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 14956 49857 15483
## [2,] 14956     0 29339  2078
## [3,] 49857 29339     0 27787
## [4,] 15483  2078 27787     0
datatable(as.data.frame(cbind(MatrizOD, rowSums(MatrizOD), futuro)), colnames = c("A", "B", "C", "D", "Prod. Futura", "Produção Total"), rownames = c("A", "B", "C", "D"))

3.3 Método de Fratar

Primeiramente é calculado o fator de crescimento intrazona:

\[F_i = \frac{P_i^*}{P_i}\] Calcula-se as viagens entre zonas:

\[t_{ij} = \frac{P_i^**t_{ij}*f_i}{\sum_j t_{ij}*f_i}\]

Geração: \[t_{ij} = \frac{1}{2}(t`_{ij}+t`_{ji}) \to (t'valor\ calculado\ na\ iteracão) \]

MatrizOD = matrix(c(0,12,10,16,12,0,15,7,10,15,0,18,16,7,18,0),4,4)
MatrizOD = MatrizOD*multiplicador
MatrizOD
##       [,1]  [,2]  [,3]  [,4]
## [1,]     0 12000 10000 16000
## [2,] 12000     0 15000  7000
## [3,] 10000 15000     0 18000
## [4,] 16000  7000 18000     0
futuro = c(80,46,108,45)*multiplicador
cbind(c("A", "B", "C", "D"),MatrizOD, rowSums(MatrizOD), futuro)
##                                                  futuro  
## [1,] "A" "0"     "12000" "10000" "16000" "38000" "80000" 
## [2,] "B" "12000" "0"     "15000" "7000"  "34000" "46000" 
## [3,] "C" "10000" "15000" "0"     "18000" "43000" "108000"
## [4,] "D" "16000" "7000"  "18000" "0"     "41000" "45000"
FatCrescMedio =  futuro/rowSums(MatrizOD)
FatCrescMedio
## [1] 2.105263 1.352941 2.511628 1.097561
ods = c("A", "B", "C", "D")
dimmatriz = dim(MatrizOD)[2]
intervalo = FALSE
controle = 1
MatrizODDois = matrix(0, dim(MatrizOD), dim(MatrizOD))
while (intervalo!=TRUE) {   
  FatCrescMedio =  futuro/colSums(MatrizOD)
  for (i in 1:dimmatriz) {
    for (j in 1:dimmatriz) {
      MatrizODDois[i, j]  = (futuro[i]*MatrizOD[i, j]*FatCrescMedio[j])/sum(MatrizOD[i,]*FatCrescMedio)
    }
  }
  MatrizOD = (MatrizODDois+t(MatrizODDois))/2
  intervaloB = abs(1-(futuro / rowSums(MatrizOD)))
  intervalo = all(abs(1-(futuro / rowSums(MatrizOD)))<IntervaloDeConvergencia)
  print(paste0("Iteracão:", controle ))
  print(MatrizOD)
  controle = controle+1
}
## [1] "Iteracão:1"
##          [,1]     [,2]     [,3]     [,4]
## [1,]     0.00 19251.14 35658.65 20500.37
## [2,] 19251.14     0.00 30205.02  4913.69
## [3,] 35658.65 30205.02     0.00 28971.13
## [4,] 20500.37  4913.69 28971.13     0.00
## [1] "Iteracão:2"
##          [,1]     [,2]     [,3]     [,4]
## [1,]     0.00 16797.65 45377.06 17494.58
## [2,] 16797.65     0.00 29232.46  3176.13
## [3,] 45377.06 29232.46     0.00 27422.11
## [4,] 17494.58  3176.13 27422.11     0.00
## [1] "Iteracão:3"
##          [,1]      [,2]     [,3]      [,4]
## [1,]     0.00 15480.926 48951.43 16149.140
## [2,] 15480.93     0.000 28988.24  2693.941
## [3,] 48951.43 28988.238     0.00 27236.330
## [4,] 16149.14  2693.941 27236.33     0.000
## [1] "Iteracão:4"
##          [,1]      [,2]     [,3]      [,4]
## [1,]     0.00 14844.284 50144.03 15511.498
## [2,] 14844.28     0.000 29088.45  2534.658
## [3,] 50144.03 29088.449     0.00 27377.078
## [4,] 15511.50  2534.658 27377.08     0.000
## [1] "Iteracão:5"
##          [,1]      [,2]     [,3]      [,4]
## [1,]     0.00 14530.023 50575.24 15198.202
## [2,] 14530.02     0.000 29207.63  2472.369
## [3,] 50575.24 29207.635     0.00 27516.533
## [4,] 15198.20  2472.369 27516.53     0.000

3.3.1 Resultados

O resultado converte? TRUE.
A relação com o Fator de Crescimento foi de 0.996221041523058,0.995454961528066,1.00652933892982,0.995859341097992.
Resultando em diferenças da ordem de: 0.003779, 0.004545, 0.0065293, 0.0041407, estando contidas dentro do intervalo de erro admitido de 0.01%.

3.3.1.1 Matriz Final

##          A         B        C         D
## A     0.00 14530.023 50575.24 15198.202
## B 14530.02     0.000 29207.63  2472.369
## C 50575.24 29207.635     0.00 27516.533
## D 15198.20  2472.369 27516.53     0.000

datatable(as.data.frame(cbind(ods,MatrizOD, rowSums(MatrizOD), futuro)), colnames = c("Zona", "A", "B", "C", "D", "ATUAL", "FUTURO"), rownames = 1:length(MatrizOD[1,]))

Referências:

Campos, Vânia Barcellos Gouvêa. 2013. Planejamento de transportes: conceitos e modelos. Interciência,