[SciPy-User] fmin_slsqp- Bounds are not obeyed

jagan prabhu jagan_cbe2003 at yahoo.co.in
Wed Nov 4 05:16:43 EST 2009


Thank you for your answers, the program is working now

referring to "outside bounds"

optimizer occasionally evaluate the objective outside of the bounds (which are quite abnormal for my case?) 

For example:
occasionally fmin_slsqp passes parameters like  -45.0,-12.0,16
which perfectly obeys inequality constrain, but out of bounds..
my code is quite sensitive, at any case it should stick with in bounds.

Please help me. Is there any problem in my Bound syntax ?

* i face out of bounds problem in all Constrained (multivariate) optimization methods.

--- On Wed, 4/11/09, Zachary Pincus <zachary.pincus at yale.edu> wrote:

From: Zachary Pincus <zachary.pincus at yale.edu>
Subject: Re: [SciPy-User] fmin_slsqp- Bounds are not obeyed
To: "SciPy Users List" <scipy-user at scipy.org>
Date: Wednesday, 4 November, 2009, 1:39 AM

Hello,

> Problem is " Bounded with inequality constrains", in slssqp often  
> Bounds are not obeyed, its deviates the bounds. So if deviates i  
> made it to come back with in the region(bounds). But i face a  
> problem in execution. i get error like,
>
> File "/usr/lib/python2.5/site-packages/scipy/optimize/slsqp.py",  
> line 277, in fmin_slsqp
>     c_ieq = array([ ieqcons[i](x) for i in range(len(ieqcons)) ])
>   File "/usr/lib/python2.5/site-packages/scipy/optimize/ 
> optimize.py", line 97, in function_wrapper
>     return function(x, *args)
> TypeError: <lambda>() takes exactly 1 argument (2 given)

I can't help with the bounds not being obeyed... but I can say that  
you'll probably need to provide more detail about what you mean by  
this for others to help though -- is it that the optimizer will  
occasionally evaluate the objective outside of the bounds (which I  
understand is normal?) or that the final results are out-of-bounds?

Anyhow, the traceback explains exactly what the problem with the  
execution is. You define your inequality constraint as:
con1 = lambda x:numpy.asarray(x[1]-x[0], x[2]-x[1])

but from the traceback, you can see that it is being called like:
function(x, *args)

The error is quite clear on the problem: your lambda takes one  
argument, but it is called with two.

I assume that x is the current position, and args is just what you  
passed to the slsqp. So you should rewrite con1 as lambda x, args:  
whatever...

Zach



On Nov 3, 2009, at 2:58 PM, jagan prabhu wrote:

> Dear users,
>
> Problem is " Bounded with inequality constrains", in slssqp often  
> Bounds are not obeyed, its deviates the bounds. So if deviates i  
> made it to come back with in the region(bounds). But i face a  
> problem in execution. i get error like,
>
> File "/usr/lib/python2.5/site-packages/scipy/optimize/slsqp.py",  
> line 277, in fmin_slsqp
>     c_ieq = array([ ieqcons[i](x) for i in range(len(ieqcons)) ])
>   File "/usr/lib/python2.5/site-packages/scipy/optimize/ 
> optimize.py", line 97, in function_wrapper
>     return function(x, *args)
> TypeError: <lambda>() takes exactly 1 argument (2 given)
>
> program will look like,
>
>
> #import os
> #import scipy.optimize
> from scipy import *
> import numpy
> from scipy import optimize
> from numpy import asarray
> from math import *
>
>
> def cst(aParams,bounds):
>   aParams = numpy.asarray(aParams)
>   for par in range(len(aParams)):
>    if ((bounds[par][0]<= aParams[par]<= bounds[par][1])):
>      pass
>    else:
>      if (aParams[par]< bounds[par][0]): aParams[par] = bounds[par][0]
>      if (aParams[par]> bounds[par][1]): aParams[par] = bounds[par][1]
>
>   x = aParams[0]
>   y = aParams[1]
>   z = aParams[2]
> # objective function
>   eqn = -cos(x)*cos(y)*cos(z)*log(-((x-pi)**2-(y-pi)**2-(z-pi)**2))
>   return eqn
>
>
> #Initial guess
> Init = numpy.array([5.0,15.0,17.0]) # parameters x,y,z
> bounds = [(2.0, 20000.0),(4.0, 50000.0),(5.0, 60000.0)]
> # inequality constraints x must be least,y larger than x smaller  
> than z,and z the largest of all
> con1 = lambda x:numpy.asarray(x[1]-x[0], x[2]-x[1])
>
>
> opt = fmin_slsqp(cst,Init,ieqcons= [con1] , bounds=bounds, fprime =  
> None, args=(bounds,), full_output=True, iter=20000, iprint=2,  
> acc=0.001)
>
> print '****************************************'
>
> print opt[0]
> print opt[1]
> print opt[2]
> print opt[4]
>
> Problems are,
> 1, bounds i could not able to pass to the function as args( ).
> 2, Whether implementation of the ineq. constraints are correct? any  
> better way?
> 3, How to avoid bounds deviation?
>
> Please help me.
>
> Regards,
> Prabhu
>
> Add whatever you love to the Yahoo! India homepage. Try now! 
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user

_______________________________________________
SciPy-User mailing list
SciPy-User at scipy.org
http://mail.scipy.org/mailman/listinfo/scipy-user



      Yahoo! India has a new look. Take a sneak peek http://in.yahoo.com/trynew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20091104/e32fb013/attachment.html>


More information about the SciPy-User mailing list