Opasnet Suomi
Rajaus
Tarkastellaan julkisten kulkuvälineiden tuen suuruuden vaikutusta liikenteen (yksityisautoilun ja bussien osalta) kokonaiskustannuksia (otetaan huomioon pienhiukkas- ja kasvihuonekaasupäästöt, bussin kuljettajien palkka, polttoaineen hinta) pääkaupunkiseudulla.
Määritelmä
Muuttujat
R malli
+ Näytä koodi- Piilota koodi
library(OpasnetBaseUtils)
bus.routes <- op_baseGetData("opasnet_base", "Op_en5336")
buses <- data.frame()
for (i in levels(bus.routes$Route_id)) {
temp <- bus.routes[bus.routes$Route_id == i, c("Route_id", "Time_id", "Route_order", "Result.Text")]
temp <- temp[order(temp$Route_order),]
for (j in 1:length(temp$Result.Text)) {
temp2 <- data.frame(Route_id = temp$Route_id[1], Time_id = temp$Time_id[1], From = temp$Result.Text[j],
To = temp$Result.Text[-j])
# delay between "stops" should be calculated, as well as the times when buses start; this is not needed when we assume that a bus can pick up
# anyone during an hour and deliver them anywhere on the route while running the route in both directions
#temp <- merge(temp, distance[,c("From", "To", "Result")])
#temp$Delay <- c(0, temp$Result[-nrow(temp)]) / 20 #speed
#temp$Time <- temp$Time + temp$Delay
buses <- rbind(buses, temp2)
}
}
trips <- op_baseGetData("opasnet_base", "Op_en2625")
trips.time.sum.margins <- data.frame(Time = seq(1, 24.8, 0.2), Time.hour = rep(1:24, each = 5))
trips <- merge(trips, trips.time.sum.margins)
trips <- tapply(trips$Result, trips[,c("Mode", "Time.hour", "From", "To")], sum)
trips <- as.data.frame(as.table(trips))
colnames(trips)[5] <- "Result"
trips.bus <- merge(trips[trips$Mode == "Public"], buses)
buses.per.stop <- tapply(trips.bus$Result, trips.bus[,c("From", "To", "Time.hour")], length)
buses.per.stop <- as.data.frame(as.table(buses.per.stop))
colnames(buses.per.stop)[4] <- "Buses.per.stop"
trips.bus.2 <- merge(trips[trips$Mode == "Public"], buses.per.stop)
trips.bus.2$Result <- trips.bus.2$Result / trips.bus.2$Buses.per.stop
trips.bus.2 <- merge(trips.bus.2, buses)
trips.bus.3 <- tapply(trips.bus.2$Result, trips.bus.2[,c("Route_id", "Time.hour")]) # Passengers per hour per bus route assuming one bus goes in
# both directions and given passengers are divided evenly among buses going into same destinations
trips.bus.3 <- as.data.frame(as.table(trips.bus.3))
trips.bus.3$Active <- trips.bus.3$Freq > minlevel # test whether number of passengers is higher than minumum required to run
trips.bus <- merge(trips.bus, trips.bus.3)
trips.possible <- tapply(trips.bus$Active, trips.bus[,c("Time.hour", "From", "To")], sum)
trips.possible <- as.data.frame(as.table(trips.possible))
trips.possible$Possible <- trips.possible$Freq > 0 # test whether at least 1 bus route that includes the considered trip is active
trips.bus.2 <- merge(trips[trips$Mode == "Public"], trips.possible)
distance <- op_baseGetData("opasnet_base", "Op_en5322", include = 14299, exclude = 53098)
gc()
# Costs, need to be modified to fit the new scenario
test3 <- as.data.frame(as.table(tapply(test2$vehicle.kilometers, test2$Type, sum)))
colnames(test3) <- c("Type", "vehicle.kilometers")
fuel.cons.emis.CO2 <- data.frame(Type = c("n.full.8.cars", "n.full.4.cars", "n.4.cars.3.pas", "n.4.cars.2.pas", "n.4.cars.1.pas"),
Consumption = c(8.7, 5.7, 5.7, 5.7, 5.7) / 100, Emis.factor.CO2 = c(232, 153, 153, 153, 153))
emis.factor.PM <- 0.1 # gkm^-1
fuel.price <- 1.374 # 4.8. average cost of a liter of diesel fuel in Finland
maint.price <- 0.0582 # €km^-1
driver.salary <- 2313 / 160 * 1.35 # €h^-1
test3 <- merge(test3, fuel.cons.emis.CO2)
test3$Fuel.cost <- test3$vehicle.kilometers * test3$Consumption * fuel.price
test3$Maint.cost <- test3$vehicle.kilometers * maint.price
test3$Emis.CO2 <- test3$vehicle.kilometers * test3$Emis.factor.CO2
test3$Emis.PM <- test3$vehicle.kilometers * emis.factor.PM
test3$Driver.cost <- test3$vehicle.kilometers / speed * driver.salary
PM.lethality <- c(-7.223e-004, 5.640e-006, 4.228e-005, 5.987e-005, 8.013e-005, 1.150e-004, 2.037e-004, 2.939e-004, 3.598e-004, 4.132e-004,
4.640e-004, 5.139e-004, 5.662e-004, 6.233e-004, 6.854e-004, 7.577e-004, 8.441e-004, 9.519e-004, 1.093e-003, 1.314e-003, 2.805e-003)
PM.lethality <- median(PM.lethality) # deaths / kg
value.of.life <- (2e6 + 0.98e6) / 2 # runif(n, 0.98e6, 2e6) # € / death
emis.price.PM <- PM.lethality * value.of.life # 201.879 # €kg^-1
emis.price.CO2 <- 10e-3 # runif(n, 5e-3, 40e-3) # €kg^-1, the price of CO2 allowances fluctuates quite a bit, in 8.8.2011 they
# were going for 10.74 € per ton of CO2 equivalent
test3$CO2.cost <- test3$Emis.CO2 * emis.price.CO2
test3$PM.cost <- test3$Emis.PM * emis.price.PM
# bus emis: 44 - 54 * 10^-2 lkm^-1; ref: N. Nylund, K. Erkkilä, T. Hartikka 2007 http://www.vtt.fi/inf/pdf/tiedotteet/2007/T2372.pdf p.31
--#: Jostain eriskummallisesta syystä, koodi on äärettömän hidasta ajamaan serverillä. Arvaan syyksi keskusmuistin loppumisen, jonka jälkeen kiintolevy tulee käyttöön, joka luonnollisesti hidastaa operointia roimasti. gc funktion mukaan erään ajon maksimi muistin käyttö oli yli 3 Gb (http://fi.opasnet.org/fi/Special:R-tools?id=13136726070). --Teemu R 19. elokuuta 2011 kello 15.44 (EEST)
--#: Mallin pitäisi nyt laskea toteutuvat bussireitit ja sovittaa niitä mahdollisesti toteutettaviin trippeihin, mutta jossain kohti on bugi ja debuggaaminen on vaikeaa kun ei oma kone jaksa tätä pyörittää. --Teemu R 22. elokuuta 2011 kello 15.52 (EEST)
Katso myös
Viitteet
Aiheeseen liittyviä tiedostoja
| id | Tiedoston nimi | Viimeksi muokattu | Koko (kB) |
|---|