Le modèle de trafic Biham-Middleton-Levine est un automate cellulaire auto-organisé qui modélise le trafic simplifié.
Il se compose d'un certain nombre de voitures représentées par des points sur un réseau avec une position de départ aléatoire, où chaque voiture peut être de deux types: celles qui ne se déplacent que vers le bas (indiquées en bleu dans cet article), et celles qui se déplacent uniquement vers le à droite (représenté en rouge dans cet article). Les deux types de voitures se déplacent à tour de rôle. A chaque tour, toutes les voitures du type correspondant avancent d'un pas si elles ne sont pas bloquées par une autre voiture.
Votre tâche consiste à visualiser ce modèle sous forme d'animation. Voici quelques bonnes démonstrations.
Contribution
Un nombre à virgule flottante compris entre 0 et 1 représentant la densité et deux entiers représentant la hauteur et la largeur de la grille affichées. Supposons que les entrées sont valides et que les paramètres d'une fonction ou la lecture de l'entrée utilisateur sont tous les deux corrects.
Exemple: 0.38 144 89
(correspond à l'image ci-dessus)
Production
Une grille, au moins 80x80, qui affiche l'animation de ce modèle en cours d'exécution. Au début, les voitures sont placées au hasard sur la grille jusqu'à ce que la grille atteigne la densité d'entrée, avec moitié rouge et moitié bleu (c'est-à-dire la densité multipliée par le nombre total de carrés de grille, arrondis comme vous le souhaitez). La densité doit être cette valeur, ce qui signifie que vous ne pouvez pas remplir chaque cellule de densité comme probabilité. Pour chaque étape, un type de voiture se déplace vers le bas ou vers la droite, s'enroulant autour du bord. Le type de voiture qui se déplace alterne chaque étape. Pour rendre l'animation visible, il doit y avoir au moins 10 ms entre chaque étape.
Règles
Les voitures peuvent être de n'importe quelle couleur ou symbole tant qu'elles peuvent être distinguées les unes des autres et de l'arrière-plan, et chaque type de voiture est de la même couleur ou du même symbole.
La console et la sortie graphique sont toutes deux autorisées. Pour la sortie de la console, tout symbole imprimable convient, mais la sortie doit être une grille de caractères.
Veuillez spécifier le type de sortie que vous avez produit si vous n'avez pas de capture d'écran ou de gif.
La simulation doit fonctionner pour toujours.
La sortie est un peu complexe, donc si vous avez des questions, veuillez commenter.
Réponses:
R,
350338293291273268264 octetsNon golfé:
Fonction qui prend 3 arguments:
d
comme densité et dimensionsx,y
.q
est le nombre de voitures dans chaque couleur.m
est la matrice avec des voitures, qui est initialement remplie en prenant une sorte aléatoire du nombre de voitures et d'espaces vides. Les voitures sont soit1
ou-1
, l'espace vide l'est0
.f
est une fonction qui déplace les voitures d'une rangée, en regardant les voitures codées comme1
. Il vérifie si la voiture peut se déplacer en vérifiant les1
s suivis de0
. Nous utilisonsapply
pour courirf
sur chaque ligne ou colonne, selon les voitures.f
gère le déplacement des1
voitures, pour déplacer les-1
voitures, nous transposons la matrice, changeant la direction du mouvement, multipliant la matrice par-1
, de sorte que les-1
voitures deviennent des1
voitures, et vv et la matrice résultante est à nouveau transformée.Cela permet
image
de créer le tracé, en utilisant 3 couleurs par défaut pour les trois valeurs. Utilise leanimation
package pour gérer les animations en utilisant les options par défaut, qui est de 1 fps.0.38, 144, 89:
0.2, 144, 89:
0.53, 144, 89:
la source
0.38 144 89
de l'exemple.Mathematica,
237228203198181 octetsLa sortie est une dynamique
Image
. L'arrière-plan est vert clair et les voitures sont noires ou magenta, selon leur direction.Explication
Créez le tableau initial:
Réglez
i
sur2
. Créez unList
de{0, 2}
, dont la longueur est le plancher (densité * largeur * hauteur / 2) (divisé par deux car{0, 2}
longueur-2).Remodeler le 2-D résultant
List
(2 x quelque chose) en 1-DList
(longueur = largeur * hauteur). Remplissez1
s'il n'y a pas assez de valeurs.(Pseudo) trie aléatoirement le résultat.
Partition qui résulte en longueur (largeur).
Conservez-le dans
b
.Créez un
Dynamic
Image
:Retournez le signe de
i
.Appliquer l'automate cellulaire avec
193973693
les poids de règle et de voisin{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}
àb
transposer. Ensembleb
égal à cela.Si
i
c'est positif, laissezb
tranquille. Sinon, transposez leb
(2-
est là parce que j'ai jouéCellularAutomaton
un peu au golf ). Essentiellement, cela transposeb
toutes les autres itérations (pour annuler la transposition)Convertissez le tableau en un coloré
Image
.Faites l'expression
Dynamic
. c'est-à-dire que les fonctions ci-dessus sont exécutées de manière répétée.Production
Voici un exemple de sortie (entrées:
0.35, 192, 108
pour 2000 images (2x agrandies).https://i.imgur.com/zmSyRut.mp4
la source
Dyalog APL ,
190108115112 octetsSolution
TryAPL en ligne (légèrement modifié en raison de restrictions en ligne):
Définir
⎕IO←0
, définir la fonction S , puis définir et afficher une grille de 38% 14 × 29 aléatoire, G .Faites un pas vers le bas.
Faites un pas vers la droite.
Passez à l'étape 2.
Animation de l'algorithme précédent, qui ne garantissait pas la densité.
Explication
S←{
définir la fonction directe S (expliquée ici de droite à gauche):÷4
réciproque de 4 (0,25)⎕DL
attendre autant de secondes (retourne le temps réel écoulé)⍵⊣
jeter cela en faveur de ⍵ (le bon argument; la grille)⎕←
sortie qui⍉
transposer⍉⍣⍺
transposer à nouveau si ⍺ (l'argument de gauche; 0 = bas, 1 = droit)(
appliquer le train de fonctions (expliqué ici de gauche à droite):,⍨
l'argument ajouté à lui-même,
annexé à⊢
lui-même)
↓
diviser la matrice en liste de listes(
recherche d'expressions rationnelles (expliquées ici de gauche à droite):⍺⊃
choisissez l'un des deux suivants en fonction de ⍺ (0 = bas / premier, 1 = droite / seconde)'(↓+) ' '(→+) '
séquences de flèches bas et gauche suivies d'un espace)⎕R' \1'
remplacer par un espace suivi de la séquence trouvée↑
mélanger la liste des listes dans la matrice⍉
transposerd[⍺]↓
supprimer les lignes "hauteur" si ⍺ (argument de gauche) est 0 (bas) ou les lignes "largeur" si ⍺ est 1 (droite)d[⍺]↑
puis prenez autant de lignes⊢
passer à travers (sert de séparateur)⍉⍣⍺
transposer si ⍺ (l'argument de gauche; 0 = bas, 1 = droit)}
' ↓→'[
indexez la chaîne avec (expliqué ici de droite à gauche):⎕
entrée numérique (dimensions)d←
attribuer cela à d×/
multiplier les dimensions (trouve le nombre de cellules)c←
attribuer cela à c⎕×
multipliez cela avec une entrée numérique (la densité)⌊
arrondir vers le bas1 2⍴⍨
répéter cycliquement un et deux jusqu'à cette longueurc↑
étendre cela jusqu'à la longueur c , rembourrage avec des zérosd⍴
utiliser d (les dimensions) pour remodeler{
appliquer cette fonction anonyme à cela (expliqué ici de gauche à droite):⍵[
le bon argument (la liste des zéros, des uns et des deux) indexé par?⍨
les indices mélangés jusqu'à⍴⍵
la longueur de l'argument]
}
]
{
appliquer la fonction anonyme suivante (expliquée de droite à gauche):0S⍵
appliquer S avec 0 (bas) comme argument de gauche et la grille comme argument de droite1S
avec cela comme bon argument, appliquer S avec 1 (droite) comme argument de gauche}⍣≡
jusqu'à ce que deux itérations successives soient identiques (un embouteillage)Remarques
Requiert
⎕IO←0
, qui est par défaut sur de nombreux systèmes.Demande pour (hauteur, largeur), puis pour la densité.
N'utilise aucun automate intégré.
Utilise le support regex intégré.
Arrête en cas d'embouteillage (aucune voiture ne peut bouger).
Produit des matrices de caractères où
→
représentent les voitures se déplaçant vers la droite,↓
représentent les voitures se déplaçant vers le bas et les espaces sont des routes vides.Comme ci-dessus, il émet vers la session à 4 Hz, mais la fréquence peut être ajustée en changeant
÷4
; par exemple÷3
est 3 Hz et.3
est ³⁄₁₀ Hz.Il est plus facile de voir ce qui se passe si vous exécutez
]Box on -s=max -f=on
abord.La distribution requise est maintenant garantie, et les deux types de voitures se produisent dans exactement 50-50, sauf pour l'arrondi.
la source
↓
,. Si entre ᵈ⁄₂ et d, il devient a→
. Si entre d et 1, il reste vide.0
(car elles sont (pseudo) générées de manière aléatoire (pseudo) -indépendamment; très improbable mais possible). Ensuite, votre conseil est plein de↓
s.Java (624 octets + 18 octets pour Java.awt. * = 642 octets)
Non golfé:
Image:
la source