LevelCrossing ver.2.1
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
It is a multi-agent model of the level crossing system (ver. 2.1). Its ancestor (ver.1.1) was uploaded as a community model in late 2005. This essentially improved version was created to have more realistic graphic representation and implement some new functions. The model also makes possible to model traffic flows and make evaluation based on one "simulation day".
HOW IT WORKS?
1) At the beginning it is necessary to make all required settings using sliders and choosers for: ROAD TRAFFIC (speed, kind of road vehicles, arrival interval) and RAILWAY TRAFFIC (train time table, approaching time predictor, speed, number of wagons, kind of train);
2) Then pressing the button "Setup" makes initiation of the model;
3) Simulation itself can be started by pressing the button "Simulation" or "Simulation/step" (in that case repeated pressing of the button "Simulation/step" is required).
HOW TO USE IT
Road vehicles are generated separately for East->West and West->East direction based on used settings. Trains are generated either using one of three train time-tables or by pressing the button "Generate Train" for generation of an extra train. Only one train may be generated and situated at the line.
THINGS TO NOTICE
- drawing histograms showing intensities of road traffic after one hour of simulation;
- displayng the states of particular track sections (approach section, annulation section, distant section) in the right-hand bottom corner of two-dimensional world; the way of displaying how the approach section becomes occupied is different and depends on the use of Approaching Time Predictor (ATPr) - if ATPr is used then red point located somewhere inside the approach section indicates point of activation (depending on train speed), if ATPr is not used the whole length is coloured red in the same way for all train speeds.
THINGS TO TRY
You may try how different settings of parameters can change a traffic flow, resulting values of intensities and finally calculate so called "traffic moment".
EXTENDING THE MODEL
There are still several ideas how the model could be extended in future, e.g.:
- possible choice of a higher number of rails;
- choice of rail traffic direction(s);
- two-way railway operation;
- the way of how warning and rail signals look like and what signalling is given (different countries and different companies use different road-rail interface - present way corresponds to Slovak regulations and is very similar to other Central European countries);
- choice of a different kind of protection (no barriers, half barriers, full barriers);
- results evaluation not only for one day of simulation, but for a longer timer interval;
- implementation of new functions defining behaviour under faulty conditions, under service mode (when maintenance is being performed) etc.
NETLOGO FEATURES
The model was created using NetLogo 3.1.4. Using higher versions of NetLogo may cause error messages and brings necessity to make modifications of the code to ensure troublefree running of the model in higher versions.
RELATED MODELS
Level crossing ver. 1.1 designed by JANOTA A. et al - this model is available as a community model at http://ccl.northwestern.edu/netlogo/models/community/Level_Crossing
Designed at the University of Zilina, EF KRIS 2005
CREDITS AND REFERENCES
Slovak version of the model (ver. 2.0) was theoretically and experimentally elaborated and tested within the MSc. thesis entitled "Multiagentovy model priecestneho zabezpecovacieho zariadenia", written (in Slovak) by Mr. Robert Kubicar under supervision of prof. Ales Janota. The thesis was successfully defended in 2007 at the Department of Control and Information Systems, Faculty of Electrical Engineering, University of Zilina (Slovakia). This version (2.1) represents the latest version - English mutation, containing other modifications and some other functions implemented.
SPECIAL THANKS
Sincere thanks to Robert Kubicar for his work over Slovak model of the version 2.O. Additional thanks also to Esther Verreau from the Center for Connected Learning (CCL) and Computer-Based Modeling for her time and willingness to answer his questions.
More detailed description of the model, including some background explanations, will be available in the paper "JANOTA Ales, MAS Model of the Level Crossing. Journal of ITS Research, Vol. 6, No. 2, November 2008. ISSN 1348-8503", to be published in Japan.
To refer to this model in academic publications, please use: "Janota, A. (2008). NetLogo Level Crossing Model 2.1 http://ccl.northwestern.edu/netlogo/models/....... (please complete link address according to the real position of the file at the server)".
To reference NetLogo software in academic publications, please use: Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
Comments and Questions
globals [ unit_time ;incrementation of built-in NetLogo units for expressing total time of simulation time_of_simulation ;total time in hours (not real one), given for a specified number of built-in units per one hour of simulation one_hour ;in procedure "setup" there is an assignment of how many built-in units is equivalent to one hour one_minute ;in procedure "setup" there is an assignment of how many built-in units is equivalent to one minute one_day ;in procedure "setup" there is an assignment of how many built-in units is equivalent to one day time_day ;in procedure "time" a number of the total simulation days is written to this variable actual_day_unit ;incrementation of built-in units for an actual hour (variable is set to zero when a day is over) actual_day_hour ;in procedure "time" an actual number of simulation hours is written to this variable actual_day_unit_minute ;incrementation of built-in units for an actual minute (variable is set to zero when an hour is over) actual_day_minute ;in procedure "time" an actual number of simulation minutes is written to the variable No_of_cars_to_East No_of_trucks_to_East ;Number of cars/trucks in EAST direction, once a simulation day is over the variable remains unchaged No_of_cars_to_West No_of_trucks_to_West ;Number of cars/trucks in WEST direction, once a simulation day is over the variable remains unchaged freq freq< ;variable that is being compared with the following variable "Time-interval" and road vehicles are generated based on match Time-interval Time-interval< congestion-we congestion-ew ;determines how many road vehicles have not been generated (in this case the result is not output to monitor window) MaxSpeed MaxSpeed< ;variable used to set maximum speed of road vehicles choose-vehicleWE choose-vehicleEW ;variable used to choose between a car and a truck randomly generationF ;if the variable is set to the value 1, the good wagons for a freight train are generated behind the locomotive (0 for no generating) generationP ;if the variable is set to the value 1, the passenger wagons are generated for a pasenger train behind the locomotive (0 for no generating) generationFS ;the same as above, but for a special (extra generated) freight train generationPS ;the same as above, but for a special (extra generated) passenger train freight-train ;variable used to detect what kind of rail vehicle is actually the line (due to function of Approach Time Predictor - for different speeds) passenger-train ;variable used to detect what kind of rail vehicle is actually at the line (due to function of Approach Time Predictor - for different speeds) occupancy delta_t ;coefficient used to multiply a train speed counter-wagonsF ;these four variables record a number of wagons (of a freight train (F), passenger train (P), specially generated freight train (FS) or specially counter-wagonsP ;generated passenger train (PS)); if value becomes equivalent to the required number, the variable (F,P,FS,PS) is given the value zero counter-wagonsFS counter-wagonsPS no_of_passenger_trains ;in procedure "move-for-train" a number of passenger wagons/day is written to this variable no_of_freight_trains ;in procedure "move-for-train" a number of goods wagons/day is written to this variable blinkA ;variable used to set interval for "active signalling" (white flashing light) blinkW ;variable used to set interval for the warning state of level crossing tcb ;warning time to close barriers (time from the moment of warning activation to the moment when barriers start going down) A ;approach section, by default value="vacant" B ;annulation section, by default value="vacant" C ;distant section, by default value="vacant" timeATPr ;variable is incremented after the approach section A has been occupied ativation-point-ATPr ;if variable becomes equivalent o value 1, warning state is activated at the level crossing (delay depends on train speed) carsE ;drawing road vehicles at the certain hour, reset of variable occurs when hour is over trucksE carsW trucksW value all-cars ;summing of variables mentioned above, necessary for drawing histograms all-trucks all-vehicles top_intensity ;variable reports the highest achieved value via reporter moment valueI ;value of lapses (time intervals) between road vehicle arrivals resetting ;variable used to reset values of "no_of_passenger_trains" a "no_of_freight_trains" ] breed [rail] breed [rail1] ;rails over road breed [obstacle-EW] breed [obstacle-WE] breed [ST240] ;ST means "signalling table", situated 240 m prior to the level crossing breed [ST160] ;signalling table situated 160 m prior to the level crossing breed [ST80] ;signalling table situated 80 m prior to the level crossing breed [cars-WE] ;cars going from west to east breed [trucks-WE] ;trucks going from west to east breed [cars-EW] ;cars going from east to west breed [trucks-EW] ;trucks going from east to west breed [wsignal] ;warning signal - here alternatively flashing red light breed [rail-signal] ;rail signal - here 2 yellow position lights + 1 white light (being on or off) breed [barriers-EW] ;barriers for direction East-West breed [barriers-WE] ;barriers for direction West-East breed [trainF] ;freight train breed [wagonF] ;wagon of freight train breed [trainP] ;passenger train breed [wagonP] ;wagon of passenger train breed [state-of-wsignal-EW] ;state of the warning signal (information for road users going from East to West) breed [state-of-wsignal-WE] ;state of the warning signal (information for road users going from West to East) breed [state-of-rsignal] ;state of the rail signal (information for train crew) cars-WE-own [speed accel?] trucks-WE-own [speed accel?] cars-EW-own [speed< accel?<] trucks-EW-own [speed< accel?<] ;------------------------------------------------------------------------------------------ ; PART 1 SETUP ;------------------------------------------------------------------------------------------ to setup reset-timer ca crt 1 ;turtle used to draw road communication (curves) set actual_day_unit 0 set actual_day_unit_minute 0 set one_hour 8417 ;all what is needed - to define how many time unit create one hour and one day mentioned below ;shortened simulation 20; ; and in procedure time all times in model are re-calculated automatically set one_day 202008 ;shortened simulation 480; set one_minute one_hour / 60 set No_of_trucks_to_West 0 set No_of_cars_to_West 0 set No_of_cars_to_East 0 set No_of_trucks_to_East 0 set time_of_simulation 0 set delta_t 0.003 set freq 0 set freq< 0 set generationF 0 set counter-wagonsP 0 set-default-shape ST240 "signal table 240m" set-default-shape ST160 "signal table 160m" set-default-shape ST80 "signal table 80m" set-default-shape cars-WE "car0" set-default-shape trucks-WE "carn01" set-default-shape cars-EW "car<" set-default-shape trucks-EW "carn<" set-default-shape rail "rail3" set-default-shape rail1 "rail4" set-default-shape trainF "locomotive1"; definition of turtle for a passenger train set-default-shape wagonF "freight car" set-default-shape trainP "locomotive2"; definition of turtle for a freight train set-default-shape wagonP "coach" set-default-shape wsignal "warning signal" set-default-shape rail-signal"rail signal" set-default-shape barriers-WE "barriers" set-default-shape barriers-EW "barriers" set-default-shape state-of-wsignal-EW "black point" set-default-shape state-of-wsignal-WE "black point" set-default-shape state-of-rsignal "black point" curve background centerline STs rails wsignals rail-signal-draw end ;------------------------------------------------------------------------------------------- ; PART 2 DRAWING ROAD CURVE (LEFT AND RIGHT) ;------------------------------------------------------------------------------------------- to curve ask turtles [set heading 90 part1] ask turtles [set heading 10 part2] ask turtles [set heading 90 track] end to part1 setxy ( -1 * max-pxcor + 34 ) (-1 * max-pycor + 5 ) set pen-size 39 set color black pd repeat 7 [fd 1.16 lt 12 ] pu end to part2 setxy 0 8 set pen-size 39 set color black pd repeat 7 [fd 1.15 rt 12] pu end to track setxy 10.5 -13 ;drawing of the track set pen-size 1.5 set shape "squareR" set color 38 pd repeat 2 [fd 15] pu setxy 10.5 -12.9; use of two lines one alongside of another set pen-size 1.5 set shape "squareR" set color 38 pd repeat 2 [fd 15] pu end to background ask patches [ set pcolor green if ((pxcor < -4 and pycor < -10) and (pxcor < -4 and pycor >= -15 )) ;access road from the left [ set pcolor black ] if ((pxcor > 4 and pycor > 10) and (pxcor > 4 and pycor <= 15 )) ;access road from the right [ set pcolor black ] if ( (pxcor >= -2 and pycor < 9 )and (pxcor <= 2 and pycor > -9 )) ;road directly to the top (section will be grey) [ set pcolor gray ] if ( (pxcor >= -2 and pycor > 2 ) and (pxcor <= 2 and pycor <= 8 )) ;re-draw the curve from the bottom [ set pcolor black ] if ( (pxcor >= -2 and pycor < -2 ) and (pxcor <= 2 and pycor >= -8 )) ;re-draw the curve from the top [ set pcolor black ] if ((pxcor > 10 and pycor >= -18) and (pxcor > 10 and pycor <= -7 )) ;monitor window [ set pcolor black ] if ((pxcor > 10 and pycor > -14) and (pxcor < 24 and pycor < -12 ))[set pcolor gray ] ;technical means TP1 if ((pxcor >= 25 and pycor > -14) and (pxcor < 29 and pycor < -12 ))[set pcolor gray ] ;technical means TP2 if ((pxcor >= 30 and pycor > -14) and (pxcor <= 40 and pycor < -12 ))[set pcolor gray ];technical means TP3 ] end ;------------------------------------------------------------------------------------------- ; PART 3 DEFINITION OF THE HALF-WAY LINE ;------------------------------------------------------------------------------------------- to centerline ask turtles [set heading 90 part3] ask turtles [set heading 80 part4] ask turtles [set heading 10 part5] ask turtles [set heading 90 part6] end to part3 setxy -40.4 -13 set pen-size 1 set shape "point" set color white pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd end to part4 setxy ( -1 * max-pxcor + 35 ) (-1 * max-pycor + 5 ) set pen-size 1.5 set shape "point" set color white pd repeat 7 [fd 1.13 lt 12] end to part5 setxy 0 8 set pen-size 1.5 set shape "point" set color white pd repeat 7 [fd 1.12 rt 12] pu end to part6 setxy 5 13 set pen-size 1 set shape "point" set color white pd repeat 11 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu repeat 1 [fd 1 ] pd repeat 1 [fd 1 ] pu end ;------------------------------------------------------------------------------------------- ; PART 4 DRAWING RAILS ;------------------------------------------------------------------------------------------- to rails create-custom-rail 25 [ setxy min-pxcor + 1.2 0 set heading 90 set size 3 non-overlapping1 ] create-custom-rail1 4 [ set color gray + 1 setxy -1.5 0 set heading 90 set size 3 non-overlapping1 ] create-custom-rail 25 [ setxy 4.2 0 set heading 90 set size 3 non-overlapping1 ] end to non-overlapping1 if any? other-turtles-here [ fd 1.5 non-overlapping1 ] end ;------------------------------------------------------------------------------------------- ; PART 5 DRAWING OF SIGNAL TABLES FOR ROAD USERS & DRAWING OF WARNING AND RAIL SIGNALS ;------------------------------------------------------------------------------------------- to STs; drawing signal tables for road communication create-custom-ST240 1 [setxy -6 -16.2 set heading 90 set size 5 ] create-custom-ST160 1 [setxy 0.5 -14 set heading 50 set size 5 ] create-custom-ST80 1 [setxy 3.2 -8 set heading 0 set size 5 ] create-custom-ST240 1 [setxy 6 16.2 set heading 270 set size 5 ] create-custom-ST160 1 [setxy -0.5 14 set heading 230 set size 5 ] create-custom-ST80 1 [setxy -3.2 8 set heading 180 set size 5 ] end to wsignals ;custom turtle "wsignal" is defined inside setup, ;it remembers its position all the time therefore it is not necessary to use Ask create-custom-wsignal 1 [setxy 5 -3 set heading 0 set size 4 ] create-custom-wsignal 1 [setxy -5 3 set heading 180 set size 4 ] create-obstacle-EW 1 ask obstacle-EW [setxy -9 6 set shape "x" set color green set size 1] ;turtle "obstacle" is also created inside setup, ;it changes its position during the warning period and avoid vehicles from enterring the rails area create-obstacle-WE 1 ask obstacle-WE [setxy 9 -6 set shape "x" set color green set size 1] create-barriers-WE 1 ask barriers-WE [setxy 3.5 0 set heading 90 set size 6 ] create-barriers-EW 1 ask barriers-EW [setxy -3.5 0 set heading 270 set size 6 ] create-custom-state-of-wsignal-WE 1 [setxy 5 -3.3 set size 4.6 set color black] ;creation of the signal sign "black" at the place of active signalling create-custom-state-of-wsignal-EW 1 [setxy -5 3.3 set size 4.6 set color black] ;this signal will be drawn accoring to the state of the level crossing end to rail-signal-draw ;drawing the rail signal create-custom-rail-signal 1 [setxy -38 -2.5 set heading 90 set size 4.3] create-custom-state-of-rsignal 1 [setxy -36.90 -2.45 set size 4.5 set color black] end ;------------------------------------------------------------------------------------------- ; PART 6 THE MAIN BODY OF THE PROGRAMME ;------------------------------------------------------------------------------------------- to Simulation Simulation/step end ;using the procedure "Simulation/step" all required procedures are called ;these procedures are performed during the entire running of the programme to Simulation/step time occupancy-check wagons-newF wagons-newP wagons-newF-special wagons-newP-special time-table arrival-hour move-for-train set-speed-of-vehicles CCM set freq freq + 1 if freq > Time-interval [new-vehicles cycle set freq 0 set choose-vehicleWE random 3 ] movement turning set freq< freq< + 1 if freq< > Time-interval< [new-vehicles< cycle< set freq< 0 set choose-vehicleEW random 3] movement< turning< set-variables end ;------------------------------------------------------------------------------------------- ; PART 7 PROCEDURES USED TO BOLT BARRIERS ;------------------------------------------------------------------------------------------- to barriers ask obstacle-EW [setxy -1.5 3.5 set shape "x" set size 1 set color black] ask obstacle-WE [setxy 1.5 -3.5 set shape "x" set size 1 set color black] set tcb tcb + 1 if tcb = 50 [ask barriers-WE [setxy 0.8 -2.8 set heading 0 set size 6 ] ;turtle generated in setup using procedure wsignals ask barriers-EW [setxy -0.8 2.8 set heading 180 set size 6 ]set tcb 0] end to barriersUP ask barriers-WE [setxy 3.5 0 set heading 90 set size 6 ] ;turtle generated in setup using procedure wsignals ask barriers-EW [setxy -3.5 0 set heading 270 set size 6 ] ask obstacle-EW [setxy -9 6 set shape "x" set size 1 set color green] ask obstacle-WE [setxy 9 -6 set shape "x" set size 1 set color green] end ;------------------------------------------------------------------------------------------- ; PART 8 USE OF APPROACH TIME PREDICTOR ATPr OR ITS ABSENCE ;------------------------------------------------------------------------------------------- to CCM ; central control module contains (un)selection of ATPr ;the following conditions define states of all three sections (A,B,C) ifelse ((any? wagonF with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < -4 and ycor = 0.5) ] ) or (any? wagonP with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < -4 and ycor = 0.5) ] ) or (any? trainF with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < -4 and ycor = 0.5) ] ) or (any? trainP with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < -4 and ycor = 0.5) ] )) [set A "occupied"] [set A "vacant"] ifelse ((any? wagonF with [ (pxcor > -4 and ycor = 0.5) and (pxcor < 7 and ycor = 0.5) ] ) or (any? wagonP with [ (pxcor > -4 and ycor = 0.5) and (pxcor < 7 and ycor = 0.5) ] ) or (any? trainF with [ (pxcor > -4 and ycor = 0.5) and (pxcor < 7 and ycor = 0.5) ] ) or (any? trainP with [ (pxcor > -4 and ycor = 0.5) and (pxcor < 7 and ycor = 0.5) ] ) ) [set B "occupied"] [set B "vacant"] ifelse ((any? wagonF with [ (pxcor > 7 and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] ) or (any? wagonP with [ (pxcor > 7 and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] ) or (any? trainF with [ (pxcor > 7 and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] ) or (any? trainP with [ (pxcor > 7 and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] )) [set C "occupied"] [set C "vacant"] use-of-ATPr ;call of procedure given below end to use-of-ATPr if (Yes/No = "YES")[ATPr-yes] if (Yes/No = "NO")[ATPr-no] end to ATPr-no ;fulfilling of the following conditions enables to choose one of three states of the level crossing system used in this model if (A = "occupied" or B = "occupied") [warning-state] if (A = "vacant" and B = "vacant" and C = "occupied") [annulation-state] if (A = "vacant" and B = "vacant" and C = "vacant") [basic-state] ;fulfilment of the following conditions make possible visualization of train movement in bottom right-hand corner of the dispaly window ifelse A = "occupied" [ask patches with [((pxcor > 10 and pycor > -14) and (pxcor < 24 and pycor < -12 ))][ set pcolor red ]] [ask patches with [((pxcor > 10 and pycor > -14) and (pxcor < 24 and pycor < -12 ))][ set pcolor gray ]] ifelse B = "occupied" [ask patches with [((pxcor >= 25 and pycor > -14)and (pxcor < 29 and pycor < -12 ))][ set pcolor red ]] [ask patches with [((pxcor >= 25 and pycor > -14)and (pxcor < 29 and pycor < -12 ))][ set pcolor gray ]] ifelse C = "occupied" [ask patches with [((pxcor >= 30 and pycor > -14)and (pxcor <= 40 and pycor < -12 ))][ set pcolor red ]] [ask patches with [((pxcor >= 30 and pycor > -14)and (pxcor <= 40 and pycor < -12 ))][ set pcolor gray ]] end to ATPr-yes if A = "occupied" [set timeATPr timeATPr + 1 ] if (freight-train = 1 and (((For_Freight_Train = 10 )and timeATPr = 1136 - 71)or ((For_Freight_Train = 20 )and timeATPr = 568 - 71) or ((For_Freight_Train = 30 )and timeATPr = 378 - 71) or ((For_Freight_Train = 40 )and timeATPr = 284 - 71) or ((For_Freight_Train = 50 )and timeATPr = 227 - 71) or ((For_Freight_Train = 60 )and timeATPr = 189 - 71) or ((For_Freight_Train = 70 )and timeATPr = 162 - 71) or ((For_Freight_Train = 80 )and timeATPr = 142 - 71) or ((For_Freight_Train = 90 )and timeATPr = 126 - 71) or ((For_Freight_Train = 100 )and timeATPr = 113 - 71) or ((For_Freight_Train = 110 )and timeATPr = 103 - 71) or ((For_Freight_Train = 120 )and timeATPr = 94 - 71) or ((For_Freight_Train = 130 )and timeATPr = 87 - 71) or ((For_Freight_Train = 140 )and timeATPr = 81 - 71) or ((For_Freight_Train = 150 )and timeATPr = 75 - 71) or ((For_Freight_Train = 160 )and timeATPr = 5)));speed of freight train in interface is max 80, ;however here it is processed for all speeds [set ativation-point-ATPr 1] if (passenger-train = 1 and (((For_Passenger_Train = 10 )and timeATPr = 1136 - 71)or ((For_Passenger_Train = 20 )and timeATPr = 568 - 71) or ((For_Passenger_Train = 30 )and timeATPr = 378 - 71) or ((For_Passenger_Train = 40 )and timeATPr = 284 - 71) or ((For_Passenger_Train = 50 )and timeATPr = 227 - 71) or ((For_Passenger_Train = 60 )and timeATPr = 189 - 71) or ((For_Passenger_Train = 70 )and timeATPr = 162 - 71) or ((For_Passenger_Train = 80 )and timeATPr = 142 - 71) or ((For_Passenger_Train = 90 )and timeATPr = 126 - 71) or ((For_Passenger_Train = 100 )and timeATPr = 113 - 71) or ((For_Passenger_Train = 110 )and timeATPr = 103 - 71) or ((For_Passenger_Train = 120 )and timeATPr = 94 - 71) or ((For_Passenger_Train = 130 )and timeATPr = 87 - 71) or ((For_Passenger_Train = 140 )and timeATPr = 81 - 71) or ((For_Passenger_Train = 150 )and timeATPr = 75 - 71) or ((For_Passenger_Train = 160 )and timeATPr = 1))) [set ativation-point-ATPr 1] ;fulfilment of the following conditions make possible visualization of train movement in bottom right-hand corner of the dispaly window if(freight-train = 1 and For_Freight_Train = 160 and timeATPr >= 1)or (passenger-train = 1 and For_Passenger_Train = 160 and timeATPr >= 1 )[ask (patch 11 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 150 and timeATPr >= 75 - 71)or (passenger-train = 1 and For_Passenger_Train = 150 and timeATPr >= 75 - 71 )[ask (patch 11 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 140 and timeATPr >= 81 - 71)or (passenger-train = 1 and For_Passenger_Train = 140 and timeATPr >= 81 - 71 )[ask (patch 12 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 130 and timeATPr >= 87 - 71)or (passenger-train = 1 and For_Passenger_Train = 130 and timeATPr >= 87 - 71 )[ask (patch 13 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 120 and timeATPr >= 94 - 71)or (passenger-train = 1 and For_Passenger_Train = 120 and timeATPr >= 94 - 71 )[ask (patch 14 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 110 and timeATPr >= 103 - 71)or (passenger-train = 1 and For_Passenger_Train = 110 and timeATPr >= 103 - 71 )[ask (patch 15 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 100 and timeATPr >= 113 - 71)or (passenger-train = 1 and For_Passenger_Train = 100 and timeATPr >= 113 - 71 )[ask (patch 16 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 90 and timeATPr >= 126 - 71)or (passenger-train = 1 and For_Passenger_Train = 90 and timeATPr >= 126 - 71 )[ask (patch 15 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 80 and timeATPr >= 142 - 71)or (passenger-train = 1 and For_Passenger_Train = 80 and timeATPr >= 142 - 71 )[ask (patch 17 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 70 and timeATPr >= 162 - 71)or (passenger-train = 1 and For_Passenger_Train = 70 and timeATPr >= 162 - 71 )[ask (patch 17 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 60 and timeATPr >= 189 - 71)or (passenger-train = 1 and For_Passenger_Train = 60 and timeATPr >= 189 - 71 )[ask (patch 18 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 50 and timeATPr >= 227 - 71)or (passenger-train = 1 and For_Passenger_Train = 50 and timeATPr >= 227 - 71 )[ask (patch 19 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 40 and timeATPr >= 284 - 71)or (passenger-train = 1 and For_Passenger_Train = 40 and timeATPr >= 284 - 71 )[ask (patch 20 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 30 and timeATPr >= 378 - 71)or (passenger-train = 1 and For_Passenger_Train = 30 and timeATPr >= 378 - 71 )[ask (patch 21 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 20 and timeATPr >= 568 - 71)or (passenger-train = 1 and For_Passenger_Train = 20 and timeATPr >= 568 - 71 )[ask (patch 21 -13) [set pcolor red ]] if(freight-train = 1 and For_Freight_Train = 10 and timeATPr >= 1136 - 71)or (passenger-train = 1 and For_Passenger_Train = 10 and timeATPr >= 1136 - 71 )[ask (patch 22 -13) [set pcolor red ]] if ativation-point-ATPr = 1 [warning-state] if (A = "vacant" and B = "vacant" and C = "occupied") [annulation-state ] if (ativation-point-ATPr = 0 and B = "vacant" and C = "vacant") [basic-state] ifelse B = "occupied" [ask patches with [((pxcor >= 25 and pycor > -14)and (pxcor < 29 and pycor < -12 ))][ set pcolor red ]] [ask patches with [((pxcor >= 25 and pycor > -14)and (pxcor < 29 and pycor < -12 ))][ set pcolor gray ]] ifelse C = "occupied" [ask patches with [((pxcor >= 30 and pycor > -14)and (pxcor <= 40 and pycor < -12 ))][ set pcolor red ]] [ask patches with [((pxcor >= 30 and pycor > -14)and (pxcor <= 40 and pycor < -12 ))][ set pcolor gray ]] end ;------------------------------------------------------------------------------------------- ; PART 9 ACTIVE SIGNALLING, WARNING ACTIVATION, WARNING TERMINATION ;------------------------------------------------------------------------------------------- ;Note: so called "active signalling" is represented by one white flashing light to basic-state set tcb 0 set blinkA blinkA + 1 if blinkA = 20 [ask state-of-wsignal-WE [setxy 5 -3.3 set size 4.6 set color white ] ask state-of-wsignal-EW [setxy -5 3.3 set size 4.6 set color white ] ] if blinkA = 40 [ask state-of-wsignal-WE [setxy 5 -3.3 set size 4.6 set color black set blinkA 0 ] ask state-of-wsignal-EW [setxy -5 3.3 set size 4.6 set color black set blinkA 0 ] ] ask state-of-rsignal [setxy -36.90 -2.45 set size 4.5 set color white] ;relation Level Crossing - Rail Signal end to warning-state if (blinkA >= 20 and blinkA <= 40) [ask state-of-wsignal-WE [set color black ] ;condition deactivates active signalling after occupying A ask state-of-wsignal-EW [set color black ] set blinkA 0 set blinkW 18 ] set blinkW blinkW + 1 ;variable blink is used for both active signalling and warning signalling if blinkW = 20 [ask state-of-wsignal-WE [setxy 4.4 -2.5 set size 4.8 set color red beep beep beep] ask state-of-wsignal-EW [setxy -4.6 2.6 set size 4.8 set color red ]] if blinkW = 40 [ask state-of-wsignal-WE [setxy 5.5 -2.5 set size 4.8 set color red set blinkW 0 ] ask state-of-wsignal-EW [setxy -5.7 2.6 set size 4.8 set color red set blinkW 0 ] ] barriers ask state-of-rsignal [setxy -36.90 -2.45 set size 4.5 set color white] ;relation Level Crossing - Rail Signal end to annulation-state set timeATPr 0 set ativation-point-ATPr 0 set tcb 0 ask state-of-wsignal-WE [set color black ] ask state-of-wsignal-EW [set color black ] ask patches with [((pxcor > 10 and pycor > -14) and (pxcor < 24 and pycor < -12 ))][ set pcolor gray ] barriersUP ask state-of-rsignal [setxy -36.90 -2.45 set size 4.5 set color white] ;relation Level Crossing - Rail Signal end ;------------------------------------------------------------------------------------------- ; PART 10 GENERATING OF FREIGHT AND PASSENGER TRAINS ;------------------------------------------------------------------------------------------- to occupancy-check ;after occupying the track (here particular patches) te variable "occupancy " is set to "1" ;this variable can be used in any procedure, where we need to test if a train is or is not ;in the monitored part of the railway line ifelse ((any? wagonF with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] ) or (any? wagonP with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] ) or (any? trainF with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] ) or (any? trainP with [ (pxcor > min-pxcor and ycor = 0.5) and (pxcor < max-pxcor and ycor = 0.5) ] )) [set occupancy 1] [set occupancy 0] end to generated-F-train create-custom-trainF 1 [set color white setxy -39 0.5 set size 4 set heading 90 set generationF 1 set freight-train 1] ; end to wagons-newF ;procedure ensures generating of freight wagons (freight cars) following the locomotive if not (((any? wagonF-at min-pxcor 0.5) or (any? wagonF-at (min-pxcor + 1) 0.5) or (any? wagonF-at (min-pxcor + 2) 0.5) or (any? wagonF-at (min-pxcor + 3) 0.5) or(any? wagonF-at (min-pxcor + 3.49) 0.5) or (any? trainF-at min-pxcor 0.5) or (any? trainF-at (min-pxcor + 1) 0.5) or (any? trainF-at (min-pxcor + 2) 0.5) or (any? trainF-at (min-pxcor + 3) 0.5) or(any? trainF-at (min-pxcor + 3.5) 0.5)) or generationF = 0 or Freight-cars = 0) [create-custom-wagonF 1 [ set color white setxy -39 0.5 set size 3.3 set heading 90 set counter-wagonsF counter-wagonsF + 1 ]] if counter-wagonsF = Freight-cars [set generationF 0 set counter-wagonsF 0] if (occupancy = 0 ) [set freight-train 0] end to generated-P-train create-custom-trainP 1 [set color white setxy -39 0.5 set size 3.55 set heading 90 set generationP 1 set passenger-train 1 ] end to wagons-newP ;procedure ensures generating of passenger wagons (coaches) following the locomotive if not (((any? wagonP-at min-pxcor 0.5) or (any? wagonP-at (min-pxcor + 1) 0.5) or (any? wagonP-at (min-pxcor + 2) 0.5) or (any? wagonP-at (min-pxcor + 3) 0.5) or(any? wagonP-at (min-pxcor + 3.49) 0.5) or (any? trainP-at min-pxcor 0.5) or (any? trainP-at (min-pxcor + 1) 0.5) or (any? trainP-at (min-pxcor + 2) 0.5) or (any? trainP-at (min-pxcor + 3) 0.5) or(any? trainP-at (min-pxcor + 3.5) 0.5)) or generationP = 0 or Coaches = 0) [create-custom-wagonP 1 [ set color white setxy -39 0.5 set size 3.5 set heading 90 set counter-wagonsP counter-wagonsP + 1 ]] if counter-wagonsP = Coaches[set generationP 0 set counter-wagonsP 0] if (occupancy = 0 ) [set passenger-train 0] end to move-for-train ask trainF [ fd (For_Freight_Train * delta_t) ] ask wagonF [ fd (For_Freight_Train * delta_t) ] ask trainF [ if xcor > max-pxcor - 0.8 [set no_of_freight_trains no_of_freight_trains + 1 die ]] ask wagonF [ if xcor > max-pxcor - 0.8 [ die ]] ask trainP [ fd (For_Passenger_Train * delta_t) ] ask wagonP [ fd (For_Passenger_Train * delta_t) ] ask trainP [ if xcor > max-pxcor - 1 [ set no_of_passenger_trains no_of_passenger_trains + 1 die]] ask wagonP [ if xcor > max-pxcor - 1 [ die ]] end ;------------------------------------------------------------------------------------------- ; PART 11 GENERATING OF THE SPECIAL TRAIN ;------------------------------------------------------------------------------------------- to special-train ifelse occupancy = 1 [user-message "There is a rail vehicle at the line and required train cannot be dispatched. Check actual time of simulation and compare it with train time-table. To continue simulation press OK - to stop simulation press HALT. " stop] [if Train = "freight" [generated-F-train-special] if Train = "passenger" [generated-P-train-special] ] end to generated-F-train-special create-custom-trainF 1 [set color white setxy -39 0.5 set size 4 set heading 90 set generationFS 1 set freight-train 1] end to wagons-newF-special ;procedure ensures generating of freight wagons (freight cars) following the locomotive if not (((any? wagonF-at min-pxcor 0.5) or (any? wagonF-at (min-pxcor + 1) 0.5) or (any? wagonF-at (min-pxcor + 2) 0.5) or (any? wagonF-at (min-pxcor + 3) 0.5) or(any? wagonF-at (min-pxcor + 3.49) 0.5) or (any? trainF-at min-pxcor 0.5) or (any? trainF-at (min-pxcor + 1) 0.5) or (any? trainF-at (min-pxcor + 2) 0.5) or (any? trainF-at (min-pxcor + 3) 0.5) or(any? trainF-at (min-pxcor + 3.5) 0.5)) or generationFS = 0 or Number_of_Wagons = 0) [create-custom-wagonF 1 [ set color white setxy -39 0.5 set size 3.3 set heading 90 set counter-wagonsFS counter-wagonsFS + 1 ]] if counter-wagonsFS = Number_of_Wagons [set generationFS 0 set counter-wagonsFS 0] end to generated-P-train-special create-custom-trainP 1 [set color white setxy -39 0.5 set size 3.55 set heading 90 set generationPS 1 set passenger-train 1] end to wagons-newP-special ;procedure ensures generating of passenger wagons following the locomotive if not (((any? wagonP-at min-pxcor 0.5) or (any? wagonP-at (min-pxcor + 1) 0.5) or (any? wagonP-at (min-pxcor + 2) 0.5) or (any? wagonP-at (min-pxcor + 3) 0.5) or(any? wagonP-at (min-pxcor + 3.49) 0.5) or (any? trainP-at min-pxcor 0.5) or (any? trainP-at (min-pxcor + 1) 0.5) or (any? trainP-at (min-pxcor + 2) 0.5) or (any? trainP-at (min-pxcor + 3) 0.5) or(any? trainP-at (min-pxcor + 3.5) 0.5)) or generationPS = 0 or Number_of_Wagons = 0) [create-custom-wagonP 1 [ set color white setxy -39 0.5 set size 3.5 set heading 90 set counter-wagonsPS counter-wagonsPS + 1 ]] if counter-wagonsPS = Number_of_Wagons [set generationPS 0 set counter-wagonsPS 0] end ;------------------------------------------------------------------------------------------- ; PART 12 PROCEDURE USED TO SET TIME-TABLE ;------------------------------------------------------------------------------------------- to time-table if (==TGT== = "====1====")[tgt-1] if (==TGT== = "====2====" )[tgt-2] end to tgt-1 if ((((int actual_day_hour = 0 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 1 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 3 )and ((actual_day_minute >= 0)and(actual_day_minute <= 1)))and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 23 ) and ((actual_day_minute >= 45)and(actual_day_minute <= 46)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] ;freight trains in time-table TGT1 if ((((int actual_day_hour = 4 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 5 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 6 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 8 ) and ((actual_day_minute >= 35)and(actual_day_minute <= 36)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 10 ) and ((actual_day_minute >= 35)and(actual_day_minute <= 36)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 12 ) and ((actual_day_minute >= 35)and(actual_day_minute <= 36)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 14 ) and ((actual_day_minute >= 40)and(actual_day_minute <= 41)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 16 ) and ((actual_day_minute >= 35)and(actual_day_minute <= 36)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 18 ) and ((actual_day_minute >= 35)and(actual_day_minute <= 36)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] if ((((int actual_day_hour = 20 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 160] ;speed trains (passenger trains) in time-table TGT1 if ((((int actual_day_hour = 5 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)))and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 6 ) and ((actual_day_minute >= 15)and(actual_day_minute <= 16)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 7 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 11 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 13 ) and ((actual_day_minute >= 35)and(actual_day_minute <= 36)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 14 ) and ((actual_day_minute >= 25)and(actual_day_minute <= 26)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 15 ) and ((actual_day_minute >= 40)and(actual_day_minute <= 41)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 17 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 17 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 18 ) and ((actual_day_minute >= 50)and(actual_day_minute <= 51)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 22 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] ;passenger trains in time-table TGT1 end to tgt-2 if ((((int actual_day_hour = 0 ) and ((actual_day_minute >= 50)and(actual_day_minute <= 51)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 2 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 3 )and ((actual_day_minute >= 30)and(actual_day_minute <= 31)))and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 5 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 9 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 12 ) and ((actual_day_minute >= 5)and(actual_day_minute <= 6)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 13 )and ((actual_day_minute >= 30)and(actual_day_minute <= 31)))and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 17 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 18 )and ((actual_day_minute >= 30)and(actual_day_minute <= 31)))and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 19 ) and ((actual_day_minute >= 50)and(actual_day_minute <= 51)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 21 )and ((actual_day_minute >= 10)and(actual_day_minute <= 11)))and occupancy = 0)) [generated-F-train set For_Freight_Train 80] if ((((int actual_day_hour = 23 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-F-train set For_Freight_Train 80] ;freight trains in time-table TGT2 if ((((int actual_day_hour = 4 ) and ((actual_day_minute >= 10)and(actual_day_minute <= 11)))and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 5 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 6 ) and ((actual_day_minute >= 30)and(actual_day_minute <= 31)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 10 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 14 ) and ((actual_day_minute >= 0)and(actual_day_minute <= 1)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] if ((((int actual_day_hour = 19 ) and ((actual_day_minute >= 50)and(actual_day_minute <= 51)) )and occupancy = 0)) [generated-P-train set For_Passenger_Train 100] end ;------------------------------------------------------------------------------------------- ; PART 13 TIME PROCEDURES ;------------------------------------------------------------------------------------------- to time set resetting time_day if (int resetting) + 0.002 >= resetting [clear-all-plots set no_of_passenger_trains 0 set no_of_freight_trains 0 set top_intensity 0 set resetting 0] set unit_time unit_time + 1 set actual_day_unit_minute actual_day_unit_minute + 1 set actual_day_unit actual_day_unit + 1 set time_of_simulation ( unit_time / one_hour ) ;total time in hours (not real time) given for chosen number of units in one simulation hour set time_day ( unit_time / one_day ) ;sets total number of passed days set actual_day_minute (actual_day_unit_minute / one_minute ) set actual_day_hour (actual_day_unit / one_hour) if actual_day_minute >= 60 [do-plot set carsE 0 set trucksE 0 set carsW 0 set trucksW 0 set actual_day_unit_minute 0 set actual_day_minute 0] ;60 is in minutes (not real but for the given model) if actual_day_hour >= 24 [set actual_day_hour 0 set actual_day_unit 0 calculate-results ] ;24 is in hours (not real but for the given model) end ;------------------------------------------------------------------------------------------- ; PART 14. MOVEMENT FOR ROAD VEHICLES IN BOTH DIRECTIONS ;------------------------------------------------------------------------------------------- to set-speed-of-vehicles set MaxSpeed ((MAX_SPEED / 1000) * 1.5) set MaxSpeed< ((MAX-SPEED / 1000) * 1.5) end to movement ask cars-WE[ if xcor > max-pxcor - 1 [set No_of_cars_to_East No_of_cars_to_East + 1 set carsE carsE + 1 die ] set accel? true if (any? cars-WE-at 0 1) or (any? cars-WE-at 0 2) or (any? cars-WE-at 0 3)or (any? cars-WE-at 0.5 1) or (any? cars-WE-at 0.5 2) or (any? cars-WE-at 0.5 3)or (any? cars-WE-at 3 2) or (any? cars-WE-at 3 1) or (any? cars-WE-at 3 0.5) or (any? cars-WE-at 3 0)or (any? cars-WE-at 2 2) or (any? cars-WE-at 2 1) or (any? cars-WE-at 2 0.5) or (any? cars-WE-at 2 0)or (any? cars-WE-at 1 2) or (any? cars-WE-at 1 1) or (any? cars-WE-at 1 0.5) or (any? cars-WE-at 1 0)or ;reporters used to stop a car behind the truck follow (any? trucks-WE-at 0 1) or (any? trucks-WE-at 0 2) or (any? trucks-WE-at 0 3)or (any? trucks-WE-at 0.5 1) or (any? trucks-WE-at 0.5 2) or (any? trucks-WE-at 0.5 3)or ;always takes these reportes. If the barrier goes down immediately in front of the car, then condition is not ;fulfilled any more since distance < 3 and reporters given below are used (any? trucks-WE-at 3 2) or (any? trucks-WE-at 3 1) or (any? trucks-WE-at 3 0.5) or (any? trucks-WE-at 3 0)or (any? trucks-WE-at 2 2) or (any? trucks-WE-at 2 1) or (any? trucks-WE-at 2 0.5) or (any? trucks-WE-at 2 0)or (any? trucks-WE-at 1 2) or (any? trucks-WE-at 1 1) or (any? trucks-WE-at 1 0.5) or (any? trucks-WE-at 1 0)or (any? obstacle-WE-at 0 1) or (any? obstacle-WE-at 0 2)or(any? obstacle-WE-at 0.5 1)or (any? obstacle-WE-at 0.5 2) [set speed 0 set accel? false] ;if at least one condition of those given above following if is fulfilled, cars will stop (zero speed) if (any? cars-WE-at 4 0) or ;slowing-down of 4patch prior to next car and car "looks" only directly ahead it (any? trucks-WE-at 4 0) or (any? cars-WE-at 4 0.5) or ;slowing-down of 4patch to next car and looks also from -14.5 to 14, usually uses intervals 0.5 (any? trucks-WE-at 4 0.5)or (any? cars-WE-at 4 1) or (any? trucks-WE-at 4 1)or (any? obstacle-WE-at 0.5 3);condition for slowing cars ahead truck in front of barriers too [set speed 0.01 set accel? false] if accel? [speed-up] ;nasledujúca procedúra musí by uvedená ako podmienka nasledujúceho príkazu "fd speed" lebo inak vozidlá nebudú spomalova if xcor > -6 and xcor < 2 and ycor < 2 [ set speed speed / 3] fd speed ] ask trucks-WE[ if xcor > max-pxcor - 1 [set No_of_trucks_to_East No_of_trucks_to_East + 1 set trucksE trucksE + 1 die ] set accel? true if (any? trucks-WE-at 0 1) or (any? trucks-WE-at 0 2) or (any? trucks-WE-at 0 3)or (any? trucks-WE-at 0.5 1) or(any? trucks-WE-at 0.5 2) or (any? trucks-WE-at 0.5 3)or (any? trucks-WE-at 3 2) or (any? trucks-WE-at 3 1) or (any? trucks-WE-at 3 0.5) or (any? trucks-WE-at 3 0)or (any? trucks-WE-at 2 2) or (any? trucks-WE-at 2 1) or (any? trucks-WE-at 2 0.5) or (any? trucks-WE-at 2 0)or (any? trucks-WE-at 1 2) or (any? trucks-WE-at 1 1) or (any? trucks-WE-at 1 0.5) or (any? trucks-WE-at 1 0 )or ;nasleduju reportery pouziti na zastavenie nakladneho pred osobnym (any? cars-WE-at 0 1) or (any? cars-WE-at 0 2) or (any? cars-WE-at 0 3)or (any? cars-WE-at 0.5 1) or (any? cars-WE-at 0.5 2) or (any? cars-WE-at 0.5 3)or (any? cars-WE-at 3 2) or (any? cars-WE-at 3 1) or (any? cars-WE-at 3 0.5) or (any? cars-WE-at 3 0)or (any? cars-WE-at 2 2) or (any? cars-WE-at 2 1) or (any? cars-WE-at 2 0.5) or (any? cars-WE-at 2 0)or (any? cars-WE-at 1 2) or (any? cars-WE-at 1 1) or (any? cars-WE-at 1 0.5) or (any? cars-WE-at 1 0)or (any? obstacle-WE-at 0.5 1)or (any? obstacle-WE-at 0.5 2) ;úplné zastavenie pred závorou vo vzdialenosti 1 [set speed 0 set accel? false] if (any? trucks-WE-at 4 0)or;spomalovanie pred autami a aj pred zavorami pocas vystrahy (any? cars-WE-at 4 0) or (any? trucks-WE-at 4 0.5)or (any? cars-WE-at 4 0.5) or (any? trucks-WE-at 4 1)or (any? cars-WE-at 4 1) or (any? obstacle-WE-at 0.5 3) [set speed 0.01 set accel? false] if accel? [speed-up] if xcor > -6 and xcor < 2 and ycor < 2 [ set speed speed / 3 ] fd speed ] end to speed-up ifelse (speed >= MaxSpeed) [set speed MaxSpeed fd speed] ;ak je rýchlos väèia, alebo rovná ako zadaná rýchlos ;zo slideru "RYCHLOST_MAX" potom nastaví "speed" na hodnotu ;ktorá je na slideri èie spomalí (obmedzenie rýchlosti) [set speed speed + 0.07 fd speed];ak je rýchlos menia potom vozidlo zrých¾uje krokom 0.07 end to movement< ask cars-EW[ if xcor < 0 + min-pxcor + 1 [set No_of_cars_to_West No_of_cars_to_West + 1 set carsW carsW + 1 die ] set accel?< true if (any? cars-EW-at 0.5 -1) or (any? cars-EW-at 0.5 -2) or (any? cars-EW-at 0.5 -3)or (any? cars-EW-at -3 -2) or (any? cars-EW-at -3 -1) or (any? cars-EW-at -3 -0.5) or (any? cars-EW-at -3 0)or (any? cars-EW-at -2 -2) or (any? cars-EW-at -2 -1) or (any? cars-EW-at -2 -0.5) or (any? cars-EW-at -2 0)or (any? cars-EW-at -1 -2) or (any? cars-EW-at -1 -1) or (any? cars-EW-at -1 -0.5) or (any? cars-EW-at -1 0)or ;nasleduju reportery pouzity na zastavenie osobneho pred nakladnym v smere Vychod-Zapad (any? trucks-EW-at 0.5 -1)or (any? trucks-EW-at 0.5 -2) or (any? trucks-EW-at 0.5 -3)or (any? trucks-EW-at -3 -2) or (any? trucks-EW-at -3 -1) or (any? trucks-EW-at -3 -0.5) or (any? trucks-EW-at -3 0) or (any? trucks-EW-at -2 -2) or (any? trucks-EW-at -2 -1) or (any? trucks-EW-at -2 -0.5) or (any? trucks-EW-at -2 0) or (any? trucks-EW-at -1 -2) or (any? trucks-EW-at -1 -1) or (any? trucks-EW-at -1 -0.5) or (any? trucks-EW-at -1 0) or (any? obstacle-EW-at 0.5 -1) or (any? obstacle-EW-at 0.5 -2)or(any? obstacle-EW-at 0 -1)or (any? obstacle-EW-at 0 -2);zastavenie pred priecestím, ak je PZZ vo výstranom stave [set speed< 0 set accel?< false] if (any? cars-EW-at -4 0)or;spomalovanie (any? trucks-EW-at -4 0)or (any? cars-EW-at -4 -0.5)or (any? trucks-EW-at -4 -0.5)or (any? cars-EW-at -4 -4)or (any? trucks-EW-at -4 -1)or (any? obstacle-EW-at 0.5 -3) [set speed< 0.01 set accel?< false] if accel?< [speed-up<] if xcor < 6 and xcor > -2 and ycor > -2 [ set speed< speed< / 3 ] fd speed< ] ask trucks-EW[ if xcor < 0 + min-pxcor + 1 [set No_of_trucks_to_West No_of_trucks_to_West + 1 set trucksW trucksW + 1 die ] set accel?< true if (any? trucks-EW-at 0.5 -1)or (any? trucks-EW-at 0.5 -2) or (any? trucks-EW-at 0.5 -3)or (any? trucks-EW-at -3 -2) or (any? trucks-EW-at -3 -1) or (any? trucks-EW-at -3 -0.5) or (any? trucks-EW-at -3 0) or (any? trucks-EW-at -2 -2) or (any? trucks-EW-at -2 -1) or (any? trucks-EW-at -2 -0.5) or (any? trucks-EW-at -2 0) or (any? trucks-EW-at -1 -2) or (any? trucks-EW-at -1 -1) or (any? trucks-EW-at -1 -0.5) or (any? trucks-EW-at -1 0) or (any? cars-EW-at 0.5 -1) or (any? cars-EW-at 0.5 -2) or (any? cars-EW-at 0.5 -3)or (any? cars-EW-at -3 -2) or (any? cars-EW-at -3 -1) or (any? cars-EW-at -3 -0.5) or (any? cars-EW-at -3 0)or (any? cars-EW-at -2 -2) or (any? cars-EW-at -2 -1) or (any? cars-EW-at -2 -0.5) or (any? cars-EW-at -2 0)or (any? cars-EW-at -1 -2) or (any? cars-EW-at -1 -1) or (any? cars-EW-at -1 -0.5) or (any? cars-EW-at -1 0)or (any? obstacle-EW-at 0.5 -1) or (any? obstacle-EW-at 0.5 -2)or(any? obstacle-EW-at 0 -1) or (any? obstacle-EW-at 0 -2);stopping in front of level crossing if there is the warning state there [set speed< 0 set accel?< false] if (any? cars-EW-at -4 0)or;spomalovanie (any? trucks-EW-at -4 0)or (any? cars-EW-at -4 -0.5)or (any? trucks-EW-at -4 -0.5)or (any? cars-EW-at -4 -4)or (any? trucks-EW-at -4 -1)or (any? obstacle-EW-at 0.5 -3) [set speed< 0.01 set accel?< false] if accel?< [speed-up<] if xcor < 6 and xcor > -2 and ycor > -2 [ set speed< speed< / 3 ] fd speed< ] end to speed-up< ifelse (speed< >= MaxSpeed<) [set speed< MaxSpeed< fd speed<] ;if the speed is higher or equivalent to the value of defined speed ;then the speed will be taken from the slider "MAX-SPEED, i.e. ;the speed becomes reduced [set speed< speed< + 0.07 fd speed<] ;if the speed is lower that vehicle speeds up with the step 0.07 end ;------------------------------------------------------------------------------------------- ; PART 15 VEHICLES' FOLLOWING THE TRAJECTORY ;------------------------------------------------------------------------------------------- to turning< ask turtles [ if (distancexy 3.0800 14 ) < 0.5 [ set heading 260 ] if (distancexy 2.9310 13.8857) < 0.5 [ set heading 250 ] if (distancexy 1.6865 13.3565) < 0.5 [ set heading 240 ] if (distancexy 0.7027 12.8073) < 0.5 [ set heading 230 ] if (distancexy -0.7027 11.6843) < 0.5 [ set heading 220 ] if (distancexy -0.5909 11.3840) < 0.5 [ set heading 210 ] if (distancexy -0.8998 10.6863) < 0.5 [ set heading 200 ] if (distancexy -1.1149 9.8569) < 0.5 [ set heading 190 ] if (distancexy -1.3622 7.9842) < 0.5 [ set heading 180 ] ;from the right to the left - direction "270=>180" if (distancexy -1.2806 -8.7548) < 0.5[ set heading 190 ] if (distancexy -1.3785 -9.4042) < 0.5 [ set heading 200 ] if (distancexy -1.4591 -9.6735) < 0.5 [ set heading 210 ] if (distancexy -1.6323 -10.0060) < 0.5 [ set heading 220 ] if (distancexy -1.9210 -10.3755) < 0.5 [ set heading 230 ] if (distancexy -2.2694 -10.6892) < 0.5 [ set heading 240 ] if (distancexy -3.5068 -11.0681) < 0.5 [ set heading 250 ] if (distancexy -4.3714 -11.7142) < 0.5 [ set heading 260 ] if (distancexy -5.5706 -11.9423) < 0.7 [ set heading 270 ]] ;from the right to the left - directon "180=>270" end to turning ask turtles [ if (distancexy -5 -14.5) < 0.5 [ set heading 80 ] if (distancexy -3.500 -14.326) < 1 [ set heading 70 ] if (distancexy -2.0653 -13.4594) < 1 [ set heading 60 ] if (distancexy -0.5396 -12.3938) < 0.5 [ set heading 50] if (distancexy 0.2693 -11.6316) < 0.5 [ set heading 40 ] if (distancexy 1.0518 -10.5996) < 0.5 [ set heading 30 ] if (distancexy 1.3673 -9.9254) < 0.5 [ set heading 20 ] if (distancexy 1.4979 -9.3796) < 0.5 [ set heading 10 ] if (distancexy 1.7235 -7.7321) < 1 [ set heading 0 ] ;from the left to the right - direction "0" if (distancexy 1.4771 8.5448) < 0.5[ set heading 20 ] if (distancexy 2.1492 9.6967) < 0.5 [ set heading 30 ] if (distancexy 2.4152 10.6007) < 0.5 [ set heading 40 ] if (distancexy 3.2354 11.0406) < 0.5 [ set heading 60 ] if (distancexy 3.4108 11.0380) < 0.5 [ set heading 70 ] if (distancexy 4.2060 11.4650) < 0.5 [ set heading 90 ]] ;from the left to the right - direction "90" end ;------------------------------------------------------------------------------------------- ; PART 16 GENERATING ROAD VEHICLES FOR BOTH DIRECTIONS ;------------------------------------------------------------------------------------------- to new-vehicles ;vehicles in direction EAST if (East = "cars")[cars] ;choose of the car using the chooser if (East = "trucks")[trucks] if (East = "cars/trucks")[cars-trucks] end to cars let my-colors [ 15 35 45 55 97] ifelse ((any? cars-WE-at min-pxcor -14.5) or (any? cars-WE-at (min-pxcor + 1) -14.5)or(any? cars-WE-at (min-pxcor + 2) -14.5))or ((any? trucks-WE-at min-pxcor -14.5)or(any? trucks-WE-at (min-pxcor + 1) -14.5)or(any? trucks-WE-at(min-pxcor + 2) -14.5)) [set congestion-we congestion-we + 1] [create-custom-cars-WE 1 [set heading 90 set size 1.4 setxy -39.5 -14.5 set speed 0 set color one-of my-colors]] end to trucks let my-colors [ 15 35 45 55 97 ] ifelse ((any? trucks-WE-at min-pxcor -14.5)or(any? trucks-WE-at (min-pxcor + 1) -14.5)or(any? trucks-WE-at(min-pxcor + 2) -14.5)) or((any? cars-WE-at min-pxcor -14.5) or (any? cars-WE-at (min-pxcor + 1) -14.5)or(any? cars-WE-at (min-pxcor + 2) -14.5)) [set congestion-we congestion-we + 1] [create-custom-trucks-WE 1 [set heading 90 set size 2 setxy -39.5 -14.5 set speed 0 set color one-of my-colors]] end to cars-trucks if (choose-vehicleWE <= 1) [cars] if (choose-vehicleWE = 2) [trucks] end to new-vehicles< ;nove auta v smere Západ if (West = "cars")[cars<];vyber auta pomocou chooseru if (West = "trucks")[trucks<] if (West = "cars/trucks")[cars-trucks<] end to cars< let my-colors [ 15 35 45 55 97] ifelse ((any? cars-EW-at max-pxcor 14) or (any? cars-EW-at (max-pxcor - 1) 14)or(any? cars-WE-at (max-pxcor - 2) 14))or ((any? trucks-EW-at max-pxcor 14)or(any? trucks-EW-at (max-pxcor - 1) 14)or(any? trucks-EW-at(min-pxcor - 2) 14)) [set congestion-ew congestion-ew + 1] [create-custom-cars-EW 1 [set heading 270 set size 1.4 setxy 39 14 set speed< 0 set color one-of my-colors]] end to trucks< let my-colors [ 15 35 45 55 97] ifelse ((any? trucks-EW-at max-pxcor 14)or(any? trucks-EW-at (max-pxcor - 1) 14)or(any? trucks-EW-at(min-pxcor - 2) 14)) or((any? cars-EW-at max-pxcor 14) or (any? cars-EW-at (max-pxcor - 1) 14)or(any? cars-WE-at (max-pxcor - 2) 14)) [set congestion-ew congestion-ew + 1] [create-custom-trucks-EW 1 [set heading 270 set size 2 setxy 39 14 set speed< 0 set color one-of my-colors]] end to cars-trucks< if (choose-vehicleEW <= 1) [cars<] if (choose-vehicleEW = 2) [trucks<] end ;------------------------------------------------------------------------------------------- ; PART 17 PROCESURES FOR DETERMINING OF REGULAR OR OCCASSIONAL ARRIVAL OF VEHICLE ;------------------------------------------------------------------------------------------- to arrival-hour if actual_day_hour < 5.5 [set valueI 7000] if actual_day_hour = 5.5 [set Time-interval 0 set Time-interval< 0] if ((actual_day_hour > 5.5)and(actual_day_hour < 6.5)) [set valueI 100] if actual_day_hour = 6.5 [set Time-interval 0 set Time-interval< 0] if ((actual_day_hour > 6.5)and(actual_day_hour < 8.5)) [set valueI 70] if actual_day_hour = 8.5 [set Time-interval 0 set Time-interval< 0] if ((actual_day_hour > 8.5)and(actual_day_hour < 13.5)) [set valueI 400] if actual_day_hour = 13.5 [set Time-interval 0 set Time-interval< 0] if ((actual_day_hour > 13.5)and(actual_day_hour < 15.5)) [set valueI 70] if actual_day_hour = 15.5 [set Time-interval 0 set Time-interval< 0] if ((actual_day_hour > 15.5)and(actual_day_hour < 20)) [set valueI 400] if actual_day_hour = 20 [set Time-interval 0 set Time-interval< 0] if ((actual_day_hour > 20)and(actual_day_hour < 23)) [set valueI 1500] if actual_day_hour = 23 [set Time-interval 0 set Time-interval< 0] end to cycle if (Vehicle_arrival = "regular")[regular] if (Vehicle_arrival = "occasional" )[occasional] end to occasional set Time-interval random-exponential valueI ;setting of time interval between arrival of vehicles, ;in this case according to "quasi" poisson distribution end to regular set Time-interval _interval_ end to cycle< if (Vehicle-arrival = "regular")[regular<] if (Vehicle-arrival = "occasional" )[occasional<] end to occasional< set Time-interval< random-exponential valueI ;setting of time interval between arrival of vehicles, ;in this case according to "quasi" poisson distribution end to regular< set Time-interval< -interval- end ;------------------------------------------------------------------------------------------- ; PART 18 PROCEDURES FOR DRAWING HISTOGRAMS AND SETTING VARIABLES FOR DRAWING ;------------------------------------------------------------------------------------------- to do-plot set-current-plot "Histogram of Intensities of Real Vehicles/Hour" set-plot-x-range 0 24 set-current-plot-pen "Cars" plot all-cars set-current-plot-pen "Trucks" plot all-trucks set-current-plot-pen "Total" plot all-cars + all-trucks set-current-plot "Histogram of intensities of Unit Vehicles/Hour" set-plot-x-range 0 24 set-current-plot-pen "UnitVehs" plot all-vehicles end to set-variables set all-cars (carsE + carsW) set all-trucks (trucksE + trucksW) set all-vehicles (all-cars + (all-trucks * 2)) if top_intensity < all-vehicles [set top_intensity all-vehicles] set moment ((10 * top_intensity)*(no_of_freight_trains + no_of_passenger_trains )) end to calculate-results export-all-plots "d:/histogram.csv" user-message "Actual simulation day is over. Calculated traffic moment is "+ moment + ". Press HALT and record all monitored quantities. Values from histograms were exported to the file d:/histogram.csv To continue simulation of the next day press again Simulation. " stop end
There is only one version of this model, created over 14 years ago by Uri Wilensky.
Attached files
No files
This model does not have any ancestors.
This model does not have any descendants.