J'essaye de créer une simulation d'autoroute et le comportement des pilotes dans NetLogo.NetLogo 4.1 - Implémentation d'une autoroute (Problème créant une collision de voitures)
J'ai quelques questions que j'ai du mal à résoudre.
Voici mon 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
Je sais que c'est un peu en désordre parce que je suis en utilisant le code des autres modèles de la bibliothèque.
Je veux savoir comment créer la collision des voitures. Je ne peux pas penser à une idée. Comme vous remarquez que mon agent a presque la même taille que le patch (je l'ai mis à 0,9 de sorte que vous puissiez distinguer l'espace entre 2 voitures quand elles sont placées l'une à côté de l'autre et je arrondis les coordonnées pour qu'elles soient centre du patch).
Dans ma procédure d'accélération, mon agent doit tourner à gauche, se déplacer de 1, tourner à droite dans une boucle. Je veux savoir s'il y a une commande qui me permet de faire passer l'agent d'une voie à l'autre (au patch à côté de lui sur sa gauche) sans le faire tourner et bouger. Enfin, si vous notez le code que j'ai créé, la voiture vérifie le patch qui se trouve à côté sur la voie à sa gauche et le patch devant et derrière. Donc, si les 3 patches sur sa gauche sont vides, il peut changer de voie. La partie floue est que lorsque je cours la configuration et j'appuie sur Go parfois (pas toujours) la voiture sort des 3 voies de base.
Pour comprendre cela, j'ai 7 voies. Celui du milieu que je n'utilise pas qui est la voie 0. Ensuite, il y a 3 voies au-dessus des voies 0 et 3 ci-dessous. Donc, le code que j'utilise fait référence aux trois voies supérieures où je place les voitures, mais pour une raison quelconque, certaines voitures changent de voie et passent à la voie -3 puis -2 et ainsi de suite.
Si quelqu'un peut me donner un pourboire, je l'apprécierais vraiment.
Merci d'avance. Astuce: si vous voulez essayer ce code dans netlogo, gardez à l'esprit que sur l'onglet interface j'ai 2 boutons un setup et un aller ainsi que 3 sliders avec des noms: number_of_cars, speed-up, slow-down.
J'avais quelque chose de similaire à l'esprit, mais cela ne semble pas fonctionner. Check it out: si la distance min-one-of-tortues sur les voisins [distance moi]> 0,9 [stop] mais pour une raison quelconque, plus d'une tortue (voitures) sont fixés sur le même patch et la distance entre eux quand j'inspecte est supérieur à 1! Comment est-ce possible? – solidsn2004
En raison de la géométrie. Un patch est 1x1, si une tortue est au centre du patch et l'autre est soit au bord d'une autre pièce, ou au centre de la pièce en diagonale, alors ils sont plus de 1 à part. –