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

5 réponses

pilas31 Messages postés 1878 Statut Contributeur 647
 
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
Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 447
 
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
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
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
Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 447
 
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

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

Posez votre question
Raymond PENTIER Messages postés 71867 Date d'inscription   Statut Contributeur Dernière intervention   17 397
 
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