<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=iso-8859-1"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Texto de balão Carácter";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.apple-tab-span
        {mso-style-name:apple-tab-span;}
span.TextodebaloCarcter
        {mso-style-name:"Texto de balão Carácter";
        mso-style-priority:99;
        mso-style-link:"Texto de balão";
        font-family:"Tahoma","sans-serif";}
span.EstiloCorreioElectrnico20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 3.0cm 70.85pt 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=PT link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Dear Greg,<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If you have your model in AMPL, you may take a look at the NEOS server (<a href="http://www.neos-server.org/neos/solvers/index.html">http://www.neos-server.org/neos/solvers/index.html</a>) for a solver that fits your problem.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>In particular, the PSwarm solver is intended for derivative-free optimization, where a small number of continuous variables (a few tens) are considered. The problem may have bound and/or linear constraints only. Please note that derivative-free means that derivatives of the objective function will not be used during the optimization process, but in order to have convergence your objective function needs to be differentiable (which is not the case). Just give it a try, if it fits your problem structure.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Best regards,<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Ismael<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>De:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> ipopt-bounces@list.coin-or.org [mailto:ipopt-bounces@list.coin-or.org] <b>Em nome de </b>Gregory K.<br><b>Enviada:</b> quarta-feira, 21 de Setembro de 2011 23:05<br><b>Para:</b> Ayotte-Sauvé, Étienne; ipopt@list.coin-or.org; Hans Pirnay<br><b>Assunto:</b> Re: [Ipopt] If statement in objective function<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><div><div><p class=MsoNormal style='background:white'><span style='color:black'>Thanks Etienne and Hans for your time that you put in to answer this question.<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>As I was saying, I am a bit rusty on theory, and just took my dusty textbooks out of the basement.<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>Your proposed solution looks feasible for my simplified objective function, but in reality it contains multiple if statements of the same form.<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>Like that<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>maximize price:<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span class=apple-tab-span><span style='color:black'>                        </span></span><span style='color:black'>(if x[1]&gt;=a and x[1]&lt;=b then 1 else 0)*(if x[2]&gt;=c and x[2]&lt;=d then 1 else 0)*...*(if x[n]&gt;=e and x[n]&lt;=f then 1 else 0)<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>Again, it is still a simplified version but it shows the complexity of my if statements piled up on one another.<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>My original version of this model didn't involve any IF statements but had thousands of binary variables accompanied by thousands of constraints, which was to big to solve for any MINLP solver. To simplify things I came up with this one complex objective function filled with if statements and by doing that eliminated most of variables and constraints, but now I cannot find a solver that would accept those if statements.<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>I start to wonder if it's even possible.<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>Would appreciate your opinion on it.<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'><o:p>&nbsp;</o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>Thanks,<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'>Greg<o:p></o:p></span></p></div><div><p class=MsoNormal style='background:white'><span style='color:black'><o:p>&nbsp;</o:p></span></p></div><div><div><div class=MsoNormal align=center style='text-align:center;background:white'><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:black'><hr size=1 width="100%" align=center></span></div><p class=MsoNormal style='margin-bottom:12.0pt;background:white'><b><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:black'>From:</span></b><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:black'> &quot;Ayotte-Sauvé, Étienne&quot; &lt;<a href="mailto:Etienne.Ayotte-Sauve@RNCan-NRCan.gc.ca">Etienne.Ayotte-Sauve@RNCan-NRCan.gc.ca</a>&gt;<br><b>To:</b> <a href="mailto:ipopt@list.coin-or.org">ipopt@list.coin-or.org</a><br><b>Sent:</b> Tuesday, September 20, 2011 10:01:33 AM<br><b>Subject:</b> [Ipopt] FW: If statement in objective function<br></span><span style='color:black'><br>Hi Greg,<br><br>Another way to model your objective function without invoking binary variables is to use complementarity constraints. However, such constraints cause non-uniqueness and unboundedness of the Lagrange multipliers (i.e. the dual optimization problem will not be well posed in classical terms). I am not an optimization specialist and I'm even less knowledgable with respect to IPOPT (that's in part why I joined this message group), but my guess is you'll be able to tag these complementarity contraints so that IPOPT treats them with adapted subroutines (e.g. relaxation strategies).<br><br>To be more precise, you can reformulate your piecewise function via complementarity constraints in the following manner<br><br>p = y[2];<br><br>y[1] + y[2] + y[3] = 1;<br><br>(x - xL)*(x - a) - mu - lambda[1] = 0;<br><br>(x - a)*(x - b) - mu - lambda[2] = 0;<br><br>(x - b)*(x - xU) - mu - lambda[3] = 0;<br><br>y[i]*lambda[i] = 0, (i = 1, ..., 3); (*complementarity constraints*)<br><br>y[i] &gt;= 0, (i = 1, ..., 3); (*complementarity constraints*)<br><br>lambda[i] &gt;= 0, (i = 1, ..., 3), (*complementarity constraints*)<br><br>where p denotes the objective function value defined in your original message; xL and xU denote lower and upper bounds (respectively) on the variable x; y[1], y[2], y[3], lambda[1], lambda[2], lambda[3] and mu are variables originating from a reformulation of your piecewise function via a convex optimization problem which in turn is reformulated via first order optimality conditions (i.e. KKT conditions) - see chapter 11 of &quot;Nonlinear Programming: Concepts, Algorithms and Applications to Chemical Processes&quot; by Lorenz Biegler. To help your intuition, note that the variable y[i] takes value 1 if x is in the open interval ] c[i-1], c[i] [ and it takes value 0 if x is NOT in the closed interval [ c[i-1], c[i ] ] (i = 1, 2, 3), where c[0] = xL, c[1] = a, c[2] = b, c[3] = xU.<br><br>Remarks.<br><br>1. The variable mu may take negative values (it is a Lagrange multiplier corresponding to an equality constraint).<br><br>2. For x = a or x = b, the above formulation may yield values of p which are between 0 and 1; for x &lt; a or x &gt; b, this formulation yields p = 0; for a &lt; x &lt; b, it gives p = 1.<br><br>3. Please verify with the book since I wrote the above formulation from memory (and intuition).<br><br>I hope this helps.<br><br>Etienne Ayotte-Sauve'<br><a href="mailto:eayottes@nrcan.gc.ca">eayottes@nrcan.gc.ca</a><br>Mathematician, Research Scientists for Natural Resources Canada (Gov. of Canada) <br><br><br><br><br><br>-----Original Message-----<br>From: <a href="mailto:ipopt-bounces@list.coin-or.org">ipopt-bounces@list.coin-or.org</a> [mailto:<a href="mailto:ipopt-bounces@list.coin-or.org">ipopt-bounces@list.coin-or.org</a>] On Behalf Of Hans Pirnay<br>Sent: September 20, 2011 2:49 AM<br>To: Gregory K.<br>Cc: ipopt ipopt<br>Subject: Re: [Ipopt] If statement in objective function<br><br>Hi Greg,<br><br>that model is not a smooth nonlinear optimization problem, and therefore not directly solvable with Ipopt.<br><br>Here's one simple thing you can do if you only have one constraint of this kind: Solve the problem three times, once with the constraint<br><br>x &lt;=a,&nbsp; price=0<br>x &gt;=a, x&lt;=b&nbsp; ,&nbsp; price=1<br>x&gt;=b,&nbsp; price = 0<br><br>If you have several price variables, this approach quickly becomes infeasible, and you will need to use an MINLP solver (I don't have any suggestion which, it probably depends on what you can afford, though).<br><br>good luck<br><br>Hans<br><br>On Mon, Sep 19, 2011 at 11:44 PM, Gregory K. &lt;<a href="mailto:khoroshylov@yahoo.com">khoroshylov@yahoo.com</a>&gt; wrote:<br>&gt; Thank's for your response. To be honest I had finished my CO major <br>&gt; awhile ago, and a bit rusty on theory.<br>&gt; On a very simplified level, that's what I am trying to achieve <br>&gt; maximize price:<br>&gt; if x&gt;=a and x &lt;=b then 1 else 0<br>&gt; But IPOPT gives me all zero solution which is obviously is not optimal.<br>&gt; What should be done to make IPOPT solve it correctly? Am I missing <br>&gt; anything (any ipopt option)?<br>&gt; Is it even possible to solve it?<br>&gt; Or maybe you can recomend any other more suitable solver.<br>&gt; Thanks a bunch,<br>&gt; Greg<br>&gt; ________________________________<br>&gt; From: Andrea Walther &lt;<a href="mailto:andrea.walther@uni-paderborn.de">andrea.walther@uni-paderborn.de</a>&gt;<br>&gt; To: Stefan Vigerske &lt;<a href="mailto:stefan@math.hu-berlin.de">stefan@math.hu-berlin.de</a>&gt;<br>&gt; Cc: Gregory K. &lt;<a href="mailto:khoroshylov@yahoo.com">khoroshylov@yahoo.com</a>&gt;; <a href="mailto:ipopt@list.coin-or.org">ipopt@list.coin-or.org</a><br>&gt; Sent: Monday, September 19, 2011 2:05:14 AM<br>&gt; Subject: Re: [Ipopt] If statement in objective function<br>&gt;<br>&gt; Hi,<br>&gt;<br>&gt;&gt; I don't know how AMPL computes derivatives for functions containing <br>&gt;&gt; if-statements, but you should make sure that you have at least <br>&gt;&gt; continuous first derivatives for Ipopt to work.<br>&gt;<br>&gt; as far as I know, AMPL uses Automatic Differentiation for the <br>&gt; derivative calculation. Therefore, as long as you are not right at the <br>&gt; kink caused by the if statement you get a derivative that is valid in <br>&gt; a certain region around the current point. However, if this point is <br>&gt; close to the kink the derivative information perhaps is not that <br>&gt; useful. This might cause the problems in the optimisation process.<br>&gt;<br>&gt; Best regards,<br>&gt;<br>&gt; Andrea Walther<br>&gt;<br>&gt; --<br>&gt; Prof. Dr. Andrea Walther<br>&gt; Lehrstuhl fuer Mathematik und ihre Anwendungen Institut fuer <br>&gt; Mathematik Universitaet Paderborn Warburger Str. 100<br>&gt; 33098 Paderborn<br>&gt;<br>&gt; Email: <a href="mailto:andrea.walther@uni-paderborn.de">andrea.walther@uni-paderborn.de</a><br>&gt; Phone: ++49 5251 602721<br>&gt; Fax:&nbsp; ++49 5251 603728<br>&gt;<br>&gt; **********<br>&gt;<br>&gt;<br>&gt;<br>&gt;<br>&gt; _______________________________________________<br>&gt; Ipopt mailing list<br>&gt; <a href="mailto:Ipopt@list.coin-or.org">Ipopt@list.coin-or.org</a><br>&gt; <a href="http://list.coin-or.org/mailman/listinfo/ipopt" target="_blank">http://list.coin-or.org/mailman/listinfo/ipopt</a><br>&gt;<br>&gt;<br><br>_______________________________________________<br>Ipopt mailing list<br><a href="mailto:Ipopt@list.coin-or.org">Ipopt@list.coin-or.org</a><br><a href="http://list.coin-or.org/mailman/listinfo/ipopt" target="_blank">http://list.coin-or.org/mailman/listinfo/ipopt</a><br><br>_______________________________________________<br>Ipopt mailing list<br><a href="mailto:Ipopt@list.coin-or.org">Ipopt@list.coin-or.org</a><br><a href="http://list.coin-or.org/mailman/listinfo/ipopt" target="_blank">http://list.coin-or.org/mailman/listinfo/ipopt</a><br><br><o:p></o:p></span></p></div></div></div></div></body></html>