Hello,
Je suis en train de revoir les bases d'algo. Pour ce faire, Je me suis décidé de refaire la fourmi de Langton.
Tout fonctionne bien mais je suis tombé sur internet sur du code que j'ai du mal à comprendre car ce sont des manipulations de matrice.
Mon objectif est de comprendre cette manipulation matricielle, je n’ai pas ces connaissances. J’aimerai les acquérir.
Pour faire très court, il y a une fourmi qui doit se déplacer dans une grille.
1. Si la fourmi est sur une case blanche, elle effectue une rotation vers la gauche; si elle est sur une case noire, elle effectue une rotation vers la droite ;
2. La fourmi inverse la couleur de la case sur laquelle elle se trouve (blanc devient noir et réciproquement);
3. La fourmi avance d’une case dans la direction de son orientation.
Mon souci c'est de comprendre.
Dans le code je rencontré
La fourmi bouge avec une addition de matriceCode:
1
2
3 # Rotation Matrices clock = np.matrix([[0, 1], [-1, 0]]) counter = np.matrix([[0, -1], [1, 0]])
et la direction est modifiée par une multiplication de matrice selon le sensCode:pos[:] = pos + direction
ouCode:direction[:] = clock * direction
J'aimerai comprendre quelles sont ces propriétés/règles de matrice qui permette de faire ce type de manipulation.Code:direction[:] = counter * direction
Voici le code complet.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 import numpy as np from matplotlib import pyplot as plt from matplotlib import animation # Initialize the Simulation dim = 100 a = np.matrix(np.zeros((dim, dim))) pos = np.matrix([[dim // 2], [dim // 2]]) # current position of ant direction = np.matrix([[1], [0]]) # direction ant is currently moving # Rotation Matrices clock = np.matrix([[0, 1], [-1, 0]]) counter = np.matrix([[0, -1], [1, 0]]) def takestep(a, pos, direction): pos[:] = pos + direction if a[pos[0, 0], pos[1, 0]] == 0: # landed on white a[pos[0, 0], pos[1, 0]] = 1 # put a black direction[:] = clock * direction else: a[pos[0, 0], pos[1, 0]] = 0 direction[:] = counter * direction fig = plt.figure(figsize=(10, 10)) im = plt.imshow(a, interpolation='none', vmin=0, vmax=10) def animate(i): takestep(a, pos, direction) im.set_data(a) return [im] anim = animation.FuncAnimation(fig, animate, frames=12000, interval=0, blit=True, repeat=False) plt.show()
Merci de votre aide.