diff --git a/msi.gama.models/models/Toy Models/Traffic/includes/voit.png b/msi.gama.models/models/Toy Models/Traffic/includes/voit.png new file mode 100644 index 0000000000..6d57a24239 Binary files /dev/null and b/msi.gama.models/models/Toy Models/Traffic/includes/voit.png differ diff --git a/msi.gama.models/models/Toy Models/Traffic/includes/voit_blue.png b/msi.gama.models/models/Toy Models/Traffic/includes/voit_blue.png new file mode 100644 index 0000000000..03deca562d Binary files /dev/null and b/msi.gama.models/models/Toy Models/Traffic/includes/voit_blue.png differ diff --git a/msi.gama.models/models/Toy Models/Traffic/includes/voit_red.png b/msi.gama.models/models/Toy Models/Traffic/includes/voit_red.png new file mode 100644 index 0000000000..064a768995 Binary files /dev/null and b/msi.gama.models/models/Toy Models/Traffic/includes/voit_red.png differ diff --git a/msi.gama.models/models/Toy Models/Traffic/models/Netlogo - Traffic model - 1 road.gaml b/msi.gama.models/models/Toy Models/Traffic/models/Netlogo - Traffic model - 1 road.gaml new file mode 100644 index 0000000000..931972a549 --- /dev/null +++ b/msi.gama.models/models/Toy Models/Traffic/models/Netlogo - Traffic model - 1 road.gaml @@ -0,0 +1,131 @@ +/*** +* Name: NetlogoTrafficmodel +* Author: Benoit Gaudou (for the reimplementation), Wilensky, U. (for the original model) +* Description: This model is a reimplementation of the Netlogo model "Traffic model" +* Wilensky, U. (1997). NetLogo Traffic Basic model. http://ccl.northwestern.edu/netlogo/models/TrafficBasic. +* Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL. +* It has been implemented with the Netlogo platform: +* Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. +* Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL. +* Tags: traffic, transport, congestion, netlogo +***/ + +model NetlogoTrafficmodel + +global torus: true { + int pavement_width <- 50; + int pavement_height <- 9; + + geometry shape <- rectangle(pavement_width * 2, pavement_height * 2); + image_file voit_image_file <- image_file("../includes/voit.png"); + image_file voit_red_image_file <- image_file("../includes/voit_red.png"); + + int y_road <- 4; + car sample_car; + + int nb_cars <- 25 parameter: true; + float acceleration <- 0.0045 min: 0.0 max: 0.01 parameter: true; + float deceleration <- 0.026 min: 0.0 max: 0.1 parameter: true; + + float max_speed <- 50.0; + + init { + list road <- pavement where(each.grid_y = y_road); + create car number: nb_cars { + pavement free_pavement <- one_of(road where(empty(car inside self))); + if(free_pavement != nil) { + my_pavement <- free_pavement; + location <- my_pavement.location; + } else { + do die; + } + heading <- 0.0; + } + + sample_car <- one_of(car); + ask sample_car { + color <- #red; + icon <- voit_red_image_file; + } + } +} + +grid pavement height: pavement_height width: pavement_width { + init { + if( (grid_y >= 3) and (grid_y <=5) ) { + color <- #white; + } else { + color <- #black; + } + } +} + +species car skills: [moving] { + float speed_limit; + float speed_min; + rgb color; + image_file icon; + pavement my_pavement; + + init { + color <- #blue; + icon <- voit_image_file; + speed <- 0.1 +rnd(0.9); + speed_limit <- 1.0; + speed_min <- 0.0; + } + + reflex patch_ahead { + my_pavement <- pavement first_with(each overlaps self); + pavement next_pavement <- pavement first_with( + (each.grid_y = my_pavement.grid_y) and + (each.grid_x = (my_pavement.grid_x + signum(cos(heading))) mod pavement_width) + ); + car car_ahead <- first(car inside next_pavement); + if(car_ahead != nil) { + do slow_down(car_ahead); + } else { + do speed_up; + } + + do move heading: heading; + } + + action slow_down(car car_ahead) { + speed <- max(speed_min, car_ahead.speed - deceleration) ; + } + + action speed_up { + speed <- min(speed + acceleration, speed_limit); + } + + aspect rect { + draw rectangle(1.5,1) rotated_by heading color: color border: #black; + } + + aspect icon { + draw icon at: location size: 3 rotate: heading ; + } +} + +experiment NetlogoTrafficmodel type: gui { + float minimum_cycle_duration <- 0.01; + + output { + layout #vertical; + + display road type: opengl { + grid pavement; + species car aspect: icon; + + } + + display sp { + chart "speed" type: series { + data "red car" value: sample_car.speed * max_speed color: #red; + data "min speed" value: car min_of(each.speed) * max_speed color: #blue; + data "max speed" value: car max_of(each.speed) * max_speed color: #green; + } + } + } +} diff --git a/msi.gama.models/models/Toy Models/Traffic/models/Netlogo - Traffic model - 2 roads.gaml b/msi.gama.models/models/Toy Models/Traffic/models/Netlogo - Traffic model - 2 roads.gaml new file mode 100644 index 0000000000..1a6b95c5b9 --- /dev/null +++ b/msi.gama.models/models/Toy Models/Traffic/models/Netlogo - Traffic model - 2 roads.gaml @@ -0,0 +1,167 @@ +/*** +* Name: NetlogoTrafficmodel2 +* Author: Benoit Gaudou +* Description: This model is a variation of the "Netlogo - Traffic model - 1 road.gaml" in order to be able +* to visualise the impacts of parameters on the congestion and compare 2 scenarios of acceleration-deceleration. +* It is based on the Netlogo model "Traffic model". +* Wilensky, U. (1997). NetLogo Traffic Basic model. http://ccl.northwestern.edu/netlogo/models/TrafficBasic. +* Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL. +* It has been implemented with the Netlogo platform: +* Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. +* Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL. +* Tags: traffic, transport, congestion, netlogo +***/ + +model NetlogoTrafficmodel + +global torus: true { + int pavement_width <- 50; + int pavement_height <- 14; + + geometry shape <- rectangle(pavement_width * 2, pavement_height * 2); + image_file voit_image_file <- image_file("../includes/voit.png"); + image_file voit_red_image_file <- image_file("../includes/voit_red.png"); + image_file voit_blue_image_file <- image_file("../includes/voit_blue.png"); + + int y_road1 <- 4; + int y_road2 <- 10; + list cars_on_road1; + list cars_on_road2; + car sample_car1; + car sample_car2; + list road1; + list road2; + + int nb_cars <- 25; + float acceleration1 <- 0.0045 min: 0.0 max: 0.01 parameter: true; + float deceleration1 <- 0.026 min: 0.0 max: 0.1 parameter: true; + float acceleration2 <- 0.0005 min: 0.0 max: 0.01 parameter: true; + float deceleration2 <- 0.004 min: 0.0 max: 0.1 parameter: true; + float max_speed <- 50.0; + + init { + road1 <- pavement where(each.grid_y = y_road1); +// cars_on_road1 <- create_cars_on_road(nb_cars, road1); + cars_on_road1 <- create_cars_on_road(1, road1, acceleration1, deceleration1); + sample_car1 <- pick_sample(cars_on_road1, #red, voit_red_image_file); + + road2 <- pavement where(each.grid_y = y_road2); +// cars_on_road2 <- create_cars_on_road(nb_cars, road2); + cars_on_road2 <- create_cars_on_road(1, road2, acceleration2, deceleration2); + sample_car2 <- pick_sample(cars_on_road2, #blue, voit_blue_image_file); + } + + reflex create_cars when: (length(car) < nb_cars * 2) and every(10 #cycles) { + do create_cars_on_road(1, road1, acceleration1, deceleration1); + do create_cars_on_road(1, road2, acceleration2, deceleration2); + } + + list create_cars_on_road(int num_cars, list road, float acc, float dec){ + create car number: num_cars returns: cars_on_road { + pavement free_pavement <- one_of(road where(empty(car inside self))); + if(free_pavement != nil) { + my_pavement <- free_pavement; + location <- my_pavement.location; + acceleration <- acc; + deceleration <- dec; + } else { + do die; + } + heading <- 0.0; + } + + return cars_on_road; + } + + car pick_sample(list cars, rgb col, image_file _icon) { + car a_car <- one_of(cars); + ask a_car { + color <- col; + icon <- _icon; + } + return a_car; + } + + +} + +grid pavement height: pavement_height width: pavement_width { + init { + if( (grid_y >= y_road1 - 1) and (grid_y <= y_road1 + 1) ) or + ( (grid_y >= y_road2 - 1) and (grid_y <= y_road2 + 1)) { + color <- #white; + } else { + color <- #black; + } + } +} + +species car skills: [moving] { + float speed_limit; + float speed_min; + float acceleration; + float deceleration; + rgb color; + image_file icon; + pavement my_pavement; + + init { + color <- #blue; + icon <- voit_image_file; + speed <- 0.1 +rnd(0.9); + speed_limit <- 1.0; + speed_min <- 0.0; + } + + reflex patch_ahead { + my_pavement <- pavement first_with(each overlaps self); + pavement next_pavement <- pavement first_with( + (each.grid_y = my_pavement.grid_y) and + (each.grid_x = (my_pavement.grid_x + signum(cos(heading))) mod pavement_width) + ); + car car_ahead <- first(car inside next_pavement); + if(car_ahead != nil) { + do slow_down(car_ahead); + } else { + do speed_up; + } + + do move heading: heading; + } + + action slow_down(car car_ahead) { + speed <- max(speed_min, car_ahead.speed - deceleration) ; + } + + action speed_up { + speed <- min(speed + acceleration, speed_limit); + } + + aspect rect { + draw rectangle(1.5,1) rotated_by heading color: color border: #black; + } + + aspect icon { + draw icon at: location size: 3 rotate: heading ; + } +} + +experiment NetlogoTrafficmodel type: gui { + float minimum_cycle_duration <- 0.01; + + output { + layout #vertical; + display road { + grid pavement /*lines: #black*/; + species car aspect: icon; + + } + + display sp { + chart "speed" type: series { + data "red car" value: sample_car1.speed * max_speed color: sample_car1.color; + data "blue car" value: sample_car2.speed * max_speed color: sample_car2.color; + } + } + } +}