Résolution de problème récursif (d)
Comme
nous l’avons dit au début de l’article précédent, il y a deux façons de trouver
la réponse à notre problème : soit l’énumération – par une série de boucles – des 65.536 solutions possibles, soit le tirage d’un grand nombre de solutions – par exemple 100.000 – pour être quasiment sûr de
trouver la solution optimale.
Nous
avons choisi la seconde solution, ce qui évite au moins de devoir créer 8
boucles imbriquées… Voici le code VBA correspondant :
Sub
Solution()
Dim NbMax As Integer
Dim I As Long
Dim Nb1 As Integer
Dim Nb2 As Integer
Range("Sol").ClearContents
Range("Sol").Offset(0,
1).ClearContents
Application.Calculation =
xlCalculationManual
Application.ScreenUpdating = False
For I = 1 To 500000
Application.StatusBar = "Itération
n°" & _
Application.Text(I, "# ##0") & _
Application.Text(I, "# ##0") & _
". Meilleure solution : "
& NbMax
Calculate
If Range("Good").Value >=
NbMax Then
Application.ScreenUpdating = True
NbMax = Range("Good")
Range("Sol") =
Range("Answers").Value
Range("Sol").Offset(0, 1)
= Range("Eval").Value
Application.ScreenUpdating = False
End If
Next I
Application.StatusBar
= False
Application.Calculation =
xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "Solution optimale : "
& NbMax & ""
End
Sub
Remarque 1 – Notez l’utilisation
de la barre de statut pour permettre à l’utilisateur de suivre la progression
des travaux. J’utilise cette barre chaque fois qu’un traitement prend un
certain temps et que je souhaite rassurer l’utilisateur sur la progression du
traitement.
Remarque 2 – Quand j’ai résolu
le problème la première fois, j’ait trouvé deux réponses optimales, chacune
avec 7. J’ai envoyé un mail à l’auteur en lui disant que
j’avais bien résolu le problème mais qu’il y avait « hélas » deux
solutions.
Il
m’a répondu que c’était faux et que la solution était unique. J’ai repris mon
travail et j’ai constaté que j’avais en effet saisi (5;6;7;8) en H8:K8. Je
n’avais effectivement pas remarqué, en créant mon modèle Excel, que dans cette
série – et elle seule – les réponses n’étaient pas en ordre croissant.
J’ai
donc corrigé cette ligne et, comme par hasard, il n’y avait alors plus qu’une
seule solution ! Cela m’a permis de lui renvoyer un mail pour lui dire que
j’avais fait cette distraction puis compris pourquoi il avait
« truandé » la dernière ligne afin d’obtenir une réponse
unique !
1 Commentaire(s):
C'est un peu dommage de faire 100.000 tirages aléatoires et de risquer de ne pas trouver la solution optimal !
proba de ne pas trouver la bonne réponse = (65535/65536) ^ nbTirages
soit 21% pour 100.000 tirages :(
avec 500.000 tirages on est n'est plus qu'a 0.05% de pas trouver la solution optimal, mais quand même !
By Benji, sur 11:54 AM
Enregistrer un commentaire
<< Accueil