IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Optimisation d'une fonction à plusieurs variables [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 71
    Par défaut Optimisation d'une fonction à plusieurs variables
    Bonjour à tous,

    le titre n'est peut-être pas explicite mais je n'ai pas trouvé mieux...

    Voici ma question :
    mon résultat noté R (en rouge dans l'exemple) est fonction d'un triplet (L1, L2, L3) de variables qui peuvent prendre 5 valeurs différentes. On peut donc écrire :
    R= f(L1Ci, L2Cj, L3Ck) avec i, j, k compris entre 1 et 5 dans mon exemple.

    Je souhaiterais tester tous les triplets possibles (dans mon exemple il y en a 5^3 soit 125) et savoir quels sont les X triplets qui minimisent le plus ma fonction.
    Dans mon exemple (variables en jaune) je teste la première hypothèse (hypothèses pour L1, L2, et L3 à titre d'exemple en vert)

    Je sais que c'est un peu abstrait mais peut-être que certains d'entre vous (nostalgiques des prépas scientifiques) auront du plaisir à m'aider.

    Merci d'avance

    PS : je précise que l'exemple en PJ est un exemple et que la fonction choisie l'a été par hasard.

    PPS : Si j'ai un grand nombre de variables à tester, même en testant peu de valeurs pour chacune des variables on arrive à un nombre impressionnant de résultats à tester puisque celui-ci est egal au nombre de valeurs possible pour chaque variable élevé à la puissance du nombre de variables (dans mon exemple 5^3 comme dit plus haut). Etant donné qu'il n'y a que 256 * 65536 = 16 millions de possibilités par onglet dans excel 2003, avez vous une idée de la façon dont on pourrait contourner le problème?
    Peut-être en faisant calculer à la macro les différents résultats et n'afficher que le min des Y derniers tests??

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    on réfléchit ensemble :
    1) si l'on veut tester (comme tu le dis) tous les triplets, il faut bien commencer par les déterminer, puis, pour chacun d'entre eux .... tester .
    2) si l'homme le faisait sans la machine, il devrait faire tout celà manuellement et aurait besoin d'un certain temps (long...)
    3) c'est l'homme, qui a programmé la machine, en lui inculquant ses propres réflexes et raisonnements. La machine n'est pas dotée d'une connaissance échappant à l'homme
    4) l'homme a toutefois pu doter la machine d'une capacité d'exécution des tâches, notamment de calculs, beaucoup plus rapide
    5) la machine calculera, déterminera et testera donc plus vite, mais n'inventera rien ... Il lui faudra donc passer par le même nombre de déterminations (de triplets) et de tests après calculs.
    J'espère que ma réponse est claire...

    Traduction : la machine attend ton algorithme, sa traduction en code et ... l'exécutera . Aurais-tu un algorithme de détermination des triplets, de calculs et de tests qui rendrait leur nombre plus petit ?

  3. #3
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 71
    Par défaut
    Héhé,
    Bonjour Ucfoutu.
    Tu résumes et traduis bien la situation : il me faut un algorithme capable d'exécuter les taches décrites. Et c'est pour ça que je poste ma question sur le forum, ma connaissance de VBA étant trop récente pour pouvoir me débrouiller tout seul.
    J'espère avoir un coup de main de quelqu'un qui connait bien VBA pour coder les étapes décrites...

  4. #4
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 71
    Par défaut
    Bonjour à tous,

    comme mon topic s'empoussière, je vais tenter de le dépoussiérer un peu en segmentant le problème :
    une première question qu'on peut se poser est :
    - Comment créer une base contenant l'exhaustivité des n-uplets à tester?

    Si vous avez des idées, n'hésitez pas...

  5. #5
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 71
    Par défaut
    Bonsoir à tous,
    je vous mets en PJ un fichier excel dans lequel j'ai commencé à faire quelques tests de boucle pour générer mes n-uplets (dans mon exemple 4 valeurs pour 5 hypothèses soit 1024 quintuplets à générer).

    mon code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub nuplets()
     
    Dim i As Long
    Dim j As Long
    Dim ligdeb As Long
    Dim numval As Long
    Dim numhyp As Long
    Dim k As Long
    Dim l As Long
     
     
    numval = 4
    numhyp = 5
     
    'For k = 1 To numval
        'For l = 1 To numhyp
            For i = 1 To numval
                For j = 1 To numhyp
                Cells(i + 4, j + 9).Value = Cells(11 + i, 2 + j).Value
                Next
            Next
        'Next
    'Next
     
    End Sub
    ne génère pas les bons quintuplets.
    note : k et l ne servent pour l'instant à rien.
    Si quelqu'un a une idée de boucle qui marche pour générer ces quintuplet, il est le bienvenu.
    A+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Par défaut
    Salut KokoVBA et tout le forum

    Ci-joint un code qui répond (presque) à ta question.
    Quelques remarques en effet :
    1) Je travaille sur la feuille 2 et non sur la feuille 1, où je n'ai pas positionné mes cellules au même endroit que toi...
    2) je suppose que le tableau comprenant les valeurs des variables à tester est déjà fourni, il n'y a donc pas de macro générant les données à tester (mais c'est très simple à faire si les valeurs prises par les variables évoluent régulièrement. Exemple : Var1 varie de 1 à 10 avec un pas de 1, Var2 varie de -23 à 56 avec un pas de 0.5, etc.)
    3) c'est la première fois que je viens en aide à quelqu'un alors le code que je te soumets est complet (test des divisions par zéro, affichage du résultat) et surtout il est marqué par toutes les petites habitudes que j'ai prises depuis que je code, i.e. une semaine (au passage, si quelqu'un pouvait me dire si ce code est rédigé dans les règles de l'art, ce serait cool !)
    4) du coup il est abondamment commenté histoire que t'arrives à me suivre, mais je ne promets rien....
    5) donc si t'as la moindre question n'hésite pas

    En tout cas merci, ta requête m'a permis de bien progresser sur la gestion des tableaux !
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/11/2012, 01h57
  2. minimiser une fonctions à plusieurs variables
    Par lassaib dans le forum Fortran
    Réponses: 4
    Dernier message: 03/04/2012, 22h04
  3. Réponses: 0
    Dernier message: 22/03/2011, 23h52
  4. Réponses: 0
    Dernier message: 06/08/2010, 16h53
  5. Réponses: 3
    Dernier message: 16/03/2010, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo