Netlogo 4.1 - Implementación de una autopista (problema creando colisión de automóviles)

StackOverflow https://stackoverflow.com/questions/2555893

  •  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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top