Logiciel gratuit lp-solution qui résout les problèmes de programmation linéaire. La procédure pour l'exécuter sur le terminal Mac et la procédure pour l'appeler à partir de Python n'ont été organisées nulle part, je vais donc le noter. De plus, comme je ne savais pas comment l'utiliser après son installation, j'écrirai le code Python comme un exemple simple à la fin.
Mac OS X El Capitan 10.11.6 Python 2.7.12
$ brew tap homebrew/science
$ brew install lp_solve
Tout d'abord, téléchargez la dernière version du fichier à partir de https://sourceforge.net/projects/lpsolve/files/lpsolve/. Les deux fichiers suivants sont requis. (Dernière mise à jour le 10 octobre 2016: 5.5.2.5)
lp_solve_5.5.2.5_source.tar.gz
lp_solve_5.5.2.5_Python_source.tar.gz
Décompressez-les ($ tar xfvz) et copiez sous / extra dans lp_solve_5.5.2.5_Python_source.tar.gz dans /lp_solve_5.5 dans lp_solve_5.5.2.5_source.tar.gz.
Si la hiérarchie des répertoires ressemble à ceci ↓ lp_solve_5.5/ ├ lp_solve ├ lpsolve55 ├ extra ├ : └ demo
Dans lp_solve / et lpsolve55 /,
$ sh ccc.osx
ça ira. À ce stade, un grand nombre d'erreurs se produiront en fonction de l'environnement, mais les fichiers nécessaires seront générés. Si vous faites lp_solve / → lpsolve55 / et sh ccc.osx, vous devriez voir que lpsolve55 / bin est généré. Copiez liblpsolve55.a et liblpsolve55.dylib dans / lpsolve55 / bin / osx64 /, s'il est généré, dans / usr / loca / lib.
Enfin, exécutez setpy.py dans /lp_solve_5.5/extra/Python. Mais avant cela, modifiez la partie suivante dans setpy.py.
setpy.py
:
:
windir = getenv('windir')
if windir == None:
WIN32 = 'NOWIN32'
LPSOLVE55 = '../../lpsolve55/bin/ux32' #→ lpsolve55/bin/Fixé à osx64
else:
WIN32 = 'WIN32'
LPSOLVE55 = '../../lpsolve55/bin/win32'
setup (name = "lpsolve55",
version = "5.5.0.9",
description = "Linear Program Solver, Interface to lpsolve",
author = "Peter Notebaert",
:
:
Après la sauvegarde, le reste est dans le terminal
$ python setpy.py install
Ensuite, toute l'installation est terminée.
Si vous obtenez une erreur de fichier "malloc.h" introuvable ici, réécrivez la ligne spécifiée (probablement #include \ <malloc.h>) en #include \ <stdlib.h>. Si stdlib.h est déjà inclus, supprimez-le. (Référence: malloc.h sur OS X)
Vérifions si cela fonctionne normalement à partir de Python.
$python
Python 2.7.12 (default, Aug 3 2016, 23:22:34)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from lpsolve55 import *
>>> lpsolve()
lpsolve Python Interface version 5.5.0.9
using lpsolve version 5.5.2.5
Usage: ret = lpsolve('functionname', arg1, arg2, ...)
>>>
Si ça ressemble à ça, c'est un succès.
Par exemple, si vous souhaitez résoudre le problème suivant
Fonction objective
min -400x1 -300x2 + 100x3
Contrainte
s.t. \qquad\qquad\qquad\qquad\qquad\\
60x1 +40x2 + 10x3 \le 3800\\
30x1 +20x2 -40 x3 \ge 1200\\
5 \ge x1 \ge -\infty \\
20 \ge x2, x3\\
int\ x1,x2,x3
Ajoutez des expressions de contrainte comme suit.
from lpsolve55 import *
# 0,3 → L'expression de contrainte est 0 ligne, la variable est 3 Faites ce LP
lp = lpsolve('make_lp',0,3)
#Ajout de la fonction objectif "min": -400x1 -300x2 +100x3」
lpsolve('set_obj_fn', lp, [-400, -300, 100] )
#Expression de contrainte ajoutée "60x1+40x2 +10x3 =< 3800」, 「LE」 = 「<=」、 「GE」 = 「>=」、 「EQ」 = 「=」
lpsolve('add_constraint', lp, [60,40,10], LE, 3800)
# 30x1 +20x2 -40x3 => 1200
lpsolve('add_constraint', lp, [30,20,-40], GE, 1200)
#Réglage de la limite inférieure des variables,"Infinite"Exprimez l'infini avec
lpsolve('set_lowbo',lp,1,-Infinite)
#Limite supérieure de variables, plusieurs paramètres peuvent être définis en même temps dans la liste
lpsolve('set_upbo',lp,[5,20,20])
#Contrainte entière, 0-1 contrainte est"set_binary"
lpsolve('set_int'lp,[1,2,3])
# const.lp est généré et produit la formulation
lpsolve('write_lp',lp,'const.lp')
#Résoudre le problème
lpsolve('solve',lp)
#Sortie de solution optimale, assignable à des variables. Le type est la liste
print lpsolve('get_variables',lp)
En gros, j'ai arrangé les commandes que je pense utiliser souvent. Trouvez d'autres commandes dans la Référence API lp_solve. J'étudie également.
~~ Ce qui m'intéresse actuellement, c'est de savoir s'il existe une fonction pour arrêter le calcul de lp_solve à un moment donné. Par exemple, je recherche quelque chose comme "Si cela ne se termine pas dans 20s, je sortirai une solution provisoire à ce stade." ~~
(Ajout: 2016/10/7) Il y avait.
lpsolve('set_timeout',lp,TIME) #TIME est le nombre de secondes-Réglez sur 1. TIME pour 1 minute= 59
C'est possible avec.
Solveur de plan linéaire Installez le pilote lpsolve pour Python lp_solve API reference INSTALL LPSOLVE FOR PYTHON
PuLP est une bibliothèque d'optimisation mathématique plus flexible en Python. Ces articles de @SaitoTsutomu sont très utiles. Veuillez voir ensemble. Modèle mathématique du début Python dans l'optimisation Feuille de calcul du modélisateur d'optimisation mathématique (PuLP) (Python)
Recommended Posts