Deutsches Simutransforum

Normale Version: [Problem - 120.1.3] Änderung Linienfahrplan
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2

Wurzelgnom

Ändert man den Linienfahrplan kommt das bei den Fahrzeugen nicht an.

Also der Fahrplan der Fahrzeuge wird schon aktualisiert ( zumindest beim öffnen ), aber die Wegsuche bleibt die alte.

Man muss also jedes Fahrzeug der Linie anklicken und den Fahrplan öffnen, damit die neue Linie wirklich ankommt.

Dachte das war mal anders gewesen.
Keine Ahnung ob es inzwischen einen Fix dafür gibt ( sofern das ein Bug sein sollte ), verfolge das nicht so.
Die Fahrzeuge suchen erst einen neuen Weg beim nächsten Halt. Das war aber schon immer so. (Öffnen eines Fahrplans ist intern derselbe Status wie das nächste Zeil am Halt suchend.

Wurzelgnom

Das Problem ist halt, wenn man auf Grund von Staus Linien verändert ( Wegpunkte hinzufügen ) muss man anschließend alle Fahrzeuge ( können über 40 LKW sein und mehr ) einzeln anklicken und den Fahrplan öffnen.

Wäre hilfreich das von Hand anstoßen zu können für alle Fahrzeuge einer Linie.

Wurzelgnom

ich korrigiere, es sind mehrere hundert Fahrzeuge zum Fahrplan öffnen

Simutrans 120.1.3; pak64.german 112.3.4

p64g_640x384_1933-2000_v120.sve ~2,5 MByte
Ich kann mich da auch an die ein oder andere Fahrplanöffne Orgie erinnern und habe auch schön häufiger an das Thema gedacht.
Wenn alle Fahrzeuge beim Ändern des Linienfahplans automatisch neu geroutet würden, wird man damit wohl auch nicht immer glücklich werden.
Ein Button, der funktioniert, als würde man gleichzeitig alle Fahpläne einer Linie öffnen und wieder schließen, den man dann wahlweise benutzen kann, wäre trotzdem nett.

Wurzelgnom

Automatisch hätte den Vorteil das man es nicht vergessen kann.

Wegen der Performance, da wäre es ggf möglich die Karte in Pause zu versetzen.
Die Funktion wäre durchaus praktisch, die Karte in Pause zu versetzen ist mit Blick auf den Multiplayer aber eine wohl eher nicht so gute Idee. Vermutlich besser wäre es nicht die Wegsuche aller Fahrzeuge der Linie gleichzeitig zu starten, sondern die Aktion in eine Warteschalnge einzureihen und diese dann nach und nach abzuarbeiten.
Ein größeres Problem sehe ich darin sinnvoll zu bestimmen welcher Wegpunkt bei einem solchen update als nächstes Ziel ausgewält wird.
Aktuell scheint es so zu sein, dass sobald man den Fahrplan eines Fahrzeugs öffnet und wieder schließt, der Wegpunkt der als nächstes angefahren werden soll nur dann angepast wird, wenn der aktuell angefahrene Wegpunkt nicht mehr im Fahrplan enthalten ist. In diesem Fall wird einfach der nächste Wegpunkt angefahren.

Für den Fall, dass auf dem Abschnitt in dem sich das Fahrzeug aktuell befindet nur Punkte wegfallen, ist die Lösung recht gut. Für den Fall, dass Punkte hinzukommen bzw. für den allgemeinen Fall, dass in diesem Abschnitt Punkte verschwinden und andere hinzugenommen wurden, ist die Lösung zusammen mit einer solchen auto update Funktion eher ungeeignet.

Man bräuchte also einen Algorithmus, der in einem solchen Fall den nächstbesten Wegpunkt bestimmt, wobei erstmal garnicht klar ist, was überhaupt der nächstbeste Wegpunkt sein soll.
Das wird jedenfalls vermutlich aufwendiger sein als die eigentliche Wegsuche.

Alles in allem eine tolle Idee aber ich vermute es wird nicht all zu einfach sein die umzusetzen. Mal sehen was Prissi dazu sagt.
Das Problem ist in der Tat das Wegpunkte dabei übersprungen werden könnten. Ist ansonsten aber einfach zu programmieren.

Man kann das Rerouten auch erzwingen, indem man ein Fahrverbot-Schild aufstellt oder eine Wegkachel temporär durch eine Brücke ersetzt. Dann routen alle Fahrzeuge um, wenn sie die Brücker erriecht haben, man muss dann nur einen einzelen selbst nach wegschicken.

EDIT: Aber im Falle festsitzender Konvois hilf das nichts, denn die würden, solange das nächste Ziel noch im Fahrplan auftaucht, weit dieses ansteuern.
Für das finden dieses Wegpunktes hätte ich auch schon eine Idee wie das halbwegs performant ablaufen könnte.

Fahrplan der Linie wird geändert:
1. erstelle eine Kopie des "alten Fahrplans der Linie"
2. bestimme veränderte Blöcke im Fahrplan. (relativ aufwändig aber nur einmal für die gesamte Linie notwendig)
3. signalisiere allen Fahrzeugen die sich in einem veränderten Block befinden, dass sich ihr Fahrplan geändert hat.


Mit einem Block meine ich den Teil des neuen Fahrplans, der zwischen zwei Wegpunkten liegt die im alten und im neuen Fahrplan existieren, wobei der Wegpunkt am Ende des Blockes eingeschlossen wird, der Wegpunkt am Anfang nicht.
Bestimme blöcke im Fahrplan:
1. Suche einen Halt der im alten und im neuen Fahrplan existiert.
-Gibt es keinen solchen Punkt, wurde der gesamte Fahrplan verändert. (Sonderfall: Fahrplan ist leer)
-Gibt es einen solchen Punkt, merke diesen als Block Start.
2. Vergleiche auf den im alten Fahrplan auf den Startpunkt folgenden Punkt mit dem Wegpunkt der im neuen Fahrplan auf den Startpunkt folgt.
-Sind diese identisch, existiert an dieser Stelle keine Änderung. Der folgende Punkt wird als neuer Block Start betrachtet und es geht wieder zu Punkt 2.
-sind diese nicht identisch, wissen wir, dass es eine Änderung an dieser Stelle gab. Markiere den im alten Plan folgenden Punkt als Block Ende un untersuche dies in Punkt 3 genauer.
3. Suche den Block Ende Punkt im neuen Fahrplan
-existiert dieser, markiere den Bereich dazwischen (im neuen Fahrplan) als Block mit Veränderung, setzte Block Anfang=Block Ende und mache mit Punkt 2 weiter.
-existiert dieser nicht, wissen wir, dass der Punkt entfernt wurde. Markiere den im alten Fahrplan auf den Punkt Block Ende folgenden Wegpunkt als neues Block Ende und es geht wieder zu Punkt 3.

In Punkt 2 sollte man natürlich vom letzten Punkt zum ersten gehen und nur so lange weiter machen wie bis man dort angekommen ist wo man angefangen hat.


Fahrzeug Fahrplan erneuern (wird nur für Fahrzeuge aufgerufen, die sich in einem veränderten Block befinden):
1. suche Weg von aktueller Position des Fahrzeugs zu jedem Wegpunkt in dem Block in dem sich das Fahrzeug befindet.
2. wähle den "besten" Weg davon als Ziel aus.

Mir ist völlig klar, dass dies zwar einfach aussieht aber vermutlich der schwierigste Teil davon ist. Ich weiß allerdings nicht wie die Wegsuche für Fahrzeuge intern aussieht und habe da deshalb nur sehr grob beschrieben.
Punkt 1 dürfte größtenteils die Wegsuche für einen erledigen.
Punkt 2 hängt stark davon ab in welcher Form die Wegsuche die Route zurückgibt.
Der "beste" Weg ist in diesem Fall vermutlich der kürzeste Weg.

Durch das Vorgehen dürfte das ganze, verglichen mit der Variante, dass man für alle Fahrzeuge das aufruft was beim schließen des Fahrplanfensters passiert, für größere Linien meistens performanter ablaufen.
Ich muss echt mal C++ lernen... Irgendwie habe ich das Gefühlt immer wenn man meint die eine Sprache halbwegs verstanden zu haben, kommt etwas um die Ecke wofür man die nächste Sprache können muss...
Nun, mehr oder weniger so läuft das schon ab; mit dem Unterschied, dass nicht alle Fahrzeuge auf einmal die Routensuche anwerfen (und bei hundert Fahrzeugen Simutrans im schlimmsten Fall (Schiffe) erst mal eine Minuten hängt), sondern eben erst, wenn sie den nächsten Halt erreichen. Sonst wäre das eine Aktion, die ein Netzwerkspiel (gerade bei schwächerem Server) schnell zur Desync treibt.

Der kleine Unterschied, nur dann einen Wegsuche aufzurufen, wenn sich das Ziel geändert hat, wäre auch schnell programmiert.
Seiten: 1 2