NetLogo 4.1 - реализация автомагистрали (проблема создания столкновения автомобилей) - PullRequest
2 голосов
/ 31 марта 2010

Я пытаюсь создать симуляцию автомагистрали и поведения водителей в NetLogo.

У меня есть несколько вопросов, которые я пытаюсь решить.

Вот мой код:

    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

Я знаю, что это немного грязно, потому что я использую код из других моделей из библиотеки.

Я хочу знать , как создать столкновение автомобилей ,Я не могу придумать ни одной идеи.Как вы заметили, мой агент имеет почти такой же размер, как и патч (я установил его на 0,9, чтобы вы могли различать расстояние между двумя автомобилями, когда они расположены рядом друг с другом, и я округляю координаты, чтобы они были установлены по центрупатча).

В моей процедуре ускорения я заставил своего агента повернуть налево, переместиться на 1, повернуть вправо в цикле.Я хочу знать, есть ли команда, позволяющая мне заставить агента перепрыгивать с одной полосы на другую (на участок рядом с ним слева), не заставляя его поворачиваться и двигаться.

И последнее, если выобратите внимание на код, который я создал, машина проверяет патч, который находится рядом с ним на полосе слева и патч перед ним и сзади.Так что, если 3 левых патча пусты, то он может сменить полосу движения.Нечеткая часть заключается в том, что когда я запускаю настройку и иногда нажимаю Go (не всегда), машина выходит из 3 основных полос.

Чтобы понять это, у меня 7 полос.Средняя, ​​которую я не использую, это полоса 0. Тогда есть 3 полосы сверху полосы 0 и 3 под ней.Таким образом, код, который я использую, относится к верхним 3 полосам, где я устанавливаю машины, но по некоторым причинам некоторые машины меняют полосу и переходят на полосу -3, затем -2 и т. Д.

Если кто-то может датьмне совет, я был бы очень признателен.

Заранее спасибо.

Совет: если вы хотите попробовать этот код в netlogo, имейте в виду, что на вкладке интерфейса у меня 2 кнопки одна настройкаи один ход, а также 3 ползунка с именами: number_of_cars, ускорение, замедление.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2010

Чтобы проверить, не произошло ли крушения, просто попросите черепаху найти ближайшую к ней другую черепаху. Если их расстояние меньше 1, то они терпят крах. Как таковой:

let closest min-one-of other turtles [distance myself]
if (distance closest < 1) [
  ;;we crashed
]
2 голосов
/ 01 апреля 2010

re «по какой-то причине на одном участке установлено несколько черепах (машин), а расстояние между ними, когда я проверяю, больше 1! Как это вообще возможно?», Рассмотрим две черепахи в противоположных углахтот же патч.расстояние между ними составляет 1,414 ... (длина диагонали), даже если они находятся на одном патче.

...