Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Maximale Schiffanzahl pro Feld
#1
Alle Typen sind irgendwie Platzbeschränkt.
LKWs verursachen Staus, Züge resevieren ihre Schienen, Flugzeuge haben Haltebuchten.
Nur die Schiffe lassen sich 1000fach übereinander lagern.

Ich würde daher vorschlagen, das maximal 3 Schiffe auf einem Feld sein dürfen.
Wovon maximal 2 Stehen können. Auf die Art und Weise verhindert man Deadlocks.
Schiffe müssen immer bis zum nächsten Feld an dem sie anhalten können den Weg reservieren, wenn das nicht geht pausieren sie, bis es geht. (Dann kommt echtes Rheinfeeling auf bei dem Schiff an Schiff den Fluss entlangschippert anstat alle aufeinander)


Die seltenen Fälle in denen ein User den Fahrplan öffnet und so das Schiff anhält sollten kein Probleme sein weil es sehr selten Eintritt. Ausserdem wird er diesen Fall genauso leicht korrigieren können wie andere selbstverursachte Deadlocks (da auch von diesem Feld aus der Weg zum nächsten Stehfeld frei ist).


Später lässt sich das sicher noch so erweitern das freie Plätze im gesamten Hafen gesucht werden.
Auf die Art und Weise machen umfangreiche Hafenanlagen endlich Sinn.



zum Speicherverbraucht benötigt werden 2 bit pro feld. (oder falls der Simutranscode bereits cool ist garnix extra). Beim zuruecksetzen von 2 auf 1 kann ja überprüft werden ob die Schiffanzahl tatsächlich nur 1 beträgt (da ja beim laden alter Karten durchaus 200 schiffe an einer Stelle sein können würde ich in einem Fall mit mehr als 3 Schiffen auf einem Feld 2 als Standardwert eintragen um Userbeschwerden vorzubeugen)

der Speicherverbrauch macht bei einer 256x256 Karte lächerliche 16Kb
maximal (falls man 8 bit braucht, weil man das Byte an den Weg anknüpfen muss) wäre es bei einer 1024x1024 Karte nur 1MB (was für Leute die solche Karten spielen kein Problem sein sollte).

Rechenzeitmäsig müssen die einzelnen Schiffe nur checken ob das nächste Feld ausreichend frei ist.
Sonst brauchen sie ein Wegobjekt, in dem ihr Weg bis zum nächsten Feld an dem sie stehen können eingespeichert und reserviert ist. (macht im normalfall nur 4Byte extra für den Pointer)

(wenn ich Zugang zum Code hätte würd ichs als patch selber coden)
Zitieren
#2
Es passen maximal 16 Fahrzeuge auf ein Feld, Schiff und Flugzeuge eingerechnet. Da ein Kästchen ca. 1km lang ist, sollten schon ein paar Schiffe hinpassen, in Realität hätte ich kein Problem auf einem Kilometer Breite ca. 30 Schiffe nebenaneinander anzuordnen.

Außerdem hat ja ein Hafen viele freie Felder, nur die alle anzupassen finde ich zu mühselig; aber es steht dir frei, allen Schiffen ein anderes Feld zuzuweisen.

Und wie macht man das Deadlockfrei dann bei Kanälen? Wenn, dann müsste ich auch die Richtung testen. Alles kein Problem, nur habe ich selten mehr als drei Schiffe voll bekommen. (Und wenn alle Schiff im Hafen warten, dann hast du eh zuviel Schiffe im Einsatz,)
Zitieren
#3
Aber auf 1km Straße müssten dan auch ne menge Buse hinpassen und die stauen sich ja, wen man es jetzt andersrum betrachtet
Zitieren
#4
Und ein Grundstück in der Stadt hat 1 km²?
Zitieren
#5
Meckerheinis!

Grundsätzlich bin ich für jede Idee, jeden Wunsch offen - aber ich muss sagen, dass ich hier Prissi Recht gebe.
Eure nicht unbedingt fairen Konter bekräftigen meine Meinung.
Zitieren
#6
@prissi es ist deadlock frei (bis auf Spezialfälle), Richtung ist komplet egal.

Es gibt auch Passagierschiffe und manchmal müssen Schiffe 2 Kontinente Verbinden (dazu noch apoteken versorgen etc).
Und da Schiffe relativ langsam sind, braucht man tatsächlich für längere Strecken deutlich mehr Schiffe. Was dazu führt das pro Linie schonmal 2 oder 3 Schiffe notwendig waren, ich hab z.B. jetzt einen Hafen der von 11 Schiffen angesteuert wird wovon 3-6 an ihm warten. Und der hafen ist genau ein Feld breit, deswegen kam ich auf die Idee)

Der Grundgedanke hinter der ganzen Geschichte mit Deadlock ist, das nur 2 Schiffe stehen können 3 aber gleichzeitig auf ein Feld dürfen. Damit ist immer ein Slot fuer Wege frei. (ich hab anno dazumal ein 2D Echtzeittestspiel gebaut, was auf dem Prinzip aufbaut. Deadlocks sind bei entfernteren Zielorten nicht möglich)

Also 3 Slots pro Feld. Das Schiff reserviert seinen Weg bis zu einem Feld an dem es stehen kann.
Wenn das nicht geht, weil bei einem Zwischenfeld alle 3 Slots voll sind, wird sich dieses bald geleert haben, nachdem ja ein Slot nur eine Bewegung ist und das Schiff darauf nicht stehen kann. Das wartende Schiff selbst verursachte keine Regelbrüche weil es ja auf seinem Feld sowieso nen WarteSlot reserviert hat.

(das ist der Grund warum es keine Deadlocks geben kann, der Gedanke dahinter ist ähnlich wie meine Deadlockfreie Bauweise beim alten Signalsystem mit Vorsignalen, oder der Grund warum es beim jetzigen Zugsystem kein Deadlocks zwischen Haltestellen gibt und die Deadlocks die man durch falsche Haltstellenwahl aufbauen kann, wird es bei Schiffen nicht geben, weil sie an jedem Feld dazwischen ne Pause einlegen können, und ausserdem Metrisch fahren (sprich es gibt keine Richtungsschilder).)

Das Verzichten auf Richtungsschilder ist tatsächlich nötig um immer Deadlockfrei zu sein. Wer sie verwendet, macht sich allerdings normalerweise Gedanken darüber (bei schiffen sind sie selbst dann noch extrem unwahrscheinlich). Das ganze System verändert tatsächlich nur was an den Häfen.

Beweis:
Ein Deadlock entsteht wenn A->b will von C daran gehindert wird und C->d will und (ueber mehrere Schritte) von a daran gehindert wird. Oder Das A->b will und sich selbst im Weg steht

Fall 0
A steht sich selbst im Weg, ist nicht möglich. Weil a auf seinem Feld bereits nen Warteslot belegt und dort warten darf. Bzw garnicht erst losfährt.

Also:
Annahme >->b wird von C gehindert.
Fall 1 C steht da nur rum.
Fall 1a C Steht auf dem Weg und nicht dem Ziel
da Anzahl stehender Schiffe < als Anzahl fahrender Schiffe. gibt es fuer a die Möglichkeit über das Feld zu fahren. Falls A diese Möglichkeit nicht hat liegt es also nicht an C sondern an einem Schiff E was wiederum nicht rumsteht ->Fall 2. (ausser wir haben alte Karten geladen, aber da gilt die sonderregel das wenn mehr als 2 schiffe auf dem feld sich befinden sie als 2 Schiffe eingetragen werden).
Sollte E auch rumstehen gilt das gleiche wie hier und es muss an F liegen was nicht rumstehen darf (nach der maximal 2 Schiffe dürfen stehen Regel)

Fall 1b C Steht auf dem Ziel

Fall 1b' Entweder das feld ist mit C und einem Weiteren die dort warten besetzt, dann kann A da nicht hin, (aber A kann relativ nahe meist Nachbarfeld hinfahren) deswegen gibts ja die Regelung. (aber das ist nicht der deadlock fall, weil C ja garnicht vorhat weiterzufahren, das ist ein ganz normaler Ladestau wie ihn ne LKWkolone einer Linie an nem Frachthof hat, der genau wie dort den Verkehr dorthin oder zum Nachbarfeld einschränkt).
In der Erweiterung würde sich A einfach einen anderen Platz an dem Hafen suchen, und diesen Ansteuern. (Auch dabei wird kein Livelock entstehen können, das liegt an der metrikstruktur von Simutrans)

Fall 1b'' C steht dort wird aber von A daran gehindert wegzufahren.
Das geht nur unter den Umständen das A zum Deadlockeintritt genau auf dem Feld Stand, zu dem C hinwill. (Das ist tatsächlich der einzige Deadlock Fall mehr unten). Falls C nicht dahinwill wo A steht kann es nachdem auf jedem Weg ein Slot frei ist auf den nur drübergefahren werden darf aber nicht gehalten. zum nächsten Feld auf seiner Route fahren an dem es Halten darf ->kein Deadlock


Fall 2 C steht da nicht rum sondern fährt über das Feld (und ist in bewegung oder hat dieses Feld nur reserviert)

Fall 2a C ist in Bewegung Widerspruch zu Deadlock
Fall 2b C hat dieses Feld nur Reserviert.
Wenn C das getan hat, dann hat es eine durchgehende Strecke bis zu seinem Punkt an dem es Stehen bleiben kann reserviert -> es gibt keine Behinderungen die Bewegung von C kann beginnen -> kein Deadlock


Fall 1b''
man nehme einen Kanal - ist ein feld

A----------db----------C
wenn die Zielendfelder direkt nebeneinander liegen wie hier gezeigt, ist tatsächlich ein Deadlock möglich.
(sollten sie weiter auseinander liegen, gibt es ein feld dazwischen wo a oder C pausieren kann und das andere Schiff vorbeilassen)
-----------AC--------- deadlock

alles andere wie
A--------dXb----------C
führt zu
----------AXC------
----------bAC-----
----------bCA----
----------CXA-----
(wobei X ein eventuel wartendes schiff ist verursachte keine deadlocks)


Der lässt sich aber mit einer einfachen Abfrage testen. Wenn das Schiff an seinen Endzielort nicht kommt (und nur dann), kann es testen ob ein Schiff darauf geblockt ist, was über das Feld fahren möchte auf dem es steht. dann gibt es nurnoch einen Dreiecksdeadlock.

Das war die Bewertung meines ersten Vorschlags. Ich werd das ganze Model nochmal überarbeiten um sicherzugehen das es wirklich keine Deadlocks geben kann.
Zitieren
#7
Du kannst durch die manuelle Wahl des Wartefeldes am Hafen doch selber verhindern, dass mehrere Schiffe "übereinander" warten. Das Hafeneinzugsgebiet gilt nicht nur auf, sondern auch neben den Hafengrafiken.
Zitieren
#8
Zum Thema Deadlockfrei: Ein drittes Schiff, dass am Hafen halten soll, ist doch auch in Bewegung, wenn es das Feld betritt und weiß gar nicht, dass es dort halten soll (das weiß nur der zugehörige Convoi). Auch gibt es Schiffe aus mehren Teilen (z.B. Ölschute und die Schubschiffe im German). Und wie du schon schriebst lassen sich Deadlocks nicht vermeiden, speziell wenn von zwei Seiten Schiffe kommen.

Man könnte natürlich eine Neuberechnung der Route anstoßen; aber leider ist das so ziemlich die zeitaufwändigste Option, die denkbar ist und scheitert in engen Schiffahrtsstraßen.
Zitieren
#9
Wissen Schiffe nicht wie Züge, wohin sie sollen? und können sich jeweils Stückweise die Fahrstrecke reservieren?
Mehr wäre ja nicht nötig.

Das bei Convois die aus mehreren Schiffen Zusammengesetzt sind, der hintere Teil nicht weis ob er an einem Feld stehen wird ist klar. (Allerdings weis es ja der Convoi), und das ändert am prinzipiellen Gedankenspiel auch nicht so viel. Er kennt ja seine geplante Route, und muss halt bis zu entsprechend vielen Feldern mit Steherlaubnis reservieren.

Aber übernehmen bei Zügen z.b. nicht auch die Convois die Reservierung oder tun das tatsächlich die einzelnen Wagen?


Ne Routenneuberechnung sollte nicht nötig sein (ausser wenn am Hafen das Zielfeld besetzt ist, das wäre dann wie das Wählsignal)
Zu dem Deadlockproblem überlege ich mir noch was.

Alternativ etwas vereinfacht, da es mir ja sowohl darum geht ne Maximalkapazität von Kanälen zu haben als auch grössere Hafen nötig zu machen.
Man könnte zumindest das 2. verwirklichen, indem Schiffe 4 Felder bevor sie an ihren Hafenziel sind, ihren Liegeplatz reservieren und falls dieser schon zu voll ist (1-2 schiffe stehen dort)) sie das näheste freie Hafenfeld reservieren und dort hinfahren. (Das ganze könnte so laufen das erst alle Felder mit maximal 1 Schiff besetzt sind und dann alle mit nem 2. besetzt werden, und sie dann warten, wie z.B. in der Realität in Singapur)
Zitieren
#10
Die Hälfte der Karten ist oft Wasser; eine Reservierung kostet vier Bytes extra und ist völlig sinnlos, weil auf 1x1km^2 in Realität auch fünf Schiffe passen.

Die Fahrzeuge bewegen sich völlig unabhängig vom Convoi. Der kümmert sich nur um die Höchstgeschwindigkeit und das nächste Feld. Ich meine, Programmieren lässt sich viel, nur finde ich es hier völlig unnötig. Eher würde ich bei den Flugzeugen was ändern ...
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste