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

Algorithmes et structures de données Discussion :

Trie liste de point3D - minimiser deplacement


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut Trie liste de point3D - minimiser deplacement
    Bonjour,

    Je demande vote aide car je lutte sur un algo de trie. je pose le probleme.

    j'ai une liste d'element à 3 valeurs (X, Y et Z). j'aimerai trié cette liste de facon à ce que les elements soit "géographiquement le plus pret". avec comme priorité l'axe X puis l'axe Y puis Z.

    "géographiquement le plus pret" signifie que les points sont triés comme si on voulait minimiser l'espace entre deux points consécutifs. en minimisant le deplacement sur l'axe X puis l'axe Y et finalement l'axe Z qui est le moins contraint en deplacement.

    la deuxième contrainte est qu'on veut minimiser le nombre de deplacement entre deux points.

    le point initiale est fixé avant le trie.

    Petit exemple:
    - liste des points à ranger:
    (0,0,1)(0,1,0)(0,1,1)(1,0,0)(1,0,1)(1,1,0)(1,1,1) soit les coins d'un cube.

    bien entendu la liste peut être passée dans le n'importe quelle ordre.

    - point original :
    (0,0,0)

    la liste rangée serai :
    (0,0,0)(0,0,1)(0,1,1)(0,1,0)(1,1,0)(1,1,1)(1,0,1)(1,0,0)

    Merci d'avance à ceux interessés pour resoudre mon case tête.
    TiTi.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    avec un cube il y a plusieurs manières

    en partant de l'origine, tu as 3 directions équivalentes.

    Si par contre tu as des vrais points 3D, alors là c'est différent.

    En gros tu fais l'algorithme du "quick sort"
    (voir http://fr.wikipedia.org/wiki/Tri_rapide).

    Il faut une fonction de comparaison. Si tu veux trier tel que tu le dis (mais qui n'est pas en distance) , ta fonction sera du style :

    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
     
    Si X2 < X1
        alors Pt2 avant Pt1
    Sinon
        Si X2 > X1
            alors Pt2 après Pt1
        Sinon
            Si Y2 < Y1
                 alors Pt2 avant Pt1
            Sinon
                 Si Y2 > Y1 
                       alors Pt2 après Pt1
                 Sinon
                       Si Z2 < Z1
                            alors Pt2 avant Pt1
                        Sinon
                            Si Z2 > Z1
                                alors Pt2 après Pt1
                             Sinon
                                 On ne change rien
                             Fin si
                        Fin si
                 Fin si
            Fin si
        Fin si
    Fin si
    Mais ça ne triera pas en distance !!!
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre éclairé
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Points : 810
    Points
    810
    Par défaut
    salut,

    moi je ferais comme ca:
    - trier la liste de points selon X
    - segmenter cette liste en autant de listes qu'il y a de valeurs de X distinctes
    --- trier chacune de ces sous-listes selon Y
    --- segmenter chacune de ces liste en autant de listes qu'il y a de valeurs de Y distinctes
    ----- trier chacune des sous-sous-listes selon Z
    --- refusionner les sous-sous-listes
    - refusionner les sous-listes

    pour la deuxième contrainte j'ai pas compris, et d'ailleurs ton problème m'a l'air assez tordu c'est quoi ton problème initial ? il y a surement une solution plus simple

    a+

    Débugger du code est deux fois plus dur que d'en écrire.
    Donc, si vous écrivez votre code aussi intelligemment que vous le pouvez, vous n'etes, par définition, pas assez intelligent pour le débugger.

  4. #4
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Un algorithme très simple est de construire la liste de manière itérative. A chaque fois, tu rajoutes le point le plus proche (en utilisant ta définition de la proximité) du point précédemment ajouté.

    Cela ne donnes pas une solution optimale pour ton problème tel que tu le définis mais je dois avoir que je ne comprends pas ta deuxième "contrainte".
    la deuxième contrainte est qu'on veut minimiser le nombre de deplacement entre deux points.
    Est-ce mathématiquement une contrainte ou un objectif? Qu'est-ce que le déplacement entre deux points?

    Quand tu dis minimiser le déplacement sur x, est-ce que le coût de déplacement est proportionnel à la longueur du déplacement sur x, ou est-ce plus complexe.
    As-tu une formulation mathématique du coût de déplacement?

    Le problème est un voyageur de commerce en lui-même. Dans ma compréhension du problème, il est polynomial mais j'attends tes précisions sur l'énoncé pour répondre.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Je rajouterais que si c'est vraiment en distance que tu souhaites trier, alors ta fonction de comparaison sera du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    dist2 = distance ( Pt2, Ptref)
    dist1 = distance ( Pt1, PtRef)
     
    Si dist2 < dist1
        alors Pt2 avant Pt1
    Sinon
        Si dist2 > dist1
            alors Pt2 après Pt1
        Sinon
            Aucune importance
        Fin si
    Fin si
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    FrancisSourd tu as raison c'est un peu le probleme du voyageur du commerce.

    En fait ce que je veux faire c'est deplacer une pointe d'instrument dans l'espace. On me donne une liste de point. A moi d'ordonner ses points pour minimiser le deplacement de l'instrument.

    le deplacement sur X est plus lent que sur Y et Z.
    Je veux favoriser le deplacement sur Z.

    si on prend le problème en 2D et que les points sont uniforméments répartie ca donne ce genre de deplacement:
    >>>v
    v<<<
    ...
    Avec les axe
    x-->Z
    |
    v
    X

    la liste serai : >>>v <<<v

    comment je peux definir ca en algo??

    le test du superieur et inferieur sur X, Y et Z ne fonctionne pas car j'aurai la liste suivante:
    >>>v v<<<

    C'est plus claire comme ca?

    La deuxième contrainte c'est que je veux pas si possible me deplacer en diagonale seulement suivant une direction si possible. Bon si on a deux points avec X et Y différent on sera obligé. mais dans la mesure du possible je voudrai faire un seule deplacement X,Y ou Z entre deux points sucessifs de ma liste.
    je me deplacement axe par axe donc un deplacement en diagonal et plus long que le deplacement dans un seul axe.

  7. #7
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par <_oodTi96Tiboo_>
    le deplacement sur X est plus lent que sur Y et Z.
    Je veux favoriser le deplacement sur Z.
    Il y a alors une solution optimale qui, à partir de l'origine, va
    • soit au point de plus petite coordonnée x et parcourt les points dans l'ordre des x croissants
    • soit au point de plus grande coordonnée x et parcourt les points dans l'ordre des x décroissants

    Le choix entre les deux points se fait en fonction de la distance entre l'origine et le point de x min ou max.

    Reste à départager les points avec même valeur de x.

    Si les temps de déplacement sur Y et Z sont du même ordre de grandeur, le problème est NP complet. Il te faudra donc une heuristique (comme celle du plus proche voisin que j'indiquais dans mon précédent message, mais il y a mieux) pour départager les points qui ont même valeur sur X.

    Sinon, si les temps sur Y sont nettement plus grands que ceux sur Z, il faudra, pour les points avec x identique, parcourir les Y dans l'ordre croissant ou décroissant puis, chaque sous-ensemble de points avec même valeur de y est parcouru par z croissant ou décroissant.

    Ce problème se résout comme un plus court chemin, et c'est donc polynômial... mais je n'ai pas le temps aujourd'hui de formaliser plus. Si cette piste t'intéresse vraiment, je pourrai détailler un peu plus la semaine prochaine.


    si on prend le problème en 2D et que les points sont uniforméments répartie ca donne ce genre de deplacement:
    >>>v
    v<<<
    ...
    Avec les axe
    x-->Z
    |
    v
    X

    la liste serai : >>>v <<<v

    comment je peux definir ca en algo??
    J'avoue que je ne comprends pas >>>v....

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    [QUOTE=<_oodTi96Tiboo_>]

    si on prend le problème en 2D et que les points sont uniforméments répartie ca donne ce genre de deplacement:
    >>>v
    v<<<
    ...
    Avec les axe
    x-->Z
    |
    v
    X

    la liste serai : >>>v <<<v
    [QUOTE]

    Soit la liste de point (x,y) suivante:=
    (0,0) (0,1) (0,2) (0,3) (1,0) (1,1) (1,2) (1,3) (2,0) (2,1) (2,2) (2,3) (3,0) (3,1) (3,2) (3,3)

    cette liste serai rangée comme ceci:
    (0,0) (0,1) (0,2) (0,3) (1,3) (1,2) (1,1) (1,0) (2,0) (2,1) (2,2) (2,3) (3,3) (3,2) (3,1) (3,0)

    pour faire ce mouvement là:
    >>>v
    v<<<
    >>>V

    avec
    >: avancer suivant y
    v: avancer suivant x
    <: reculer suivant y

    Autement pour ta reponse je suis pas très matheu dans l'ame et j'ai du mal à comprendre le coup de NP complet entre autre

  9. #9
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Merci pour ces précisions.

    En fait, si un problème est NP-complet, cela signifie qu'il n'y a pas d'algorithme rapide pour le résoudre. En pratique il faut chercher des bonnes solutions (non optimales) au problème (heuristique, recherche locale, métaheuristique...)

    En gros, tu pars d'une solution que tu as construit puis tu essaies de l'améliorer en changeant la séquence (inversion de deux points par exemple) jusqu'à ce que tu n'arrive plus à l'améliorer.

    Dans ton cas, il me semble que l'on peut quand même avoir un bon algorithme mais cela demande quelques connaissances en théorie des graphes.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    J'ai toujours pas réussit à generer un algo valable pour resoudre mon probleme.

    je resume:
    - je veux deplacer une pointe d'instrument dans un espace 3D (x,y,z).
    - l'utilisateur defini un nombre de point ou la pointe doit se positioner.
    - cette liste est donnée point par point.
    - le deplacement sur x est le plus lent. => minimiser le deplacement sur cet axe
    - je desire favoriser le deplacement sur l'axe z (y et z vont à la même vitesse mais pour diverse raison je fait ce choix).
    - le point de debut de sequence est definie par l'utilisateur est donnée en premier.
    - dans la mesure du possible avoir un seul depalcement entre deux points. donc trouver le point le plus proche en gardant les valeurs sur 2 axes identiques si possible.

    je voudrai donc créer une liste de points organisés en fonction du parcour de la la pointe.
    le deplacement doit respecter les contraintes suivante:
    - minimiser deplacement sur X.
    - maximiser deplacement sur Z.
    - debuter d'un point definie.

    la solution de faire un test sur x,y et z est delicat plus que l'on ne peux pas dire qu'un point est supperieur (à mettre en queu de liste) à un autre puisque cela depend des precedents points déjà parcourus.

    je donne un exemple en 2D c'est plus simple.
    soit les points suivant (x,y):
    (0,0)(1,0)(0,1)(1,1)
    point de start: (0,0)

    le parcout optimal suivant mes criteres serait:
    (0,0) (0,1) (1,1) (1,0)

    or si on fait un test en testant si x et y superieur ou inferieur, on aurait.
    (0,0) (0,1) (1,0) (1,1)
    car (1,0) > (1,1) (x1=x2 et y1<y2)

    je donne un exemple en 3D pour la forme et bien expliquer ce que je voudrais.
    soit les points suivant (x,y,z):
    (0,0,0) (1,0,0) (0,1,0) (1,1,0) (1,2,0) (0,2,0) (0,1,2) (0,1,1)
    point de start: (0,0,0)

    le parcout optimal suivant mes criteres serait:
    (0,0,0) (0,1,0) (0,1,1) (0,1,2) (0,2,0) (1,2,0) (1,1,0) (1,0,0)
    ou ca qui seraitr encore mieux:
    (0,0,0) (0,1,0) (0,1,2) (0,1,1) (0,2,0) (1,2,0) (1,1,0) (1,0,0)
    car le deplacement sur l'axe z est plus long mais ca minimise le deplacement sur deux axes z et y simulatement qui est par nature plus long car deux deplacements. enfin ca c'est le luxe

    c'est un peu long mais je voulai être claire. enfin je j'espere

    merci d'avance de votre aide.

  11. #11
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554

  12. #12
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut Re:
    Voici Comment déterminer lequel des points A et B est le plus proche du point C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fonction PointLePlusProche(POINT A, POINT B, POINT C)
    {
        Si d(A, C) < d(B, C) Alors
            C'est A
        Sinon : Si d(A, C) > d(B, C) Alors
            C'est B
        Sinon :
            C'est PointLePlusProcheSelonX(A, B, C)
        Fin Si
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fonction PointLePlusProcheSelonX(POINT A, POINT B, POINT C)
    {
        Si |xA - xC| < |xB - xC| Alors
            C'est A
        Sinon : Si |xA - xC| > |xB - xC| Alors
            C'est B
        Sinon :
             C'est PointLePlusProcheSelonY(A, B, C)
        Fin Si
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fonction PointLePlusProcheSelonY(POINT A, POINT B, POINT C)
    {
        Si |yA - yC| < |yB - yC| Alors
            C'est A
        Sinon : Si |yA - yC| > |yB - yC| Alors
            C'est B
        Sinon :
             C'est PointLePlusProcheSelonZ(A, B, C)
        Fin Si
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fonction PointLePlusProcheSelonZ(POINT A, POINT B, POINT C)
    {
        Si |zA - zC| < |zB - zC| Alors
            C'est A
        Sinon : Si |zA - zC| > |zB - zC| Alors
            C'est B
        Sinon :
             C'est A /* Ou pourquoi pas B? ;) */
        Fin Si
    }
    Pour parcourir un ensemble de points avec chaque fois un déplacement minimum, en partant d'un point quelconque de départ (qui n'est pas forcément le point O), on parcours les points de proche en proche sans repasser par un même point (autrement dit si A est plus proche que B pourtant on est déja passé par A, alors on passe cette fois ci par B).

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    Melem je suis un peu partie comme tu le decris mais avec cette fonction comme evaluation de la distance entre 2 points.

    function Eval (Pt1, Pt2){
    abs((Pt2.X - Pt1.X) * Cx) +
    abs((Pt2.Y - Pt1.Y) * Cy) +
    abs((Pt2.Z - Pt1.Z)* Cz)
    }

    Cx, Cy et Cz sont des facteur de ponderations pour favoriser un axe plutot qu'un autre. J'ai pris Cx=10000, Cy=100 et Cz=1.

    J'ai simplifié le problème en ajoutant les points par plan 2D. ils sont definis par deux pts. On ajoute plan par plan (soit XY, XZ ou YZ).
    lors de l'ajoue d'un plan j'ajoute à ma liste les points un par un comme ceci (excusez c'est en Java mais ca se lit bien):

    public void Add_planeXY(Point2D Pt0, Point2D Ptf, Point2D Delta, double Z0){
    for (double x=Math.min(Pt0.X, Ptf.X); x<=Math.max(Pt0.X, Ptf.X); x+=Math.abs(Delta.X)){
    for (double z=Math.min(Pt0.Y, Ptf.Y); z<=Math.max(Pt0.Y, Ptf.Y); z+=Math.abs(Delta.Y)){
    List_pts.Add_point(x, Y0, Correction_planarity(z, x, Y0));
    }
    }
    }

    La fonction Add_point parcourt la liste et insert le point si elle trouve que le point et plus proche que sont suivant grace à la fonction d'evaluation.

    bon entre deux plans saisis, le deplacement peut être long mais bon je rejete la faute sur l'utilisateur pour qu'il choisisse bien ses plans

    Les premiers tests sont ok et la procedure est super rapide.

    Si on avait mieux à proposer je suis toujours preneur.

Discussions similaires

  1. trie list par les derniere lettre
    Par godarium dans le forum Général Python
    Réponses: 13
    Dernier message: 17/09/2010, 11h34
  2. trie liste de nombres
    Par courson dans le forum Débuter
    Réponses: 2
    Dernier message: 09/01/2009, 16h37
  3. Serveur FTP Filezilla trie liste fichiers
    Par damjal dans le forum Serveurs (Apache, IIS,...)
    Réponses: 1
    Dernier message: 29/10/2006, 12h40
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05

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