2016-10-03 1 views
1

J'essaie de résoudre un problème avec de nombreuses variables en utilisant la programmation scipy et linéaire. Je disposer d'un ensemble de variables X, qui sont des nombres réels compris entre 0,5 et 3 et I doivent résoudre les équations suivantes:résoudre des équations multiples avec de nombreuses variables et contraintes d'inégalité

346 <= x0*C0 + x1*C1 + x2*C2 +......xN*CN <= 468 
25 <= x0*p0 + x1*p1 + x2*p2 +......xN*pN <= 33 
12 <= x0*c0 + x1*c1 + x2*c2 +......xN*cN <= 17 
22 <= x0*f0 + x1*f1 + x2*f2 +......xN*fN <= 30 

le nombre C0 ... CN, p0 ... Pn, c0 ... cN , f0 ... fN me sont déjà donnés. J'ai essayé de résoudre ce de la manière suivante:

import numpy as np 
from scipy.optimize import linprog 
from numpy.linalg import solve 
A_ub = np.array([ 
    [34, 56, 32, 21, 24, 16, 19, 22, 30, 27, 40, 33], 
    [2, 3, 2, 1.5, 3, 4, 1, 2, 2.5, 1, 1.2, 1.3], 
    [1, 2, 3, 1.2, 2, 3, 0.6, 1, 1, 1.2, 1.1, 0.8], 
    [0.5, 2, 2, 1, 3, 4, 1, 1, 1, 0.5, 0.3, 1.2], 
    [-34, -56, -32, -21, -24, -16, -19, -22, -30, -27, -40, -33], 
    [-2, -3, -2, -1.5, -3, -4, -1, -2, -2.5, -1, -1.2, -1.3], 
    [-1, -2, -3, -1.2, -2, -3, -0.6, -1, -1, -1.2, -1.1, -0.8], 
    [-0.5, -2, -2, -1, -3, -4, -1, -1, -1, -0.5, -0.3, -1.2]]) 
b_ub = np.array([468, 33, 17, 30, -346, -25, -12, -22]) 
c = np.array([34, 56, 32, 21, 24, 16, 19, 22, 30, 27, 40, 33]) 
res = linprog(c, A_eq=None, b_eq=None, A_ub=A_ub, b_ub=b_ub, bounds=(0.5, 3)) 

Explication pour les équations de la première rangée de A_ub est le même que b_ub, que nous essayons de maximiser l'équation ainsi que vous assurer qu'il est dans la donnée limites limites, c'est-à-dire 468 et 346, ce qui signifie que je veux obtenir la valeur la plus proche possible de la limite supérieure.

Je mis [-34, -56, -32, -21, -24, -16, -19, -22, -30, -27, -40, -33] dans A_ub et -346 en b_ub avec la logique:

-346 > -(x0*C0 + x1*C1 + x2*C2 +......xN*CN) qui résoudrait le problème des limites inférieures de l'équation. Je fais la même chose avec le reste d'entre eux.

Mais je sens que mon approche est erronée que je reçois la réponse que 0.425 pour res.fun et nan que la valeur de res.x

La limite supérieure de x est 3 et la limite inférieure est de 0,5

Comment faire Je définis le problème comme indiqué ci-dessus afin d'obtenir une valeur maximale proche de 468 tout en gardant à l'esprit les limites supérieures? Comment définir les limites inférieures en utilisant scipy? Je travaille sur la programmation linéaire pour la première fois, j'ai peut-être manqué des idées qui pourraient m'aider.

Je suis également ouvert à toute autre solution.

+0

Vous ne pouvez pas avoir une inégalité stricte (>) dans un modèle d'optimisation, seulement ≥ (à la fois pour des raisons théoriques et pratiques). Sinon, vous pouvez facilement ajouter ces inégalités au modèle. Vous devrez faire cela par paires, c'est-à-dire -x0 * C0 + x1 * C1 ≤ 0', -x1 * C1 + x2 * C2 ≤ 0' etc –

+0

Merci Erwin Kalvelagen, comment puis-je mettre en place l'équation ci-dessus dans scipy, (PS mes excuses si cela semble simple, je suis juste commencé à scipy pour l'apprentissage automatique et la programmation linéaire) –

+0

Pour mettre en œuvre «-x0 * C0 + x1 * C1 ≤ 0» ajouter une ligne à «A_ub». Il aura juste deux éléments non-zéro: '-C0' dans la colonne' x0' et 'C1' dans la colonne' x1'. Puis ajouter un élément à 'b_ub' avec la valeur 0. –

Répondre

3

Ce système d'inégalités n'est pas réalisable: il n'y a pas de solution qui satisfasse toutes les contraintes. Vous pouvez voir que de res:

 fun: 0.42500000000000243 
message: 'Optimization failed. Unable to find a feasible starting point.' 
    nit: 28 
    status: 2 
success: False 
     x: nan 

Je crois que c'est un résultat correct (je l'ai vérifié cela avec un autre système LP). Remarque: Si vous modifiez les limites à (0,3), vous obtiendrez une solution réalisable.

+0

Merci l'homme, vous avez raison –