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 :

Recherche somme minimum


Sujet :

Algorithmes et structures de données

  1. #1
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut Recherche somme minimum
    Je génère de nombreuses matrices contenant des nombres.
    Je cherche la matrice dont la somme des éléments soit le minimum possible.
    Avec une difficulté supplémentaire : selon la valeur de la somme sur une ligne donnée, le résultat à prendre en compte peut être minoré.

    J'ai fait un algorithme qui, pour chaque matrice, parcourt systématiquement chaque ligne pour vérifier la condition, calcule la somme et si cette somme est inférieure à celle stockée temporairement, on conserve la matrice et ainsi de suite.

    Pour quelques dizaines de matrice, c'est supportable.
    Mais comme il arrive que j'ai plusieurs centaines de milliers de matrices, le temps de calcul explose

    Je précise que je code en python.

    Existe-t-il une fonction python qui permet de calculer la somme des éléments d'une matrice ?
    J'ai pensé modifier l'algorithme en arrêtant le calcul en cours pour une matrice dès que la somme cumulée des lignes dépasse le minimum stockée en mémoire, mais cela ajoute autant de comparaison que de lignes à la place d'une seule comparaison à la fin du calcul pour la matrice : pas sûr que ce soit efficace.

    Pour que ce soit plus clair, voici un exemple avec 2 matrices.

    [1,2,3]
    [0,0,0]

    [1,2,0]
    [0,0,5]

    Premier calcul :
    1 + 2 + 3 = 6
    0 + 0 + 0 = 0
    6 + 0 = 6
    On stocke cette valeur et la matrice en temporaire.

    Second calcul :
    1 + 2 + 0 = 3
    0 + 0 + 5 = 5
    3 + 5 = 8
    On compare à la valeur stockée en temporaire : supérieure, on ne retient pas.

    Second calcul avec condition :
    1 + 2 + 0 = 3
    0 + 0 + 5 = 5 --- Condition : Somme > 4 : on retire 3 --> 5 - 3 = 2
    3 + 2 = 5
    On compare à la valeur stockée en mémoire : inférieure, on retient et on stocke dans le temporaire.

    Connaissez-vous un algorithme plus rapide et/ou plus simple ?

  2. #2
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    déjà, pourquoi ne travailles-tu pas avec des vecteurs de sommes de ligne?

    Les éléments de tes matrices ont quelle grandeur?
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  3. #3
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    déjà, pourquoi ne travailles-tu pas avec des vecteurs de sommes de ligne?
    J'ai une vague idée de ce que ça pourrait être, mais peux-tu préciser ?

    Citation Envoyé par Nemerle Voir le message
    Les éléments de tes matrices ont quelle grandeur?
    Ben là, ça dépend des données entrées par l'utilisateur. Minimum 2x2, maximum pas défini pour l'instant.

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    télécharge les librairies numpy et scipy.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par senacle Voir le message
    Ben là, ça dépend des données entrées par l'utilisateur. Minimum 2x2, maximum pas défini pour l'instant.
    na, je demandais juste la taille de tes entiers: de 1 à 10, 1 à 100,1 à 10^10...?

    >>Zavonen: pour ma culture, numpy a une fct directe??
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    >>Zavonen: pour ma culture, numpy a une fct directe??
    J'utilise surtout les deux bibliothèques comme support de matplotlib pour faire toutes mes figures. En réponse à ta question je dirais au 'feeling' plutôt oui.
    numpy+scipy+matplotlib offre des possibilités voisines à celles de matlab
    Si le sujet t'intéresse réellemnt je ne peux que t'orienter vers la doc officielle.
    http://www.scipy.org/Documentation
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  7. #7
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    na, je demandais juste la taille de tes entiers: de 1 à 10, 1 à 100,1 à 10^10...?
    S'il s'agit du contenu des matrices, j'ai pris des entiers pour l'exemple, mais en fait, c'est plutôt des réels maximum 9 999,99.

  8. #8
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Pour numpy et scipy, j'ai commencé à regardé et j'ai trouvé une fonction qui permet d'avoir la somme des éléments d'une ligne.

    Mais là, c'est plutôt l'outil.

    Par rapport à la question initiale, existe-t-il un algorithme plus simple que le mien ?

  9. #9
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Par rapport à la question initiale, existe-t-il un algorithme plus simple que le mien ?
    Et bien déjà quand tu sommes les coefficients des lignes si tu dépasses la valeur stockée, ce n'est pas la peine de continuer la sommation pour TOUTES les lignes, tu fais un 'break' et tu passes à la suivante.
    Sur le plan pratique tu peux accélérer la manœuvre (facteur 2 assuré) avec le module psyco. Il semble que Cython soit aussi intéressant, je n'ai pas réussi à l'utiliser sous windows, je n'ai pas encore essayé sous Linux.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  10. #10
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut , les matrices que tu génères correspondent à quoi ?

  11. #11
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Et bien déjà quand tu sommes les coefficients des lignes si tu dépasses la valeur stockée, ce n'est pas la peine de continuer la sommation pour TOUTES les lignes, tu fais un 'break' et tu passes à la suivante.
    Sur le plan pratique tu peux accélérer la manœuvre (facteur 2 assuré) avec le module psyco. Il semble que Cython soit aussi intéressant, je n'ai pas réussi à l'utiliser sous windows, je n'ai pas encore essayé sous Linux.
    La valeur stockée correspond à la somme des éléments de la matrice, donc de toutes les lignes.
    Je peux effectivement faire :
    A/
    - somme ligne1 = S1
    - Stmp = S1
    - Stmp > valeur stockée ?
    - Oui break
    - non
    - somme ligne2 = S2
    - Stmp = S1 + S2
    - Stmp > valeur stockée
    ....

    Ou
    B/
    - somme ligne1 = S1
    - somme ligne2 = S2
    - somme ligne3 = S3
    ....
    - Stmp = S1 + S2 + S3 + ...
    - Stmp > valeur stockée
    - Oui : break
    - Non : valeur stockée = Stmp

    On a donc :
    A/
    Au minimum une seule somme (S1) et une seule comparaison
    Au maximum n somme (S1...Sn) + n-1 somme (Stmp = S1 + S2, puis Stmp = Stmp + S3....) et n comparaisons
    Soit entre 2 et 3n-1 opérations

    B/
    n sommes (S1, S2, ..., Sn)
    1 somme S1 + S2 + ... + Sn
    1 comparaison
    Soit n + 2 opérations

    Je suppose que pour le choix A, on peut faire une approximation grossière sur la moyenne des opérations, ce qui réduit à 3/2n +1/2.

    Le choix B reste donc préférable.

  12. #12
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    tu devrais déja tester avec tes données !
    il y a peu de chances que la méthode B) soit + efficace que la méthode A)
    les comparaisons entre deux valeurs présentes dans les registres prennent environ 5 cycles processeurs, négligeable par rapport, entre autre, au temps d'accès mémoire


    et ma question précédente reste toujours d'actualité

  13. #13
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par acx01b Voir le message
    tu devrais déja tester avec tes données !
    il y a peu de chances que la méthode B) soit + efficace que la méthode A)
    les comparaisons entre deux valeurs présentes dans les registres prennent environ 5 cycles processeurs, négligeable par rapport, entre autre, au temps d'accès mémoire
    Pour B, il n'y a qu'une comparaison, alors que pour A, 1 comparaison est un minimum.
    Lorsque tu parles du temps d'accès mémoire, c'est par rapport à Stmp et les différentes sommes ?

    Citation Envoyé par acx01b Voir le message
    et ma question précédente reste toujours d'actualité
    Initialement, j'ai un tableau que l'utilisateur remplit avec des réels.
    Certaines cases peuvent être laissées vides (elles sont alors remplies de 0 par mon code).

    L'algorithme complet se décompose en deux parties.
    1/
    A partir du tableau, je génère toutes les matrices possibles de telle sorte que pour une colonne donnée, il y a une seule valeur non nulle.
    2/
    Ensuite, je cherche la matrice dont la somme des éléments est le minimum possible, ce qui pourrait être assez simple et rapide à coder.
    Mais il y a la condition précisée au début : selon la valeur de la somme sur une ligne donnée pour la matrice en cours, le résultat à prendre en compte peut être minoré.

    En y pensant, ne serait-il pas intéressant, lors de la génération des matrices, d'ajouter une colonne dans laquelle il y a la somme des éléments de chaque ligne ?

    Du coup, dans la deuxième partie, je fais les comparaisons et dans une nouvelle colonne, je stocke la valeur minorée (ou pas).
    En faisant la somme de cette dernière colonne, j'obtiens donc la somme pour la matrice considérée. A comparer à Stmp....

    Visiblement, il y a plusieurs possibilités.
    Reste à trouver celle qui est la moins consommatrice de ressources.

  14. #14
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    ok on commence à y voir plus clair

    reste à détailler un peu :

    Condition : Somme > 4 : on retire 3 --> 5 - 3 = 2
    pourquoi 4 et pourquoi 3 ? ça change selon la ligne ou autre chose ?

    quand tu dis je génère toutes les matrices:
    si le tableau à remplir par l'utilisateur est de taille 16, tu ne génères que des matrices 4x4 qui contiennent tes 16 nombres ?

  15. #15
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par acx01b Voir le message
    Condition : Somme > 4 : on retire 3 --> 5 - 3 = 2
    pourquoi 4 et pourquoi 3 ? ça change selon la ligne ou autre chose ?
    C'est toujours des exemples. Effectivement, ça change selon les lignes.
    Et les valeurs ne sont pas fixes, ce sont aussi des variables (récupérées en bdd ou saisies par l'utilisateur).

    Citation Envoyé par acx01b Voir le message
    quand tu dis je génère toutes les matrices:
    si le tableau à remplir par l'utilisateur est de taille 16, tu ne génères que des matrices 4x4 qui contiennent tes 16 nombres ?
    Oui, je ne m'occupe pas des matrices 1x1, 1x2, 1x3, 2x1, 2x2...
    Je prends uniquement les matrices qui ont les mêmes dimensions que le tableau rempli par les utilisateurs.

  16. #16
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    ok, mais ce n'est toujours pas assez détaillé !

    à en croire ce que tu as écrit, à partir du tableau

    a b c d e f g h ...

    la matrice dont la somme est minimale serait

    a b c d e f g h ....
    0 0 0 0 0 0 0 0 ...
    0 0 0 0 0 0 0 0 ...
    ...

  17. #17
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Un exemple est plus parlant.

    Tableau initial
    a b c d
    - e f -
    g -h - -

    (- indique que la valeur n'est pas renseignée).

    Matrices possibles
    M1
    a b c d
    0 0 0 0
    0 0 0 0

    M2
    a b 0 d
    0 0 f 0
    0 0 0 0

    M3
    a b 0 d
    0 0 h 0
    0 0 0 0

    M4
    a 0 c d
    0 e 0 0
    0 0 0 0

    M5
    a 0 f d
    0 e 0 0
    0 0 0 0

    etc....

    Sommes
    M1
    a+b+c+d
    0
    0

    Si S1=a+b+c+d < valeur1, rien
    Sinon, S1 = S1 - minorant1

    Stotal = S1+S2+S3
    Si Stotal < Stmp
    Mtmp=M1
    Stmp=Stotal

    M2
    a+b+d
    f
    0

    Si S1=a+b+d <valeur1....

    Si S2=f < valeur2, rien
    Sinon, S2=S2-minorant2
    ...
    Stotal = ...
    Si Stotal < Stmp
    Mtmp=M2
    Stmp=Stotal

    M3
    a+b+d
    h
    0

    Si....

    M4
    a+c+d
    e
    0

    Si....

    M5
    a+f+d
    e
    0

    Si....

    Ca correspond à l'algo qui tourne actuellement.
    Mais avec des tableaux initiaux de grande dimension, le temps de calcul explose.

  18. #18
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Mtmp=M1
    J'espère que tu stockes le No de la matrice, pas la matrice elle-même...

    T'as pas besoin de faire tout tes si...alors. En sommes, tu recherches un bi-vecteur sol(j,2) où sol(j,1) est la valeur max des sommes de tes lignes j pour toutes tes matrices et sol(j,2) est le No de la matrice concerné.

    1) tu parses tes matrices Mi en calculant la somme de tes lignes Mi(1)+...+Mi(n) pour chaque ligne j et tu mets éventuellement à jour sol(j,1) et sol(j,2). Attention, tu ne fais rien d'autres (pas tes si...alors)
    2) Une fois cela fait tu corriges tes valeurs par tes règle si...alors.

    Franchement, ça dépote!
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  19. #19
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    J'espère que tu stockes le No de la matrice, pas la matrice elle-même...
    Malheureusement, je crois bien que si...

    Citation Envoyé par Nemerle Voir le message
    T'as pas besoin de faire tout tes si...alors. En sommes, tu recherches un bi-vecteur sol(j,2) où sol(j,1) est la valeur max des sommes de tes lignes j pour toutes tes matrices et sol(j,2) est le No de la matrice concerné.

    1) tu parses tes matrices Mi en calculant la somme de tes lignes Mi(1)+...+Mi(n) pour chaque ligne j et tu mets éventuellement à jour sol(j,1) et sol(j,2). Attention, tu ne fais rien d'autres (pas tes si...alors)
    2) Une fois cela fait tu corriges tes valeurs par tes règle si...alors.
    Je comprends un peu ce que tu veux dire, et ne suis pas sûr que ça correspond à ce que je cherche. Ce n'est pas un maximum que je cherche, mais un minimum. Et un minimum pour une matrice, et non pour des lignes de plusieurs matrices.

    Peux-tu donner un exemple pour que j'y vois plus clair ?

    Citation Envoyé par Nemerle Voir le message
    Franchement, ça dépote!
    J'attends avec impatience d'avoir modifier mon code ;-)

  20. #20
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Excuse-moi concernant le min, j'ai lu un peu vite les posts précédents! Va falloir que je reprenne, mais pas l'temps today
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

Discussions similaires

  1. pbk de requete sur 2 tables : recherche de minimum
    Par juzii dans le forum Langage SQL
    Réponses: 30
    Dernier message: 27/08/2008, 14h54
  2. Recherche de minimum global
    Par nini94 dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/08/2008, 12h10
  3. Recherche du minimum d'une fonction sur un intervalle
    Par jschutz dans le forum Mathématiques
    Réponses: 6
    Dernier message: 18/03/2008, 14h25
  4. [Débutant] Recherche de minimum non nul dans une matrice
    Par sebastien69 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/06/2007, 16h00
  5. recherche du minimum dans un vector
    Par javamax dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 22/10/2006, 09h43

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