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 :

[parfor] Où puis-je l'utiliser correctement dans mon algorithme ?


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Par défaut [parfor] Où puis-je l'utiliser correctement dans mon algorithme ?
    Bonsoir,

    J'ai écris un algorithme qui permet, en gros, de trouver le point le plus proche de chaque point dans l'espace.
    Le fait est que cet algorithme est lui-même imbriqué dans 2 boucles for. Au final le temps de calcul se compte en heures.
    J'aimerais savoir où je pourrais utiliser [parfor] dans mon code.

    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
     
    % Algorithme
     
            VectorO = zeros(N,4);
            NormesO = zeros(N,1);
            All_Best_ways = zeros(N,1);
            Point = zeros(N,3);
     
            for i = 1 : N
                VectorO(i,1:3) = P(i,1:3) - Origine(1,1:3);
                NormesO(i) = sqrt((VectorO(i,1))^2+(VectorO(i,2))^2+(VectorO(i,3))^2);
            end
            Emplacement_Best_way = find(NormesO == min(NormesO(:)));
            if length(Emplacement_Best_way) ~= 1 % Si il y a plusieurs plus courts chemins
                Emplacement_Best_way(2:end) = []; % On ne prend que le premier
            end
            Best_way = min(NormesO);
            All_Best_ways(1) = Best_way;
            P(Emplacement_Best_way,4) = 1; % Le système est visité
            Point(1,:) = P(Emplacement_Best_way,1:3);
     
            if Point(1,:) == Terre(1:3) % Si la Terre est atteinte
                Jusqua_Terre = sum(All_Best_ways);
            end
     
            Vector = zeros(N-1,4);
            Normes = zeros(N-1,1);
            for j = 2 : N
                for i = 1 : N
                    if i ~= Emplacement_Best_way
                        if P(i,4) == 0
                            Vector(i,1:3) = P(i,1:3) - P(Emplacement_Best_way,1:3);
                            Normes(i) = sqrt((Vector(i,1))^2+(Vector(i,2))^2+(Vector(i,3))^2);
                        else
                            Normes(i) = inf;
                        end
                    else
                        Normes(i) = inf;
                    end
                end
                Emplacement_Best_way = find(Normes == min(Normes(:)));
                if length(Emplacement_Best_way) ~= 1 % Si il y a plusieurs plus courts chemins
                    Emplacement_Best_way(2:end) = []; % On ne prend que le premier
                end
                Best_way = min(Normes);
                All_Best_ways(j) = Best_way;
                P(Emplacement_Best_way,4) = 1; % Le système est visité
                Point(j,:) = P(Emplacement_Best_way,1:3);
     
                if Point(j,:) == Terre(1:3) % Si la Terre est atteinte
                    Jusqua_Terre = sum(All_Best_ways);
                    break % On arrête l'algorithme
                end
            end
    Merci d'avance pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Avant d'utiliser parfor, il y a quelques améliorations à apporter à ton code.

    Le bloc suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Emplacement_Best_way = find(Normes == min(Normes(:)));
    if length(Emplacement_Best_way) ~= 1 % Si il y a plusieurs plus courts chemins
        Emplacement_Best_way(2:end) = []; % On ne prend que le premier
    end
    Best_way = min(Normes);
    All_Best_ways(j) = Best_way;
    devrait simplement s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [All_Best_ways(j),Emplacement_Best_way] = min(Normes);
    As-tu besoin des valeurs stockées dans Vector à la fin de ton code ?

    Si ce n'est pas le cas, tu n'as pas besoin de lui attribuer une taille Nx3. Il suffirait de faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vector = P(i,1:3) - P(Emplacement_Best_way,1:3);
    Normes(i) = sqrt(Vector(1)^2+Vector(2)^2+Vector(3)^2);
    Pourquoi mets tu N-1 éléments dans la ligne suivante :

    Ne serait-ce pas plutôt N ?

    Ensuite, tu remplis Normes avec des valeurs Inf. Initialise donc ce vecteur avec la fonction inf :

    Ceci te permettra de simplifier la boucle interne sur i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i = 1 : N
            if i ~= Emplacement_Best_way
                if P(i,4) == 0
                    Vector(i,1:3) = P(i,1:3) - P(Emplacement_Best_way,1:3);
                    Normes(i) = sqrt((Vector(i,1))^2+(Vector(i,2))^2+(Vector(i,3))^2);
                else
                    Normes(i) = inf;
                end
            else
                Normes(i) = inf;
            end
        end
    Ensuite, je ne suis pas certain que la condition suivante fasse ce que tu espères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Point(j,:) == Terre(1:3)
    Je ferais plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if all(Point(j,:) == Terre(1:3))
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Point(j,1) == Terre(1) && Point(j,2) == Terre(2) && Point(j,3) == Terre(3)

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Par défaut
    Merci beaucoup pour ta réponse !

    J'ai donc simplifié mon code avec tes 3 premières propositions et cela fonctionne parfaitement.
    Par contre, pour ce qui est d'écrire :
    Mon code ne fonctionne plus correctement, après quelques itérations, la valeur de ligne i de All_Best_ways reste la même jusqu'à la fin.

    Enfin, la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Point(j,:) == Terre(1:3)
    Me permet de tester si le point j actuel se trouve à certaines coordonnées.
    Si je mets un all, il va tester toutes les valeurs présentes dans Point et pas le point actuel non ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Citation Envoyé par Globoxx Voir le message
    Par contre, pour ce qui est d'écrire :
    Mon code ne fonctionne plus correctement, après quelques itérations, la valeur de ligne i de All_Best_ways reste la même jusqu'à la fin.
    Bizarre, il n'y a pas de raison à cela

    Citation Envoyé par Globoxx Voir le message
    Me permet de tester si le point j actuel se trouve à certaines coordonnées.
    Essai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >> if [1 2 3] == [1 2 3], disp('OK'); end
    OK
    >> if [0 2 3] == [1 2 3], disp('OK'); end
    >> if [1 4 5] == [1 2 3], disp('OK'); end
    Le test ne vérifie que l'égalité des premières valeurs de chaque terme.
    Il faut plutôt utiliser all ou any selon le besoin
    Citation Envoyé par Globoxx Voir le message
    Si je mets un all, il va tester toutes les valeurs présentes dans Point et pas le point actuel non ?
    Il va seulement tester les valeurs à la ligne j

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Peux-tu poster le code avec les modifications ?

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Par défaut
    Le voici :
    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
     
    % Algorithme
     
            NormesO = zeros(N,1);
            All_Best_ways = zeros(N,1);
            Point = zeros(N,3);
     
            for i = 1 : N
                VectorO = P(i,1:3) - Origine(1,1:3);
                NormesO(i) = sqrt((VectorO(1))^2+(VectorO(2))^2+(VectorO(3))^2);
            end
            Emplacement_Best_way = find(NormesO == min(NormesO(:)));
            if length(Emplacement_Best_way) ~= 1 % Si il y a plusieurs plus courts chemins
                Emplacement_Best_way(2:end) = []; % On ne prend que le premier
            end
            Best_way = min(NormesO);
            All_Best_ways(1) = Best_way;
            P(Emplacement_Best_way,4) = 1; % Le système est visité
            Point(1,:) = P(Emplacement_Best_way,1:3);
     
            if all(Point(1,:) == Terre(1:3)) % Si la Terre est atteinte
                Jusqua_Terre = sum(All_Best_ways);
            end
     
            Normes = zeros(N,1);
            for j = 2 : N
                for i = 1 : N
                    if i ~= Emplacement_Best_way
                        if P(i,4) == 0
                            Vector = P(i,1:3) - P(Emplacement_Best_way,1:3);
                            Normes(i) = sqrt((Vector(1))^2+(Vector(2))^2+(Vector(3))^2);
                        else
                            Normes(i) = inf;
                        end
                    else
                        Normes(i) = inf;
                    end
                end
                [All_Best_ways(j),Emplacement_Best_way] = min(Normes);
                P(Emplacement_Best_way,4) = 1; % Le système est visité
                Point(j,:) = P(Emplacement_Best_way,1:3);
     
                if all(Point(j,:) == Terre(1:3)) % Si la Terre est atteinte
                    Jusqua_Terre = sum(All_Best_ways);
                    break % On arrête l'algorithme
                end
            end
    Finalement all fonctionne très bien merci !
    Mais pour le Normes = inf(N,1)... Je sèche.

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

Discussions similaires

  1. [Débutant] Comment utiliser List dans mon code
    Par solaar dans le forum C#
    Réponses: 2
    Dernier message: 02/04/2013, 13h07
  2. Comment utiliser VLC dans mon application JAVA
    Par fleurette_51 dans le forum Général Java
    Réponses: 1
    Dernier message: 09/05/2010, 13h47
  3. comment utiliser impdb dans mon cas ?
    Par TshAw dans le forum Import/Export
    Réponses: 1
    Dernier message: 30/01/2010, 08h46
  4. utiliser JDom dans mon plugin
    Par Aurelien Pupier dans le forum Eclipse Platform
    Réponses: 7
    Dernier message: 27/06/2008, 15h22
  5. Erreur dans mon algorithme
    Par quaresma dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 25/05/2007, 10h04

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