Utilisation du solveur

Neyrda76 Messages postés 3 Statut Membre -  
pilas31 Messages postés 1878 Statut Contributeur -
Bonjour,

Voila je voudrais utiliser Excel pour faire quelque chose d'un petit peu compliqué et j'espère que des gens calés sur Excel pourront me renseigner :)

Donc je souhaite réaliser la chose suivante (les explications pourront paraitre confuses, mais c'est très "simple" en fait :

"A partir d'une liste de nombre, je voudrait trouver la combinaison de 3 nombres qui donne un autre nombre x connu".

En gros, dans une liste de 20 nombre à virgule, je souhaite trouver quelle combinaison de 3 nombre (la somme de ces 3 nombres est égal a un certain chiffre connus (par exemple 1500,45)

Exemple simple :

Nombres :

1
2
3
4
5
6

Nombre à atteindre : 9
Quantité de nombre utilisé : 2
Réponse : 5 + 4 ou 6 + 3

Dans le cas présent, c'est simple et ca se fait à vue de nez, mais dans mon cas j'ai 20 nombres et c'est la somme de 3 nombres qu'il faut trouver.

Dans la pratique, j'ai besoin de ça dans un probleme de trésorerie : J'ai une liste de factures avec les montants de celles-ci, et j'ai une remise de chèque de 3 chèques. Je ne connais que le total de cette remise de chèque et je souhaite savoir quelles factures sont concernées par cette remise.

Merci d'avance aux âmes généreuses qui pourront se creuser les méninges (un petit peu) sur ce casse tête.

Neyrda76
Configuration: Windows Vista
Safari 532.0

5 réponses

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonjour à tous,

    Pour le fun je me suis amusé à créer une Fonction en VBA. La voila :

    Private Function TROUVE_CIBLE(Liste As Range, Cible As Double, Précis As Double) As Variant
    ' Cherche dans la liste "Liste" en colonne les combinaisons de trois valeurs
    ' dont la somme est égale à "Cible" à la précision "Précis" prés
    ' Le résultat est un tableau de Triplets (dans l'exemple 10 au maximum)
    ' Il faut utiliser la fonction dans une formule matricielle (10 lignes et 3 colonnes)
    ' en validant par <Ctrl><Shift><Entrée>
    Dim Rang1 As Integer, Rang2 As Integer, Rang3 As Integer
    Dim Isol As Integer, Der As Integer
    Dim Result(10, 3) As Double
    Isol = 0
    Der = Liste.Count
    For Rang1 = 1 To Der
        For Rang2 = Rang1 + 1 To Der
            For Rang3 = Rang2 + 1 To Der
                    If Liste(Rang1) + Liste(Rang2) + Liste(Rang3) <= Cible + Précis And _
                       Liste(Rang1) + Liste(Rang2) + Liste(Rang3) >= Cible - Précis Then
                        Result(Isol, 0) = Liste(Rang1)
                        Result(Isol, 1) = Liste(Rang2)
                        Result(Isol, 2) = Liste(Rang3)
                        Isol = Isol + 1
                    End If
                Next Rang3
        Next Rang2
    Next Rang1
    If Isol = 0 Then
        TROUVE_CIBLE = "Insoluble"
    Else
        TROUVE_CIBLE = Result
    End If
    End Function


    Voici l'exemple sur ci-joint:
    http://www.cijoint.fr/cjlink.php?file=cj200911/cij4it6JYY.xls

    J'ai repris l'exemple de Raymond dans le premier cas et dans le second tableau un exemple avec plusieurs solutions. On doit pouvoir généraliser à n valeurs au lieu de 3 mais bon ....

    Il y a peut-être plus simple ..

    A+
    2
  2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonsoir
    Je ne veux pas vous décourager, mais outre le fait que cela parait difficile à formuler, voire irréaliste, pensez vous que le nombre de solutions possibles dans votre liste vous permmettra de retrouver vos factures Sans riques d'erreur?
    Car votre modéle et facile à interprèter, mais si vous le faite avec trois 6,trois 3 trois 4 et trois 5 ça devient coton!
    combien avez vous de factures à traiter?

    Crdlmnt
    PS: dans la liste si dessous,et en conservant deux variables seulement autour du nombre 1000, il y a 11 façon d'obtenir 4600,10 en tournant autour du nombre 100, 11 en tournant autour du nombre 200 etc.....
    je n'ai pas calculé, mais je pense qu'au total on doit dépasser les 150 même 200 solutions...!

    100
    200
    300
    400
    500
    600
    700
    800
    900
    1000
    1100
    1200
    1300
    1400
    1500
    1600
    1700
    1800
    1900
    2000
    2100
    2200
    2300
    2400
    2500
    2600
    2700
    2800
    2900
    3000
    3100
    3200
    0
    1. Neyrda76 Messages postés 3 Statut Membre
       
      J'pense que j'mexplique pas suffisamment clairement....

      La dans mon problème, Je suis quasiment certain qu'il n'y a qu'une seule solution... c'est même presque sûr. Les montant des différentes factures sont très éclectiques et ne se suivent pas pas du tout.
      0
  3. Neyrda76 Messages postés 3 Statut Membre
     
    A vue de nez, il n'y a qu'une seule solution possible.

    Les montants sont très précis. Il s'agit de montant de facture (genre 1240,65 145,56 ... )
    Et le montant de cette remise de chèque est lui aussi très précis ( 2430,45 ou dans le même genre.)

    Je suis quasiment certain qu'il n'y a qu'une seule combinaison, et surtout, il n'y a pas 2 factures de même montant

    [EDIT] Environ 25 factures.
    0
  4. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Rassurez vous, s'il y en une , il y aura certainement dans les compètences de forum quelqu'un pour la trouver;
    (Je ne sais pas faire, mais je suis loin d'être une référence)
    pour facilter la prospection, vous devriez peut être diffuser une liste exemple des montants à traiter.
    Crdlmnt

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Raymond PENTIER Messages postés 58225 Date d'inscription   Statut Contributeur Dernière intervention   17 487
     
    Bonjour.

    Vaucluse (salut, vieux frère !) a parfaitement raison au post 1 (premier paragraphe) comme au post 4 (faites-nous voir cette liste et ce montant).

    "En gros, dans une liste de 20 nombre à virgule, je souhaite trouver quelle combinaison de 3 nombre (la somme de ces 3 nombres est égal a un certain chiffre connus (par exemple 1500,45)"
    1) Inscris tes 20 nombres dans les cellules de A1 à A20 et ton total connu en C1
    2) Fais un tri croissant de la colonne A
    3) En B3 saisis la formule =C1-($A$1+$A$2+A3) et recopie jusqu'à B20
    4) En commençant par la ligne 20, élimine toutes les lignes pour lesquelles le résultat colonne B est négatif
    Cette manip devrait te permettre d'écarter déjà quelques chèques d'un montant trop élevé ; elle est d'autant plus efficace que les chèques sont de valeurs très différentes.
    https://www.cjoint.com/?lgfRBzUgHs
    0