2010-03-31 9 views
2

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.

Répondre

3

Pour vérifier la présence d'une collision, demandez à la tortue de trouver l'autre tortue la plus proche. Si leur distance est inférieure à 1, ils s'écrasent. En tant que tel:

let closest min-one-of other turtles [distance myself] 
if (distance closest < 1) [ 
    ;;we crashed 
] 
+0

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

+1

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

2

re, « pour une raison plus d'une tortue (les voitures) sont fixées sur le même patch et la distance entre eux quand j'Inspect est supérieur à 1 Comment est-ce possible! » Considérez deux tortues dans les coins opposés du même patch. la distance entre eux est 1,414 ... (la longueur de la diagonale), même s'ils sont sur le même patch.

Questions connexes