Dans le cadre de notre formation d'ingénieur
généraliste, nous avons, en 1ère année, des
cours d'informatique (Fortran 77 et C). En plus de cours en amphi, nous
avons beaucoup de TD pour apprendre à manipuler ces langages informatiques.
A la fin, on doit écrire un programme qui répond à
certains critères.
Pour le Fortran 77, nous avions le choix entre 4
sujets :
- le "tri du couvain"
- la "piste de chasse"
- le "robot de Langhton"
- le "jeu de la vie"
Le Tri du Couvain : Il était une fois des fourmis qui ne faisaient qu'un seule chose : trier ! Il y avait chez ces fourmis, 2 types d'oeufs : des oeufs de type 1 (jeunes par ex.) et des oeufs de type 2 (vieux par ex.). Les fourmis non chargés, quand elles arrivent sur un oeuf d'un certain type, elles calculent la "concentration locale" en oeuf de même type (par ex. il y a 4 oeufs de ce type dans les 9 cases entourant la fourmi : la concentration est de 4/9.). Suivant la concentration, la fourmi prend l'oeuf avec une certaine probabilité. Si la fourmi est chargée, elle le dépose avec une certaine proba, en fonction de la concentration locale. On comprend donc que plus l'oeuf est isolé, plus il a de chances d'être pris.
Le Jeu de la Vie : cf ci-dessous
POUR CEUX QUE CA INTERESSE...
Voilà ce que j'ai écrit pou le Jeu de la Vie en Fortran 77.
Que fait ce programme ?
En gros, il faut s'imaginer que l'on a un plateau blanc, avec des cellules
bleues, et des cellules roses. Ces cellules, au fil des génération
meurent, restent en vie ou procréent de nouvelles cellules à
certaines conditions :
- Une cellule en vie meurt d'isolement si elle a
moins de 2 voisines.
- Une cellule en vie meurt d'étouffement
si elle a plus de 3 voisines.
- Une cellule reste en vie si elle a 2 ou 3 voisines.
- Une cellule naît si elle a exactement 3
voisines dont 2 de sexes différents.
c declaration des variables c ========================= real seed,ran
c Hauteur et Largeur du
plateau
write(*,*)'Largeur
du plateau (entre 1 et 50)'
c Génération
de départ
call init_X(nl,nc,10) write(*,*)'Tapez
un nombre au hasard'
do i=1,nl
c Comment passer à
la génération suivante ?
10 write(*,*)'Combien de générations
?' ! Demande du nombre de tours
do k=1,tours
if (mod(k,100).eq.99)then
do i=1,nl
c Continuation ou arrêt
30 write(*,*)'On continue ?
(choix=1)' ! Choix de continuite
c ==============================================================
subroutine nouvo(P,nl,nc,Voisi) integer P(50,50),Voisi(50,50)
c Conversion du plateau
de jeu en grille d'occupation
do i=1,nl
c Conversion de la grille
d'occupation en grille de voisinage
do i=1,nl
k1=mod(j-1,nc) ! On prend j entre 1 et nc
if (k1.eq.0) then
l1=mod(i-1,nl) ! On prend i entre 1 et nc
if (l1.eq.0) then
Voisi(i,j)=Occ(l1,k1)+Occ(l1,j)+Occ(l1,k2)+Occ(i,k1)
Sexe(i,j)=P(l1,k1)+P(l1,j)+P(l1,k2)+P(i,k1)
enddo
c Conditions de conservation
ou de génération de cellules.
do i=1,nl
c pour les cases vides
if (P(i,j).eq.0) then
if ((Voisi(i,j).eq.3) .and. ! Il faut 3 voisines
c pour les cases bleues
elseif (P(i,j).eq.1) then
c pour les cases roses
elseif (P(i,j).eq.2) then
c en cas d'erreur
else
|
Voilà ! Vous pouvez voir le résultat si vous pouvez compiler du Fortran 77. Plus tard, vous pourrez voir le résultat en image, mais je ne sais pas quand je m'en occuperai.
" LE TRI DU COUVAIN "
Quelques mots sur ce programme :
L'action se passe au pays des fourmis. Je m'explique : On considère une fourmilère ( plus précisément la chambre où sont rangés les oeufs ). Dans celle-ci, on a un certain nombre de fourmis qui doivent ranger des oeufs jeunes (rouges) et des oeufs vieux (bleus) en faisant des groupes. Peu importe la couleur de nos oeufs...
Pour ranger les oeufs, les fourmis se déplacent et ont une certaine probabilité de ramasser un oeuf suivant qu'il est isolé ou non. De même, si les fourmis sont chargées avec un oeuf, elles auront une certaine probabilité de le déposer suivant qu'il y a beaucoup ou pas d'oeufs du même type que celui qu'elles portent.
Voilà mon exemple de programme :
program
Tri_du_couvain
implicit none c déclaration des
variables
real ran,seed
c Génération
de départ
write(*,*)'Tapez
un nombre au hasard'
write(*,*)'Nombre
de lignes (entre 1 et 50) ?'
40 if ((nl.lt.1).or.(nl.gt.50))
then
write(*,*)'Nombre
de colonnes (entre 1 et 50) ?'
41 if ((nc.lt.1).or.(nc.gt.50))
then
call init_X(nl,nc,10) c Positionnement des oeufs
c Oeufs rouges write(*,*)'Combien
d`oeufs rouges ?'
do while (nor.gt.0)
i=int(ran(seed)*nl+1) ! choix d'une ligne
if (Nid(i,j).eq.0)then ! si la case est vide
nor=nor-1 ! on le décompte
call put_carre_X(i,j,1)
c Oeufs bleus write(*,*)'Combien
d`oeufs bleus ?'
do while (nob.gt.0)
i=int(ran(seed)*nl+1) ! choix d'une ligne
if (Nid(i,j).eq.0)then ! si la case est vide
nob=nob-1 ! on le décompte
call put_carre_X(i,j,2)
c Positionnement des fourmis
write(*,*)'Combien
de fourmis (entre 1 et 100)?'
42 if ((nf.lt.1).or.(nf.gt.100))
then
n=1 do while (n.le.nf) ! Pour chacune des nf fourmis
x(n)=0
i=int(ran(seed)*nl+1) ! choix d'une ligne
if (Nid(i,j).eq.0)then ! si la case est vide
x(n)=i
! on enregistre les coordonnées de la fourmi
call put_carre_X(i,j,10)
enddo
c Déplacement des
fourmis
10 write(*,*)'Combien de tours
?'
do i=1,tours call deplace(Nid,nf,x,y,charge,nl,nc) enddo 30 write(*,*)'On continue ?
(choix=1)' ! Choix de continuite
end
c==============================================================================
subroutine deplace(Nid,nf,x,y,charge,nl,nc) integer x(100),y(100),Nid(50,50),charge(100),nf,nl,nc,etat do n=1,nf
call put_carre_X(x(n),y(n),Nid(x(n),y(n)))
c Déplacement de
la fourmi
dir=int(ran(seed)*4)+1 ! Tirage de la direction entre 1 et 4
if (dir.eq.1)then ! dir = 1
elseif(dir.eq.2)then ! dir = 2
elseif(dir.eq.3)then ! dir = 3
else
! dir = 4
c Une " planète
Fourmilière "
if (x(n).eq.0) then ! si la fourmi sort à gauche
elseif (x(n).eq.nl+1) then ! si elle sort à droite
endif
if (y(n).eq.0) then ! si la fourmi sort en haut
elseif (y(n).eq.nc+1) then ! si elle sort en bas
endif if (Nid(x(n),y(n)).ne.0)then call Prise(Nid,x,y,charge,n,nl,nc,seed) else call Depose(Nid,x,y,charge,n,nl,nc,seed) endif
etat=10+charge(n)
enddo return end
c ==================================
c Calcul des Concentrations
subroutine Concentration(Nid,x,y,Fr,Fb,n,nl,nc) integer Nid(100,100),x(100),y(100),n
Fr=0
abs=mod(x(n)+i,nl)
c Concentration en oeufs
rouges
do i=-1,1
if (abs.eq.0)then
if (ord.eq.0)then
if (Nid(abs,ord).eq.1)then
enddo
c Concentration en oeufs
bleus
do i=-1,1
if (abs.eq.0)then
if (ord.eq.0)then
if (Nid(abs,ord).eq.2)then
enddo
Fr=Fr/9.
return
c Prise des oeufs
subroutine Prise(Nid,x,y,charge,n,nl,nc,seed) integer x(100),y(100),Nid(50,50),charge(100),n,nl,nc
r=ran(seed) call Concentration(Nid,x,y,Fr,Fb,n,nl,nc) if ((Nid(x(n),y(n)).eq.1).and.(charge(n).eq.0))then ! Pour un oeuf Rouge Ppriser=(0.2/(0.2+Fr))**2
if (r.le.Ppriser)then
elseif((Nid(x(n),y(n)).eq.2).and.(charge(n).eq.0))then! Pour un oeuf Bleu Ppriseb=(0.1/(0.1+Fb))**2
if (r.le.Ppriseb)then
return
c Dépose des oeufs
subroutine Depose(Nid,x,y,charge,n,nl,nc,seed) integer x(100),y(100),Nid(50,50),charge(100),n,nl,nc
r=ran(seed) call Concentration(Nid,x,y,Fr,Fb,n,nl,nc) if ((Nid(x(n),y(n)).eq.0).and.(charge(n).eq.1))then ! Pour un oeuf Rouge Pposer=(Fr/(0.1+Fr))**2
if (r.le.Pposer)then
elseif((Nid(x(n),y(n)).eq.0).and.(charge(n).eq.2))then! Pour un oeuf Bleu Pposeb=(Fb/(0.1+Fb))**2
if (r.le.Pposeb)then
return
|
Comme pour l'autre programme, une petite visualisation
du problème en images suivra mais je ne sais pas quand...