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

Mathématiques Discussion :

Comment coder un solveur ?


Sujet :

Mathématiques

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut Comment coder un solveur ?
    Bonjour,

    Allez je me lance dans mon dernier espoir. Sincèrement si vous passer par ici et que le mot Solver ne vous a pas fait peur, s'il vous plait essayé de m'aider.



    Historique:
    Notre client a un gros fichier Excel avec une quantité phénoménale de calcul. Ces calculs sont breveté donc je ne peux malheureusement pas vous les présenter.
    Le fichier Excel contient 6 onglets avec un solver.

    -Mon rôle est de créer un logiciel qui va automatiser tout cela, sachant qu'il y a plein de chose autours: Des paramètres et surtout des mesures avec des appareils spécifique qui vont alimenter les données.

    Mon souci c'est donc les Solvers:
    Pour le moment j'ai réussi à faire fonctionner 5 des 6 solvers. RRrrrrr. Excel trouve un résultat bien plus pertinent pour ce 6éme et cela ne conviens pas au client bien sûr.

    En langage, le logiciel est créer en C# Winform. J'utilise Microsoft Solver Foundation. Mais ce dernier n'est plus maintenu depuis des années.

    Donc si vous connaissez autre chose n'hésiter pas, même si ce n'est pas du C#, en python ou autre par exemple, du moment que je peux lui transmettre les données à résoudre et récupérer le résultat.


    Pour vous donner une idée:
    Il y a 5 inconnu à trouver afin de d'avoir le résultat le plus petit possible.

    Actuellement j'ai représenté chaque cellule Excel (formule) sous forme de méthode me renvoyant un double. Mais pour alimenter le solver j'ai fait les mêmes méthodes me renvoyant un Term

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            private double Cell_C38()
            {
                return 1234 / (0.1528 * 0.78 * Cell_K8() * Cell_L8() * Cell_O8()) / 384;
            }
            private Term Solv_C38()
            {
                Term res =1234/ (0.1528 * 0.78 * Solv_K8() * Solv_L8() * Solv_O8()) / 384;
            }
    Les chiffres que j'ai mis ici sont en réalité soit des cellules qui me renvoie un double n'utilisant pas les inconnus, soit c'est des variables.

    Pour vous faire peur:

    La ligne complète de formule TERM que je passe au Solver fait... 42562 caractères.

    Bon il faut relativisé, dans les "Term" apparemment cela n'utilise que des entiers donc il présente une valeur double sous forme de division.

    Un morceau du Term:

    Attention cela pique:

    Nom : 2022-11-18 16_33_20-Window.png
Affichages : 277
Taille : 92,2 Ko


    Mes variables inconnu M22 sont des Decision, il y en a donc 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                    Solver_M22 = new Decision(Domain.RealNonnegative, "M22");
                    Solver_M23 = new Decision(Domain.RealNonnegative, "M23");
                    Solver_M24 = new Decision(Domain.RealNonnegative, "M24");
                    Solver_M25 = new Decision(Domain.RealNonnegative, "M25");
                    Solver_M26 = new Decision(Domain.RealNonnegative, "M26");
    Les contraintes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    modelM5.AddConstraint("M22a", Solver_M22 <= 4);
                    modelM5.AddConstraint("M22b", Solver_M22 >= 0);
                    modelM5.AddConstraint("M23a", Solver_M23 <= 2);
                    modelM5.AddConstraint("M23b", Solver_M23 >= 0.0000001);
                    modelM5.AddConstraint("M24a", Solver_M24 <= 2);
                    modelM5.AddConstraint("M24b", Solver_M24 >= 0);
                    modelM5.AddConstraint("M25a", Solver_M25 <= 2);
                    modelM5.AddConstraint("M25b", Solver_M25 >= 0);
                    modelM5.AddConstraint("M26a", Solver_M26 <= 2);
                    modelM5.AddConstraint("M26b", Solver_M26 >= 0.0000001);
    La différence avec les autres qui fonctionnent:

    Ils sont un peux moins complexe, il y a légèrement moins de calcul (pas beaucoup moins), mais surtout dans ce 6eme il y a des fonctions Math.Log(x), en Term j'utilise les mêmes fonctions, mais depuis --> Model comme Model.Log, Model.PI, Model.Pow etc..

    Ce qu'il y a dans les formules:

    Rien d'exotique, Multiplication, Division, Addition, Soustraction, Exponentiation, PI, Log et j'en ai peut être oublié. Quelques MOYENNE ou MAX, mais il me semble qu'il n'y a pas les inconnu la dedans.


    Conclusion:

    Voila, donc si vous avez une idées pour traiter ce genre de recherche d'inconnu, dans un langage pouvant être interprété ensuite par du C#.

    MERCIIIIII.

  2. #2
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    si j'ai bien compris tu veux résoudre une équation non linéaire a plusieurs inconnues ?

    la lib tpmat081

    https://www.unilim.fr/pages_perso/je...h/tpmath_f.htm

  3. #3
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Bonjour,

    Oui il y a 5 inconnu. Pour trouver un resultat le plus proche de zero.
    Je vais regarder votre proposition. Après comment lui passer la formule, je vais regarder cela.
    Je pense qu'il faut que je reproduise une seul formule comme le fait le MSF avec l'objet Term.

    Merci

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    Par défaut


    "Rien d'exotique", mais tu parles d'exponentielle, de puissance, de maximum, de minimum : pas de l'optimisation convexe, pas un système d'équations polynomiales ou linéaires (de par les opérations et la présence de bornes), ça n'est pas mathématiquement très joli .

    AMPL pourrait fournir la couche d'accès C# dont tu as besoin (version d'évaluation avant de devoir acheter : https://ampl.com/products/ampl/apis/). Sinon, tu as des bibliothèques d'analyse numérique qui pourraient te sortir de là : https://www.extremeoptimization.com/...ogramming.aspx, https://www.alglib.net/optimization/...onstrained.php, https://github.com/numericalalgorith...l_optimization.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Tes 5 autres onglets fonctionnent, et il y a des Log aussi dedans ?

    Je ferais un petit contrôle sur cette fonction Log. J'ai un vague souvenir de certaines conventions, où log (en minuscule) était le log en base 10, et Log (majuscule) était le log en base e. Si ça se trouve, c'est une bêtise comme ça qui explique que tu obtiens des résultats différents.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

Discussions similaires

  1. [C#] Comment coder un String.Join pour des int ?
    Par luimême dans le forum C#
    Réponses: 2
    Dernier message: 12/10/2005, 08h14
  2. [matrice spéciale] comment coder ce genre de matrices?!
    Par wjean dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 09/05/2005, 09h50
  3. Comment coder un effet de neige ?
    Par the_magik_mushroom dans le forum Langage
    Réponses: 11
    Dernier message: 17/12/2004, 23h29
  4. Comment coder une tabulation pour cut ?
    Par ggnore dans le forum Linux
    Réponses: 2
    Dernier message: 26/11/2004, 10h31
  5. Comment coder guillemets et cotes ?
    Par Vow dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 14/05/2003, 12h11

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