Tirage aléatoire de valeurs

Bonjour à tous,

j'aimerais pouvoir sélectionner des valeurs d'une colonne pour que la somme se trouve dans une plage s'il y a une solution possible.

Je ne sais pas si c'est de l'exploration d'arbre et s'il y a des fonctions pour cela en VBA ?

Y1 Y2 X

117,0 125,0 8

119,0 127,0 90

127,0 135,0 5

141,0 150,0 350

146,0 155,0 143

171,0 182,0 250

187,0 199,0 14

500

450

50

60

1

Exemple pour la 1ère plage:

50+60+8=118 est une solution

90+14+8+5= 117 est une solution

90+14+8+5+1=118 est une solution

J'aimerais que la macro puisse tirer une solution au hasard s'il y en a une

Bonjour,

voici un exemple,

n = Application.RandBetween(2, 13)
résultat = Application.Sum(Range("A" & n & ":D" & n))

Je pense que ce n'était pas clair, car les colonnes ont été déplacées après le postage de mon message.

Du coup, j'ai fait une capture d'écran que j'ai mise en fichier joint.

Pour cet exemple , je dois trouver une somme qui se situe entre 117 et 125 à l'aide différentes valeurs de X prises au hasard

capture excel

Bonjour,

en prenant la moyenne de tes 2 nombres et en jouant sur la précision ça devrait le faire.

eric

Merci pour ton aide.

J'essaie d'adapter ton code.

Est ce que tu ne prends pas en compte les grandes valeurs ?

Car j'ai testé sur les petites valeurs , cela fontionnait et j'ai voulu le faire sur 15 et 41 avec comme somme cible 56, et l'automate ne trouve pas la somme.

capture

Bonjour,

effectivement, j'ai été un peu fort sur une optimisation (nombre mini de termes à prendre)

En attendant que je corrige complètement, dans RetrouveSomme() remplace :

nbTmin = Application.Match(CDbl(somme), .Range("B:B"), 1)

par

nbTmin = 1

eric

Merci pour ton aide. La macro trouve la somme maintenant

Est ce que tu testes toutes les combinaisons ? ou tu en supprimes certaines ?

Car j'essaie de faire des tests pour 4, 5, 10 valeurs et je ne trouve pas le même total

pour 4 valeurs: 15 combinaisons (dans le programme 14)

pour 5 valeurs: 31 combinaisons (dans le programme 29)

pour 10 valeurs: 1023 combinaisons (dans le programme 803)

Si je ressors les cours de proba:

nb combinaisons = somme (k=1,n) C(k,n)

Oui et non.

J'explore toutes les combinaisons, car il n'y a pas d'autre algorithme pour ce problème.

C'est pourquoi le temps de recherche est exponentiel au nombre de termes. Il faut être (très très) patient si nombreux.

Mais j'élague les branches inutiles pour optimiser.

ie :

  • si la somme est dépassée inutile de continuer à y ajouter des termes, cette branche est morte.
  • ou bien si la somme des x plus grands termes est inférieure à la somme, inutile d'explorer les branches de 1 à x termes (c'est celle-ci que je t'ai fait strapper car je faisais <= au lieu de <, d'où l'absence de ton 15+41=56).
  • ou bien le nombre de termes ne peut être supérieur au nombre de termes de la somme des x plus petites valeurs > à la somme
Si tu n'es pas d'accord ou que tu trouves d'autres idées d'optimisations je suis preneur (dans la mesure où ça ne remet pas trop en cause l'existant, je ne me vois pas tout refaire. Ca m'avait pris pas mal de temps)

eric

v4.3.4 avec correction

eric

Merci pour le lien.

Je pensais aussi supprimer les combinaisons pour lesquelles on sait que ça ne marchera pas.

Bonjour,

j'ai adapté ton code. Cela marche sur certaines valeurs mais par contre parfois , la macro me remonte des combinaisons farfelues et je ne sais pas pourquoi

si tu as une idée ?

capture

Bonjour,

aucune idée.

C'est un programme assez complexe, il vaut mieux l'utiliser à ce pour quoi il a été conçu, sans y toucher.

Ton besoin a l'air tout autre.

eric

Rechercher des sujets similaires à "tirage aleatoire valeurs"