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:
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.
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; }
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:
Mes variables inconnu M22 sont des Decision, il y en a donc 5 :
Les contraintes:
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");
La différence avec les autres qui fonctionnent:
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);
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.
Partager