Bonjour,
Je suis actuellement étudiant en biologie et je dois réaliser un projet sur Scilab en utilisant comme technique de modélisation un automate cellulaire.

Contexte : Quand une fourmi trouve une source de nourriture intéressante, elle en rapporte une petite quantité au nid, en laissant derrière elle une traînée de phéromones pour marquer son chemin. Ses congénères tenteront ensuite de suivre ce chemin pour retrouver la source de nourriture.

Question : Comment les fourmis optimisent-elles le transfert d’information afin d’atteindre collectivement, le plus rapidement possible, une source de nourriture placée dans un labyrinthe généré aléatoirement ?

Conditions initiales :
-On considère un labyrinthe généré aléatoirement dont les cases noires représentent les obstacles.
-On considère que seuls les obstacles seront générés aléatoirement, la source de nourriture et la colonie auront une position fixe.
-On considère une seule colonie de fourmis dans le système.
-On considère une seule source de nourriture illimitée dans le système.
-On suppose que toutes les fourmis avancent à la même vitesse.
-On suppose que le poids de la charge n’influe pas sur la vitesse de déplacement des fourmis.
-On suppose qu’une seule fourmi débute la recherche de nourriture puis à chaque instant t une nouvelle fourmi sort de la colonie pour récolter la nourriture.
-On considère que la phéromone est un composé volatil, donc elle s’évapore au fil du temps, ce qui fait diminuer sa concentration.
-On considère que seulement à partir d'un certain seuil, la concentration en phéromone influencera le déplacement de la fourmi.

Il y a deux forces majeures: -rétroactions positives: le dépôt de phéromone des fourmis sur le chemin du retour, attire d'autres fourmis qui vont renforcer à leur tour. Et donc plus le chemin est court plus la concentration en phéromone est élevée.
- rétroaction négatives: dissipation progressive de la piste de phéromone puisque c'est un composé volatil.

Voici comment nous avons a réfléchi pour écrire le script:
1) Générer un labyrinthe: avec 0=case vide 1=obstacle 3=source de nourriture 4=colonie
2) Déplacement de fourmis: 0=case vide= absence de fourmi 2=présence de fourmi
- une cellule voisine de la colonie (4) passe à l'état 2 avec un pas de temps t
- déplacement de la case 2 sous forme de boucle (en changeant les 0 en 2) jusqu'à atteindre une cellule voisine a la source de nourriture (3). Lors de ce trajet il faut ajouter une certaine probabilité qui fait que la fourmi à plus tendance à choisir les directions devant/droite/gauche plutôt que faire demi-tour.
- le retour est le chemin contraire de l'aller.
3) Taux de phéromones: n="taux de phéromone" avec n0=0 et plage de n=0;100
- si sur le chemin du retour une case 0 passe à l'état 2 alors la case 2 prend n+1
- à chaque pas de temps t: n-0,2
- à partir d'un seuil n=30, il y a une augmentation de la probabilité que la fourmi passe par cette case. Plus n est grand plus la probabilité augmente.


Voici ce que j'ai fait pour l'instant, j'ai essayé de me débrouiller tant bien que mal, mais étant vraiment très débutant dans tous ce qui est programmation je vous demande de l'aide pour la suite de mon script:

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
clear
clc
clf(0)
 
// 0 : cellule vide
// 1 : obstacle
// 2 : présence de fourmis
 
nL=12 // Nombre de lignes (i)
nC=12 // Nombre de colonnes (j)
 
M=grand(nL,nC,'uin',0,2)     // Création matrie aléatoire selon une probabilité uniforme avec des 0, 1 et 2 == labyrinthe
M(2,10)=3                    // Génération de la source de nourriture 
M(M==2)=0                   // Passage de tous les 2 en 0 (présence de fourmis à vide)
M(8,3)=4                    // Génération de la colonie
disp(M)
 
    Mnew=M; // création d'une matrice miroir, sur laquelle vont être opérés les changements d'état de cellules    
 
for compteur=1:1:1000
for i=2:(nL-1) // Balayage
    for j=2:(nC-1)
        M(i,j+2)=0
         if (M(i,j+1)==4 & M(i,j+2)==0) // Si il trouve une case vide à côté de la colonie
               then Mnew(i,j+2)=2 // Alors il génère une fourmi
               end
                     if (Mnew(i,j)==2 & Mnew(i,j+1)==0) then // Codes pour mouvement d'une fourmi qui se termine lorsqu'il y a un 2 près du 3
                        Mnew(i,j+1)=2
                        Mnew(i,j)=0
                     end
                     if (Mnew(i,j)==2 & Mnew(i-1,j)==0) then 
                        Mnew(i-1,j)=2
                        Mnew(i,j)=0
                     end
                     if (Mnew(i,j)==2 & Mnew(i+1,j)==0) then 
                        Mnew(i+1,j)=2
                        Mnew(i,j)=0
                     end
                     if (Mnew(i,j)==2 & Mnew(i,j-1)==0) then
                         Mnew(i,j-1)=2
                         Mnew(i,j)=0
                     end
                     if Mnew(1,9)==2|Mnew(1,10)==2|Mnew(1,11)==2|Mnew(2,9)==2|Mnew(2,11)==2|Mnew(3,9)==2|Mnew(3,10)==2|Mnew(3,11)==2 then
                         break
                         end
end
end
end  
 
// Il nous reste à faire le chemin retours avec le dépôt de phéromone+ ajouté des probabilitées pour les directions que peux prendre la fourmi+ influence des phéromones+ ajouté un interval de temps entre les sortie des fourmis de la colonie
 
// Représentation
Mcoul=Mnew
disp(Mnew)
    Mcoul(M==1)= 8; // blanc --> obstacles
    Mcoul(M==2)=13; // vert --> fourmis
    Mcoul(M==3)=7;    //jaune --> nourriture
    Mcoul(M==4)=5;  //rouge --> colonie
 
Matplot(Mcoul)
sleep(1000)
Cordialement,