Tas de sables abéliens

Qui je n’ai pas encore tanné avec mes tas de sables ?

Pour ceux qui suivent, et pour les autres, j’explore en ce moment les tas de sables abéliens, du moins une petite partie, celle qui consiste à construire une « colonne » de grains de sable, puis de la regarder s’effondrer.

La seule règle pour l’effondrement est : « Si une pile fait plus de 4 grains de haut, elle s’écroule en envoyant un grain au nord, un au sud, un à l’ouest, et un à l’est ».

Donc en Python on peut construire un tas assez simplement :

width = 150
terrain = np.zeros((width, width), dtype=np.int64)
terrain[width // 2, width // 2] = 20_000

et le faire s’écrouler tout aussi simplement :

for x in range(width):
    for y in range(width):
        if terrain[x][y] >= 4:
            terrain[x][y] -= 4
            terrain[x - 1][y] += 1
            terrain[x + 1][y] += 1
            terrain[x][y + 1] += 1
            terrain[x][y - 1] += 1

Un seul écroulement n’est peut-être pas suffisant, on peut donc recommencer à écrouler jusqu’à ce que le tas soit bien étalé, qu’il soit « stable », que toutes les piles fassent moins de 4 grains.

Alors déjà en augmentant le nombre de grains placés au centre on constate deux choses :

  • C’est lent (très lent).
  • C’est beau (très beau).

Côté lenteur, je vous laisse tester.

Côté beauté voilà ce que ça donne avec 2**26 grains de sable (après 22h de calcul) :

Oui il n’y a que 4 couleurs, et oui mon choix de couleur n’est probablement pas le meilleur :

  • blanc pour 0 grain,
  • bleu clair pour 1 grain,
  • bleu pour 2 grains,
  • bleu foncé pour 3 grains.

Pour ceux que ça titille, j’ai posté plusieurs implémentations par ici : https://git.afpy.org/mdk/fast-abelian-sandpile/, y’a du Python et du C.

6 « J'aime »

“Bonjour”.

Un truc à tester côté performance : https://github.com/taichi-dev/taichi .

1 « J'aime »