2016-10-25 1 views
0

Je résous un problème de minimisation non linéaire (contraint) avec trois variables (w, V, m). Étant donné que w le problème de minimisation est (contraint) linéaire pour (V, m). Le problème de minimisation linéaire est défini pour w dans [w_0, w_1].Comment conserver la recherche d'optimisation dans les limites de Scipy?

La façon dont j'ai mis en place le problème est que w donné, je résous un programme linéaire contraint et puis je le minimise sur w avec bounds = ((w_0, w_1),) la gamme de w comme limites. Je rencontre des problèmes lorsque la minimisation sur w recherche en dehors de ses limites, c'est-à-dire dans une région où le programme linéaire n'est pas défini.

Existe-t-il un moyen de restreindre la recherche pour ne pas sortir des limites fournies? Si non, existe-t-il des alternatives? Passer des limites plus serrées? Faire que la fonction objectif renvoie une grande valeur si elle est passée une valeur en dehors des limites?

Je suis désolé de ne pas pouvoir fournir un exemple de travail minimal.

Voici quelques pseudo-code:

from scipy.optimize import linprog,minimize 

def objective(w): 
A_ub,b_ub = constraints(w) 
results = linprog(c,A_ub = A_ub,b_ub=b_ub) 
return results.fun 

bounds = ((w_0,w_1),) 
x0 = (w_0+w_1)/2 
minimize(objective,x0,bounds) 

Répondre

0

On peut classer les approches pour résoudre des problèmes d'optimisation sous contraintes en deux classes:

  • (1) méthodes faisables: tous les itérer satisferont les contraintes
  • (2) Méthodes irréalisables: les itérations n'ont pas besoin de satisfaire les contraintes avant de converger nce

Donc, en utilisant une méthode réalisable est naturel pour votre cas. Malheureusement, les docs de scipy ne sont pas très clair sur cette caractéristique en ce qui concerne les algorithmes disponibles.

Je suis assez sûr que L-BFGS-B est le chemin à parcourir ici (comme vous avez seulement besoin lié à des contraintes!)

+0

Même des solveurs de chemin infaisables plus sophistiqués (par exemple MINOS) n'évalueront pas les fonctions et les gradients pour x à l'extérieur de leurs limites. Infaisible n'est pas identique aux violations liées. Pour les problèmes du monde réel, il est important pour un solveur de s'assurer que nous faisons des évaluations uniquement pour 'lb <= x <= ub'. Nous l'utilisons pour protéger contre les erreurs de domaine (par exemple log (x) pour x négatif). –

+0

@ErwinKalvelagen Merci pour votre commentaire.Je n'ai jamais utilisé MINOS et je ne me souviens pas des internes que j'aurais pu lire dans le passé à propos de ce solveur, mais j'ai toujours eu l'impression que certains/la plupart des solveurs NLP généraux évalueront des points irréalisables pendant l'optimisation (COBYLA serait certains [exemple] (https://mail.scipy.org/pipermail/scipy-user/2007-July/012955.html)). Je peux même imaginer des avantages en ce qui concerne les preuves de convergence. La question est maintenant: ai-je tort ou vos impressions sont-elles limitées aux solveurs commerciaux? – sascha

+0

Oui, les points peuvent être irréalisables, mais les limites des variables structurelles sont respectées lors de l'évaluation des fonctions (pour les bons solveurs). C'est à dire. x est entre les limites mais les équations peuvent encore être infaisables. Notez que les méthodes de chemin réalisables peuvent être irréalisables; Dans ma terminologie, faisable signifie que, une fois que tu es faisable, tu restes réalisable (essentiellement une approche stricte de phase I/phase II). Par exemple. CONOPT est un algorithme de chemin possible mais acceptera un point initial irréalisable. –

0

Quelque chose qui pourrait fonctionner est reparametrizing/redifining la variable w, de sorte qu'il ne quitte jamais la bornes. Si x passe entre -infinity et l'infini, alors

w = a + (b-a)/(1 + exp (-x))

sera dans le (a, b) d'intervalle. Pour être clair, vous devez définir x comme argument à optimiser dans la fonction minimize et inclure avec cette formule. Quel que soit x vous obtenez, vous avez la garantie que le w sera dans les limites.

Quand est-ce une mauvaise idée? Certainement si vous pensez que vous pourriez avoir une solution de coin à a ou b. À part ça, je pense que cela fonctionne habituellement, mais veuillez nous en informer pour voir si cela a fonctionné pour vous.