Adaptado do Livro Planejamento de Transportes: Conceitos e Modelos Campos (2013).
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+"))
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))
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\]
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))
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))
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))
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,]))
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))
rowSums(MatrizOD)
## [1] 69456 58310 84551 66683
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"))
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
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%.
## 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,]))
Campos, Vânia Barcellos Gouvêa. 2013. Planejamento de transportes: conceitos e modelos. Interciência,