views:

261

answers:

2

Hi there,

I am trying to create a simulation of motorway and the behaviour of the drivers in NetLogo.

I have some questions that I m struggling to solve.

Here is my code:

    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

I know its a bit messy because I am using code from other models from the library.

I want to know how to create the collision of the cars. I can't think of any idea. As you notice my agent has almost the same size as the patch (I set it to 0.9 so that you can distinguish the space between 2 cars when they are set next to each other and I round the coordinates so that they are set to the centre of the patch).

In my accelerate procedure I set my agent to turn left, move 1, turn right in a loop. I want to know if there's a command that lets me make the agent jump from one lane to the other (to the patch next to it on its left) without making it turn and move.

And last, if you notice the code i created the car checks the patch that is next to it on the lane on its left and the patch in front of it and the back of it. So if the 3 patches on its left are empty then it can change lane. The fuzzy part is that when i run the setup and I press Go sometimes (not always) the car goes out of the 3 basic lanes.

To understand this I have 7 lanes. The middle one which I don't use which is lane 0. Then there are 3 lanes on top of lane 0 and 3 below it. So the code I am using refers to the upper 3 lanes where I set the cars but for some reason some of the cars change lane and go to lane -3 then -2 and so forth.

If someone can give me a tip I would really appreciate it.

Thank you in advance.

Tip: if you want to try this code in netlogo keep in mind that on interface tab I have 2 buttons one setup and one go as well as 3 sliders with names: number_of_cars , speed-up , slow-down.

+1  A: 

To check for a crash, just ask the turtle to find the closest other turtle to it. If their distance is less than 1 then they crash. As such:

let closest min-one-of other turtles [distance myself]
if (distance closest < 1) [
  ;;we crashed
]
Jose M Vidal
I had something similar in mind but it doesnt seem to be working. Check it out:if distance min-one-of turtles-on neighbors [distance myself] > 0.9 [stop]but for some reason more than one turtles(cars) are set on to the same patch and the distance between them when I inspect is greater than 1! How is that even possible?
Because of Geometry. A patch is 1x1, if one turtle is at the center of the patch and the other one is either at the edge of another patch, or at the center of the patch diagonally from it, then they are more than 1 apart.
Jose M Vidal
A: 

re "for some reason more than one turtles(cars) are set on to the same patch and the distance between them when I inspect is greater than 1! How is that even possible?", consider two turtles in opposite corners of the same patch. the distance between them is 1.414... (the length of the diagonal), even though they're on the same patch.

Seth Tisue