Instead of using sum(x) = 1 as an equality constraint, perhaps you can directly take x(1) = 1 - sum(x(2:end)) and substitute it into the problem directly.
Best, Grey > On Apr 27, 2016, at 2:31 AM, David Morris <otha...@othalan.net> wrote: > > Good idea, but no luck. But that does have me thinking on different ways to > formulate the constraint. Maybe one of them will bypass AUGLAG limitations. > > David > > On Wed, Apr 27, 2016 at 12:43 PM, Jacob Biesinger <jake.biesin...@gmail.com> > wrote: > Again, I'm no expert, but you could always separate the equality constraint > into two inequality constraints, yes? Maybe worth a try. > > > On Tue, Apr 26, 2016, 10:37 PM David Morris <otha...@othalan.net> wrote: > I've been looking through the NLOpt code for AUGLAG. If I understand > correctly, it seems that my problem is AUGLAG will not efficiently find a > solution which fits my constraints and so never finds a valid solution (not > even a bad one) within time limits I have defined. It usually finds a > solution eventually, just not within an acceptable time for our project. The > difficulty appears to be that a constraint of "sum(x) == 100" is not a type > of constraint which works well with the algorithm. > > In particular, I am looking at auglag.c lines 251 - 268 where results are > saved, but which potentially is not called if interrupted too early by a > timeout. > > Does this make sense? Any suggestions for alternative ways to write this > constraint? > > David > > On Tue, Apr 26, 2016 at 7:57 PM, David Morris <otha...@othalan.net> wrote: > I am using NLOpt in a python application and am having problems when setting > an equality constraint when using LN_AUGLAG. > > If I use LN_COBYLA, optimization works perfectly. However, if I use > LN_AUGLAG and set LN_COBYLA as the local optimizer, the result is the exact > same as my initial guess. My goal is to use experiment with other > optimization algorithms (for example, LN_SBPLX), and use AUGLAG to provide > the quality constraint. > > Can anyone help determine why the equality constraint causes AUGLAG to fail? > > Below is sample code showing how I use NLOpt. > > > > ################################################################################### > # CODE Sample: > > args = ( ... ) > kw = { ... } > > # Optimization Function for NLOpt > def optfunc(x,grad): > # Big complex function which calculates a single return value: > val = model_p_mixer(x,*args,**kw) > return val > > # Constraint Function for NLOpt > # x -> percentage of total content for each component > # sum(x) == 100 % > def opt_constraint(x, grad): > val = float(100.0 - x.sum()) > return val > > gopt = nlopt.opt(nlopt.LN_AUGLAG, len(guess)) > lopt = nlopt.opt(nlopt.LN_COBYLA, len(guess)) > > gopt.set_min_objective(optfunc) > > gopt.set_lower_bounds([98.62, 0.0, 0.0]) > gopt.set_upper_bounds([99.5, 1.0, 1.0]) > > gopt.add_equality_constraint(opt_constraint, 0.001) > > # Set tolerances to determine when the optimizer stops looking for > solutions > gopt.set_xtol_abs(1E-6) > gopt.set_ftol_abs(0.001) > lopt.set_xtol_abs(1E-6) > lopt.set_ftol_abs(0.001) > > # Set initial step size > gopt.set_initial_step(0.01) > > gopt.set_maxtime(8.0) > > gopt.set_local_optimizer(lopt) > > # Run the optimizer > mix = gopt.optimize([99.0, 0.5, 0.5]) > > # Initial Guess : [99.0, 0.5 , 0.5 ] > # Expected Result: [99.2, 0.35, 0.45] > # Actual Result: [99.0, 0.5 , 0.5 ] > > ################################################################################### > > > Thank you, > > David > _______________________________________________ > NLopt-discuss mailing list > NLopt-discuss@ab-initio.mit.edu > http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss > > _______________________________________________ > NLopt-discuss mailing list > NLopt-discuss@ab-initio.mit.edu > http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss _______________________________________________ NLopt-discuss mailing list NLopt-discuss@ab-initio.mit.edu http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss