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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    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 émérite
    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
    Points : 2 841
    Points
    2 841
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    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 émérite
    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
    Points : 2 841
    Points
    2 841
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

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

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

  6. #6
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    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).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Ah d'accord, je te remercie !

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème avec l'incrémentation du temps
    Bonjour, je reviens vers vous car j'ai encore un petit problème. Lorsque je lance mon script, je rentre ma valeur de "Nbagent" dans ma "Command Window" ce qui correspond à mon nombre d'agents que je veux lancer. Par exemple je rentre 5, 5 particules seront lancés les uns après les autres, une fois la précédente arrêté. Toutefois, j'ai un problème au niveau de l'incrémentation car l'envoi de nouveau agent continu sans cesse. Je voudrais que si je rentre 5, 5 particules soient lancées puis le programme s'arrête une fois la dernière particule stoppée.

    Merci d'avance pour votre aide.

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    % Faire Environnement
    U=zeros(17,19);
     
    % 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;
     
    % Créer l'image
    image(U,'cDataMapping','scaled')
     
    % Positionner agent
    hold on;
    XAgents=[1];
    YAgents=[9];
    YAgentsnm1=9;
    arret=[0,1]
     
    plot(XAgents,YAgents,'ow');
     
    %Demande du temps d'execution
     
    n=input('Quel est le nombre d''agent lancé ?')
    for Nbagent=1:n
     
     
        while((length(find(arret~=0))==0)||(Nbagent~=n))
     
            %Particule reste dans la rivière
            ag=1;
            riv=U(YAgents(ag),XAgents(ag));
     
            disp(ag)
     
            %Déplacement de la particule dans la rivière
     
            while riv==1 || arret(ag)==0
                XAgents(ag) = XAgents(ag)+1;
                alea = rand;
     
                if alea<0.33
                    YAgents(ag)=YAgents(ag)+1;
                elseif alea<0.66
                    YAgents(ag)=YAgents(ag)-1;
                end
     
                %arret particule quand celle-ci va toucher la berge
     
                if U(YAgents(ag),XAgents(ag))==0
                    YAgents(ag)=YAgentsnm1(ag);
                    XAgents(ag)=XAgents(ag)-1;
                    arret(ag)=1;
     
                    ag=ag+1
                end
     
                if length(XAgents)<ag && length(YAgents)<ag
                    XAgents(ag)=[1];
                    YAgents(ag)=[9];
                end
     
                YAgentsnm1(ag)=YAgents(ag);
                riv=U(YAgents(ag),XAgents(ag));
     
                %Faire image
                hold  off
                image(U,'cDataMapping','scaled')
                hold on
                plot(XAgents,YAgents,'ow')
                grid on
                % voir le pas de temps
                pause(0.5)
            end
        end
    end

  9. #9
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour,

    J'ai supprimé le for Nbagent=1:n

    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
     
    nb=input('Quel est le nombre d''agent lancé ?')
    n=0;
        while length(find(arret~=0))==0 | nb>=n
            %Particule reste dans la rivière
            ag=1;
            riv=U(YAgents(ag),XAgents(ag));
            disp(ag)
            %Déplacement de la particule dans la rivière
            while riv==1 | arret(ag)==0
                XAgents(ag) = XAgents(ag)+1;
                alea = rand;
                if alea<0.33
                    YAgents(ag)=YAgents(ag)+1;
                elseif alea<0.66
                    YAgents(ag)=YAgents(ag)-1;
                end
                %arret particule quand celle-ci va toucher la berge
                if U(YAgents(ag),XAgents(ag))==0
                    YAgents(ag)=YAgentsnm1(ag);
                    XAgents(ag)=XAgents(ag)-1;
                    arret(ag)=1;
                    ag=ag+1
                    n=n+1;
    erreur là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while riv==1 | arret(ag)==0
    Une seule barre

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Dans un premier temps, merci pour ton aide.

    Cependant, je me suis peut être mal exprimé. Quand l'utilisateur rentre 3 par exemple, je voudrais qu'il y ait au maximum 3 particules qui partent. Du coup j'ai modifié 2-3 truc et j'ai obtenu ce que je voulais.
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    clear
    clc
     
    % Faire Environnement
    U=zeros(17,19);
     
    % 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;
     
    % Créer l'image
    image(U,'cDataMapping','scaled')
     
    % Positionner agent
    hold on;
    XAgents=[1];
    YAgents=[9];
    YAgentsnm1=9;
    arret=[0,1]
     
    plot(XAgents,YAgents,'ow');
     
    %Demande du temps d'execution
     
    nb=input('Quel est le nombre d''agent lancé ?')
    n=0;
    n=n+1
    ag=1
     
    %Particule reste dans la rivière
    riv=U(YAgents(ag),XAgents(ag));
     
    %Déplacement de la particule dans la rivière
     
    while n<=nb | arret(ag)==0
        XAgents(ag) = XAgents(ag)+1;
        alea = rand;
     
        if alea<0.33
            YAgents(ag)=YAgents(ag)+1;
        elseif alea<0.66
            YAgents(ag)=YAgents(ag)-1;
        end
     
        %arret particule quand celle-ci va toucher la berge
     
        if U(YAgents(ag),XAgents(ag))==0
            YAgents(ag)=YAgentsnm1(ag);
            XAgents(ag)=XAgents(ag)-1;
            arret(ag)=1;
            ag=ag+1
            n=n+1;
        end
     
     
        if length(XAgents)<ag && length(YAgents)<ag
            XAgents(ag)=[1];
            YAgents(ag)=[9];
        end
     
        YAgentsnm1(ag)=YAgents(ag);
        riv=U(YAgents(ag),XAgents(ag));
     
        %Faire image
        hold  off
        image(U,'cDataMapping','scaled')
        hold on
        plot(XAgents,YAgents,'ow')
        grid on
        % voir le pas de temps
        pause(0.5)
    end
    Cependant, une fois que je suis passé par le Guide pour créer une interface, le code me fait l'erreur suivante :

    Undefined function 'le' for input arguments of type 'cell'.
    Error in SMA>pushbutton1_Callback (line 155)
    while n<=nb | arret(ag)==0


    A première vue je dirais que le programme ne va pas chercher la valeur de nb que l'utilisateur rentre dans "edit1". Pourtant j'ai mis : nb=get(handles.edit1,'String').
    J'ai commis une erreur selon toi ?

    Voici le code de mon interface :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    function varargout = SMA(varargin)
    % SMA MATLAB code for SMA.fig
    %      SMA, by itself, creates a new SMA or raises the existing
    %      singleton*.
    %
    %      H = SMA returns the handle to a new SMA or the handle to
    %      the existing singleton*.
    %
    %      SMA('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in SMA.M with the given input arguments.
    %
    %      SMA('Property','Value',...) creates a new SMA or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before SMA_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to SMA_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
     
    % Edit the above text to modify the response to help SMA
     
    % Last Modified by GUIDE v2.5 19-Nov-2016 14:40:59
     
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
        'gui_Singleton',  gui_Singleton, ...
        'gui_OpeningFcn', @SMA_OpeningFcn, ...
        'gui_OutputFcn',  @SMA_OutputFcn, ...
        'gui_LayoutFcn',  [] , ...
        'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
     
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
     
     
    % --- Executes just before SMA is made visible.
    function SMA_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to SMA (see VARARGIN)
     
    % Choose default command line output for SMA
    handles.output = hObject;
     
    % Update handles structure
    guidata(hObject, handles);
     
    % UIWAIT makes SMA wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
     
     
    % --- Outputs from this function are returned to the command line.
    function varargout = SMA_OutputFcn(hObject, eventdata, handles)
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Get default command line output from handles structure
    varargout{1} = handles.output;
     
     
    set(handles.axes1, 'Visible','off')
     
     
    function edit1_Callback(hObject, eventdata, handles)
    % hObject    handle to edit1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of edit1 as text
    %        str2double(get(hObject,'String')) returns contents of edit1 as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function edit1_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to edit1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Faire Environnement
    U=zeros(17,19);
     
    % 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;
     
    % Créer l'image
    image(U,'cDataMapping','scaled')
     
    % Positionner agent
    hold on;
    XAgents=[1];
    YAgents=[9];
    YAgentsnm1=9;
    arret=[0,1]
     
    plot(XAgents,YAgents,'ow');
     
    %Demande du temps d'execution
     
    nb=get(handles.edit1,'String')
    n=0;
    n=n+1
    ag=1
     
    %Particule reste dans la rivière
    riv=U(YAgents(ag),XAgents(ag));
     
    %Déplacement de la particule dans la rivière
     
    while n<=nb | arret(ag)==0
        XAgents(ag) = XAgents(ag)+1;
        alea = rand;
     
        if alea<0.33
            YAgents(ag)=YAgents(ag)+1;
        elseif alea<0.66
            YAgents(ag)=YAgents(ag)-1;
        end
     
        %arret particule quand celle-ci va toucher la berge
     
        if U(YAgents(ag),XAgents(ag))==0
            YAgents(ag)=YAgentsnm1(ag);
            XAgents(ag)=XAgents(ag)-1;
            arret(ag)=1;
            ag=ag+1
            n=n+1;
        end
     
     
        if length(XAgents)<ag && length(YAgents)<ag
            XAgents(ag)=[1];
            YAgents(ag)=[9];
        end
     
        YAgentsnm1(ag)=YAgents(ag);
        riv=U(YAgents(ag),XAgents(ag));
     
        %Faire image
        hold  off
        image(U,'cDataMapping','scaled')
        hold on
        plot(XAgents,YAgents,'ow')
        grid on
        % voir le pas de temps
        pause(0.5)
    end

  11. #11
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb=get(handles.edit1,'String')
    Attention nb est en caractère ! et n en numérique.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Ah d'accord. Du coup il faut que je passe "nb" en numérique pour que la comparaison s'effectue.

    Il faut donc que je rajoute avant le while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    valeur=get(handles.edit1,'String')
    nb=str2num('valeur')
    Est-ce correcte ? car mon script remarche mais mes particules n'avance que d'une case et ne sont pas limités par le nombre que je rentre.

  13. #13
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    Par défaut Automate cellulaire - problème de limite d'environnement et d'algorithme
    Bonjour,

    Attention :

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Le script ne fonctionne pas sans les cotes justement. Cela me fait une erreur direct. C'est quand même bizarre que cela marche en simple script mais pas avec l'interface.

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    Envoi nous le fichier SMA.fig et le fichier SMA.m, tous les deux mis dans une archive zip ou rar
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    SMA.7z

    Bonjour Jerome
    Voilà, merci d'avance pour votre aide, c'est sympa de votre part.

  17. #17
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    La propriété String contient un tableau de cellules comme on peut le voir avec la présence des accolades { } ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >> handles.edit1
     
    ans = 
     
      UIControl (edit1) with properties:
     
                  Style: 'edit'
                 String: {'Edit Text'}
        BackgroundColor: [1 1 1]
               Callback: @(hObject,eventdata)SMA('edit1_Callback',hObject,eventdata,guidata(hObject))
                  Value: 0
               Position: [4 16.6923 30.2000 3.9231]
                  Units: 'characters'
    Il faut donc faire :

    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
    >> str = get(handles.edit1, 'String')
     
    str = 
     
        '5'
     
    >> str{1}
     
    ans =
     
    5
     
    >> nb = str2double(str{1})
     
    nb =
     
         5
    La propriété String contient un tableau de cellules car tu as saisis plusieurs lignes (le texte + un saut à la ligne) lors de la construction de l'objet avec le GUIDE.

    Ouvre à nouveau la figure avec le GUIDE, modifie la propriété String de l'objet Edit1 en supprimant le retour à la ligne puis enregistre à nouveau l'interface.

    Tu devrais maintenant obtenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >> handles.edit1
     
    ans = 
     
      UIControl (edit1) with properties:
     
                  Style: 'edit'
                 String: '5'
        BackgroundColor: [1 1 1]
               Callback: @(hObject,eventdata)SMA('edit1_Callback',hObject,eventdata,guidata(hObject))
                  Value: 0
               Position: [4 16.6923 30.2000 3.9231]
                  Units: 'characters'
    On remarque l'absence des accolades { } et donc la valeur peut être récupérée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> str = get(handles.edit1, 'String')
     
    str =
     
    5
     
    >> nb = str2double(str)
     
    nb =
     
         5
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour ton explication détaillée ! ça marche !

    Je n'avais pas modifié le String pourtant, et jamais je n'aurais imaginé que le problème venait de là...

    Et je ne connaissait pas la fonction "str2double".

    Si tu as une ligne de code également pour dire j'aurais fini :
    si une particule obtient lors de son déplacement la même position XY qu'une particule précédente, celle-ci s'arrête (donc arret(ag)=1) et l'autre reprend son chemin (donc arret(ag)=0).
    Mon problème c'est que les agents sont créés au fur et à mesure et donc la valeur de "ag" augmente. Je ne sait donc pas comment cibler une particule en particulier.

    En tout cas merci pour votre aide à tous les deux.

    Bonne soirée

Discussions similaires

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

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