我是Netlogo的新手,我正在尝试为大学项目扩展2条车道的交通模型。随附的代码与原始的2条车道模型非常相似。有人能为我提供一些帮助,让海龟在碰撞时碰撞并死亡,并在道路的两侧增加一条车道吗?非常感谢您的帮助和友善。
真诚的
威尔逊
globals [
selected-car ; the currently selected car
lanes ; a list of the y coordinates of different lanes
]
turtles-own [
speed ; the current speed of the car
top-speed ; the maximum speed of the car (different for all cars)
target-lane ; the desired lane of the car
patience ; the driver's current level of patience
]
to setup
clear-all
set-default-shape turtles "car"
draw-road
draw-road-lines
create-or-remove-cars
set selected-car one-of turtles
ask selected-car [ set color red ]
reset-ticks
end
to draw-road
ask patches [
; the road is surrounded by green grass of varying shades
set pcolor green - random-float 0.5
]
set lanes n-values number-of-lanes [ n -> number-of-lanes - (n * 2) - 1 ]
ask patches with [ abs pycor <= number-of-lanes ] [
set pcolor grey - 2.5 + random-float 0.25
]
end
to draw-road-lines
let y (last lanes) - 1 ; start below the "lowest" lane
while [ y <= first lanes + 1 ] [
if not member? y lanes [
; draw lines on road patches that are not part of a lane
ifelse abs y = number-of-lanes
[ draw-line y yellow 0 ] ; yellow for the sides of the road
[ draw-line y white 0.5 ] ; dashed white between lanes
]
set y y + 1 ; move up one patch
]
end
to draw-line [ y line-color gap ]
; We use a temporary turtle to draw the line:
; - with a gap of zero, we get a continuous line;
; - with a gap greater than zero, we get a dasshed line.
create-turtles 1 [
setxy (min-pxcor - 0.5) y
hide-turtle
set color line-color
set heading 90
repeat world-width [
pen-up
forward gap
pen-down
forward (1 - gap)
]
die
]
end
to create-or-remove-cars
let road-patches patches with [ member? pycor lanes ]
if number-of-cars > count road-patches [
set number-of-cars count road-patches
]
create-turtles (number-of-cars - count turtles) [
set color car-color
move-to one-of free road-patches
set target-lane pycor
set heading 90
set top-speed 0.5 + random-float 0.5
set speed 0.5
set patience random max-patience
]
if count turtles > number-of-cars [
let n count turtles - number-of-cars
ask n-of n [ other turtles ] of selected-car [ die ]
]
end
to-report number-of-lanes
report 2
end
to-report car-color
; give all cars a blueish color, but still make them distinguishable
report one-of [ blue cyan sky ] + 1.5 + random-float 1.0
end
to-report free [ road-patches ] ; turtle procedure
let this-car self
report road-patches with [
not any? turtles-here with [ self != this-car ]
]
end
to go
create-or-remove-cars
ask turtles [ move-forward ]
ask turtles with [ patience <= 0 ] [ choose-new-lane ]
ask turtles with [ ycor != target-lane ] [ move-to-target-lane ]
tick
end
to move-forward ; turtle procedure
set heading 90
speed-up-car ; we tentatively speed up, but might have to slow down
let blocking-cars other turtles in-cone (1 + speed) 180 with [ y-distance <= 1 ]
let blocking-car min-one-of blocking-cars [ distance myself ]
if blocking-car != nobody [
; match the speed of the car ahead of you and then slow
; down so you are driving a bit slower than that car.
set speed [ speed ] of blocking-car
slow-down-car
]
forward speed
end
to-report y-distance
report distancexy xcor [ ycor ] of myself
end
to speed-up-car ; turtle procedure
set speed (speed + acceleration)
if speed > top-speed [ set speed top-speed ]
end
to slow-down-car ; turtle procedure
set speed (speed - decceleration)
if speed < 0 [ set speed decceleration ]
; every time you hit the brakes, you loose a little patience
set patience patience - 1
end
to choose-new-lane ; turtle procedure
; Choose a new lane among those with the minimum
; distance to your current lane (i.e., your ycor).
let other-lanes remove ycor lanes
if not empty? other-lanes [
let min-dist min map [ y -> abs (y - ycor) ] other-lanes
let closest-lanes filter [ y -> abs (y - ycor) = min-dist ] other-lanes
set target-lane one-of closest-lanes
set patience max-patience
]
end
to move-to-target-lane ; turtle procedure
set heading ifelse-value target-lane < ycor [ 180 ] [ 0 ]
let blocking-cars other turtles in-cone (1 + abs (ycor - target-lane)) 180 with [ x-distance <= 1 ]
let blocking-car min-one-of blocking-cars [ distance myself ]
ifelse blocking-car = nobody [
forward 0.2
set ycor precision ycor 1 ; to avoid floating point errors
] [
; slow down if the car blocking us is behind, otherwise speed up
ifelse towards blocking-car <= 180 [ slow-down-car ] [ speed-up-car ]
]
end
to-report x-distance
report distancexy [ xcor ] of myself ycor
end