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 :

Erreur due à une valeur aléatoire dans un algorithme [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut Erreur due à une valeur aléatoire dans un algorithme
    Bonsoir,

    Je travaille sur une simulation informatique de colonisation spatiale. J'ai fais un script qui permet, depuis la planète d'origine, de trouver le chemin le plus court pour visiter toutes les autres planètes une à une.

    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
     
    N = 50; % Nombre de système à coloniser
     
    Max = 100;
    Origine = [Max/2, Max/2, 0];
     
    ind = randperm(Max*Max);
    [x,y] = ind2sub([Max Max],ind(1:N));
     
    P = [x(:),y(:),zeros(N,1)];
     
    % Algorithme
     
    VectorO = zeros(N,3);
    NormesO = zeros(N,1);
    All_Best_ways = zeros(N,1);
     
    for i = 1 : N
        VectorO(i,1:2) = P(i,1:2) - Origine(1,1:2);
        NormesO(i,1) = sqrt((VectorO(i,1))^2+(VectorO(i,2))^2);
    end
    Emplacement_Best_way = find(NormesO == min(NormesO(:)));
    Best_way = min(NormesO);
    All_Best_ways(1,1) = Best_way;
    P(Emplacement_Best_way,3) = 1;
    clear VectorO NormesO
     
     
    Vector = zeros(N-1,3);
    Normes = zeros(N-1,1);
    for j = 2 : N
        for i = 1 : N
            if i ~= Emplacement_Best_way
                if P(i,3) == 0
                    Vector(i,1:2) = P(i,1:2) - P(Emplacement_Best_way,1:2);
                    Normes(i) = sqrt((Vector(i,1))^2+(Vector(i,2))^2);
                else
                    Normes(i) = inf;
                end
            else
                Normes(i) = inf;
            end
        end
        Emplacement_Best_way = find(Normes == min(Normes(:)));
        Best_way = min(Normes);
        All_Best_ways(j,1) = Best_way;
        P(Emplacement_Best_way,3) = 1;
    end
    Mon script fonctionne bien, mais ceci uniquement 2 fois sur 3. Effectivement parfois il me met l'erreur suivante :

    Error using -
    Matrix dimensions must agree.

    Error in simu (line 34)
    Vector(i,1:2) = P(i,1:2) - P(Emplacement_Best_way,1:2);

    Apparemment P(Emplacement_Best_way,1:2) prend parfois, et je suppose à cause des Random, la valeur d'une matrice de 2*2 alors que c'est censé être un vecteur ligne de 1*2.

    Si quelqu'un voit d'où vient mon erreur, merci d'avance !

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur en science de l'environnement
    Inscrit en
    Août 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en science de l'environnement

    Informations forums :
    Inscription : Août 2013
    Messages : 97
    Points : 149
    Points
    149
    Par défaut
    J'ai pas lancé le code mais j'imagine que le problème vient de là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Emplacement_Best_way = find(NormesO == min(NormesO(:)));
    Ajoute une ligne de code, au cas où il trouve plusieurs valeurs min, pour qu'il n'en sélectionne qu'une seul.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut
    Merci, j'ai rajouté cette ligne mais ça ne fonctionne toujours pas... Pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if length(Emplacement_Best_way) ~= 1
            Emplacement_Best_way(2:end) = [];
    end

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    si tu as rajouté ces lignes après les deux instructions find, alors cela devrait marcher.

    Mais il y a plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Emplacement_Best_way = find(NormesO == min(NormesO(:)),1,'first');
    Voir la doc pour plus d'explications. Il faut procéder de même pour le deuxième find.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut
    Autant pour moi, mon script fonctionnait en fait !
    Mais merci pour cette deuxième solution

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/03/2015, 08h53
  2. Réponses: 2
    Dernier message: 30/06/2011, 10h02
  3. Erreur due à une valeur non disponible
    Par Poisell dans le forum Excel
    Réponses: 2
    Dernier message: 09/12/2010, 17h41
  4. Joindre une valeur arbitraire dans un SELECT
    Par Tuxxy dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/01/2004, 17h04
  5. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52

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