Page 1 of 3

Add functionality to limit the number of incoming trains per station.

Posted: Wed Feb 26, 2020 3:15 pm
by ruspartisan
TL:DR
Add LTN-like functionality that limits the number of trains that can have a particular station (out of many with the same name) as a destination.
OR
Add some more signals for trains and stations so players can implement the limit themselves.
What
The easiest (for a player, I mean) way would be to have a configurable signal limit how many trains can have this particular station out of many with the same name as their current destination, so first N trains will go to this station, but for others it's effectively disabled and the station gets re-enabled for them only when the train leaves the station or some of the trains that had locked it's place in a queue decided to repath to some other station with the same name.
PROS: Very easy for the player.
CONS: Some may say it's too OP: effectively you make many vanila train control circuits obsolete, but the player still needs to dispatch trains only when there is demand.

Another, idea that is more difficult to implement (both for the player and for the developers):
1) Each station can provide a signal how much trains have it as their current destination
2) When leaving the current station train provide for a couple of ticks it's destination id signal through the current station. Player checks this signal, checks how many trains is the destination awaiting already, and send a signal to the train to wait more or proceed. If the train gets "wait signal", it tries to recalculate it's path to another station with the needed name once every N seconds.
3) Player should have some checkbox in a train schedule GUI that enables/disables choosing another destination when already on route.
PROS: Probably not-so OP as it needs more circuitry/knowledge
CONS: Worst-case scenario: you need a new wire signal for each station for providing incoming trains count, and there is a limited number of wire signals. Not clear what signal should the train provide as a destination station ID (probably it can be the same signal as a station uses). More things to implement. Doesn't sound very intuitive for a new player.
Why
Designing rail systems is one of the most interesting part of the game for me, and I really like playing with LTN mod. I know there are some vanila-train circuit networks with similar goals, when you have N stations with the same name providing materials, and a train can go to whatever station is open, but to my knowledge all of those have some problem with a situation when, say, you have 16 trains for delivering green circuits, waiting in the depot, and then one station can provide them, and suddenly all 16 trains decide to go to this station.

HTN, as far as I know, has something like this: if there is one train load available at any of the provider stations, allow only one train to exit depot, 5 loads - 5 trains will be dispatched, but even if these 5 loads are distributed over 5 provider stations all 5 trains will go to the nearest station at first and only when the first train arrives, signal-controlled rail signals will go red severely penalizing paths through this station 4 trains will go to the next provider.

As you can imagine, it makes designing stackers difficult when you don't know how many trains can arrive at the station. Worst-case scenario - all of them, which is OK if there are 2-3 trains for this product and very inconvenient if there are 16 trains.

LTN has a special signal that limits the maximum number of trains that can be sent to a particular station, therefore you can design stackers much easier.

To my knowledge you can't really implement this functionality in Vanila (at least in a useable way) because you don't have enough information: you can't read which train station out of many with the same name is train has as it's destination, you don't know how many trains already have any particular station as a destination, etc.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Tue Mar 17, 2020 4:41 pm
by ptx0
yep, as far as 'logistical challenges' go, trains already have plenty of them without adding in an arbitrary blindness to whatever is coming its way.

i.e. have a "Trains on the way" signal coming from the station if we check a box to output this signal.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Thu Mar 19, 2020 4:35 am
by Memesicle Kickflip
If you connect a train stop with a circuit wire, it can be set to

Code: Select all

send train ID (T)
enable/disable (T = 0)

Re: Add functionality to limit the number of incoming trains per station.

Posted: Thu Mar 19, 2020 8:18 pm
by tamanous
Memesicle Kickflip wrote:
Thu Mar 19, 2020 4:35 am
If you connect a train stop with a circuit wire, it can be set to

Code: Select all

send train ID (T)
enable/disable (T = 0)
That's true, and there are quite some more ways to smart this up (I got that you posted an easy-to-get-your-point-example). I once liked to use delayed self-deactivating stations with few exit-locked waiting bays (3 trains in = 1 in station + 2 on hold, 3rd+ will skip and reroute). But nowadays I number the stations and send the trains to very specific stations.

But the constant deactivation of target stations from trains en route causes massive rerouting and thus unnecessary traffic.


+1 for the OP

Re: Add functionality to limit the number of incoming trains per station.

Posted: Sun Mar 22, 2020 8:36 am
by ssilk
If you want feature like LTN, why don’t you use LTN? 8-)

Re: Add functionality to limit the number of incoming trains per station.

Posted: Sun Mar 22, 2020 6:39 pm
by ptx0
ssilk wrote:
Sun Mar 22, 2020 8:36 am
If you want feature like LTN, why don’t you use LTN? 8-)
can be done more efficiently without Lua scripting if implemented in C++.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Sun Mar 22, 2020 7:06 pm
by ssilk
I play now some years with LTN and CPU was never a problem with LTN.

More problems with just too much trains ... from my last world I found out that more than 600 trains slows Factorio down a bit. :)

Re: Add functionality to limit the number of incoming trains per station.

Posted: Sun Mar 22, 2020 7:28 pm
by ptx0
ssilk wrote:
Sun Mar 22, 2020 7:06 pm
I play now some years with LTN and CPU was never a problem with LTN.

More problems with just too much trains ... from my last world I found out that more than 600 trains slows Factorio down a bit. :)
anecdotal evidence, though - you can see measurable CPU use from LTN's Lua scripting in the debug output.

enable debug logging and watch it write to disk - those are all the updates it's processing all the time.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Tue Mar 24, 2020 2:52 pm
by gGeorg
ptx0 wrote:
Sun Mar 22, 2020 6:39 pm
ssilk wrote:
Sun Mar 22, 2020 8:36 am
If you want feature like LTN, why don’t you use LTN? 8-)
can be done more efficiently without Lua scripting if implemented in C++.
More over, LTN is too complex. Iinstall whole mode becouse of one critical feature calls for core game update.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Tue Mar 24, 2020 3:55 pm
by netmand
This will never happen. You're going to have to create a new paradigm to replace the, "lots of trains on the same schedule" methodology.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Wed Mar 25, 2020 4:40 am
by ssilk
ptx0 wrote:
Sun Mar 22, 2020 7:28 pm
ssilk wrote:
Sun Mar 22, 2020 7:06 pm
I play now some years with LTN and CPU was never a problem with LTN.

More problems with just too much trains ... from my last world I found out that more than 600 trains slows Factorio down a bit. :)
anecdotal evidence, though - you can see measurable CPU use from LTN's Lua scripting in the debug output
I never said it will not be measured, and at the same time with 600 trains that’s still the smallest impact. :)

@gGeorg: yes, LTN is too complex. :) One simple construction failure and you can produces kilometers of deadlocks , because a station requests too much trains. The original idea was a lot simpler than it is now. But you can reduce the complexity a lot if you just play with fixed length trains. LCC trains (1 loco, 2 cargo wagons) seem to be a nice compromise if you want to transport more than just ores and plates. But you need huge train stations.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Tue Apr 21, 2020 8:00 pm
by tamanous
---

The "solution" shown in this post is not working. I did not choose the settings correctly: I got too few trains, and their timing was all the same. By adding more trains and ramdomising their programming, the system broke. But even without that mistakes, it did not work as proposed. The trains still do not repath when already stopped.

I reduced the original post at some extent.
---

Setup:
I increased the length of the waiting bays to add rail signals just before the chain signals at the exit of each lane. These additional rail signals
are connected by wire to be used as sensors to detect if the lane is occupied. Let's say there are 5 waiting bays lanes, so when every lane is occupied, RED with value of 5 is send.
Instead of the typical chain signal infront of the waiting bay, I used a rail signal That rail signal is set to Close Condition: RED = 5.

One would suggest, that when the rail signal at the entrance is red, trains would still head towards the waiting bay and wait on the tracks before it. In fact, they will do just this, when there is a -unwired- rail signal infront of the waiting bay.
But when this rail signal set to red by wire condition, incoming trains actually -do- repath and will no longer head towards that waiting bay.

The problem is, that often trains will be to fast to stop at the chain signal before the crossing, when the rail signal after the crossing is set to red. Then they stop will stop right on the crossing and clog it, before heading further into the waiting bay, clogging the entire waiting bay. From time to time you can see the "no path" info floating above it, proving the initial finding. On the positive side, this is not that bad: it just means another train in the waiting bay. Every train after the stuck one will repath.

Blueprint string for testing setup inlcuding trains and fuel.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Tue Apr 21, 2020 8:19 pm
by mmmPI
there is this topic viewtopic.php?f=5&t=80501 started from a discussion in an FFF.

the title is : Request: Max number of trains for stations. similar suggestion, this one boskid took quite some time to test and answer.

In this topic are referenced other similar suggestions : 64162 70248 56375 67740

I would tend to think this won't get implemented.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Tue Apr 21, 2020 8:24 pm
by tamanous
Nice, thank you.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Tue Apr 21, 2020 9:38 pm
by disentius
Why would you close that signal with a wire? that is what chain signals are for.
If you replace the wired railsignal with a Chain signal, trains will not clog the intersection.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Wed Apr 22, 2020 12:17 pm
by tamanous
Let's say the waiting bay has the 5 lanes as shown in the screenshot. Let's further imagine that there are 20 trains going to that waiting bay. The problem is, when the 5 lanes at the waiting station are full, 14 trains (one is at the station behind the waiting bay) will wait on the railroad before the waiting bay and hinder all other trains that want to drive through.

You want to repath the 14 trains to go somwhere else. Forcing to repath could be done by deactivating the station they are heading towards, too.


I do not understand the logic of trains choosing a station, except that they prefer the closest one. What I can see while watching this setup for one or two minutes is,that instead of going to the free station that is further away, the trains wait until the waiting bay is empty to enqueue there.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Wed Apr 22, 2020 12:49 pm
by disentius
Hm... I think I dont understand your point then. Was referring to your test setup.
I believe it is covered by this rule on the wiki:
2020-04-22 14_44_37-Railway - Factorio Wiki.png
2020-04-22 14_44_37-Railway - Factorio Wiki.png (17.16 KiB) Viewed 21784 times
https://wiki.factorio.com/Railway/Train_path_finding

Re: Add functionality to limit the number of incoming trains per station.

Posted: Wed Apr 22, 2020 3:46 pm
by tamanous
Yeah, you're right. There's still something off.

But thanks again for pointing to the problem: one often needs to repath trains that are currently stopped.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Wed Apr 22, 2020 7:41 pm
by tamanous
Disabling the station with Enable Red < [number of waiting bay lanes -1 ] works better, as it seems to force even stopped trains to repath.

This time I did some more testing and ran in the expected problem, but did not find any other problems: when the number of trains exceeds the number of waiting bay lanes, it is possible that all waiting bay lanes are occupied and thus all all trains get a No path.

Re: Add functionality to limit the number of incoming trains per station.

Posted: Wed Apr 22, 2020 7:45 pm
by disentius
tamanous wrote:
Wed Apr 22, 2020 12:17 pm
...
I do not understand the logic of trains choosing a station, except that they prefer the closest one. What I can see while watching this setup for one or two minutes is,that instead of going to the free station that is further away, the trains wait until the waiting bay is empty to enqueue there.
It is a bit more complicated than that. again, here: https://wiki.factorio.com/Railway/Train_path_finding

Trains calculate their path based on lowest cost. That is not the same as shortest path. Complications are the penalties for various conditions. Also, the train calculates its path before it leaves its origin station. in a moderately busy train network that condition changes before it reaches its destination. that is why there are so many path recalculate rules lower down.