Programmation linéaire de la bibliothèque .NET / C#
J'ai besoin pour résoudre un sous-déterminés système linéaire d'équations et de contraintes, puis de trouver la solution particulière qui minimise une fonction de coût. Ce qui doit être fait sur le plan purement portable de code managé qui va l'exécuter .NET et Mono. Ce qui librement disponible bibliothèques sont là, que je peux utiliser pour mettre en œuvre cette?
Tous les algorithmes d'optimisation fourni par les bibliothèques libres j'ai trouvé que le soutien de l'intervalle de contraintes sur des variables individuelles, par exemple 0 < x < 1
, pas de contraintes comme x + 2y < 4
. J'ai aussi remarqué que, souvent, les équations linéaires solveurs seulement le soutien des systèmes linéaires avec une solution.
Le plus proche que j'ai trouvé pour l'instant est DotNumerics, qui comprend la Décomposition en valeurs Singulières pour la résolution de sous-déterminés systèmes linéaires, mais ses algorithmes d'optimisation uniquement en charge une seule variable contraintes (autant que je puisse en dire).
Il y a plusieurs autres questions à poser à propos de la programmation linéaire, mais ma clé exigences sont multi-variables, de contraintes et de problèmes sous-déterminés systèmes. Je n'ai pas encore trouver une bibliothèque qui prend en charge multi-contraintes variables.
Après une inspection plus minutieuse, il ne ressemble à ceci répond à mes exigences. Je vous remercie beaucoup. Donner une réponse et je vais accepter. Je ne sais pas comment je n'ai pas de place avant.
OriginalL'auteur Dylan | 2013-05-09
Vous devez vous connecter pour publier un commentaire.
ALGLIB est l'habitude d'aller à la bibliothèque pour des choses comme les solveurs linéaires. Je donnerais un bon coup d'oeil avant de désespérer.
OriginalL'auteur Marc Gravell
Si vous êtes en développement .NET (c'est à dire pas du Windows Store, Windows Phone ou Silverlight), alors je n'hésiterais pas à vous recommander de prendre un coup d'oeil à lpsolve, qui est approprié pour de grands LP et/ou MILP problèmes. Télécharger le x86 ou x64 développement des archives qui contiennent les respectifs lpsolve DLL:s, et ensuite télécharger le .NET API archive qui contient un fichier C# avec P/Invoke appels à toutes les fonctions dans le lpsolve API.
Une autre alternative est d'utiliser la CLP solveur de la PIÈCE DE MONNAIE OU projets, via le CoinMP des binaires précompilés. Il y a un C# wrapper DLL disponible ici.
Si vous ne exiger purement de code managé, ALGLIB est probablement votre meilleur pari (comme suggéré par Marc Gravel ci-dessus), mais sachez que le ALGLIB licence open-source utilise la GPL. Si vous souhaitez utiliser ALGLIB dans votre propre code sans les divulguer à la communauté open-source, vous aurez besoin d'acheter un commercial ALGLIB de licence.
Une recherche rapide sur Internet révèle également une pure C# de la mise en œuvre du Simplexe algorithme LP ici. Je ne peut pas identifier l'auteur, et je n'ai aucune idée si cette mise en œuvre est correcte, ou de toute qualité. Le code ne semble pas très portable, même dans des conditions de Windows Store, Windows Phone, Silverlight et Mono contextes.
Je ne sais pas pourquoi vous pensez que je mérite un downvote, c'est pas comme si ma réponse est fausse. Certes, vous mentionner, en passant, que vous avez besoin d'une solution gérée, mais il n'est pas évident de votre question de savoir pourquoi c'est comme un briseur d'affaire. Le plus souvent, les gens demandent des solutions gérées lorsqu'un P/Invoke solution serait mis en place (comme dans ce cas où lpsolve fonctionne parfaitement dans les deux .NET et Mono). La réponse de Marc est à l'évidence le plus pertinent dans votre cas, mais sachez que ALGLIB est sous GPL; si vous souhaitez utiliser à des fins commerciales, vous devez acheter un commercial ALGLIB licence.
Peut-être que le downvote a été un peu vite en besogne, mais la ligne directrice est de downvote si la réponse n'est pas utile. Je peux annuler si vous modifiez la réponse d'une certaine façon.
Désolé pour la confusion, et le downvote, qui est maintenant corrigée.
Ici, ont un upvote. Je suis sûr que la réponse sera utile à d'autres sans mon exigence.
OriginalL'auteur Anders Gustafsson
La programmation linéaire est conçu pour faire exactement ce que vous demandez. Multi-variables, les contraintes sont tout à fait normal dans la programmation linéaire. Regarder gratuitement des solveurs comme lpsolve (http://sourceforge.net/projects/lpsolve/), glpk (http://www.gnu.org/software/glpk/) ou de la SRC (https://projects.coin-or.org/Cbc) par exemple.
J'accepte que les suggestions ci-dessus ne sont pas en C# et ne sont pas gérées .net assemblées out-of-the-box. Si c'est un briseur d'affaire pour vous, alors peut-être que vous pouvez essayer de construire une version de vous-même à partir du code source d'une de ces bibliothèques. Peut nécessiter un peu de travail, même si - je n'ai pas essayé.
Il est également difficile de dire à votre question de départ comment grand ou complexe, un problème que vous essayez de résoudre. Si vous avez des variables qui doivent prendre des valeurs discrètes, alors vous auriez besoin d'un solveur bibliothèque qui fera de branch and bound ou similaire, sinon, si purement linéaire et continue, alors vous pouvez simplement utiliser un algorithme du simplexe. Ses dans beaucoup de manuels si vous ne pouvez pas trouver une pré-version construite.
Si son vraiment un petit problème (des dizaines de variables et de contraintes) ou tout simplement linéaire et continue, alors vous pourriez être en mesure de s'en tirer avec vos propres frais (portable, pur code managé) la mise en œuvre, mais si vous avez des milliers de contraintes et de variables, vous avez de la difficulté à obtenir les performances dont vous avez besoin. Si vous avez un gros problème complexe, vous pouvez être hors de la chance que vous pourriez avoir besoin d'un solveur commercial pour obtenir les réponses dont vous avez besoin.
OriginalL'auteur TimChippingtonDerrick
personne n'a indiqué le solveur de la fondation. C'est une bonne option.
Pour exponentielle des problèmes c'est très limitée, et je ne voudrais pas le considérer, même à distance gratuit. Quelque chose comme une c. à thé est limitée à 45 points, par exemple.
OriginalL'auteur Naresh