Bonjour à tous,
Je travaille en ce moment sur un projet sous matlab, où je dois créer un automate cellulaire. Etant débutant, j'ai parfois du mal à coder bien que ce soit clair dans ma tête... Mon projet est dans un premier temps simple, et je le complexifie au fur et à mesure.
Il s'agit d'une rivière méandriforme (qui zig zag pour ceux à qui cela ne parle pas), dans laquelle transit des particules sédimentaires. J'ai pour cela créé un environnement (U) en attribuant les valeurs suivantes :
rivière = 1
berge/lit majeur = 0
J'ai ensuite créé un agent (pour commencer) que j'ai positionné au centre de la rivière avec comme position (Xagent et Yagent).
L'objectif de l'agent (la particule) est d'arriver à l'autre bout de la rivière. Pour cela, j'ai codé un déplacement aléatoire qui lui permet un déplacement :
- avant gauche
- tout droit
- avant droit
Problème : J'aimerais que la particule reste dans la rivière... Actuellement, elle chemine, sort de la rivière puis s'arrête. J'aimerais qu'elle s'interroge avant et que si le prochain déplacement est en dehors de la rivière (U=0), elle se dépose et donc s'arrête. Je vois où est mon erreur mais je n'arrive pas à le coder.
L'objectif serait en fait que la particule 1 se dépose si elle heurte une berge et qu'une particule 2 soit lancée. Si la particule 2 vient heurter la particule 1 durant son cheminement, elle se dépose tandis que la particule 1 reprend son cheminement jusqu'à atteindre le bout de la rivière, et ainsi de suite. Je souhaite ensuite complexifier, toutefois, il faut déjà que j'y arrive avec 2-3 particules... Je me suis demandé si cela n'aurait pas été plus simple de créer dans l'environnement un rang de cellule pour caractériser mes berges ?
Autre problème : Je vois pas du tout comment coder le déclenchement d'un nouveau départ quand une particule s'arrête. J'ai cherché intuitivement une fonction stop ou pause, mais cela n'a pas l'air de marcher.
Je vous met ci-dessous mon code actuel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 1) Faire Environnement U=zeros(17,19) 2) Faire tronçon de rivière U(6:12,1)=1 U(7:13,2)=1 U(8:14,3)=1 U(9:15,4)=1 U(10:16,5)=1 U(10:16,6)=1 U(9:15,7)=1 U(8:14,8)=1 U(7:13,9)=1 U(6:12,10)=1 U(5:11,11)=1 U(4:10,12)=1 U(3:9,13)=1 U(2:8,14)=1 U(2:8,15)=1 U(3:9,16)=1 U(4:10,17)=1 U(5:11,18)=1 U(6:12,19)=1 3) créer l'image image(U,'cDataMapping','scaled') 4) Positionner agent hold on; XAgents=[1] YAgents=[9] plot(XAgents,YAgents,'ow') 5) Pas de temps for temps=1:19 6) Définir la rivière riv=U(YAgents(1),XAgents(1)) 7) Déplacement de la particule dans la rivière if riv==1 XAgents(1) = XAgents(1)+1 alea = rand; if alea<0.33 YAgents(1) = YAgents(1)+1; elseif alea<0.66 YAgents(1) = YAgents(1)-1; end end hold off image(U,'cDataMapping','scaled') hold on plot(XAgents,YAgents,'ow') 8) ralentir le déplacement pause(1) end
Merci d'avance pour vos aides/conseils.
Partager