Utilisation du solveur

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

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    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+
    1. Contributeur
      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
      1. 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.
    2. 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.
      1. Contributeur
        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

        1. Contributeur
          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