Generování jízdních řádů

Úvodní stránka Fóra Nevíte si rady, napište Generování jízdních řádů

Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (celkem z 8)
  • Autor
    Příspěvky
  • #4746
    greeny
    Účastník

    Ahoj, chtěl bych se zeptat, jak řešíte tvorbu jízdních řádů pro vozidla typu MHD, které jezdí relativně často. Můj postup je takovýto (pro mě je příliš složitý a hledám jednodušší způsob):

    1. postavit dráhu, nastavit vyhýbky, vyrobit první vlak
    2. pustit vlak z depa na konečnou a změřit čas dojezdu (označím jako A)
    3. pustit vlak z konečné na druhou konečnou a změřit čas jízdy (označím jako B)
    4. čísla A i B zvětším o nějakou hodnotu, jakožto záloha pro případ zácpy, semaforů, apod., čím větší číslo, tím pravěpodobněji bude na konečné stát více vozů za sebou
    5. vyrobím jízdní řády podle parametrů linky (intervaly ve špičce, ráno, odpoledne, přes noc, přes víkend, atd atd). Už tady dávám intervaly tak, aby číslo B bylo násobek intervalu (např. pokud B je 22 minut, tak to zvětším na 30 a intervaly dělám po 5 nebo 10 minutách).
    6. nejtěžší krok (pro mě): počítat, který odjezd je pro který vůz, abych správně nastavil výjezdy a zátahy (výjezdy jsou o A minut před prvním odjezdem a zátahy jsou v čase posledního odjezdu (ten už většinou ani v řádech není)
    7. celý to pustím a zkouším, jestli projede celej den bez zadrhnutí (opožděný odjezd z taktovacího bodu nebo příliš mnoho vozidel na konečné)

    Celkově je tento proces velmi časově náročný a přemýšlel jsem, jestli by nešel nějak zjednodušit. Jakožto vývojáře webových stránek mě samozřejmě napadlo napsat skript, kterej to za mě vyrobí, ale chtěl jsem se nejdřív zeptat tady, jestli náhodou na to nemá někdo jednodušší řešení.

    Díky za pomoc 🙂

    greeny

    #4747
    Pan Nikdo 0.
    Moderátor

    Oooohhhh! Tohle je delikátní otázka pro mě. Chtěl jsem jít spát, ale tohle si užiju.
    0. Je to BAHN. Tenhle program prostě vyžaduje spoustu úsilí a času. Do jisté míry je to omezeními programu (jež je velmi těžké odstranit), ale z větší částí je to prostě tím, o co se tady snažíme. Chápej, provoz MHD, ty vole. 😀 To je fakt docela velká věc, která zákonitě vezme čas a úsilí a nebude to jednoduchý.
    1. Stavíš vždycky celou síť, předpokládám? Tzn. máš nějaký vzor, podle kterého stavíš jízdní dráhu. Jakmie máš tohle, tak předpokládám, že děláš SLV (schéma linkového vedení). V nějakém programu si nakreslíš kudy která linka pojede, podle toho pak nastavíš křížení, signalizace apod. V tomhle okamžiku předpokládám, že máš už i zastávky, rychlostníky, apod.
    2. Měření. Jop, to je osina v zadku. Naposled, když jsem to dělal, jsem to dělal 6× (!!!). Musel jsem si síť upravit, abych měl „speciální měřící verzi“. Na konečných nebyly taktovací body, ale zastávky, s nastaveným časem, na setkávacích bodech (SB) a konečných řádně pojmenované logbody, výhybky jsem si musel nastavit tak, aby mi šaliny jezdily tak, jak jsem potřeboval. každá linka měla 2 vozy, protože máme 2 konečné (T0 a T1) (jasně, můžeš mít jediný vůz, ale 2 ti to trochu urychlí). Pomocí logbodů tohle jde velmi jednoduše. Když si je dobře nastavíš, tak se ti to měří všechno samo. Každý vlak, co pustím do sítě, má o minutu zpožděný odjezd oproti předchozímu, např. linka 0, kurz 1 má odjezd v 00:00. Linka 0, kurz 2 v 00:01. Linka 1, kurz 1 vyjíždí v 00:02, apod. Tímhle mám jakýsi základ pro pozdější výpočty. No, pak jen spustím simulaci a záznam (jop, i na ten jsem 2× úspěšně zapomněl. 15 minut se dívám, jak mi tam hezky zrychleně jezdí šalinky, říkám si, že to bude zábava se prokousávat naměřenýma datama a pak zjistím, že neměřím).
    3. Tady se asi odchyluji od toho, jak to děláš ty, ale stále vidím analogii. Simulaci nechám běžet pár hodin simulačního času, záleží na rozloze. Jakmile mi všechny vozy udělají dostatek koleček, tak to odpískám. Z log souboru odstraním zbytečné sloupce a data, částečně metodou „najdi a nahraď ničím“ a částečně smazáním sloupců v Excelu, kam si to hodím. Pak mě čeká napsání pár vzorců a rozšíření pro celou oblast, kde mám data (ty si teda ještě třídím podle linek). Tam se mi vždycky vypočítají následující časy: od konečné na SB a na protilehlou konečnou. A zase. (setkávací bod je bod na nějakém křížení, kde se vyjíždějící vůz z vozovny dostává na svou trasu. A i kdyby to bylo přímo u vozovny, tak tam stále ta minutka bude. Někdy i 2. Nebo 3, pokud jsi megaloman jako já. A to je čas, se kterým je nutno počítat). Tímhel získám hromadu časů, které jsou v několika skupinách. A všechny ve stejné skupině by měly být stejné. mohu tím i odhalit nějaké chyby v síti, nejčastěji absenci rychlostníku, nebo špatně nastavený, apod. Pokud jsou nějaké časy moc mimo. To tam vždycky budu mít, prostě lidská chyba. Takže jdu měřit znova a dělat to celé znova (nejspíš následující den, protože po zbytek stávajícího budu příliš otrávený na to, abych to dělal znova). Jak říkám. Je to na dlouho. Urychlit to nejspíš nejde.
    4: JŘ mám obvykle už připravené. Ty dělám někdy před měřením, nebo i po, ale stále zcela ignorující data z něj. Protože data z měření prostě neovlivňují, jak si udělám JŘ, ty stanovuji podle důležitosti a plánovaného využití linky, podle toho i vybírám délkovou kategorii vozů a její rozptyl. Interně používám několik termínů (poslední verze definice všech mi zabrala asi 1,5 stránky). Každopádně, podle intervalu (nejkratšího) v JŘ stanovuji poloběžnou a oběžnou dobu. Protože to, za jak dlouho je šalina schopná se dostat z T0 do T1 nebo naopak (časy by měly být stejné (při symetricky umístěných zastávkách)), je při měření ten nejkratší možná čas. Polooběžná doba je pak nějaký vyšší násobek intervalu, obvykle tak o 2 stupně. Mám-li polooběžnou dobu 57 minut a nejmenší interval 5 minut, tak řeknu, že polooběžná doba bude 01:15. Je tam rezerva, poměrně značná, protože vím, že linka je pravděpodobně dlouhá, takže pravděpodobnost nějaké chyby je větší. Oběžná doba je pak dvojnásobek, 02:30. Odtud i vím počet kurzů, co na lince budou potřeba: jen to vydělím intervalem. Tady by to bylo 30. Dlouhá linka, no.
    5. Koukám, že tady taky počítáš s nějakou analogií toho, co jsem před tím popsal. Jasně, pro noci (pokud linka má noční část) a víkendy je to jiné. V každém JŘ jsou pak různé časové zóny, zpravidla odlišeny jiným intervalem, takže tam je vždy potřeba jiný počet kurzů. Jasný. Ráno plynulý výjezd všech…
    6. Výpočty, jasný, ty jsou otrava, je to těžký. Excel částečně pomůže, pokud pronikneš do tajů řádkového programování (a nebudeš při tom zvracet). Já jsem za celou tu dobu udělal už pár chytrých tabulek, ale ta logika je stejně vždycky na mně. Jasný, pak teda musíš stanovit služebáky. Ke každému času přiřadit číslo kurzu, co ho pojede. Pro obě konečné. Já to dělám tak, že konečná, co má nižší číslo, dostává jakousi přednost, na začátku časové zóny, co má nejnižší interval a zároveň začíná nejdřív, začíná i kurzový sled. Tam totiž už budu potřebovat všechny, takže není nic jednuššího, než jen přiřadit čísla od 1 do kamsi. Tohle je jakýsi základ, od kterého se pak mohu odpíchnout. A pak používám techniku projekce. Kouknu se, vidím, že kurz 1 vyjíždí z T13 (např., technické označení v síti) v 07:00:00 na T25, polooběžná doba je 01:15, takže vím, že tenhle kurz bude z T25 vyjíždět v 08:15:00, a že tam bude v 07:57. Teda, ne tak docela, bude vyjíždět v nejbližší čas k tomuhle času. A vím, že před 1 jsou zase čísla nejvyšších kurzů, takže takhle si to všechno hezky doplním. Jedna konečná se projektuje na druhou a naopak. Polooběžná doba by se teoreticky měla měnit se změnou intervalů, ale když si je zvolíš chytře, tak se tě tohle netýká. Z pravidla by ty čísla měly být soudělný a polooběžná doba by měla být nějakým násobkem všech. To je ale vcelku jednoduchý zajistit, a i kdyby ne, tak ten rozdíl není tak šílenej. Jen je pak dobrý si to ověřit, jestli se tam ten kurz doopravdy stihne dostat a jestli tam bude mít nějakou rezervu. Zátahy, jasně, ty jsou jednoduchý. Já je do JŘ dávám, s poznámkou, že jede po své trase jen do jisté zastávky a pak do vozovny. Pokud to teda nevyjíždí a nezatahuje režijně (což je o něco rychlejší).

    Proces to náročný doopravdy je, ale po čase budeš schopen linku (po měření a kompilaci dat z měření v nějaké užitečné) zprovoznit tak do 2 hodin.
    Ale stejně jako ty, ani já nejsem s tímhle způsobem spokojen. Vadí mi, že to všechno musím dělat já. Byly doby, kdy jsem to kompletně z hlavy počítal. Teď za mě hrubé výpočty dělá Excel, díky bohu, ale ani to mi nestačí. Programuji nástroj, co tohle udělá za mně. Ty jsi vývojář webových stránek, já zase prachobyčejný amatérský programátor. Ale už před dlouhou dobou jsem si uvědomil, že v programování se skrývá neskutečná síla. A také to, že můj algoritmus je deterministický, díky tomu, že jsem stanovil jistá pravidla. Například to, že panuje kurzový sled, že JŘ se sestavuje metodou časových zón, že linka je izolovaná, má vlastní množinu kurzů, není zde žádná provázanost, apod. Je to idealistický a zjednodušený pohled na věc, jistě, ale pro potřeby BAHNu stačí a je ve skutečnosti dost mocný. Co jsem tak hledal, tak jsem zjistil, že žádný takový program neexistuje. Takže jsem si začal vytvářet vlastní. Někdy se k tomu zase musím vrátit. Protože jakmile tu mám gigantickou síť, kde bude třeba 100 linek a já bych to měl všechno počítat současným způsobem, tak ne, ani omylem.
    Jak to bude hotové, tak program mi dovolí vytvořit si JŘ, zadám do něj pak data o lince, kliknu na jedno kouzelné tlačítko a program mi vygeneruje služebák a časy výjezdů a zátahů, v takovém formátu, abych to mohl pak nakopírovat do BAHNu, do nějakého bodu změny parametrů, aby se to nahrálo do jednotlivých vlaků. Výjezdy taky není prdel dělat, musíš se s časem výjezdu z vozovny vždy trefit přesně mezi 2 kurzy, aby se takhle pěkně zařadily na SB. Tohle je opět moje další zákonitost, co mi přijde poměrně práci-usnadňující, apod. Navíc, funkce na časové průměrování už mám. Myslím, že i funkce na vytváření JŘ, jen trochu bojuju s UI. Ale to je zase jiný příběh.

    Předpokládám, že moje odpověď asi moc nepomohla. Za sebe mohu říct ale to, že na to jdeš správně, stejně jako já (což z toho nedělá správný způsob, jen oba víme, že to funguje). Věř mi, že by to mohlo být daleko, DALEKO komplikovanější, mám už i nějakou představu, jak by to vypadalo (vezmi si, když provážeš 2 linky, že sdílí vozy. A pak něco počítej…). Snad tě potěší, že na aplikaci na tyhle výpočty už někdo dělá. Ano, taky jsem línej, chci, aby to za mě dělal komp. Co já bych se namáhal, že ano? 🙂 Zvlášť, když mi tu sedí 4jádro.

    #4748
    greeny
    Účastník

    Ahoj, díky za vyčerpávající odpověď 🙂

    Trošku upřesním některé věci.

    1. Klidně si o mně mysli, že jsem divnej, ale já BAHN nepoužívám tak jako jsi popsal – postavit síť, pak naplánovat linky. Já radši simuluji „růst“ města (ve velmi zrychlené podobě), kdy postavím nejdřív nějakou malou vesničku s jednou linkou a postupně rozšiřuju, přidávám další sídliště, silnice, tramvaje, vlakové nádraží, apod. Samozřejmě v průběhu totoho procesu se mi linky mění. Archivuju si každou větší změnu, takže pak můžu pozorovat celý proces růstu města.
    2. Z důvodů zmíněných v 1. potřebuju většinou načasovat jen jednu linku, protože ostatní již jezdí. Proto nepřipadá v úvahu tvoje řešení (pustit všechny linky zaráz a měřit to).
    3. Ze tvého i mého způsobu nakonec vyjde výsledek. A to výsledek ve formátu:
      • čas jízdy mezi konečnýma, čas jízdy z depa na konečnou (nebo na setkávací bod, ve výsledu je to jedno)
      • jízdní řády linky
    4. Z těchto výsledků je potřeba správně nastavit výjezdy a zátahy, což oba řešíme manuálním počítáním, přitom v tomto místě může nastoupit výpočetní technika, vždyť to je proces s jasnými pravidly a dá se zautomatizovat 🙂 .
    5. Včera večer jsem ještě trochu experimentoval s tím výpočetním programem co dělám a jsem asi na trochu jiné větvi, než o čem jsi mluvil ty, ale já tam zadám např. mezi 6:10 – 8:50 bude linka jezdit v intervalech 5 minut, mezi 14:20 – 18:40 bude interval 7 minut, zbytek bude 12 minut a linka bude jezdit od 5:20 do 23:50 (fiktivní data). Nu a program mi vyhodí jednak jízdní řády pro obě konečné a jednak data o výjezdech a zátazích pro jednotlivé vozy. Jízdní řády to umí i ve formátu, kde jen zkopíruješ text a v BAHNu klikneš na „vložit ze schránky“ 🙂 . Bohužel to ještě nefunguje ve všech případech, ale dělám na tom 🙂 .
    6. Trošku offtopic dotaz, ale jak řešíš situaci, kdy výjezd má být do určité konečné? Já (jakožto začátečník) mám výjezdy jen do jedné konečné a tím pádem druhá konečná má jen posunuté časy oproti první (což není zrovna reálná simulace).

    Díky 🙂

    greeny

    #4749
    b1
    Účastník

    Teď jsem na mobilu, tak jen krátce (rozepsat se můžu později, ale víceméně souhlasím s výše uvedenými základními myšlenkami).

     

    Ad poslední bod: při výjezdu nastavíš na bodu změny parametrů vozům linky 1 jedoucím na severní konečnou linku 1s, na jižní konečnou 1j. Při příjezdu na konečnou nebo po napojení trasy z vozovny na pravidelnou trasu změníš linku zpět na číslo 1.

     

    Rozlišit vozy při výjezdu z depa můžeš:

    – podle času výjezdu na sever/jih

    – podle pořadí, která jedou na sever a na jih

    – vozy na sever budou vyjíždět z jiné koleje depa než vozy na jih

     

    Jako inspiraci si můžeš vzít mou demo síť na starém fóru ve vláknu Vaše sítě.

     

    Od verze 3.88 máš možnost nastavit každé soupravě cíl, takže nepotřebuješ pomocné linky 1j a 1s, stačí nastavit cíle „sever“ a „jih“.

    #4750
    greeny
    Účastník

    b1: díky za odpověď, škoda jen, že nejde pro daný výjezd nastavit něco 🙂 že by hned při výjezdu mělo například určitý cíl. Pokud jsem to dobře pochopil, tak při zátahu vozidlo ztratí cíl (respektive po zátahu), takže nejde ho před vjezdem do depa nastavit „do budoucna“.

    #4751
    Pan Nikdo 0.
    Moderátor

    greeny:
    Vyčerpávající byla i pro mě. 😀 Zajímalo by mě, kolik lidí to mimo tebe četlo. 😀
    1: Ne, v pohodě, taky mě jednou napadlo dělat to takhle. Říkal jsem si, že by bylo velmi jednoduché postavit tratě pro jedinou linku, mít tam připojenou vozovnu, a později rozšířit. Jenže, to bych to nemohl být já. Já to nevydržím. V současnosti totiž pracuji pouze na Sokolově, mém rodném městě, který tu mám už ve 3 verzích. Je to vždycky tak, že se snažím se udržet v mezích a nedělat to moc komplexní. To se mi ale nepovede, takže vznikne velká síť. Takže pak vytvářím znova další, paralelně pracuji i na té staré. A takhle to pokračuje. Teď mám už 3 verze. Raději bych ale zahodil všechny ty malé a přijal megalomanii. 🙂 Pracoval jen na tom. Asi to i udělám. Ty malé verze nedávají smysl. Když máš zastávky šalin 0,2 až 0,5 km od sebe, tak to není moc dobrý.
    2: Ne, pozor na to, já vždycky spočítám tak 1 až 3 linky, a to pak testuju. Jde mi zejména o odhalení lidských chyb (data o jednom kurzu nakopíruju jinému, apod.). Už mám poměrně sebevědomí, numerické chyby zpravidla nedělám a v 90% můj výstup z Excelu funguje. Těch 10% je to, že odečtu třeba 11 minut místo 21. Že blbě udřívim nějakej kurz, takže se netrefí mezi 2. Na to pak stačí tam fakt jen všechno pustit, chvíli to sledovat, občas zastavit, kouknout se na pozice kurzů, na kurzový sled a očekovat, jestli to koresponduje s tím, jak by to mělo být. Jestli jo, jedeme dál. Jestli ne, tak jdu hledat chybu.
    3: Čas jízdy z vozovny na nějakou konečnou a ze SB na konečnou nejsou stejné. 🙂 Tam je obrovský rozdíl. A SB mi ulehčí strašně moc práce. Když mi nějaký kurz má vyjet na linku, tak se podívám, jak by to bylo, kdyby ve skutečnosti jel z protilehlého terminu, ne z vozovny. Říkám tomu virtuální odjezd. Ten si pak vytrackuju na SB, tzn., mám čas, kdy ten kurz musí být na SB. Je jedno, jestli jede z terminu nebo z vozovny. A přesně tenhle typ matematiky je pro člověka tak neskutečně otravný, a už se těším, jak budu psát zrovna tenhle kód, jak budu dělat funkci na tohle. To bude můj prostředníček na Excel a na počítání z hlavy.
    4: Přeně tak! Já stále nechápu, proč mi kámoš, programátor, tvrdil, že tohle není deterministické. Jasně, že je. 😀 Jsou tam doopravdy jasně daná pravidla, můžeš s tím trochu hejbat, jasně, ale většinou přece chci, aby se mi vyjíždějící kurz trefil přesně mezi 2 co jsou před a po něm, nebo pokud to je jeden z prvních, tak aby si dal rezervu, třeba 5 minut, což ve výsledku bude jen nějaký textbox, kam uživatel hodí nějaké číslo, já zkontroluju, jestli to není blbost, a vypočítám (teda, ne já, ale komp).
    5: No, myslím, že to děláme stejně. Já to mám taky takhle, na časové zóny. Od té a té doby v takovém intervalu, a takhle několik zón. Zeptám se ještě na nočnost, jestli to bude zajištěné nočníma kurzama, pro linku, co jede 24 hodin denně, a je to.
    6: Já mám vždy výjezdy na obě konečné. 🙂 Přesně jak jsem psal, SB, virtuální odjezdy, promítání, apod.

    #4753
    greeny
    Účastník

    Asi jsme se u bodu 3. špatně pochopili… Já tím myslel, že je jedno, jestli trackuješ čas vozovna -> konečná nebo vozovna -> SB. Jen je to pak potřeba správným způsobem zohlednit v excelu či kódu scriptu.

    Mimochodem, díky za odpovědi, sice jsem nedostal tu, kterou jsem doufal, že dostanu („hele, na to je jednoduchej postup: … “ nebo „hele, použij tenhle program: …“). Jdu se vrhnout na dokončení toho scriptu a když programátorský bůh dá, tak možná i bude fungovat (v tom případě bych neměl problém to někam sem hodit i pro ostatní 🙂 )

    #4754
    Pan Nikdo 0.
    Moderátor

    B1: No vidíš to, já pro určení směru používám jen čísla kurzů. Protože když dělám měření, tak to všechno jezdí už přes hotové křížení a signalizace, které počítají s pravidelným provozem. Rozlišuju to tak, že v síti mám vždycky „technické údaje“, čísla terminů, křížení, apod. Každá linka má 2 terminy, 1 z nich musí být zákonitě s vyšším číslama jiný s nižším. Takže vyšší kurz jede na vyšší konečnou, nižší na nižší. 🙂 Protože po celou dobu, co na tom dělám, se k terminům odkazuji přes jejich číslo. Jejich názvy ani nevím. 😀 Tím pádem ani nepoužívám cíle. Ty jsou zadány přes nějaký boz dměny parametrů na výjezdu z vozovny, poté, co vůz projede mezilinkovou konverzní tabukou, což je další bod změny parametrů, kde se vlastně řeší převod vozů z provozu o pracovních dnech na víkendy, abych nepotřeboval šílený množství vozů.
    greeny: No, technicky a detailisticky vzato to jedno není, ovlivňuje to položení logbodů a metodiku výpočtu, ale zhruba jasný, chápu. 🙂
    Jo, taková odpověď by byla fajn, že jo? Sorry, musím tě ale zklamat, nic takového neexistuje. Na druhou stranu, sám jsi přišel na to, jak se to dělá. Nezávisle na ostatních, předpokládám. To je taky docela fajn, ne? 🙂
    Jednoduchej postup na to bude, až jeden z nás dokončí svůj program. A vzhledem k mé časové vytíženosti předpokládám, že budeš dřív. Já tam stejně chci zakomponovat více věcí.

Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (celkem z 8)
  • Pro reakci na toto téma se musíte přihlásit.