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

Fortran Discussion :

accélération programme trop lent


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 70
    Par défaut accélération programme trop lent
    Bonjour

    Je requiers votre aide pour m'aider à optimiser un programme, car je ne vois pas comment faire.
    Mon programme lit d'abord dans un fichier des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    0.15                    0.12
    0.32                    0.25
    0.09                    0.078
    0.11                    0.001
    0.13                    0.1
    0.07                    0.008
    0.09                    0.01
    0.04                    0.02
    Ici il y a donc 8 lignes.
    Ensuite je vais générer des nombres aléatoires, qui vont être stockés dans un vecteur ayant donc 8 coordonnées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do i=1,8
    RB(i)=rand(0)
    end do
    (ce n'est pas exactement RB(i)=rand(0) qui est effectué, il y a une opération avec les nombres lus dans le fichier, mais c'est juste pour donner une idée)

    Le truc est que je ne garde le RB que si les RB(i) vérifie une certaine condition (à savoire si les RB(i) sont inférieurs et supérieurs à certains nombres). Du coup si la condition n'est pas vérifiée, je recommence le tirage de nombres aléatoires, et rebelote jusqu'à ce que la condition soit vérifiée.

    Mon problème vient du temps d'execution du programme. Pour 8 lignes de données, le calcul de RB prend entre 0 seconde et 1min30s. Pour 10 lignes, cela met entre 0s et 15min. Pour 100 lignes mon ordi n'arrive pas à me calculer un RB dans un temps raisonnable. Et le but de mon programme est d'avoir 4000 lignes...

    Avez-vous une idée pour accélérer le programme?

    Merci beaucoup de votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    tu as besoin que ton RB satisfasse à une condition particulière.
    tu génères un nombre aléatoire entre 0 et 1 avec une densité uniforme.

    qu'elle est la probabilité que ton RB soit bon à chaque génération de nombre aléatoire ?

    si elle est faible, ce qui a l'air d'être le cas, pourquoi ne pas passer par une loi uniforme avec des bornes différentes de 0 et de 1 ?

    c'est à dire générer directement du premier coup un RB valide ?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 70
    Par défaut
    J'ai modifié un peu le programme, ce qui a résolu une partie du problème, mais pas totalement.

    Je calcul effectivement des nombres aléatoires dans un intervalle qui me convient, que je stocke dans le vecteur X à n termes.
    Ensuite pour chaque i je fais RB(i)=a(i)+X(i)*b(i), où a et b sont des constantes, et ma condition est que la somme des RB(i) vaut 1.

    Donc à part faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (la somme ne vaut pas 1) alors retirer des nombres aléatoires
    ce qui pourra durer une éternité, je ne vois pas comment faire.


    Au début j'ai pensé à laisser se calculer tous seuls les n-1 premiers X(i), puis calculer à la main le n ième pour que je m'arrange à rendre la somme égale à 1. Mais évidemment ce n ième X(i) n'est plus dans l'intervalle souhaité.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 70
    Par défaut
    Je crois que je vais poster un nouveau message parce que mon problème ne colle plus vraiment avec le titre du post.

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    et si tu divises ton vecteur RB(i) par la somme sur i des RB(i) après génération aléatoire. ta somme sur i des RB(i) après normalisation vaut 1 non ?

    tu as aussi une contrainte sur la valeur de chaque composante de ton vecteur en plus de la contrainte sur la somme des composantes ?

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 70
    Par défaut
    effectivement, mathématiquement ça se tient
    j'essaierai ça demain si le coeur m'en dit (c'est le week end quand même!)

    sinon oui mes RB(i) vérifient une condition, ils sont dans un certain intervalle, mais cette condition est équivalente à une condition sur X, que je n'ai pas eu de problème à poser ; donc pas de problème de ce côté là (enfin un truc qui marche bien)


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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2013, 22h35
  2. Programme OpenGL trop lent..
    Par dridri85 dans le forum OpenGL
    Réponses: 8
    Dernier message: 07/07/2009, 14h28
  3. Programme trop lent
    Par subversa dans le forum DirectX
    Réponses: 7
    Dernier message: 18/11/2008, 18h52
  4. [SAGE] ODBC trop lent
    Par tileffeleauzed dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/11/2004, 09h56
  5. Envoi de mail trop lent
    Par MASSAKA dans le forum ASP
    Réponses: 3
    Dernier message: 15/10/2004, 10h57

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