Quel est le logiciel le plus rapide (open source) pour résoudre les problèmes de programmation en nombres mixtes

14

J'ai un problème de programmation d'entiers mixtes. Et j'utilise GLPK comme solveur. Mais j'ai trouvé que GLPK est bon pour les problèmes de programmation linéaire, mais pour la programmation mixte en nombres entiers, il nécessite beaucoup plus de temps, donc ne répond pas à nos exigences. Je recherche tellement d'autres logiciels. Existe-t-il d'autres bons outils open source pour résoudre rapidement les problèmes de programmation en nombres mixtes entiers? Merci!

Yu Hao
la source
Avez-vous vu les comparaisons avec SCIP ?
Ali

Réponses:

14

Si vous voulez quelque chose d'open-source, vous voudrez probablement essayer le code CBC de COIN (ils ont aussi quelques autres solveurs MILP, comme un cadre de branche et de prix, ou SYMPHONY).

Gurobi et CPLEX seront considérablement plus rapides, et à la réunion INFORMS de 2011 ou 2012, Gurobi était plus rapide que CPLEX (bien que les mesures de performance dépendent bien sûr des problèmes). Sur les MILP résolus dans ma thèse, Gurobi était environ 15-100 fois plus rapide que CBC, et CPLEX était presque aussi rapide que Gurobi, mais très légèrement plus lent (comme 12-80 fois plus rapide).

Bien que les performances les plus défavorables soient en effet exponentielles, le temps d'exécution dépendra fortement de la structure du problème. Il est peu probable que vous puissiez résoudre un MILP avec des millions de variables à moins d'exploiter une structure spéciale (peut-être s'il s'agit d'un programme stochastique qui peut être décomposé en de nombreux problèmes beaucoup plus petits), mais il est tout à fait possible de résoudre des MILP non triviaux avec des milliers de variables en moins d'une minute. (Bien sûr, il est également possible que ces problèmes prennent une heure ou plus à résoudre.)

Comme le note Brian Borchers, CPLEX et Gurobi ont tous deux des licences gratuites disponibles pour certains chercheurs, l'un de ces deux logiciels serait vraiment le meilleur à utiliser en tant que solveur MILP à usage général.

Geoff Oxberry
la source
6

Les problèmes de programmation linéaire en nombres mixtes sont beaucoup plus difficiles à résoudre que les problèmes de programmation linéaire. En termes de complexité de calcul, les LP peuvent être résolus en temps polynomial tout en résolvant MILP est un problème NP-difficile. Les algorithmes connus pour résoudre les MILP ont une complexité exponentielle dans le pire des cas.

Il existe d'autres logiciels pour la programmation linéaire mixte entière que vous pouvez consulter, notamment SCIP (gratuit pour un usage académique), CPLEX (commercial mais avec une option de licence académique) et GUROBI (également commercial avec une option de licence académique). Un ou plusieurs de ces paquets peuvent être sensiblement plus rapides que GLPK sur vos problèmes, mais ne vous attendez pas à ce qu'ils soient presque aussi rapides pour résoudre MILP qu'ils ne le sont pour résoudre des LP de taille similaire.

Brian Borchers
la source
4

Si vous voulez essayer un tas de solveurs différents, essayez le framework de modélisation JuMP de Julia . Il vous permet d'écrire votre modèle en tant que modèle JuMP, puis de désactiver les solveurs avec une seule ligne de code. Par exemple, pour les problèmes MILP, vous pouvez choisir parmi les solveurs Bonmin, Cbc, Couenne, CPLEX, GLPK, Gurobi et MOSEK. Pour cette raison, si vous l'écrivez dans JuMP, vous pouvez simplement essayer tous les solveurs mentionnés par Geoff et voir ce qui fonctionne sans avoir à écrire un tas de code. Vos propres tests personnels seront la meilleure source de connaissances sur les algorithmes les plus rapides pour vos problèmes.

Chris Rackauckas
la source
Le cadre JuMP ajoute-t-il beaucoup de frais généraux?
naught101
1
Non, JuMP se fait via des macros donc c'est au moment de la compilation. En fait, qu'est-ce que JuMP utilise-t-il des macros pour réécrire le code et utiliser l'autodifférenciation pour calculer des fonctions efficaces pour les gradients, les jacobiens et les hessois, donc ce sera plus rapide dans les cas où vous n'auriez autrement pas fourni de forme analytique pour le gradient / Jacobian / Hessian. Vous pouvez réellement vérifier via @code_llvmpour vérifier le code d'assemblage résultant pour voir que le code de collage n'est essentiellement rien (c'est aussi parce que Julia utilise naïvement des pointeurs de fonction et les mêmes tableaux de bits que C / Fortran).
Chris Rackauckas
@ChrisRackauckas Quel solveur fonctionne mieux pour les problèmes non linéaires avec des contraintes non linéaires?
skan
C'est une question complètement différente si elle ne devrait probablement pas être posée dans un commentaire, mais j'ai tendance à utiliser JuMP avec NLopt ou IPOPT selon les contraintes requises et si j'ai besoin d'une optimisation globale ou locale.
Chris Rackauckas
3

Suite aux suggestions des autres, j'ai utilisé (le commercial) GAMS pour de nombreux projets. C'est très simple; il vous suffit de mettre la formulation mathématique de votre problème. Il récupère les variables, les contraintes, les fonctions objectives et toutes les données d'entrée. Ensuite, il fournit une gamme de solveurs (optimiseurs) pour tous les cas. Selon votre cas, vous ajoutez des solveurs plus sophistiqués.

Certes, EASY mérite le détour. Framework open source.

Le terme "rapide" est très vague! Tu dois être plus précis; Rapide en nombre d'itérations? nombre d'évaluations? temps écoulé? combinaison de ceux-ci?

Cependant, si vous ne cherchez pas un logiciel et que vous voulez simplement résoudre le problème, je pourrais suggérer d'utiliser l'optimiseur global NSGA-II, qui est un optimiseur open source de très haute réputation et performance.

Si vous fournissiez plus d'informations, je pourrais vous guider avec précision.

T3rmInAt0r
la source
1
Vous devez sérieusement considérer [openMDAO] [1], qui est développé / soutenu par la NASA et il est assez flexible!
T3rmInAt0r