web-dev-qa-db-fra.com

Meilleur résolveur d'optimisation mixte en open source

J'utilise CPLEX pour résoudre d'énormes modèles d'optimisation (plus de 100 000 variables) maintenant, j'aimerais voir si je peux trouver une alternative open source, je résous les problèmes mixtes entiers (MILP) et CPLEX fonctionne très bien mais c'est très cher si nous veulent évoluer, j'ai donc vraiment besoin de trouver une alternative ou de commencer à écrire notre propre bibliothèque d'optimisation ad hoc (ce qui sera douloureux)

Toute suggestion/idée serait très appréciée

46
Mark

J'ai personnellement trouvé GLPK meilleur (c'est-à-dire plus rapide) que LP_SOLVE. Il prend en charge différents formats de fichiers, et un autre avantage est son interface de bibliothèque, qui permet une intégration en douceur avec votre application.

20
David Hanak

Une autre approbation pour COIN-OR . Nous avons constaté que le composant d'optimiseur linéaire (Clp) était très fort, et le composant entier mixte (Cbc) pouvait être réglé assez bien avec une analyse. Nous avons comparé avec LP-Solve et GLPK.

Pour les problèmes vraiment difficiles, un solveur commercial est la solution.

18
dtw

Essayez le solveur SCIP. Je l'ai utilisé pour des problèmes MILP avec plus de 300K variables avec de bonnes performances. Ses performances MILP sont bien meilleures que GLPK. Gurobi a également d'excellentes performances pour les problèmes MILP (et généralement mieux que SCIP (mai 2011)), mais cela pourrait être coûteux si vous n'êtes pas un utilisateur universitaire. Gurobi utilisera les multicœurs pour accélérer le solveur.

16
user764309

Si j'étais vous, j'essaierais d'utiliser une interface multi-solveurs comme Osi (C++) ou PuLP (python) pour que vous puissiez écrire votre code une fois et le tester avec de nombreux solveurs.

Si les programmes entiers que vous allez résoudre sont énormes, je recommanderais python par rapport à C++, car votre code sera plus propre et 99% du temps sera passé dans le solveur.

Si, au contraire, les problèmes sont petits, alors le temps pour copier les problèmes de la mémoire de python vers le solveur (aller-retour) n'est plus à négliger: dans ce cas, vous pouvez expérimenter des améliorations de performances notables en utilisant un langage compilé .

Mais si les problèmes sont énormément énormes, alors les langues compilées vont gagner à nouveau, car l'empreinte mémoire sera grossièrement divisée par 2 (pas de copie du problème en python).

10
user48678
10
Zach Scrivena

Je recommande de consulter le projet COIN. PIÈCE O

Beaucoup de bons solveurs ici, y compris ipOPT pour les problèmes non linéaires et quelques solveurs mixtes entiers également.

9
SplittingField

Bien que ce ne soit peut-être pas ce que vous voulez entendre, il existe des années-lumière entre les solveurs commerciaux CPLEX et Gurobi d'une part et les solveurs open source d'autre part.

Néanmoins, vous pouvez être chanceux et votre modèle fonctionne bien avec GLPK, Coin ou similaire, mais en général, les solutions open source sont loin derrière les solveurs commerciaux. Si c'était différent, personne ne paierait 12 000 $ pour une licence Gurobi et encore plus pour une licence CPLEX.

Au cours des dernières années, j'ai vu de nombreux modèles qui étaient tout simplement trop difficiles pour les solveurs open source. Crois moi...

Ce n'est pas tant une question de taille que de difficulté numérique.

6
Knasterbax

Scip n'est pas mauvais!

6
Harald Schilly

J'ai utilisé DICOPT en utilisant le serveur NEOS ( http://www.neos-server.org/neos/solvers/minco:DICOPT/GAMS.html ) pour résoudre des problèmes importants (environ 1k variables et 1k contraintes) ) a mélangé des programmes non linéaires entiers et l'a trouvé excellent.

Pour mon problème, DICOPT a fait bien mieux que les autres solveurs MINLP répertoriés sur le serveur neos BARON/KNITRO/LINDO/SBB, etc.

Il y a certaines contraintes à soumettre des travaux à NEOS et c'est un peu lourd mais l'accès gratuit à un puissant solveur commercial fait plus que compenser.

2
skr

100k variables est un gros problème. De nombreuses bibliothèques open source ne fonctionnent pas bien avec autant de variables. D'après ce que j'ai lu, lp_solve n'a été testé que pour environ 30k variables. L'utilisation du système commercial peut être votre seul choix.

2
kpatvt

J'ajouterai ce qui suit aux réponses déjà excellentes.

Alors que, comme d'autres l'ont souligné, les solveurs commerciaux sont beaucoup plus rapides et plus performants que les alternatives gratuites, il est important de considérer le niveau d'écart d'optimalité que vous pouvez accepter. Pour les problèmes importants avec de nombreuses variables entières, vous pouvez obtenir des temps de résolution beaucoup plus rapides si vous pouvez accepter un écart d'optimalité de 1% ou même plus (les valeurs par défaut ont tendance à être d'environ 0,01% ou moins).

Bien sûr, si vous résolvez un problème où 1% se traduit par des millions de dollars, ce n'est pas acceptable - d'où le marché des solveurs de premier ordre. (Quelques comparaisons de Gurobi avec des solveurs libres ici )

Je conviens avec d'autres que l'utilisation d'une plate-forme qui génère des fichiers de problème indépendants du solveur (tels que les fichiers * .mps, * .lp) vaut la peine car vous pouvez ensuite essayer d'autres solveurs. J'utilise PuLP et je le trouve, et le solveur COIN_CBC gratuit, excellent. Bien que limité pour les problèmes avec de nombreuses variables entières.

1
kabdulla

Je suis surpris que personne n'ait mentionné MIPCL ( http://www.mipcl-cpp.appspot.com/index.html ). Ce solveur prétend être open source sous licence LGPL (source: http://www.mipcl-cpp.appspot.com/licence.html ), il peut donc également être utilisé dans des applications open source. Mais ce qui manque pour être vraiment open source, c'est le code source du solveur lui-même.

Hans Mittelmann a récemment (10 septembre 2017) fait un benchmark de programmation linéaire en nombres mixtes: http://plato.asu.edu/ftp/milpc.html (vous pourriez également être intéressé par la page de présentation http://plato.asu.edu/bench.html ou les diapositives de son exposé: http://plato.asu.edu/talks/informs2017.pdf ) .

Dans le benchmark de programmation linéaire en nombres mixtes entiers avec 12 threads et un délai de 2 heures, MIPCL a réussi à résoudre 79 instances. Seuls les solveurs commerciaux CPLEX, Gurobi et XPRESS ont réussi à résoudre davantage sous les contraintes données (86 ou 87 instances, respectivement).

Toujours en termes de mesure de performance choisie (utilisant à nouveau 12 threads), MIPCL est plus rapide que les dérivés SCIP référencés (FSCIPC, FSCIPS) et le solveur open source CBC. Encore une fois, seuls les solveurs commerciaux CPLEX, Gurobi et XPRESS surpassent sensiblement MIPCL en termes de performances.

1
Nubok

Pas open source, mais si vous avez une licence Microsoft Academic Alliance, l'édition d'entreprise Microsoft Solver Foundation (MSF) est incluse. Gurobi est également gratuit à des fins académiques, je l'ai utilisé dans ma recherche de thèse.

0
Ohad Schneider