IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Automate cellulaire - problème de limite d'environnement et d'algorithme


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Par défaut Automate cellulaire - problème de limite d'environnement et d'algorithme
    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.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut Automate cellulaire - problème de limite d'environnement et d'algorithme
    Bonjour,

    Une première approche :

    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
    clear
    %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')
    grid
    %4) Positionner agent
    hold on;
    XAgents=1;
    YAgents=9;
    YAgentsnm1=9;
    arret(1)=0;
    h=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 & arret(1)==0
        XAgents(1) = XAgents(1)+1;
        alea = rand;
                if alea < 0.333
                    YAgents(1) = YAgents(1)+1;
                elseif alea < 0.66
                    YAgents(1) = YAgents(1)-1;
                end
            if U(YAgents,XAgents)==0  
                YAgents(1) =  YAgentsnm1(1);
                XAgents(1)=XAgents(1)-1;
                arret(1)=1;
            end
            YAgentsnm1(1)=YAgents(1);
        end
        set(h,'Xdata',XAgents,'Ydata',YAgents)
     %8) ralentir le déplacement
        pause(0.3)
     
    end

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Par défaut
    Bonjour, tout d'abord, merci de ta réponse.

    Cependant je ne comprend pas les lignes suivantes, peux-tu m'expliquer stp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    YAgentsnm1=9;    
    arret(1)=0;

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if U(YAgents,XAgents)==0  
                YAgents(1) =  YAgentsnm1(1);
                XAgents(1)=XAgents(1)-1;
                arret(1)=1;
            end
     
            YAgentsnm1(1)=YAgents(1);
    end
    A quoi sert "YAgentsnm1" exactement, ainsi que le code suivant stp ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonsoir,

    YAgentsnm1 est la valeur de Y au coup d'avant ( n moins un ) cela permet de rester au bord de la rivière quand il,y a dépassement.
    arret(1) est le signal d'arrêt de la particule 1

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Par défaut
    D'accord merci.

    Mais pourquoi YAgentsnm1=9 ? Pourquoi égale à 9 ? C'est sa qui m'échappe.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour,
    C'est la valeur donnée à l'initialisation de y. Le premier coup il n'y a pas de valeur passée (n moins un n'existe pas).

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/02/2010, 23h03
  2. problème de limit
    Par isa21493 dans le forum Requêtes
    Réponses: 6
    Dernier message: 10/03/2006, 13h09
  3. [MFC] Problème de limitation d'un CListCtrl
    Par exal66 dans le forum MFC
    Réponses: 1
    Dernier message: 30/12/2005, 17h49
  4. [Debutant(e)]problème de variable d'environnement
    Par tolsam dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/08/2004, 19h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo