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

Calcul scientifique Python Discussion :

sympy et conteur du nombre maximal de triangles


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juillet 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 36
    Points : 19
    Points
    19
    Par défaut sympy et conteur du nombre maximal de triangles
    Bonjour à tous,
    Je suis tous neuf dans python, et j'essaye de réaliser un programme qui lorsqu'on lui soumet des coordonnées de points, il compte le maximum de triangle non-sécant (pouvant être inscrit).

    Jusqu'ici, je fonctionne au pas à pas...

    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
    from sympy import *
    from sympy.geometry import *
    from sympy.plotting import *
    import sys
    sys.setrecursionlimit(10000)
     
    p = [Point(45489772381, -736449623108), Point(45489772381, -736136770248), Point(455065875115, -736292552948), Point(454927507396, -736292552948), Point(454956086125, -736292552948), Point(454956086125, -736344480515), Point(454956086125, -736240625381), Point(454974435912, -736363148689), Point(454974435912, -736221957207), Point(454990378684, -736274957657), Point(454990378684, -736310148239)]
    l = 0
    seg = []
    group = []
     
    for i in range(0, len(p)-1):
       for j in range (i+1, len(p)):
          l += 1
          seg.extend([Segment(p[i] , p[j])])
    cette première partie liste tous les segments possible.

    puis dans un premier temps je voudrais effacer tous les segments qui se croisent et en faire des groupes
    d'où la fonction suivante qui pour le moment devrait juste nettoyer la liste primaire de tous les liens qui croisent les segments précédements "admis"
    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
     
    group = []
    group.append(seg)
     
    def main():
        tabl = []
        cleancrossed(tabl)
     
    def cleancrossed(tabl):
        print len(tabl)
        temp = tabl
        for i in range(0, len(tabl)-1):
           for j in range (i+1, len(tabl)):
              for element in intersection(seg[i], seg[j]):
                 if element in p:
                    test = len(tabl)
                 else :
                    print seg[j]
                    tabl = [x for x in temp if x != seg[j]]
                    return cleancrossed(tabl);
        return;
     
    cleancrossed(group[0])
    print group[0]
    print len(group[0])
    mais qui a terme devrait générer tous les groupes possibles.

    Donc pour le moment je bloque dans cette fonction car elle reprend toujours au même point;

    Dans le cas ci dessus la liste primaire fait 55 éléments, la fonction tourne une première fois retire le premier segment secant, puis reprend la fonction avec une liste de 54 éléments, puis ça boucle à 54....
    Pourquoi je ne sais pas....

    Je pense que ça doit être au niveau de ma compréhension des variables, mais je trouve pas de solution... Si quelqu'un peut trouver une solution et m'expliquer, je serais le plus heureux!

    Merci

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    Je n'ai pas trop regardé ton code en détail, du moins pas assez pour te donner la solution. N'ayant pas simpy sur ma machine, pourrais tu nous indiquer l'indice qui bloque à 54?

    Sinon, mon message va porter plus sur tes boucles for imbriquée qui sont une catastrophe, en terme de performance. Ne t'inquiète pas, on est tous passé par là , et justement j'en profite pour t'indiquer l'existance de itertools

    Voici un exemple trouvé sur le net et bien parlant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = ['un']
    b = a + ['deux']
    c = b + ['trois']
    d = c + ['quatre']
     
    for i in a:
        for j in b:
            for k in c:
                for l in d:
                    print i,j,k,l
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a = ['un']
    b = a + ['deux']
    c = b + ['trois']
    d = c + ['quatre']
     
    for i, j, k, l in itertools.product(a,b,c,d):
        print i,j,k,l
    Bien sur, cela ne fonctionne que pour les imbrications directes dans ce cas. Je t'invite à lire la doc d'itertools très complete.

    Outre l'amelioration de la lisibilité, sur des choses un peu consommatrice de ressources, tu verra les performances de l'algo grimper en fleche.

    j'attend ton retour pour l'indice (est-ce i, j ou element?) qui pose probleme?
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juillet 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse et merci pour itertools, je pense qu je vais pouvoir m'en servir.

    Le résultat qui stagne à 54 c'est le print de la longueur de la liste que je veux "réduire".
    donc c'est mon appel des variable qui pose un problème car la longueur initiale de la liste est 55; donc c'est comme si ma fonction ne marchait qu'une fois et ne s'appelle pas elle même. (enfin elle s'appelle mais toujours avec la liste initiale)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juillet 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Je suis sur la bonne voie je crois, mon erreur était dans la fonction en elle même (les intersections testée étaient toujours les mêmes....)

    voici mon update

    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
    from sympy import *
    from sympy.geometry import *
    from sympy.plotting import *
    import sys
    import itertools
    sys.setrecursionlimit(10000)
     
    p = [Point(45489772381, -736449623108), Point(45489772381, -736136770248), Point(455065875115, -736292552948), Point(454927507396, -736292552948), Point(454956086125, -736292552948), Point(454956086125, -736344480515), Point(454956086125, -736240625381), Point(454974435912, -736363148689), Point(454974435912, -736221957207), Point(454990378684, -736274957657), Point(454990378684, -736310148239)]
    seg = []
    group = []
     
    results = list(itertools.combinations(range(0, len(p)), 2))
    for result in results:
        (i, j) = result
        seg.extend([Segment(p[i] , p[j])])
     
    group = []
    group.append(seg)
     
    def cleancrossed(tabl):
        results = list(itertools.combinations(range(0, len(tabl)), 2))
        for result in results:
           (i, j) = result
           for element in intersection(tabl[i], tabl[j]):
              if element in p:
                 test = len(tabl)
              else :
                 tabl = [x for x in tabl if x != tabl[j]]
                 return cleancrossed(tabl)
        return tabl;
     
    group[0] = cleancrossed(group[0])
    print len(group[0])

  5. #5
    Membre à l'essai
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juillet 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Pour tous ceux qui ce sont intéressé au problème, ma technique est une voie sans issue.. (sauf peut être si vous avez un supercalculateur sous la main)
    Merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/05/2008, 13h17
  2. Quel est le nombre maximal de tables dans un DataSet ?
    Par Philorix dans le forum Accès aux données
    Réponses: 6
    Dernier message: 11/09/2006, 14h18
  3. Nombre maximal de fichiers dans un répertoire
    Par cquilgars dans le forum Administration système
    Réponses: 10
    Dernier message: 15/12/2005, 12h04
  4. Un ls et nombre maximal de fichiers
    Par adrien84 dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 08/06/2004, 11h16
  5. [net][Sockets] Quel est le nombre maximal de threads?
    Par itsmii dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 06/05/2004, 10h48

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