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

Intelligence artificielle Discussion :

Trouver les paramètres d'une fonction pour la faire tendre vers une valeur


Sujet :

Intelligence artificielle

  1. #1
    cedrix57
    Invité(e)
    Par défaut Trouver les paramètres d'une fonction pour la faire tendre vers une valeur
    Bonjour,

    J'ai un algorithme plus ou moins complexe écrit en Scilab (qui ne ressemble pas vraiment à une fonction linéaire), qui permet en fonction d'une dizaine de paramètres de calculer une valeur.

    J'aimerai bien résoudre le problème inverse : renseigner la valeur de sortie, et obtenir une combinaison des paramètres d'entré.

    Je ne sait pas si cela est un problème d'IA, ou de recherche opérationnelle. Quelqu'un aurait des pistes ?

    Pour le moment, je connais un seul outil qui m’aiderait : Crystal Ball d'Oracle qui permet de faire de la recherche opérationnelle sans utiliser de fonctions linéaires. Le problème c'est que j'ai besoin d'un truc libre/gratuit qui fonctionne sous Ubuntu et Windows.


    Merci d'avance,

  2. #2
    Membre émérite
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Points : 2 464
    Points
    2 464
    Par défaut
    J'ai l'impression que ton problème peut se résoudre via algorithmes évolutionnistes.

    Possibilité de tester rapidement cette hypothèse et évaluer ses performances : je connais pas Scilab, mais il me semble que le langage est très proche de MATLAB (peut-être même directement interprétable avec de la chance). Dans MATLAB, avec la Global Optimization Toolbox tu as une interface graphique appelée Gatool te permettant facilement d'optimiser les paramètres via algo évo (regarde les exemples tu comprendras vite, eg http://www.mathworks.com/products/gl...cription4.html ou http://www.developpez.net/forums/d10...oolbox-gatool/).

    Mais MATLAB n'est ni open source, ni gratuit. Personnellement en dehors de MATLAB pour les algorithmes évolutionnistes j'utilise Sferes2 (http://pages.isir.upmc.fr/~mouret/sf...l/sferes2.html) mais cette librairie C++ est pour l'instant peu documentée. Il existe beaucoup d'autres implémentation des algorithmes évolutionnistes dans la plupart des langages !

    Sinon, entre IA et recherche opérationnelle, les frontières ne sont pas clairement définies

  3. #3
    cedrix57
    Invité(e)
    Par défaut
    Merci pour votre réponse.

    Je me demande si les algorithmes génétiques sont efficaces ? J'en ai utilisé un il y a longtemps ou un autre problème (trouver un ordre de parcourt de villes minimisant la distance totale), et les résultats avaient pas l'air terrible.
    Le problème venait sûrement du fait que c'était moi qui l'avait programmé.

    Sinon je pense avoir trouvé un mot clé concernant mon problème : "nonlinear optimization".

    C'est d’ailleurs possible de faire ça dans Scilab, mais j'ai du mal à comprendre l'exemple :

    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
      function [f, g, ind]=cost(x, ind)
        xref=[1;2;3];
        if ( ind == 1 | ind == 4 ) then
          f=0.5*norm(x-xref)^2;
        end
        if ( ind == 1 | ind == 4 ) then
          g=x-xref;
        end
        if ( ind == 1 ) then
          mprintf("===========\n")
          mprintf("x = %s\n", strcat(string(x)," "))
          mprintf("f = %e\n", f)
          g=x-xref;
          mprintf("g = %s\n", strcat(string(g)," "))
        end
      endfunction
      x0=[1;-1;1];
      [f,xopt]=optim(cost,x0,imp=-1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function [f, g, ind]=cost2(x, ind)
      fref=12;
      f=3*x(1)**2 -9*x(2)**3 + log(x(3))
      g=fref-f;
      if(ind == 1) then
        mprintf("===========\n");
        mprintf("x = %s\n", strcat(string(x)," "));
        mprintf("f = %e\n", f);
        g=x-xref;
        mprintf("g = %s\n", strcat(string(g)," "));
      end
    endfunction
    x0=[1;-1;1];
    [f,xopt]=optim(cost2,x0,imp=-1)

    J'essai de faire tendre la fonction :
    f=3*x(1)**2 -9*x(2)**3 + log(x(3))
    vers la valeur 12, mais ça n'a pas l'air de très bien marcher. Je sait pas si quelqu'un aurait une idée du problème ? Je vais quand même créé un autre poste car cela concerne peut être plutôt scilab.

  4. #4
    Membre émérite
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Points : 2 464
    Points
    2 464
    Par défaut
    Je n'ai pas vraiment lu ton post, j'ai simplement fait tourner une optimisation via gatool de MATLAb sur ta fonction et voici les résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [F]=fitness_A(x)
    F = abs(3.*x(1).^2 -9*x(2).^3 + log(x(3)) - 12);
    end
    Images attachées Images attachées  

  5. #5
    cedrix57
    Invité(e)
    Par défaut
    Effectivement ça à l'air plus facile à mettre en oeuvre sous matlab.

    Sous scilab j'ai finalement pu le faire en installant un package (pour accéder à l'algorithme évolutioniste CMA-ES avec la fonction cma_optim, qui en passant marche trés bien).

    Pour ce que ça intéresse il y a des informations sur les pages suivantes :

    http://www.lri.fr/~hansen/cmaesintro.html

    http://www.lri.fr/~hansen/scilabdoc/cma_optim.htm

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/09/2014, 22h52
  2. Réponses: 4
    Dernier message: 27/09/2013, 17h45
  3. Réponses: 3
    Dernier message: 15/11/2010, 18h22
  4. Réponses: 2
    Dernier message: 29/08/2007, 19h43
  5. une fonction pour enlever les doublons d'un array
    Par secteur_52 dans le forum Delphi
    Réponses: 1
    Dernier message: 27/06/2006, 13h45

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