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 :

Groupement de points par proximité 2D


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Groupement de points par proximité 2D
    Bonjour

    Je suis confronté au problème suivant et je cherche un algorythme permetant de traiter cela


    Je dispose d'un nombre N de points et leurs coordonées XY disposé aléatoirement sur un plan

    De dois creer G groupes ayant un maximum de M points chacun

    Chaque groupe doit evidement etre constitué en assemblant les points ayant la meilleure proximité

    Donc Hypothese :

    100 points XY
    Maximum 3 groupes
    Maximum 40 points par groupe

    Comment aborder cela ?

    Merci de vos suggestions

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    Tu peux regarder du côté de l'algorithme des k moyennes, c'est assez facile à implémenter (https://en.wikipedia.org/wiki/K-means_clustering). Par contre, il ne peut rien faire pour la taille maximale d'un groupe, mais la discussion est arrivée il n'y a pas si longtemps sur les forums (tu peux construire un petit truc par-dessus pour t'assurer que ça marche ; pour les détails…).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Dourouc05 et cher compatriote

    J'avais le pressentiment de devoir passer par du Delaunay ou du Voronoi
    Et tu me conforte donc dans l'idée que c'est la bonne piste

    Cela étant je ne suis pas pratiquant je dois donc me faire un peu la main
    L'objectif est de traduire ca en cSharp pour faire le boulot

    Si j'ai bien compris l'exemple, il partitionne selon le nombre de groupe
    Donc dans mon cas je devrais le cas échéant muter un certain nombre de points d'un groupe a l'autre en fonction de la densité et la proximité

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    M'est avis que tu cherches à faire bien compliqué. Vu le nombre de points, a priori, pas besoin d'aller aussi loin. Simplement partir de centres (prendre des points au hasard pour commencer) qui définissent des groupes, assigner chaque point au groupe dont le centre est le plus proche, recalculer les centres comme la moyenne des points du groupe, itérer. Et peut-être réassigner des points à un autre groupe pour la contrainte de quarante points par groupe, ça sera un peu plus inventif.

    Ça sera beaucoup plus facile à implémenter qu'une triangulation du genre (et tu trouveras facilement des implémentations existantes, au besoin).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 227
    Par défaut
    L'un des problèmes si on choisit 3 centres au hasard, c'est qu'on biaise pas mal les résultats. En caricaturant, si les 3 centres choisis sont tous les 3 très voisins l'un de l'autre, et tous les 3 très excentrés, on arrive à n'importe quoi.

    Un algorithme (un peu coûteux) est la méthode de la CAH (Classification hiérarchique ascendante).
    - On calcule toutes les distances 2 à 2.
    - On prend le couple de points avec la distance minimale, et on associe ces 2 points. Et on a un nouvel élément qui est ce couple de points. On recalcule donc la distance entre ce couple de points et les 98 autres points... A ce niveau là, on a 2 ou 3 choix qui peuvent donner des résultats différents. On peut dire que la distance entre un couple de points AB et un point C est au choix min ( Dist(AC), Dist(BC) ), ou bien Moyenne( Dist(AC), Dist(BC) ) ... ou bien d'autres formules envisageables.
    - Et on répète l'opération autant de fois que nécessaire pour avoir les 3 groupes voulus. en associant à chaque fois les 2 éléments avec la distance minimale (un élément étant soit un individu isolé, soit un groupe)
    - Et si on veut, on peut ajouter des contraintes pour qu'aucun groupe ne dépasse 40 individus.

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Dourouc05
    Merci tbc92

    tbc92 tu a raison sur le choix at random des trois point de départ et c'est la Remarque que je voulais faire a dourouc05
    Maintenant il est sans doute possible de poser des contraintes pour mieux determiner le choix de ces trois points


    Mais dans les deux proposition je me demande si on ne va tomber dans un problème classique d'affectation ou a force d'itérer "bêtement" sur les choix les meilleurs le resultat sera une répartition asser hétérogène et mal balancée

    Je vais bientot me lancer sur le coding a partir d'un échantillon et voir ce que ca donne

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/10/2005, 16h47
  2. VBA, graphiques : Acceder au Range pointé par une série
    Par CCHEVALIER dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/09/2005, 10h56
  3. Couleur du pixel pointé par la sourie
    Par algerian dans le forum Windows
    Réponses: 4
    Dernier message: 16/08/2005, 18h22
  4. Réponses: 4
    Dernier message: 21/05/2004, 09h13
  5. [MATH] Point par rapport à une droite
    Par teska dans le forum Mathématiques
    Réponses: 6
    Dernier message: 14/05/2003, 16h11

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