Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/oleander/trainspotting
Trainspotting using Java
https://github.com/oleander/trainspotting
Last synced: about 2 months ago
JSON representation
Trainspotting using Java
- Host: GitHub
- URL: https://github.com/oleander/trainspotting
- Owner: oleander
- Created: 2011-01-18T18:24:32.000Z (almost 14 years ago)
- Default Branch: master
- Last Pushed: 2011-02-01T20:06:32.000Z (almost 14 years ago)
- Last Synced: 2023-04-10T09:40:13.587Z (almost 2 years ago)
- Language: Java
- Homepage:
- Size: 453 KB
- Stars: 2
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.markdown
Awesome Lists containing this project
README
# Trainspotting
## Post-submit found errors (PLEASE READ)
Unfortunately our submitted code had a minor error in it. The trains don't sleep
enough when they turn around. We would highly appreciate it if you could
make this very minor edit yourself, instead of instantly rejecting the solution.In Train.java, please change **line 111*** from
sleep(1000);
to
sleep(3000);
Or something like that.
## READ FIRST
Please consider reading this README-file at our github repo, where it is
formatted in a more pleasent way.[Click here](https://github.com/oleander/Trainspotting)
## Authors
Arash Rouhani, cid rarash
Linus Oleander, cid oleander
## Background
We've implemented trainspotting generally. That means we have not hardcoded anything.
Consequently, the program must read the train-file, and it must be passed as an argument.Our solution can handle almost any map, as long the sensors are sensibly placed and the
max velocities are reasonable.## Sensors
We first specify how our general solution expects the sensor placement, then we
continue to discuss the sensor placement for the particular map (that was the actual assignment)### Placements of Sensors
Placing of the sensors must be sensible, formally:
- Before each crossing, in all four directions.
- Before each switch, in all three directions.
- Before each turn-around point.One single sensor can safely act as both a Crossing-sensor and Switch-sensor.
Sensors not abiding the bullets above will be ignored in that diretion that
they are not abiding a rule. (Which is of course very common, used as a margin)### Sensors in the particular map
The placement has been done to abide the rules above in one direction, which leads to using many sensors.
One could conversely let each Sensor act as a bi-directional Sensor, that would lead to less sensors.We choose many sensors which effectivly means good train flow, rather than few
sensors which would end in bad train flow, but high maximum velocity.## How the solution uses semaphores
We've realized by studying the general case that each sensor could correspond
to three actions:- If near the edge, turn around
- If near a crossing, grab a crossing-semaphore and then drive
- If about to switch segment, *safely* switch current segment-semaphore to the new one the train is about to enter.Hence this description clearly indicates how we use semaphores. Put short: For each crossing and for each segment.
By segment we mean any region which is bound by switches or endpoints. (There are 8 in the original map)
Totally the solution uses up to 9 semaphores for the given railmap. (upto because they are created dynamically)
## Maximum train speed
We have already discussed that the submitted railway has many sensors which ultimately lead to lower maximum train speed
but better trainflow.We do not try to temporairly slow down or halfen the speed at any time to increase the maximum train speed, as that would
make the already complicated general solution more complicated.We confidently say that the maximum speed is 14, however, it could easily be increased by using the more sparing
sensor placenment, an example of that is highlighed in the file **origfast**.## Command line usage
Out implementation must read the file as input, therfor it must be passed to the program.
Here is an example of starting the simulation:
$ 2 "tsim bana -s 3" "java Lab1 bana 15 7"
=> Starting java Lab1 bana 15 7
=> Starting tsim bana -s 3
=> Parse complete!
=> ...## How our code works
We have a class that contains all the data about the railmap, **Railmap**.
It is also responsible for parsing the railway-map.The train class contains information about the train and useful methods.
The sensor class contains almost no information, it's primarly the place for
sensor-related code.The other classes are of a lower level and are not mentioned.
## Included maps
Since we have a general solution, we couldn't resist to try out our solution
on more "fun" maps## Bloopers
The four trains in the top left have "stucked" eachother, they have
taken semaphores in a cyclic way.![The train](https://github.com/oleander/Trainspotting/raw/master/Screenshot-tsim.png)