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 :

Trouver une formule d'addition


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Points : 380
    Points
    380
    Par défaut Trouver une formule d'addition
    Bonjour,

    J'ai le problème suivant:
    J'ai deux colonnes A et B de nombres réels et un nombre C (réel aussi):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          ligne               A          B
              1              5.5        3.2
              2               1.05      6.1
              3               0.6        7.8
              4               6.4        4.13
     
     C = 8.98
    L'objectif est que l'algorithme me fournisse la formule qui a mené au nombre C
    qui est, dans cet exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     C = B(1) + A(2) + A(3) + B(4) = 3.2 + 1.05 + 0.6 + 4.13 = 8.98
    sachant qu'on ne peut prendre qu'un nombre par ligne (un des deux colonnes).

    Merci d'avance pour tout bout de réponse (ou toute réponse!).


  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Il faut partir de la formule d'addition que tu donne?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Points : 380
    Points
    380
    Par défaut
    Bonjour,
    merci pour ta réponse.
    Non, justement, cette formule il faut la trouver.

    En entrées, on a les colonnes A et B et puis le total C.

    En sortie, il nous faut la formule qui a mené au nombre C qui est le total des éléments de .A et B sachant qu'on doit pas prendre deux éléments de la même ligne, donc pas de A(1) + B(1) .

    Merci d'avance

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Points : 380
    Points
    380
    Par défaut
    Plus de précisions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Entrées:                          Sorties:
    colonne A--->        
    colonne B--->                  ---> Quels nombres de A et B  on contribué
    nombre C--->                          à obtenir le nombre C sachant qu'on ne peut
                                                 prendre qu'un nombre par ligne.

    Merci d'avance

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 77
    Points
    77
    Par défaut
    Tes nombres sont forcément positifs ?

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Premièrement, rien ne prouve ni que la solution existe, ni qu'elle existe.

    Deuxièmement, à ta place, j'essaierais en considérant les nombres comme des chaînes de caractères. Tu regardes d'abord les chiffres correspondant aux centièmes, soit 5 pour A(2), 3 pour B(4) et 8 pour C; tu en déduis que A(2) et B(4) doivent figurer dans ta formule. Et ainsi de suite...
    Jean-Marc Blanc

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Voilà un script Python qui résout ce problème:
    Code Python : 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
    A=[5.5,1.05,0.6,6.4]
    B=[3.2,6.1,7.8,4.13]
     
    def PartiesDe(E):
        P=[[]]
        yield P
        while E: 
            P=[x+[a] for x in P for a in E if all(a>y for y in x) ] 
            yield P
        return
     
    def Eval(X,K):
        L=[K[i] for i in X]
        return 0 if L==[] else reduce(lambda x,y:x+y,L)
     
    def EvalAB(C):
        return Eval(C[0],A)+Eval(C[1],B)
     
    def main():
        E=[0,1,2,3]
        P=PartiesDe(E) 
        L=[]
        for i in range(0,len(E)):
            L+=P.next()
        M=[ [X,Y] for X in L for Y in L if not any ([x in Y for x in X])]
        R=[Z for Z in M if EvalAB(Z)==8.98]
        print R
     
    if __name__ == '__main__':
        main()

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Points : 380
    Points
    380
    Par défaut
    Citation Envoyé par Vakhyw Voir le message
    Tes nombres sont forcément positifs ?
    Bonjour,
    ils sont pas forcément positifs.
    Tu penses que ça pourrait changer quelque chose?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Points : 380
    Points
    380
    Par défaut
    Bonjour Zavonen,
    merci pour ton programme en Python.
    J'avoue que je ne connais pas ce langage mais je prendrai le temps d'étudier ton code dimanche.
    Merci!

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Points : 380
    Points
    380
    Par défaut
    Re,
    Par contre, y a-t-il un moyen pour généraliser le cas? ça veut dire au cas où le résultat est composé de N valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C :=  A(1)||B(1) + A(2)||B(2) + ... + A(N-1)||B(N-1) + A(N)||B(N)
    Merci d'avance!

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Sans aucun problème !
    La méthode est la suivante:
    Je considère l'ensemble de tous les indices des suites A et B.
    Je construis l'ensemble de ses parties. Attention 2^n éléments, ça va vite.
    Ensuite je fais le produit cartésien de cet ensemble par lui-même, mais en ne gardant que les couples de parties pour lesquelles on ne retrouve jamais le même élément dans les deux.
    puis pour tout tel couple (X,Y) je calcule la somme des Ai pour i dans X + la somme des B(j) pour j dans Y et je regarde si je trouve le résultat espéré.
    Tu peux généraliser à 3.
    Au lieu de prendre un produit cartésien de 2 ensembles de parties tu auras un produit cartésien de 3 ou de 4.
    mais attention à l'explosion !!! 2^n x ....x2^n p fois cela fait 2^np .
    Cette méthode est 'bourine'. On pourrait l'optimiser si tous les coefficients étaient de même signe et/ou ordonnés.

  12. #12
    Membre confirmé Avatar de Leonhart
    Inscrit en
    Mai 2009
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2009
    Messages : 262
    Points : 536
    Points
    536
    Par défaut
    Ton problème est en fait très classique, il s'agit de l'algorithme du sac à dos (à la base de RSA).

    Voici un lien wiki où tu trouvera des solutions plus ou moins optimisées :

    !!! Super lien de la mort !!!

    Cordialement, BG

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Points : 380
    Points
    380
    Par défaut
    Re,

    Merci Zavonen ... rien à dire!

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

Discussions similaires

  1. [XL-2010] Trouver une formule
    Par Tehea85 dans le forum Excel
    Réponses: 2
    Dernier message: 13/02/2014, 15h21
  2. [XL-2007] Impasse pour trouver une formule satisfaisante
    Par arsavard dans le forum Excel
    Réponses: 2
    Dernier message: 29/04/2010, 17h44
  3. [XL-2002] Export SSIS. Trouver une formule pour tout convertir en texte
    Par cmako dans le forum Excel
    Réponses: 4
    Dernier message: 01/10/2009, 12h25
  4. Trouver une formule de calcul
    Par nellido dans le forum VBA Access
    Réponses: 19
    Dernier message: 04/09/2008, 14h07
  5. Trouver une formule d'un code aléatoire
    Par Duke49 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 31/08/2008, 14h55

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