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 :

decoupage d'une carte en sous carré


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut decoupage d'une carte en sous carré
    bonjour,

    pour un projet, j'ai besoin de decouper une matrice de case de type differents en sous carré de même type. le but etant de realiser un graph de zones connexes servant pour hierarchiser un algo de pathfinding.

    pour cela nous avons realiser une version simple de qui consiste en gros a faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pour chaque case de la matrice
        on crée un carré d'1 case
        tantque on peut construire un carré valide
            on agrandit le carré
        fintantQue
    finpour
    en considerant qu'un carré est valide quand il ne contient que des cases du même type et non deja utilisée dans un autre carré.

    le probleme est que des que le contenu de la matrice se complexifie, on se retouve avec un graphe de voisinage qui ne contient quasiment que des carré de la taille d'une case... bref on en revient presque à la matrice, ce qui fait perdre tout l'interet de la hierarchie du pathfinder...

    etant donné qu'on utilise ici un algo glouton qui est loins de nous donner une solution optimal en terme de nombre de case dans le graph, si vous pouviez m'indiquer comment approcher de l'optimalitée (en nombre de sous carré)
    en fait on ne cheche pas forcement l'optimalitée mais une approche, etant donnée qu'on souhaite un algorithme "relativement" rapide, etant donné que le temps d'analyse d'une carte est deja tres long a cause d'autres analyse effectuée dessus et j'ai bien peur de ne voir de solution que par essais succecifs...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

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

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Par défaut
    L'heuristique gloutonne pourrait commencer par rechercher un gros carré afin d'empêcher que la création d'un tel gros carré soit empêchée par la création préalable d'un petit carré voisin.

    As-tu un exemple où ton heuristique donne manifeste nettement plus mauvaise que l'optimum? Sinon, on peut supposer que la création de nombreux petits carrés est due à la nature "morcelée de ton entrée"...

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par FrancisSourd
    L'heuristique gloutonne pourrait commencer par rechercher un gros carré afin d'empêcher que la création d'un tel gros carré soit empêchée par la création préalable d'un petit carré voisin.
    Il y a un algorithme pour trouver le plus gros carre en ne faisant qu'une passe sur la matrice et en employant un tableau dont la dimention est le plus petit cote de la matrice.

  4. #4
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    Citation Envoyé par FrancisSourd
    L'heuristique gloutonne pourrait commencer par rechercher un gros carré afin d'empêcher que la création d'un tel gros carré soit empêchée par la création préalable d'un petit carré voisin.
    effectivement, c'est ce qu'il me fallait... en effectuant une passe qui recherche le plus gros sous carré de la matrice et en le bloquant on ameliore sensiblement le resultat (et la complexitée en même temps... on passe de O(n) a O(n²) )
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par bafman
    effectivement, c'est ce qu'il me fallait... en effectuant une passe qui recherche le plus gros sous carré de la matrice et en le bloquant on ameliore sensiblement le resultat (et la complexitée en même temps... on passe de O(n) a O(n²) )
    A prendre au second degré, n'est-ce-pas ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par bafman
    Citation Envoyé par FrancisSourd
    L'heuristique gloutonne pourrait commencer par rechercher un gros carré afin d'empêcher que la création d'un tel gros carré soit empêchée par la création préalable d'un petit carré voisin.
    effectivement, c'est ce qu'il me fallait... en effectuant une passe qui recherche le plus gros sous carré de la matrice et en le bloquant on ameliore sensiblement le resultat (et la complexitée en même temps... on passe de O(n) a O(n²) )
    On peut trouver le plus gros carre dans une matrice de bits en un temps proportionnel au nombre d'elements dans la matrice.

  7. #7
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    oui, c'est ca que je fait... mais etant donné que je veut trouver tout les sous carré, ca me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // on parcourt la matrice :
    tant que la matrice n'est pas entierement decoupé :
        on recupere le plus grand sous carré // complexité lineaire
        on le "bloc", il ne sera plus pris en compte pour les prochaines iteration
    fin tant que
    on a donc une complexité en O(N²)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

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

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Par défaut
    Pour rester en O(N), on peut faire une nombre constant (disons 10) passe où on ajoute le plus gros carré puis tu termines avec ton algo initial en O(N).

    Tu peux aussi ajouter d'un seul coup plusieurs gros carrés distincts que tu as pu trouvé dans la programmation dynamique (j'imagine que tu utilises la programmation dynamique pour trouver le plus gros carré).

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Tu peux aussi arreter de chercher le plus grand quand il est sous une taille donnee (deja sans perte de generalite, si le plus grand est de taille 1, c'est evident que c'est inutile de faire plusieurs recherches, s'il est de taille 2, la passe d'apres tu peux prendre un carre des qu'il est de taille 2 sans perte de qualite egalement) .

    Si tu acceptes de prendre plus de place en memoire, tu ne fais qu'une passe dans laquelle tu stockes pour chaque element de ta matrice le carre le plus grand ayant cet element comme coin inferieur droit (c'est immediat avec l'algo de programmation dynamique auquel je pensais) ce qu tu mets dans une file a priorite. Une fois ta passe faite, tu enleves les elements de ta file par ordre descendant. Pour chaque element, tu regardes si le carre est toujours valable. S'il l'est tu l'ajoute dans ta partition, tu mets tous les elements qui le compose a 0 pour pouvoir faire le test de validite par la suite. S'il ne l'est pas parce que l'element a ete mis a 0, tu l'oublies. S'il ne l'est pas parce qu'un autre element a ete mis a 0, tu peux trouver le nouveau carre maximal et tu le reinsere dans ta file.

    Une borne superieure de la complexite est N sqrt N log N si le nombre d'elements dans ta matrice est N.

Discussions similaires

  1. configurer une carte réseau sous Solaris 10 avec VMWare
    Par providence dans le forum Solaris
    Réponses: 1
    Dernier message: 01/06/2011, 17h06
  2. Problème avec une carte Micro SD 2Gb sous Vista
    Par sylsau dans le forum Windows Vista
    Réponses: 1
    Dernier message: 20/03/2009, 00h45
  3. decoupage d'une forme géométrique en carrés de 32*32
    Par AnozerOne dans le forum Mathématiques
    Réponses: 8
    Dernier message: 18/03/2008, 22h22
  4. écart entre lignes d'une table indésiré sous IE
    Par Galkir dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/04/2007, 13h50

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