ntation Widescreenv 1.0
Tidtabells-
konstruktion i Emme
Sampersdagen 2019-10-22
Daniel Sahlgren,
Plep
• Rutt (itinerary):
– nod_1, nod_2,…,nod_n
• Antal avgångar (#nr_trips)
• Gångtider
– TTF (Transit Time Function)
– Hårdkodad tid mellan uppehåll A och B
• Finns det noder mellan a och b?
Tidtabell i Emme
a
b
• Nod
– Namn – Id (Emme)
• Länk:
– node_i-node_j
• Segment:
– line_x: node_i_node_j
• Rutt (itinerary)
– {nod_1, nod_2,…, nod_n}
Grundläggande begrepp
• Linjedel:
– den del av en linje där trafikens blandning och/eller antalet tåg – infrastrukturen inklusive signalsystem är oförändrad
– Kopplar till en dimensionerande sträcka
• Dimensionerande sträcka:
– Sträckan mellan två mötesstationer som har längst gångtid för tågen
Grundläggande begrepp, forts.
• Tid från A till B
• Tar ej hänsyn till kapacitetsbrist
– Tidspåslag
Gångtider
Tidspåslag ”tdt” – enkelt!
self.segment.link.length * gamma / 10
Tidspåslag 2 – lite svårare
@property
def extra_time(self):
# check if segments assigned LD is dsp or esp
# print('L'+str(int(self.segment['@ld'])))
try:
LD = self.network.transit_line('L' + str(int(self.segment['@ld']))) if LD['#track_type'] == 'esp':
alfa = self.segment.line.vehicle['#esp_alfa']
beta = self.segment.line.vehicle['#esp_beta']
elif LD['#track_type'] == 'dsp':
alfa = self.segment.line.vehicle['#dsp_alfa']
beta = self.segment.line.vehicle['#dsp_beta']
extra_time = (LD['@capacity'] * alfa - beta) * (self.segment.link.length / 10)
Tidpåslag
• Gångtider tas fram externt i RailSys
– inkluderar ej ”trängsel på spåren”
– Baseras på fysikaliska samband (dragkraft, motstånd, etc)
• Tidspåslag:
– Typ 1: ”tdt”:
• self.segment.link.length * γ
– Typ 2: kapacitet ↓⇒ restid ↑
• (LD['@capacity']* α - β) * (self.segment.link.length)
• Järnvägen delas upp i linjedelar med en mängd attribut X:
– Inner/ytter, hw, tillåtna tågtyper, # tåg,…,,x_n, ∈ 𝑋
• Kapacitet = 𝑓 𝑋
Kapacitet
def total_time_esp(self):
if tr.is_single_track(self.ld):
total_time_esp = self.total_gangtid + self.esp_meeting + self.esp_inf_fbj def esp_meeting(self):
if tr.is_single_track(self.ld):
esp_meeting = self.ld['@sum_speed'] * self.t_values['#m_speed'] + \ +self.ld['@sum_freight'] * self.t_values['#m_freight'] + \ +self.ld['@sum_iron'] * self.t_values['#m_freight'] + \ +self.ld['@sum_other'] * self.t_values['#m_other'] + \ +self.ld['@sum_local'] * self.t_values['#m_local']
• För att beräkna tidspåslag behövs:
– Kapacitet på linjedelen som länken tillhör
• För att beräkna kapaciteten behövs:
– Antal persontåg på resp. linjedel (dimensionerande sträckan) – Antal godståg går på resp. linjedel (dimensionerande sträckan)
• Vilka tåg går på resp linjedel?
Kapacitet och tidspåslag, forts
Linjedelars sträckning – nuv metod
• Manuell nyckel
– Länk -> linjedel – Ca 2 500 länkar
• Tilldelar kapacitetspåslag
– Per segment
• Ca 300 linjedelar
• Ca 150 tåglinjer
• Ger ca 45 000 celler (sic!)
Vilka persontåg går på resp. linjedel?
– nuv metod
Vilka godståg på resp. linjedel?
– nuv metod
• Indata från Samgods via Bangods
– Mätpunkter med antal tåg
• Manuell nyckel
– Mätpunkter till linjedel – Ca 350 mätpunkter
– Manuell mappning mha klarta?
•Kör makro
•Spara linjer.txt
•Läs in linjer.txt
•Exportera fil
•Klistra in fil
•Kör makro
•Spara linjer.txt
Läs in fil Kör Sampers
När det är klart…
Tidtabell med gångtider mellan ”paths”
Skapa rutt - länklängder
Tidtabell med
tidspåslag Klart!
• Men…
– En länk (i Emme) kan tillhöra flera linjedelar
• Om en länk tillhör flera linjedelar vilken väljer man?
– Varje segment tillhör max en linjedel
• För att beräkna kapaciteten behövs:
– Antal tåg på resp. linjedel
– Antal godståg går på resp. linjedel – (Linjedelarnas sträckning i nätet)
En alternativ ansats
• Läs in linjedelar som ”vanliga” linjer i Emme
– Startnod – Slutnod
• Skapa extraattribut för kapacitetsberäkningar
– @hw_x – @gamma – @ld
– @ds
Linjedelars sträckning
• med seg[”@ld”] är vi (nästan) klara:
– Vi söker f(s) s.a.:
∀ 𝑠 ∈ 𝑁: 𝑓 𝑠 = 𝑙𝑑 if ∃ 𝑠. 𝑙𝑖𝑛𝑘. 𝑙𝑑, 𝑙𝑑 ∈ 𝐿𝐷 g
Tilldela varje segment en linjedel
For line in network_transit_lines():
for line_segment in line.segments():
for link_segment in line_segment.link:
If link_segment.line is LD:
ld_cand.append(segment.line.id) If len(ld_can)==1:
segm[@ld]=segment.line.id Else:
Så istället för…
En verktygslåda i Emme modeller
• Vi slipper Excel!
– Allt på ett ställe
• ”drag-and-drop” för att skapa/ändra tåglinjer, linjedelar, etc
• Ändra linjedelsattribut, antal tåg, m.m. direkt i Emme
– Uppdatera kapacitet och tidtabeller direkt
– Förenklar integration med gods vid iteration mellan god/person
• ”På köpet”:
– Verktyg för kapacitetsanalyser
– Extra attribut inlästa (#station, #sign, mm)
– Godstrafik inlagd i nätet
– Loggfiler
Vad innebär detta?
• Ny efterfrågeberäkning snabbar upp…
• VDF på j-väg? Beräkna gångtider direkt i Emme?
• Integrering av gods och persontrafik???
Framtida möjligheter
Tack för er uppmärksamhet!
Kontakt
daniel.sahlgren@trafikverket.se