Monsieur Excel
Pour tout savoir faire sur Excel !

08 avril 2016

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") & _
           ". 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 Blogger Benji, sur 11:54 AM  

Enregistrer un commentaire

<< Accueil