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 :

Backtracking sous Matlab


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Backtracking sous Matlab
    Bonjour à tous,

    j'ai un problème théorique. Je possède un tableau d'entiers à deux dimensions dans lequel je me place aléatoirement (indice i,j). Puis je compare cette case du tableau avec les 4 cases adjacentes.

    Si la case courante est le minimum, alors je m'arrête sinon je me place sur le nouveau minimum puis je compare à nouveau avec les 4 cases adjacentes et ainsi de suite, jusqu'à trouver le minimum du tableau.

    Jusque là, tout va bien. Sauf que j'aimerai ne plus effectuer la comparaison avec les cases du tableau déjà visitées et je ne sais pas comment écrire cette condition.

    Merci de votre aide.

  2. #2
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Peux tu nous montrer ce que tu as déjà fait ?
    Comment tu définis les 4 cases adjacentes ?
    J'ai deux pistes :
    Choix aléatoire de i et j est sans répétition avec une condition (définition des 4 cases adjacentes).
    Soit tu supprimes les éléments testés de ta matrice initiale. (matrice ==> vecteur!!!)
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Pour l'instant, j'arrive à trouver le minimum d'une matrice donnée, en partant de n'importe quel point initial (i,j).
    Les cases adjacentes sont définies comme cela :
    Nom : adjacent.PNG
Affichages : 192
Taille : 551 octets Pour k=1

    Supprimer les éléments au fur et à mesure est une bonne idée mais je ne vois pas comment écrire la condition "s'il n'existe rien à côté".

    Merci.

  4. #4
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Pour les sommets, ils ont alors seulement deux cases adjacentes ??

    Citation Envoyé par Onkyo Voir le message
    Si la case courante est le minimum, alors je m'arrête sinon je me place sur le nouveau minimum puis je compare à nouveau avec les 4 cases adjacentes et ainsi de suite, jusqu'à trouver le minimum du tableau.
    Comment peux tu garantir que tu as trouvé le minimum du tableau ??
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    C'est exactement ça pour les sommets.

    En fait, la matrice représente un critère convexe (je fais un peu comme une descente de gradient pour trouver le minimum) donc cela m'assure de trouver le minimum de la matrice.

  6. #6
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Je pense que tu vas avoir un problème si tu supprimes les éléments testés :
    On suppose que ton min représente une des cases adjacentes de la case courante, forcement cette case n'est pas ton min, si tu vas la supprimer ainsi que ses cases adjacentes, tu tomberas sur un "faux min" !!
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Oui, en fait plutôt que de supprimer les valeurs, je les ai remplacées par NaN (ce qui facilite aussi pour la condition). Mais j'ai un problème :
    je dois remplacer par NaN toutes les valeurs visitées sauf le nouveau minimum (sinon problème pour les comparaisons suivantes) or sur le coup je ne sais pas laquelle des valeurs adjacentes va être mon nouveau minimum.

    Je vous mets un petit bout de code pour être plus clair :
    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
    while condition
    				tmp=[];
     
                    %on met la valeur initiale dans le tableau
    				 if (i(1) <= L && j(1) <= C) 
    					 tmp(end+1)=M(i(1),j(1));
                     end
     
                     for k=1:pas
    			    %puis viennent les 4 valeurs adjacentes
    				  if (i(1)+k <= L) 
    					 tmp(end+1)=M((i(1)+k),j(1));
    				  end
     
    				 if (i(1)-k > 0)
    					 nb=M((i(1)-k),j(1));
    					 tmp(end+1)=nb;
    				 end
     
    				 if (j(1)+k <= C)
    					 tmp(end+1)=M(i(1),(j(1)+k));
    				 end
     
    				 if (j(1)-k > 0)
    					 tmp(end+1)=M(i(1),(j(1)-k));
     
                     end
                     end
    				 val_min=min(tmp);
     
    				%Chercher u_min et v_min à partir de la matrice
    				 [u_min,v_min]=find(abs(M-val_min)<.001);
    				 sol=val_min;
    				 u_sol=u_min(1);
    				 v_sol=v_min(1);
    				 if (M(i(1),j(1)) <= val_min) 
    					 condition=false;
    				 else
    					 i(1)=u_sol;
    					 j(1)=v_sol;
    				 end
    tmp est le tableau dans lequel j'effectue mes comparaisons. Je le vide à chaque nouveau tour de boucle.

  8. #8
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Voici ce bout de code, à optimiser :
    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
    close all
    clc
    [x,y]=meshgrid(linspace(-2,2,101));
    A=(x.^2)+(y.^2);
    SizeA=size(A);
    surf(x,y,A)
    shading interp
    view(0,-90)
     
     
    iRand=randperm(prod(SizeA));
     
    K=1;
    j=1;
    while numel(iRand)>1
        [I,J] = ind2sub(SizeA,iRand(1));
        Res= CasesAdjacentes(I,J,K,SizeA);
        index=[sub2ind(SizeA,Res(:,1),Res(:,2));iRand(1)];
    [Min,Imin] = min(A(index(1:end-1)));
        if A(iRand(1))<Min
            break
        end
        index(Imin)=[];
        for m=1:numel(index)
            iRand(iRand==index(m))=[];
        end
        j=j+1;
    end
    %%
    j
    hold on
    plot3(x(iRand(1)),y(iRand(1)),A(iRand(1)),'MarkerFaceColor',[1 0 0],'MarkerSize',15,...
        'Marker','hexagram',...
        'LineStyle','none',...
        'Color',[1 0 0]);
    la fonction CasesAdjacentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Res= CasesAdjacentes(I,J,K,SizeA)
    Top=[I-K J];
    Bottom=[I+K J];
    Left=[I J-K];
    Right=[I J+K];
    Res=[Top;Bottom;Left;Right];
    [row,~] = find(Res<=0);
    Res(row,:)=[];
    [row,~] = find(Res>SizeA(1)|Res>SizeA(2));
    Res(row,:)=[];
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  9. #9
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Si tu augmentes k, ça converge plus rapidement,
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Serait-ce possible de commenter un peu le code, car je comprends pas tout...

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Ok, j'ai finalement compris.
    Juste une chose, pour chaque tour de boucle, dans le tableau iRand, j'ai l'impression qu'il repart de iRand(1) (dans lequel on a enlevé les indices des valeurs que l'on a déjà visitées).

    J'aimerais mieux qu'il reparte de l'indice du minimum précédent (celui que l'on a trouvé dans le tour de boucle précédente).

  12. #12
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Je suis b.., forcément on doit repartir de l'indice du minimum précédent.
    Dans ce cas tu n'auras qu'une seule case qui se répète à chaque itération...
    Tu peux remplacer Lignes 23==>26 par (tu ne supprimes pas la case qui se répète):
    et tu mets while true ou while nombre d'itération max.
    Tu peux optimiser encore ton algo ainsi que le code !!
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci de votre aide. Grâce à votre astuce des indices dans un tableau, j'ai réussi à modifier mon code pour qu'il ne prenne plus en compte les cases déjà visitées.

    Toutefois, j'ai essayé de reprendre le code que vous m'avez fournit et je me suis rendu compte qu'il reprend les cases déjà visitées. Seule le tableau iRand est modifié (donc la case de départ à chaque tour de boucle).

    Une autre petite question : dans la fonction CasesAdjacentes, comment modifier l'algo pour que pour k=2 par exemple, il remplisse le tableau Top avec les 2 cases adjacentes (idemn pour Bottom, Left, Right).Autrement dit pour k=2, je prends les cases de k=1 + k=2, pour k=3, ce sera k=3 + k=2 + k=1.

    Par exemple pour k=2 :

    Nom : adjacent2.PNG
Affichages : 253
Taille : 1,8 Ko

  14. #14
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    De rien

    Citation Envoyé par Onkyo Voir le message
    Toutefois, j'ai essayé de reprendre le code que vous m'avez fournit et je me suis rendu compte qu'il reprend les cases déjà visitées. Seule le tableau iRand est modifié (donc la case de départ à chaque tour de boucle).
    Non, pour chaque nouvelle itération on ne reprend qu'une seule case déjà visitée et pas toutes les cases.

    Citation Envoyé par Onkyo Voir le message
    Une autre petite question : dans la fonction CasesAdjacentes, comment modifier l'algo pour que pour k=2 par exemple, il remplisse le tableau Top avec les 2 cases adjacentes (idemn pour Bottom, Left, Right).Autrement dit pour k=2, je prends les cases de k=1 + k=2, pour k=3, ce sera k=3 + k=2 + k=1.

    Par exemple pour k=2 :

    Nom : adjacent2.PNG
Affichages : 253
Taille : 1,8 Ko
    Tu modifies la fonction CasesAdjacentes, comme par exemple pour le Top de ta case active, tu peux ne pas prendre les inter-cases. Tu choisis un grand K puis tu le modifies de façon automatique pour trouver ton min, je pense que c'est plus rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Top=[(I-K:I-1)' J*ones(K,1)];
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonsoir,

    j'aimerai maintenant effectuer la même chose mais pour un critère 3d. C'est à dire qu'au lieu d'avoir une matrice, on a maintenant un tenseur (comme un cube).
    Je voudrai savoir si les fonctions utilisées (sub2ind, size) sont toujours valables... Et comment modéliser ce tenseur sous matlab ?

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Animation sous MATLAB
    Par Bluntz dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/10/2006, 18h36
  2. Lire un programme écrit sous MATLAB
    Par tipi09 dans le forum Octave
    Réponses: 2
    Dernier message: 06/10/2006, 10h43
  3. Pointeur sous MATLAB
    Par corentin59 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/10/2006, 10h06
  4. Curseur sous MATLAB
    Par philatex dans le forum MATLAB
    Réponses: 2
    Dernier message: 23/08/2006, 09h02
  5. Exécutable sous MATLAB
    Par julien_arche dans le forum MATLAB
    Réponses: 6
    Dernier message: 01/08/2006, 09h54

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