Simplex Algorithme en Python

Plus 25, 2016 Admin Technologie 0 959
FONT SIZE:
fontsize_dec
fontsize_inc

L'algorithme Simplex est une procédure d'optimisation des programmes linéaires. Comme l'implique "linéaire", la fonction objectif d'un tel problème est une combinaison linéaire des variables de décision. En outre, la région de solutions possibles (aka "région admissible») est un polyèdre convexe.

Considéré comme l'un des algorithmes les plus importants de tous les temps, je ai toujours trouvé les implémentations open source existants plutôt frustrant à utiliser. Quand je étais à l'école diplômé, nous avons dû utiliser AMPL, une langue spécifique pour des problèmes d'optimisation de la modélisation (qui était horrible et m'a appris peu ou rien).




Plus tard, grâce à mon travail, je me suis retrouvé à nouveau confrontés à des problèmes d'optimisation linéaire. À ce stade, cependant, je étais armé avec un niveau de compétences relativement forte en Python et ne pouvais éviter l'utilisation d'un tel langage spécifique à un domaine que AMPL. Ci-dessous est une mise en œuvre du célèbre algorithme relativement simple. Comme un bonus pour vous qui pourrait l'utiliser pour des problèmes à la maison ajoutés, vous pouvez imprimer le tableau après chaque broche.

Simplex en Python

de la division __future__ d'importation Importé NumPy * Classe Tableau: def __init __ (self, obj): self.obj = [1] + obj self.rows = [] self.cons = [] def add_constraint (auto, expression, valeur): self.rows.append ([0] + expression) self.cons.append (valeur) def _pivot_column (auto): bas = 0 idx = 0 for i in range (1, len (self.obj) -1): si self.obj [i] = 0: retourne 1 retourner 0 def résoudre (auto): # Construction pleine tableau pour i in range (LEN (self.rows)): self.obj + = [0] ident = [0 pour r dans la gamme (LEN (self.rows))] ident [i] = 1 self.rows [i] + = + ident [self.cons [i]] self.rows [i] = array (self.rows [i], DTYPE = float) self.obj = array (self.obj + [0], DTYPE = float) # Résolvez self.display () tout en ne self._check (): c = self._pivot_column () r = self._pivot_row (c) self._pivot (r, c) print '\ colonne npivot:% s \ npivot rangée:% s'% (c + 1, R + 2) self.display () if __name__ == '__main__': "" max z = 2x + 3y + 2z st 2x + y + z <= 4 x + 2y + z <= 7 z = 0 "" Tableau t = ([- 2, -3, -2]) t.add_constraint ([2, 1, 1], 4) t.add_constraint ([1, 2, 1], et 7) t.add_constraint ([0, 0, 1], 5) t.solve ()

(0)
(0)

Commentaires - 0

Sans commentaires

Ajouter un commentaire

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caractères restants: 3000
captcha