This is an R Markdown Notebook. This model originally generated from an analogy with Newtow’s gravitational law. This work is based in Introduction to Transportation Engineering, Tom V. Mathew and K V Krishna Rao: https://nptel.ac.in/courses/105101087/downloads/Lec-8.pdf

origem = c(98,106,122)
destino = c(102,118,106)
length(origem) == length(destino)
## [1] TRUE
sum(origem)
## [1] 326
sum(destino)
## [1] 326
os = c("Orig. A", "Orig. B", "Orig. C")
ds = c("Orig. A", "Orig. B", "Orig. C")
length(os) == length(ds)
## [1] TRUE
custos = c(25, 1.2, 1.8, 1.2, 25, 1.5, 1.8, 1.5, 25)
matriz_OD = matrix(0, nrow=length(ds), ncol=length(os))
matriz_OD = as.data.frame(matriz_OD)
names(matriz_OD)  = os
rownames(matriz_OD) = ds
matriz_custos = data.frame(matrix(unlist(custos), nrow=length(os), byrow=T))
names(matriz_custos)  = os
rownames(matriz_custos) = ds
matriz_custos
options(scipen = 999)
matriz_OD = as.data.frame(matrix(0, nrow=(length(os) * length(ds)), ncol=2))
matriz_OD
lista = rep(os, length(os))
names(matriz_OD) = c("O", "D")
matriz_OD
lista = rep(os, length(os))
names(matriz_OD) = c("O", "D")
matriz_OD$O = sort(lista)
matriz_OD$D = lista
matriz_OD
matriz_OD$Bj = 1
matriz_OD$Dj = rep(destino, length(origem))
matriz_OD
matriz_OD$func = 1/(custos^2)
matriz_OD$BjDjFc = matriz_OD$Bj*matriz_OD$Dj*matriz_OD$func
matriz_OD
soma_custos = aggregate(matriz_OD$BjDjFc, by=list(Category=matriz_OD$O), FUN=sum)
matriz_OD$prod_custos = rep(soma_custos$x, each=length(os))
matriz_OD
matriz_OD$inversa = 1/matriz_OD$prod_custos 
matriz_OD$Ai = rep(unique(matriz_OD$inversa), length(os))
matriz_OD$Oi = rep(origem, length(origem))
matriz_OD
matriz_OD$fc = matriz_OD$func
matriz_OD$SumAOF = matriz_OD$Ai*matriz_OD$Oi*matriz_OD$fc
matriz_OD
soma_custos = aggregate(matriz_OD$SumAOF, by=list(Category=matriz_OD$O), FUN=sum)
matriz_OD$AOF = rep(soma_custos$x, each=length(os))
matriz_OD
matriz_OD$SumAOF2 = 1/matriz_OD$AOF
matriz_OD$BjInv = matriz_OD$Dj*matriz_OD$SumAOF2*matriz_OD$Ai*matriz_OD$Oi*matriz_OD$fc
matriz_OD
sum(matriz_OD$BjInv)
## [1] 328.6846
sum(origem)
## [1] 326
matriz_final = data.frame(matrix(unlist(matriz_OD$BjInv), nrow=length(os), byrow=T))
names(matriz_final) = ds
rownames(matriz_final) = os
matriz_final