Netlogo 4.1 - Implementación de una autopista (problema creando colisión de automóviles)
-
23-09-2019 - |
Pregunta
Estoy tratando de crear una simulación de autopista y el comportamiento de los conductores en Netlogo.
Tengo algunas preguntas que estoy luchando por resolver.
Aquí está mi código:
globals
[
selected-car ;; the currently selected car
average-speed ;; average speed of all the cars
look-ahead
]
turtles-own
[
speed ;; the current speed of the car
speed-limit ;; the maximum speed of the car (different for all cars)
lane ;; the current lane of the car
target-lane ;; the desired lane of the car
change? ;; true if the car wants to change lanes
patience ;; the driver's current patience
max-patience ;; the driver's maximum patience
]
to setup
ca
import-drawing "my_road3.png"
set-default-shape turtles "car"
crt number_of_cars
[ setup-cars ]
end
to setup-cars
set color blue
set size .9
set lane (random 3)
set target-lane (lane + 1)
setxy round random-xcor (lane + 1)
set heading 90
set speed 0.1 + random 9.9
set speed-limit (((random 11) / 10) + 1)
set change? false
set max-patience ((random 50) + 10)
set patience (max-patience - (random 10))
;; make sure no two cars are on the same patch
loop
[
ifelse any? other turtles-here
[ fd 1 ]
[ stop ]
;if count turtles-here > 1
; fd 0.1
;if
;
;ifelse (any? turtles-on neighbors) or (count turtles-here > 1)
;[
; ifelse (count turtles-here = 1)
; [ if any? turtles-on neighbors
; [
; if distance min-one-of turtles-on neighbors [distance myself] > 0.9
; [stop]
; ]
; ]
; [ fd 0.1 ]
;]
;[ stop ]
]
end
to go
drive
end
to drive
;; first determine average speed of the cars
set average-speed ((sum [speed] of turtles) / number_of_cars)
;set-current-plot "Car Speeds"
;set-current-plot-pen "average"
;plot average-speed
;set-current-plot-pen "max"
;plot (max [speed] of turtles)
;set-current-plot-pen "min"
;plot (abs (min [speed] of turtles) )
;set-current-plot-pen "selected-car"
;plot ([speed] of selected-car)
ask turtles
[
ifelse (any? turtles-at 1 0)
[
set speed ([speed] of (one-of (turtles-at 1 0)))
decelerate
]
[
ifelse (look-ahead = 2)
[
ifelse (any? turtles-at 2 0)
[
set speed ([speed] of (one-of turtles-at 2 0))
decelerate
]
[
accelerate
if count turtles-at 0 1 = 0 and ycor < 2.5
[lt 90
fd 1
rt 90]
]
]
[accelerate
if count turtles-at 0 1 = 0 and ycor < 2.5
[lt 90
fd 1
rt 90]
]
]
if (speed < 0.01)
[ set speed 0.01 ]
if (speed > speed-limit)
[ set speed speed-limit ]
ifelse (change? = false)
[ signal ]
[ change-lanes ]
;; Control for making sure no one crashes.
ifelse (any? turtles-at 1 0) and (xcor != min-pxcor - .5)
[ set speed [speed] of (one-of turtles-at 1 0) ]
[
ifelse ((any? turtles-at 2 0) and (speed > 1.0))
[
set speed ([speed] of (one-of turtles-at 2 0))
fd 1
]
[jump speed]
]
]
tick
end
;; increase speed of cars
to accelerate ;; turtle procedure
set speed (speed + (speed-up / 1000))
end
;; reduce speed of cars
to decelerate ;; turtle procedure
set speed (speed - (slow-down / 1000))
end
to signal
ifelse (any? turtles-at 1 0)
[
if ([speed] of (one-of (turtles-at 1 0))) < (speed)
[ set change? true ]
]
[ set change? false ]
end
;; undergoes search algorithms
to change-lanes ;; turtle procedure
show ycor
ifelse (patience <= 0)
[
ifelse (max-patience <= 1)
[ set max-patience (random 10) + 1 ]
[ set max-patience (max-patience - (random 5)) ]
set patience max-patience
ifelse (target-lane = 0)
[
set target-lane 1
set lane 0
]
[
set target-lane 0
set lane 1
]
]
[ set patience (patience - 1) ]
ifelse (target-lane = lane)
[
ifelse (target-lane = 0)
[
set target-lane 1
set change? false
]
[
set target-lane 0
set change? false
]
]
[
ifelse (target-lane = 1)
[
ifelse (pycor = 2)
[
set lane 1
set change? false
]
[
ifelse (not any? turtles-at 0 1)
[ set ycor (ycor + 1) ]
[
ifelse (not any? turtles-at 1 0)
[ set xcor (xcor + 1) ]
[
decelerate
if (speed <= 0)
[ set speed 0.1 ]
]
]
]
]
[
ifelse (pycor = -2)
[
set lane 0
set change? false
]
[
ifelse (not any? turtles-at 0 -1)
[ set ycor (ycor - 1) ]
[
ifelse (not any? turtles-at 1 0)
[ set xcor (xcor + 1) ]
[
decelerate
if (speed <= 0)
[ set speed 0.1 ]
]
]
]
]
]
end
Sé que es un poco desordenado porque estoy usando el código de otros modelos de la biblioteca.
quiero saber Cómo crear la colisión de los autos. No puedo pensar en ninguna idea. Al notar que mi agente tiene casi el mismo tamaño que el parche (lo configuré en 0.9 para que pueda distinguir el espacio entre 2 autos cuando se colocan uno al lado del otro y redondeo las coordenadas para que estén configuradas en el centro del parche).
En mi procedimiento de aceleración, configuré mi agente para girar a la izquierda, mover 1, girar a la derecha en un bucle. Quiero saber si hay un comando que me permite hacer que el agente salte de un carril a otro (al parche al lado a su izquierda) sin hacer que gire y se mueva.
Y por último, si nota que el código, creé el automóvil, verifica el parche que está al lado en el carril a su izquierda y el parche frente a él y en la parte posterior. Entonces, si los 3 parches a su izquierda están vacíos, entonces puede cambiar el carril. La parte borrosa es que cuando ejecuto la configuración y presiono ir a veces (no siempre), el auto sale de los 3 carriles básicos.
Para entender esto tengo 7 carriles. El medio que no uso, que es el carril 0. Luego hay 3 carriles en la parte superior del carril 0 y 3 debajo de él. Entonces, el código que estoy usando se refiere a los 3 carriles superiores donde configuré los autos, pero por alguna razón algunos de los autos cambian de carril y van al carril -3 y luego -2 y así sucesivamente.
Si alguien puede darme un consejo, realmente lo agradecería.
Gracias de antemano.
Consejo: Si desea probar este código en NetLogo, tenga en cuenta que en la pestaña de la interfaz tengo 2 botones, una configuración y uno, así como 3 controles deslizantes con nombres: Number_OF_CARS, aceleración, desaceleración.
Solución
Para verificar si hay un choque, solo pídale a la tortuga que encuentre la otra tortuga más cercana. Si su distancia es inferior a 1, entonces se estrellan. Como tal:
let closest min-one-of other turtles [distance myself]
if (distance closest < 1) [
;;we crashed
]
Otros consejos
Re "Por alguna razón, más de una tortugas (autos) se establecen en el mismo parche y la distancia entre ellos cuando inspecciono es mayor que 1! ¿Cómo es eso posible?", Considere dos tortugas en las esquinas opuestas del mismo parche . La distancia entre ellos es 1.414 ... (la longitud de la diagonal), a pesar de que están en el mismo parche.