Methodesimplexe

fifiyan Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
 Profil bloqué -
Bonsoir à tous,
J'ai un projet à rendre dans un delai record,et ce projet consiste à programmer la méthode du simplexe en python.Merci pour tous ceux qui peuvent m'aider.

coordialement

2 réponses

Profil bloqué
 
C'est pourtant pas si compliquer !
Regarde mon exemple :

# coding=utf8
import numpy as np # nécessaire pour avoir le calcul numérique

# méthode du simplexe pour résoudre
# max c.x sous contraintes
# Ax=b
# x >= 0
# permut(0..m-1) : variables dans la base initiale
# permut(m..n-1) : variables hors base initiale
# ne fonctionne que si la base initiale est admissible
# et les composantes de b >=0
# renvoie la solution et le gain maximal
def simplexe(A,b,c,permut):
# m: nombre de variables dans la base
# n: nombres d'inconnues du pb d'optimisation linéaire
m,n = A.shape
if m>=n or c.shape[0] != n or b.shape[0] != m:
return 'dimensions incompatibles'

if min(b) < 0:
return 'le vecteur b doit être >=0'

while True : # émulation du do-while en python...
# matrice des colonnes permutées
Ap=np.column_stack((A[:,permut[i]] for i in range(n)))
# coefficients du gain permutés
cp=np.array([c[permut[i]] for i in range(n)])

# vérification que le problème n'est pas dégénéré
# en python ":m" désigne le range "0,1,...,m-1",
# "m:" le range "m,m+1,...,n-1" et ":" le range "0,1,...,n-1"
if np.linalg.det(Ap[:,:m]) == 0:
return 'matrice non inversible'

#expression des variables de base en
#fonctions des variables hors base
# x_b = Chb x_hb + bbase
invAp=np.linalg.inv(Ap[:,:m])
Chb=np.dot(invAp,Ap[:,m:])
bbase=np.dot(invAp,b)

# coefficients du gain dans les variables hors base
cbase=-np.dot(cp[:m],Chb)+cp[m:]
cmax=max(cbase)
# si tout les coeffs sont <0 on ne peut plus améliorer
if cmax<=0:
break # sortie du do-while
# sinon choix de la variable optimale pour le gain
# cette variable rentrera dans la base
ihb=np.argmax(cbase)+m
# choix de la variable qui s'annule en premier
# quand la variable optimale augmente
# cette variable sortira de la base
xrmax=np.array([bbase[i]/Chb[i][ihb-m] for i in range(m)])
vmax=max(xrmax)
# on met les valeurs négatives à une valeur grande
for i in range(m):
if xrmax[i]<= 0:
xrmax[i]=vmax+1

# recherche de l'indice de "première sortie"
ib=np.argmin(xrmax)
print 'out=',permut[ib],' in=',permut[ihb]

# actualisation de la permutation
permut[ib],permut[ihb] = permut[ihb],permut[ib] # swap en python
# fin du do while

# fin de l'algorithme
# on complète le vecteur des variables
# dans la base par des zéros
xp=np.hstack((bbase,np.zeros(n-m)))
# prise en compte de la permutation
x=np.empty(n)
for i in range(n):
x[permut[i]]=xp[i]
# renvoie la solution et le gain
return x,np.dot(c,x)
# fin de la fonction simplexe

# test du programme précédent sur l'exemple du cours
# matrice des contraintes Ax=b
A=np.array([[1,0,0,1,0,0,0],[0,1,0,0,1,0,0],[0,0,1,0,0,1,0],[3,6,2,0,0,0,1]])
# second membre des contraintes Ax=b
b=np.array([1000,500,1500,6750])
# coefficients de la fonction à maximiser
c=np.array([4,12,3,0,0,0,0])
# base initiale
# permutation contenant les m variables dans la base (x>=0) puis
# les variables hors base (n-m variables nulles)
permut=np.array([6,5,4,3,2,1,0])
print simplexe(A,b,c,permut)
0
fifiyan Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup Abaddon,je n'ai pas encore essayé le code,mais je ne sais comment te remercier d'avance,je souhaite rester en contact avec toi,car je suis en master 2 recherche à dakar au senegal et tout mes projets tournent autour de python.mon adresse mail:dionlar.lang@gmail.com,encore merci
0
Profil bloqué
 
Dakar !
Je connait une jolie fille du Dakar, on ce parle que par Facebook.
Aller, bonne chance dans tes études !
0