<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1680-0338</journal-id>
<journal-title><![CDATA[Ingeniería Hidráulica y Ambiental]]></journal-title>
<abbrev-journal-title><![CDATA[RIHA]]></abbrev-journal-title>
<issn>1680-0338</issn>
<publisher>
<publisher-name><![CDATA[Centro de Investigaciones Hidráulicas (CIH). Facultad de Ingeniería Civil. Universidad Tecnológica de La Habana "José A. Hecheverría" CUJAE]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1680-03382014000100005</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Programación entera para modelos lineales]]></article-title>
<article-title xml:lang="en"><![CDATA[Integer programming for linear models]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Molina Pérez]]></surname>
<given-names><![CDATA[Daniel]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Cabrera Estupiñán]]></surname>
<given-names><![CDATA[Eric]]></given-names>
</name>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Instituto Superior Politécnico José Antonio Echeverría (Cujae) Centro de Investigaciones Hidráulicas (CIH) ]]></institution>
<addr-line><![CDATA[La Habana ]]></addr-line>
</aff>
<aff id="A02">
<institution><![CDATA[,Empresa de Ingeniería y Proyectos del Petróleo (EIPP)  ]]></institution>
<addr-line><![CDATA[La Habana ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>04</month>
<year>2014</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>04</month>
<year>2014</year>
</pub-date>
<volume>35</volume>
<numero>1</numero>
<fpage>62</fpage>
<lpage>76</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_arttext&amp;pid=S1680-03382014000100005&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_abstract&amp;pid=S1680-03382014000100005&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_pdf&amp;pid=S1680-03382014000100005&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[Se presenta una herramienta para resolver modelos de programación lineal entera, lo que significa encontrar el valor óptimo de la función objetivo para variables de decisión enteras. Es una función llamada nbintprog (non binary integer programming) creada por los autores en el asistente matemático MATLAB (MatrixLaboratory) y para comodidad del usuario presenta una forma similar a las funciones de optimización propias de MATLAB. La existencia de situaciones donde sólo tiene sentido que las variables de decisión, por su naturaleza, sean números enteros y los inconvenientes que presenta la herramienta que propone MATLAB para su solución constituyen los motivos del trabajo. Nbintprog tiene como base matemática una técnica de ramificación y acotación (branch and bound) que junto a estrategias de programación utilizadas presenta características favorables para la solución de dichos modelos.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[A new tool able to solve integer linear programming problems is presented. The problem arises when one has to find the optimal value of the objective function for integer decision variables. This tool is a function called nbintprog (non binary integer programming) created by the authors in MATLAB mathematical assistant. To the user's comfort it is presented in a similar way as any other of the typical MATLAB optimization functions. The existence of situations where it only makes sense that the decision variables are integers and the inconvenience of the existing MATLAB function for its solution became the motive of this work. The function is based on the well-known branch and bound technique which together with other programming strategies may eventually reduce the search time of the solution significantly.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[MATLAB]]></kwd>
<kwd lng="es"><![CDATA[nbintprog]]></kwd>
<kwd lng="es"><![CDATA[optimización]]></kwd>
<kwd lng="es"><![CDATA[programación entera]]></kwd>
<kwd lng="es"><![CDATA[programación lineal]]></kwd>
<kwd lng="en"><![CDATA[MATLAB]]></kwd>
<kwd lng="en"><![CDATA[nbintprog]]></kwd>
<kwd lng="en"><![CDATA[optimization]]></kwd>
<kwd lng="en"><![CDATA[integer programming]]></kwd>
<kwd lng="en"><![CDATA[linear programming]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="right"><font size="2" face="Verdana"><b>ART&Iacute;CULO ORIGINAL</b></font></p>    <P>&nbsp;</p>    <P>&nbsp;</p>    <P><font size="4" face="Verdana, Arial, Helvetica, sans-serif"><B>Programaci&oacute;n  entera para modelos lineales</B></font></P>    <P>&nbsp;</P>    <P><FONT FACE="Verdana, Arial, Helvetica, sans-serif" SIZE="3"><B>Integer  programming for linear models</B> </FONT> </P><B>    <P>&nbsp;     <P>&nbsp;     <P>     <P>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Daniel  Molina P&eacute;rez,<sup>I</sup> Eric Cabrera Estupi&ntilde;&aacute;n<sup>II</sup></font></B>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><sup>I</sup>Centro  de Investigaciones Hidr&aacute;ulicas<B> </B>(CIH), Instituto Superior Polit&eacute;cnico  Jos&eacute; Antonio Echeverr&iacute;a (Cujae). La Habana. </font>     <br><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><sup>II</sup>Empresa  de Ingenier&iacute;a y Proyectos del Petr&oacute;leo (EIPP). La Habana. </font>      <P>&nbsp;     <P>&nbsp; <hr>     <P>     <P>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>RESUMEN</B>  </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se presenta  una herramienta para resolver modelos de programaci&oacute;n lineal entera, lo  que significa encontrar el valor &oacute;ptimo de la funci&oacute;n objetivo para  variables de decisi&oacute;n enteras. Es una funci&oacute;n llamada <I>nbintprog</I>  (non binary integer programming) creada por los autores en el asistente matem&aacute;tico  MATLAB (MatrixLaboratory) y para comodidad del usuario presenta una forma similar  a las funciones de optimizaci&oacute;n propias de MATLAB. La existencia de situaciones  donde s&oacute;lo tiene sentido que las variables de decisi&oacute;n, por su naturaleza,  sean n&uacute;meros enteros y los inconvenientes que presenta la herramienta que  propone MATLAB para su soluci&oacute;n constituyen los motivos del trabajo. <I>Nbintprog</I>  tiene como base matem&aacute;tica una t&eacute;cnica de ramificaci&oacute;n y  acotaci&oacute;n (branch and bound) que junto a estrategias de programaci&oacute;n  utilizadas presenta caracter&iacute;sticas favorables para la soluci&oacute;n  de dichos modelos. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Palabras  clave: </B>MATLAB, nbintprog, optimizaci&oacute;n, programaci&oacute;n entera,  programaci&oacute;n lineal. </font> </P><hr>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>ABSTRACT</B></font>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A new tool able  to solve integer linear programming problems is presented. The problem arises  when one has to find the optimal value of the objective function for integer decision  variables. This tool is a function called <I>nbintprog</I> (non binary integer  programming) created by the authors in MATLAB mathematical assistant. To the user's  comfort it is presented in a similar way as any other of the typical MATLAB optimization  functions. The existence of situations where it only makes sense that the decision  variables are integers and the inconvenience of the existing MATLAB function for  its solution became the motive of this work. The function is based on the well-known  branch and bound technique which together with other programming strategies may  eventually reduce the search time of the solution significantly. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Keywords:  </B>MATLAB, nbintprog, optimization, integer programming, linear programming.</font>    <br></p><hr>      <P>     <P>&nbsp;     <P>&nbsp;     <P><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><B>INTRODUCCI&Oacute;N</B>  </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Un <U>problema  de optimizaci&oacute;n</U> o programaci&oacute;n matem&aacute;tica consiste en  <U>maximizar o minimizar</U> una <U>funci&oacute;n real</U> dado un dominio definido.  De forma general, la optimizaci&oacute;n se basa en el descubrimiento de los &#171;mejores  valores&#187; de alguna funci&oacute;n objetivo (FO), existiendo una variedad  de diferentes tipos de funciones objetivo y diferentes tipos de dominios (Society  2010). Al procedimiento o algoritmo matem&aacute;tico mediante el cual se resuelve  un problema formado por una funci&oacute;n objetivo lineal y un sistema de ecuaciones  o inecuaciones lineales se le llama programaci&oacute;n lineal. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Existen  casos de modelos lineales en los que por razones f&iacute;sicas se necesita que  el valor &oacute;ptimo de la FO sea resultado de valores enteros para todas las  variables de decisi&oacute;n, el algoritmo capaz de resolver este problema se  conoce como &#171;programaci&oacute;n lineal entera pura&#187; (PLEP). El hecho  de conocer las variables de decisi&oacute;n que den soluci&oacute;n a un modelo  de programaci&oacute;n lineal, no significa necesariamente encontrarse cerca de  las variables que den soluci&oacute;n a la PLEP del modelo. La aproximaci&oacute;n  al valor entero m&aacute;s cercano de las variables de decisi&oacute;n no siempre  conduce a la soluci&oacute;n &oacute;ptima del modelo y en otros casos provoca  la violaci&oacute;n de algunas de las restricciones (Marrero 1985). Para demostrar  lo expresado se presentan los siguientes ejemplos: </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Ejemplo  (1)</B> </font>     <P><img src="/img/revistas/riha/v35n1/e0105114.gif" width="175" height="21">      
<P><img src="/img/revistas/riha/v35n1/e0205114.gif" width="200" height="19">      
<P><img src="/img/revistas/riha/v35n1/e0305114.gif" width="175" height="22">      
<P><img src="/img/revistas/riha/v35n1/e0405114.gif" width="94" height="19">      
<P><img src="/img/revistas/riha/v35n1/e0505114.gif" width="90" height="18">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Donde la ecuaci&oacute;n  (1) es la FO que, en este caso, se busca su m&aacute;ximo valor (ver <a href="#figura 1">figura  1</a>). </font>     <P align="center"><a name="figura 1"><img src="/img/revistas/riha/v35n1/f0105114.jpg" width="397" height="321"></a>      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las ecuaciones  (2), (3), (4) y (5) son las restricciones del dominio, es decir, delimitan lo  que se llama el espacio factible, que se ilustra en la <a href="#figura 1">figura  1</a>. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Como  muestra dicha <A HREF="#figura%201">figura 1</A> la soluci&oacute;n &oacute;ptima  de la PL en este ejemplo es Z(x,y)=5,2 para [x=0,4; y=1,2]. Una aproximaci&oacute;n  de las variables a sus valores enteros m&aacute;s cercanos ser&iacute;a [x=0;  y=1] resultando en Z(x,y)=3. Sin embargo, v&eacute;ase que el punto [x=1; y=0]  tiene Z(x,y)=4 lo que prueba que dicha aproximaci&oacute;n no garantiza la soluci&oacute;n  del modelo de PLEP . </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Ejemplo  (2)</B> </font>     <P><img src="/img/revistas/riha/v35n1/e0605114.gif" width="181" height="24">      
<P><img src="/img/revistas/riha/v35n1/e0705114.gif" width="175" height="21">      
<P><img src="/img/revistas/riha/v35n1/e0805114.gif" width="179" height="19">      
<P><img src="/img/revistas/riha/v35n1/e0905114.gif" width="184" height="20">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La soluci&oacute;n  &oacute;ptima en este ejemplo es Z(x,y)=[128/3] para [x=2; y=8/3]. Una aproximaci&oacute;n  de las variables a sus valores enteros m&aacute;s cercanos queda [x=2; y=3] la  cual se encuentra fuera del dominio del modelo incumpliendo con una de las restricciones,  ver <a href="#figura 2">figura 2</a>. </font>     <P align="center"><a name="figura 2"><img src="/img/revistas/riha/v35n1/f0205114.jpg" width="415" height="333"></a>      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Por estas razones  para obtener la soluci&oacute;n &oacute;ptima como resultado de variables enteras  (PLEP) ha surgido la necesidad de complementar algoritmos utilizados en la PL  con estrategias de PLEP. Una de las m&aacute;s eficaces estrategias es el m&eacute;todo  de ramificaci&oacute;n y acotaci&oacute;n (branch and bound). Este art&iacute;culo  propone una funci&oacute;n programada en MATLAB capaz de resolver modelos de PLEP  utilizando dicho m&eacute;todo como base matem&aacute;tica. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Dicha  herramienta, adem&aacute;s de agilizar el proceso manual, extiende sus objetivos  a ofrecer notables ventajas sobre otras estrategias como se ver&aacute; m&aacute;s  adelante. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>M&Eacute;TODO  DE RAMIFICACI&Oacute;N Y ACOTACI&Oacute;N </B> </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se  llamar&aacute; <I>problema relajado</I> (PR) de un problema de PLEP al problema  resuelto solamente mediante programaci&oacute;n lineal (PL), es decir, sin que  existan condiciones de integridad sobre las variables (Wolsey and Nemhauser 1988).  El m&eacute;todo comienza por la soluci&oacute;n del PR del modelo inicial. </font>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La <I>ramificaci&oacute;n<B>  </B></I>consiste en dividir cada problema en dos nuevos subproblemas obtenidos  mediante la imposici&oacute;n de restricciones excluyentes que dividen el dominio  del problema original en dos partes, pero eliminando en ambas partes la soluci&oacute;n  no entera del problema original (Troncoso 2005), es decir, si xbi es una variable  de decisi&oacute;n no entera, entonces se generan dos restricciones xi d&#187;  [xbi] (siendo [xbi] la parte entera por defecto de xbi) y xi e&#187; [xbi]+1,  que a&ntilde;adidas cada una por separado al problema original, da lugar a dos  nuevos subproblemas. En el ejemplo 2, y=8/3=2,67. Por tanto se introducir&aacute;n  las siguientes restricciones: y d&#187; 2; y e&#187; 3, de forma que se ha eliminado  una porci&oacute;n del dominio donde no hay soluciones enteras, <a href="/img/revistas/riha/v35n1/f0305114.jpg">figura  3</a>. </font>     
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Una  vez que se ramifica se resuelve cada subproblema o nodo, (como se le llamar&aacute;  en lo adelante) mediante PL lineal, es decir, se resuelve el PR de cada uno. Mientras  que en ambos nodos exista alguna variable no entera se ramificar&aacute; el nodo  que tenga mejor valor de FO (VFO). El nodo no ramificado pasa a formar parte de  una lista de nodos vivos. Una vez encontrado el primer nodo con todas sus variables  enteras se tiene el primer VFO de pivote y se confrontar&aacute; con el VFO de  cada nodo vivo. Ser&aacute; ramificado el nodo vivo que tenga mejor VFO que el  pivote ya que puede encontrarse una soluci&oacute;n entera mejor por dicha rama,  de ser as&iacute; esta se convertir&iacute;a en el nuevo pivote. Cuando existen  varios nodos vivos mejores que el pivote existen los criterios FIFO (first input  first output), LIFO (last input first output) y el criterio BIFO (best input first  output) donde se ramifica primero el nodo vivo de mejor VFO (Lahoz 2009). Este  &uacute;ltimo criterio ser&aacute; el empleado en la funci&oacute;n que se presenta.  Por otro lado, el nodo que tenga peor VFO que el pivote se cerrar&aacute; por  <I>acotaci&oacute;n</I> y deja de formar parte de la lista de nodos vivos. Garantizando  as&iacute; no explorar todas las soluciones del modelo, fen&oacute;meno que puede  hacer que la b&uacute;squeda de la soluci&oacute;n aumente de minutos a a&ntilde;os  ya que el n&uacute;mero de soluciones es grande incluso en peque&ntilde;os problemas  como se muestra: </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">0  &#8804; <I>x</I> &#8804; 150 ; 0 &#8804; <I>y</I> &#8804; 200 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  posibles soluciones= 151 x 201 =30 351 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Ejemplo  (3)</B> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se  resuelve el siguiente modelo mediante ramificaci&oacute;n y acotaci&oacute;n </font>      <P><img src="/img/revistas/riha/v35n1/e1005114.gif" width="197" height="17">      
<P><img src="/img/revistas/riha/v35n1/e1105114.gif" width="139" height="23">      
<P><img src="/img/revistas/riha/v35n1/e1205114.gif" width="184" height="20">      
]]></body>
<body><![CDATA[<P><img src="/img/revistas/riha/v35n1/e1305114.gif" width="130" height="21">      
<P><img src="/img/revistas/riha/v35n1/e1405114.gif" width="108" height="27">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Donde la soluci&oacute;n  del PR es Z(x,y)=[7,75] para [x=1; y=3/4], ver <a href="/img/revistas/riha/v35n1/f0405114.jpg">figura  4a</a>. </font>     
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Primera  ramificaci&oacute;n (<a href="/img/revistas/riha/v35n1/f0405114.jpg">figura  4b</a>): </font> <table width="622" height="184" border="0"> <td width="293">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nodo 1 </font>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MAX (<I>Z</I>)  = 4<I>x</I> + 5<I>y </i></font><I></I>     <P> <font face="Verdana, Arial, Helvetica, sans-serif"><I><font size="2" face="Verdana, Arial, Helvetica, sans-serif">x</font></i></font><font face="Verdana, Arial, Helvetica, sans-serif"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  &#8804; 1 </font> </font><font face="Verdana, Arial, Helvetica, sans-serif">     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">3<I>x</I>  + 4<I>y</I> &#8804; 6 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8805; 0 ; <I>y</I> &#8805; 0 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>y</I>  &#8804; 0</B> </font></font></td><td width="313">    ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nodo  2 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MAX (<I>Z</I>)  = 4<I>x</I> + 5<I>y </i></font><I></I>     <P> <font face="Verdana, Arial, Helvetica, sans-serif"><I><font size="2" face="Verdana, Arial, Helvetica, sans-serif">x  </font></i><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8804;  1 </font> </font><font face="Verdana, Arial, Helvetica, sans-serif">     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">3<I>x</I>  + 4<I>y</I> &#8804; 6 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8805; 0 ; <I>y</I> &#8805; 0 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>y</I>  &#8805; 1</B> </font></font>     <P></td></table>    <P align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Soluci&oacute;n:  [x=1; y=0]; Z(x,y)=[4]&#160;&#160;&#160;&#160; Soluci&oacute;n: [x=0,67; y=1];  Z(x,y)=[7,67]</font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En  el Nodo1 se encuentra el primer VFO resultante de variables enteras (VFO de pivote),  pero no se puede garantizar que sea la soluci&oacute;n ya que existe una soluci&oacute;n  no entera en el nodo 2 con mayor VFO (nodo vivo), lo que hace necesario ramificar  dicho nodo. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Segunda  ramificaci&oacute;n (<a href="/img/revistas/riha/v35n1/f0505114.jpg">figura  5a</a>): </font> <table width="577" height="184" border="0" > <td width="273">    
]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nodo  2-1 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MAX  (<I>Z</I>) = 4<I>x</I> + 5y </font><font face="Verdana, Arial, Helvetica, sans-serif">      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I> &#8804;  1 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">3<I>x</I>  + 4<I>y</I> &#8804; 6 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8805; 0 ; <I>y</I> &#8805; 0 </font></font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>y</I>  &#8805; 1 </B></font><B>     <P> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8804; 0 </font></B> </td><td width="288">    <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nodo  2-2 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MAX  (<I>Z</I>) = 4<I>x</I> + 5y </font><font face="Verdana, Arial, Helvetica, sans-serif">      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">x &#8804; 1 </font>      ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">3<I>x</I> + 4<I>y</I>  &#8804; 6 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8805; 0 ; <I>y</I> &#8805; 0 </font></font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>y</I>&#8805;  1 </B></font><font face="Verdana, Arial, Helvetica, sans-serif"><B>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8805; 1</font></B></font>     <P> </td></table>    <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  Soluci&oacute;n: [x=0; y=1,5]; Z(x,y)=[7,5] &#160;&#160;&#160;&#160;&#160;&#160;&#160;Soluci&oacute;n:  no factible </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El  Nodo2-2 carece de variables que puedan satisfacer todas sus restricciones por  lo que no tiene soluci&oacute;n factible y se cierra, sin embargo el Nodo2-1 tiene  un VFO mayor que el VFO de pivote por lo que se tiene que ramificar. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Tercera  ramificaci&oacute;n (<a href="/img/revistas/riha/v35n1/f0505114.jpg">figura  5b</a>): </font> <table width="577" height="184" border="0"> <td width="273">    
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nodo  2-1-1 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MAX  (<I>Z</I>) = 4<I>x</I> + 5y </font><font face="Verdana, Arial, Helvetica, sans-serif">      ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I> &#8804;  1 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">3<I>x</I>  + 4<I>y</I> &#8804; 6 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8805; 0 ; <I>y</I> &#8805; 0 </font></font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>y</I>  &#8805; 1 ; <I>x</I> &#8804; 0 </B></font><font face="Verdana, Arial, Helvetica, sans-serif"><B>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>y</I> &#8804;  1 </font></B></font>     <P> </td><td width="288">    <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nodo  2-1-2 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MAX  (<I>Z</I>) = 4<I>x</I> + 5y </font><font face="Verdana, Arial, Helvetica, sans-serif">      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I> &#8804;  1 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">3<I>x</I>  + 4<I>y</I> &#8804; 6 </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I>  &#8805; 0 ; <I>y</I>&#8805; 0 </font></font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>y</I>  &#8805; 1 ; <I>x</I> &#8804; 0 </B></font><font face="Verdana, Arial, Helvetica, sans-serif"><B>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>y</I> &#8805;  2 </font></B></font> </td></table>    <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  Soluci&oacute;n: [x=0; y=1]; Z(x,y)=[5] &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Soluci&oacute;n:  no factible </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El  Nodo 2-1-1 tiene todas sus variables enteras y su VFO es mayor que el VFO de pivote  por tanto se convierte en la nueva FO de pivote y al no existir nodos vivos, [x=0;  y=1]; Z(x,y)=[5] es la soluci&oacute;n &oacute;ptima del modelo lineal entero.  En la <a href="#figura 6">figura 6</a> se muestra el &aacute;rbol de ramificaciones  y nodos. </font>     <P align="center"><a name="figura 6"><img src="/img/revistas/riha/v35n1/f0605114.jpg" width="496" height="217"></a>      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>NBINTPROG</B></font>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La funci&oacute;n  propuesta atiende al nombre de <I>nbintprog </I>y para su llamada debe encontrarse  su ruta como carpeta actual (Current Folder) de MATLAB. En esta secci&oacute;n  se describe el modo de trabajo de la herramienta. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Declarando  vectores y matrices</B> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La  funci&oacute;n <I>nbintprog</I> resuelve problemas de programaci&oacute;n lineal  entera del tipo: </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MIN  <I>Z</I> = <I>f</I> x <I>x</I> &#160;&#160;&#160;&#160;</font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Sujeto  a:</font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> <I>A</I>  x <I>x</I> &#8804; <I>b</I> </font>     <P> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>  Aeq</I> x <I>x</I> = <I>beq</I> </font>     <P> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>lb</I>&#8804;  <I>x</I> &#8804; u<I>b</I> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Donde:  </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#402;:  Vector de coeficientes que multiplican a las variables de decisi&oacute;n en la  FO </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>x</I></font>:  Vector de variables de decisi&oacute;n (soluci&oacute;n) </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">b:  Vector de t&eacute;rminos de la derecha de las restricciones de desigualdad </font>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>beq:</I></font>  Vector de t&eacute;rminos de la derecha de las restricciones de igualdad </font>      ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>lb:</I></font>  Vector que define la frontera inferior del dominio </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  u<I>b</I></font>: Vector que define la frontera superior del dominio </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A:  Matriz de coeficientes que multiplican a las variables en las restricciones de  desigualdad </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>Aeq:</I></font>  Matriz de coeficientes que multiplican a las variables en las restricciones de  igualdad </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Es  importante el hecho de que <I>nbintprog</I> al igual que las funciones propias  de MATLAB solo minimizan la FO, por tanto si se quiere maximizar se debe multiplicar  por (-1) toda la FO como se muestra en la <a href="/img/revistas/riha/v35n1/f0705114.jpg">figura  7</a>. De igual forma todas las restricciones de desigualdad las considera como  (d&#187;), por tanto las que sean (e&#187;) se deben multiplicar por (-1) para  cambiar el sentido de la desigualdad, tal transformaci&oacute;n se realiza en  las ecuaciones (13) y (14) del ejemplo 3 resultando como se muestran en la <a href="/img/revistas/riha/v35n1/f0705114.jpg">  figura 7</a>. </font>     
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Anteriormente  se declararon las matrices y vectores que necesita <I>nbintprog</I>, ahora se  procede a hacer un llamado a la funci&oacute;n y la forma es como se muestra en  la ecuaci&oacute;n (15): </font>     <P><img src="/img/revistas/riha/v35n1/e1505114.gif" width="536" height="26">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los inputs o datos  de entrada que se encuentran a la derecha separados por coma son los datos que  necesita el programa, los cuales se declararon anteriormente, un aspecto muy importante  es que el orden de los inputs debe ser el espec&iacute;fico de cada funci&oacute;n.  Se puede prescindir de algunos inputs, su utilizaci&oacute;n depende de los tipos  de restricciones que existan en el modelo. Sin embargo si no se necesita un input  intermedio, en su posici&oacute;n se debe declara una matriz nula para no alterar  el orden de los dem&aacute;s, ver <a href="/img/revistas/riha/v35n1/f0805114.jpg">figura  8</a>. </font>     
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">[&#133;]  = <B><I>nbintprog</I></B> (<B><I>f, A, b</I></B>) resuelve el modelo sujeto a  <I>A </I>x <I>x &#8804; b </I> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">[&#133;]  = <B><I>nbintprog</I></B> (<B><I>f, A, b, Aeq, beq</I></B>) resuelve el problema  de arriba satisfaciendo adem&aacute;s las restricciones de igualdad del tipo <I>Aeq  </I>x <I>x = beq</I> </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">[&#133;]  = <B><I>nbintprog</I></B> (<B><I>f, A, b, Aeq, beq, lb, ub</I></B>) define adem&aacute;s,  la frontera inferior y superior de todas las variables de decisi&oacute;n, de  modo que la soluci&oacute;n siempre queda en el rango <I>lb</I> <I>&#8804; x &#8804;  ub</I> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">[&#133;]  = <B><I>nbintprog</I></B> (<B><I>f, A, b, Aeq, beq, lb, ub, x0</I></B>) se define  adem&aacute;s, un punto inicial de b&uacute;squeda </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">[&#133;]  = <B><I>nbintprog</I></B> (<B><I>f, A, b, Aeq, beq, lb, ub, x0, options_int</I></B>)  <I>options_int</I> es una estructura de datos que permite entrar al programa diferentes  par&aacute;metros para la b&uacute;squeda de la soluci&oacute;n; a continuaci&oacute;n  se muestra cu&aacute;les son dichos par&aacute;metros y posteriormente c&oacute;mo  declararlos: </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#183;  Tolerancia con la cual las variables de decisi&oacute;n son consideradas enteras  (<I>TolXInteger</I>): </font>     <P><img src="/img/revistas/riha/v35n1/e1605114.gif" width="406" height="19">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Esta tolerancia  es necesaria debido a que MATLAB guarda cada n&uacute;mero con una precisi&oacute;n  de 16 lugares decimales, por lo que buscar una combinaci&oacute;n de variables  realmente enteras elevar&iacute;a el n&uacute;mero de ramificaciones y de tiempo,  buscando una precisi&oacute;n innecesaria. <I>Nbintprog</I> al igual que las funciones  propias de MATLAB tiene una <I>TolXInteger</I> por defecto de 10<sup>-8</sup>.  </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#183;  Tolerancia de parada de la FO (<I>TolFun</I>): </font>     <P><img src="/img/revistas/riha/v35n1/e1705114.gif" width="596" height="24">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En resumen, <I>TolFun</I>  tiene en cuenta la proximidad del VFO de pivote con el mejor VFO de los nodos  vivos, de forma que cuando esta proximidad es muy peque&ntilde;a el programa se  detiene y ofrece como soluci&oacute;n la FO de pivote actual. Esta herramienta  puede ser muy &uacute;til ya que existen problemas que presentan muchos nodos  vivos extremadamente cercanos al VFO de pivote, y una vez que se ramifican resultan  valores peores que dicho pivote lo que trae impl&iacute;cito un consumo de tiempo  innecesario. El hecho de utilizar la estrategia de selecci&oacute;n BIFO hace  que en cada iteraci&oacute;n disminuya esta tolerancia. <I>Nbintprog</I> al igual  que las funciones propias de MATLAB tiene una <I>TolFun</I> por defecto de 10<SUP>-3</SUP>.  </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#183;  M&aacute;ximo n&uacute;mero de iteraciones(MaxIter) </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  no exceder un determinado n&uacute;mero de iteraciones. La soluci&oacute;n que  devuelve es la correspondiente al pivote actual, tiene por defecto un valor de  1000 iteraciones. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#183;  M&aacute;ximo n&uacute;mero de ramificaciones (MaxNodes) </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  no exceder un determinado n&uacute;mero de nodos ramificados. La soluci&oacute;n  que devuelve es la correspondiente al pivote actual, tiene por defecto un valor  de 5000 ramificaciones. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#183;  Opci&oacute;n de visualizaci&oacute;n de los resultados del proceso iterativo  de <I>nbintprog</I> (Display) </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  observar los resultados de cada iteraci&oacute;n es necesario llevar el par&aacute;metro  Display de su estado apagado (por defecto) a estado (iter) posteriormente se muestra  la manera de hacerlo. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">[&#133;]  = <B><I>nbintprog</I></B> (<B><I>f, A, b, Aeq, beq, lb, ub, x0, options_int, options</I></B>)  <I>options</I> son una serie de opciones aplicables s&oacute;lo a la funci&oacute;n  <I>linprog</I> que constituye una herramienta de apoyo para <I>nbintprog</I>,  &uacute;til para la soluci&oacute;n del PR, podr&iacute;a darse el caso especial  en que se necesite la modificaci&oacute;n de esta herramienta y <I>options</I>  es la v&iacute;a, para m&aacute;s informaci&oacute;n sobre <I>options</I> buscar  en la ayuda de MATLAB la funci&oacute;n <I>linprog</I>. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  modificar los valores de los par&aacute;metros por defecto de <I>options_int</I>  u <I>options</I> se utiliza la funci&oacute;n <I>optimset</I> como se muestra  en la ecuaci&oacute;n (18). Es muy importante que los par&aacute;metros se escriban  como aqu&iacute; se indica incluyendo sus may&uacute;sculas, ver su aplicaci&oacute;n  en el ejemplo 4. </font>     <P><img src="/img/revistas/riha/v35n1/e1805114.gif" width="551" height="24">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los datos de salida  (outputs), donde MATLAB devolver&aacute; los resultados obtenidos, se declaran  entre corchetes en la parte izquierda de la funci&oacute;n separados por coma,  teniendo en cuenta la importancia del orden, como se observa a continuaci&oacute;n:  </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>x</I>  </B>= <B><I>nbintprog</I></B> (&#133;)<B><I> </I></B>devuelve las variables de  decisi&oacute;n que dieron soluci&oacute;n al problema </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>[  <I>x, Fo</I>] </B>= <B><I>nbintprog</I></B> (&#133;)<B><I> </I></B>devuelve adem&aacute;s,  el valor de la FO de la soluci&oacute;n </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>[  <I>x, Fo, exit </I>] </B>= <B><I>nbintprog</I></B> (&#133;) devuelve adem&aacute;s,  la raz&oacute;n de parada del programa </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>exit  </I>= 1</B>: El programa convergi&oacute; a la soluci&oacute;n </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>exit  </I>= 2</B>: La <I>TolFun</I> existente fue menor que la <I>TolFun</I> admisible  </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>exit  </I>= 3</B>: El n&uacute;mero de iteraciones sobrepas&oacute; a MaxIter </font>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><I>exit </I>=  4</B>: El n&uacute;mero de ramificaciones sobrepas&oacute; a MaxNodes </font>      <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B> [ <I>x, Fo,  exit, output </I>] </B>= <B><I>nbintprog</I></B> (&#133;) <I>output</I> es una  estructura de datos que devuelve el tiempo empleado en encontrar la soluci&oacute;n  y la cantidad de iteraciones realizadas </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Ejemplo  (4) </B> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Plantear  y resolver el modelo del ejemplo 3 mediante <I>nbintprog</I> con una <I>TolFun</I>=0,  pues se desea ramificar todos los nodos vivos con mejor VFO que el pivote, por  muy cerca que se encuentren de este, una <I>TolXInteger</I> = 0,00001 y tambi&eacute;n  se quiere visualizar la tabla de resultados, declarar las ecuaciones (13) y (14)  como frontera inferior. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En  la <a href="/img/revistas/riha/v35n1/t0105114.gif">tabla 1</a> se observan  los resultados de cada iteraci&oacute;n. En la iteraci&oacute;n 2 aparece un asterisco  en la izquierda de la tabla, esto ocurre cada vez que hay un cambio de FO de pivote.  Posteriormente <I>nbintprog</I> muestra la soluci&oacute;n, v&eacute;ase que x  es un vector que contiene a los valores de [x ; y] </font>     
]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>PROBLEMA  DE PRODUCCI&Oacute;N DE ASPERSORES</B> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Un  taller de montaje de aspersores consta de tres secciones A, B y C. En cada secci&oacute;n  se pueden ensamblar tres tipos diferentes de aspersores A-10, A-12 y A-15. La  capacidad de producci&oacute;n de cada secci&oacute;n var&iacute;a dependiendo  del tipo de aspersor a ensamblar como indica la <a href="#tabla 2">tabla 2</a>.  Acorde con una orientaci&oacute;n, se necesita que por cada aspersor A-10, se  fabrique un aspersor A-12 y dos A-15. Determinar y resolver el modelo matem&aacute;tico  que maximice el n&uacute;mero de aspersores a fabricar. </font>     <P align="center"><a name="tabla 2"><img src="/img/revistas/riha/v35n1/t0205114.gif" width="556" height="103"></a>      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Formulaci&oacute;n  est&aacute;ndar del modelo</font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Variables  de decisi&oacute;n: </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XA<SUB>A-10  </SUB>= Cantidad de aspersores A-10 a producir por d&iacute;a en la secci&oacute;n  A. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XA<SUB>A-12  </SUB>= Cantidad de aspersores A-12 a producir por d&iacute;a en la secci&oacute;n  A. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XA<SUB>A-15  </SUB>= Cantidad de aspersores A-15 a producir por d&iacute;a en la secci&oacute;n  A. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XB<SUB>A-10  </SUB>= Cantidad de aspersores A-10 a producir por d&iacute;a en la secci&oacute;n  B. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XB<SUB>A-12  </SUB>= Cantidad de aspersores A-12 a producir por d&iacute;a en la secci&oacute;n  B. </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XB<SUB>A-15  </SUB>= Cantidad de aspersores A-15 a producir por d&iacute;a en la secci&oacute;n  B. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XC<SUB>A-10  </SUB>= Cantidad de aspersores A-10 a producir por d&iacute;a en la secci&oacute;n  C. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XC<SUB>A-12  </SUB>= Cantidad de aspersores A-12 a producir por d&iacute;a en la secci&oacute;n  C. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">XC<SUB>A-15  </SUB>= Cantidad de aspersores A-15 a producir por d&iacute;a en la secci&oacute;n  C. </font>     <P>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Funci&oacute;n  objetivo: </font>     <P><img src="/img/revistas/riha/v35n1/e1905114.gif" width="666" height="39">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>-Restricciones  de capacidad de producci&oacute;n </B></font>     <P><img src="/img/revistas/riha/v35n1/e2005114.gif" width="279" height="35">      
<P><img src="/img/revistas/riha/v35n1/e2105114.gif" width="279" height="30">      
]]></body>
<body><![CDATA[<P><img src="/img/revistas/riha/v35n1/e2205114.gif" width="273" height="34">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">-Otras restricciones  adicionales. </font>     <P><img src="/img/revistas/riha/v35n1/e2305114.gif" width="506" height="22">      
<P><img src="/img/revistas/riha/v35n1/e2405114.gif" width="580" height="20">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">-Restricciones  de no negatividad: </font>     <P><img src="/img/revistas/riha/v35n1/e2505114.gif" width="600" height="21">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Adecuaci&oacute;n  del modelo para bintprog</B> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A  continuaci&oacute;n se resuelve el problema utilizando una funci&oacute;n propia  de MATLAB llamada <I>bintprog</I>. Dicha funci&oacute;n est&aacute; concebida  para resolver modelos de programaci&oacute;n lineal entera binaria.<B> </B>De  modo que las variables de decisi&oacute;n solo pueden tomar valores cero-uno (0-1),  &uacute;til para problemas de grafos y redes (Cabrera 2012). Dicha funci&oacute;n  puede resolver modelos de PLEP aplicando un artificio matem&aacute;tico (MathWorks  2012). La idea fundamental es representar cada variable de decisi&oacute;n (X)  como un conjunto de variables binarias (z<sub>1</sub>,z<sub>2</sub>,...z<sub>n</sub>)  , el cual tiene la forma: </font>     <P><img src="/img/revistas/riha/v35n1/e2605114.gif" width="203" height="28">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Por ejemplo la  variable XA<SUB>A-10 </SUB>tiene una capacidad de producci&oacute;n<SUB> </SUB>diaria  de hasta 85 aspersores y se representa con el conjunto mostrado en la ecuaci&oacute;n  (27). Esta forma permite que la variable XA<SUB>A-10 </SUB> pueda tomar todos  los valores enteros desde 0 hasta 127, rango que encierra los posibles valores  que puede alcanzar dicha variable. </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Aplicaci&oacute;n  a cada variable de decisi&oacute;n: </font>     <P><img src="/img/revistas/riha/v35n1/e2705114.gif" width="533" height="24">      
<P><img src="/img/revistas/riha/v35n1/e2805114.gif" width="529" height="22">      
<P><img src="/img/revistas/riha/v35n1/e2905114.gif" width="536" height="18">      
<P><img src="/img/revistas/riha/v35n1/e3005114.gif" width="532" height="20">      
<P><img src="/img/revistas/riha/v35n1/e3105114.gif" width="533" height="19">      
<P><img src="/img/revistas/riha/v35n1/e3205114.gif" width="527" height="20">      
<P><img src="/img/revistas/riha/v35n1/e3305114.gif" width="531" height="21">      
<P><img src="/img/revistas/riha/v35n1/e3405114.gif" width="534" height="19">      
<P><img src="/img/revistas/riha/v35n1/e3505114.gif" width="532" height="22">      
]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Funci&oacute;n  objetivo binaria: </font>     <P><img src="/img/revistas/riha/v35n1/e3605114.gif" width="566" height="121">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">-Restricciones  de capacidad de producci&oacute;n. </font>     <P><img src="/img/revistas/riha/v35n1/e3705114.gif" width="556" height="71">      
<P><img src="/img/revistas/riha/v35n1/e3805114.gif" width="554" height="74">      
<P><img src="/img/revistas/riha/v35n1/e3905114.gif" width="553" height="71">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">-Otras restricciones  adicionales. </font>     <P><img src="/img/revistas/riha/v35n1/e4005114.gif" width="517" height="69">      
<P><img src="/img/revistas/riha/v35n1/e4105114.gif" width="613" height="44">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">-Restricciones  de no negatividad: </font>     ]]></body>
<body><![CDATA[<P><img src="/img/revistas/riha/v35n1/e4205114.gif" width="435" height="19">      
<P><img src="/img/revistas/riha/v35n1/e4305114.gif" width="437" height="19">      
<P><img src="/img/revistas/riha/v35n1/e4405114.gif" width="438" height="19">      
<P><img src="/img/revistas/riha/v35n1/e4505114.gif" width="437" height="22">      
<P><img src="/img/revistas/riha/v35n1/e4605114.gif" width="439" height="21">      
<P><img src="/img/revistas/riha/v35n1/e4705114.gif" width="435" height="17">      
<P><img src="/img/revistas/riha/v35n1/e4805114.gif" width="441" height="18">      
<P><img src="/img/revistas/riha/v35n1/e4905114.gif" width="441" height="21">      
<P><img src="/img/revistas/riha/v35n1/e5005114.gif" width="440" height="22">      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Declaraci&oacute;n  del modelo en MATLAB para bintprog</B> </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se  presenta en la <a href="/img/revistas/riha/v35n1/t0305114.gif"> tabla 3</a>.  </font>     
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Soluci&oacute;n  mediante bintprog</font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XC<SUB>A</SUB></I><SUB>-10</SUB>  = 0 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XC<SUB>A</SUB></I><SUB>-12</SUB>  = 0 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XC<SUB>A</SUB></I><SUB>-15</SUB>  = 80 </font>     <P>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XB<SUB>A</SUB></I><SUB>-10</SUB>  = 57 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XB<SUB>A</SUB></I><SUB>-12</SUB>  = 6 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XB<SUB>A</SUB></I><SUB>-15</SUB>  = 6 </font>     <P>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XA<SUB>A</SUB></I><SUB>-10</SUB>  = 0 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XA<SUB>A</SUB></I><SUB>-12</SUB>  = 51 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XA<SUB>A</SUB></I><SUB>-15</SUB>  = 28 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Valor  de la funci&oacute;n objetivo (fval)=228 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Raz&oacute;n  de parada (exit)=se excedi&oacute; el n&uacute;mero de ramificaciones por defecto  de <I>bintprog</I> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Declaraci&oacute;n  del modelo en MATLAB para nbintprog</B> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se  presenta en la <a href="#tabla 4">tabla 4</a>. </font>     <P align="center"><a name="tabla 4"><img src="/img/revistas/riha/v35n1/t0405114.gif" width="576" height="217"></a>      
<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Soluci&oacute;n  mediante nbintprog</font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XA<SUB>A</SUB></I><SUB>-10</SUB>  = 2 </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XA<SUB>A</SUB></I><SUB>-12</SUB>  = 52 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XA<SUB>A</SUB></I><SUB>-15</SUB>  = 25 </font>     <P>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XC<SUB>A</SUB></I><SUB>-10</SUB>  = 0 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XC<SUB>A</SUB></I><SUB>-12</SUB>  = 2 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XC<SUB>A</SUB></I><SUB>-15</SUB>  = 77 </font>     <P>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XB<SUB>A</SUB></I><SUB>-10</SUB>  = 55 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XB<SUB>A</SUB></I><SUB>-12</SUB>  = 3 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>XB<SUB>A</SUB></I><SUB>-15</SUB>  = 12 </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Valor  de la funci&oacute;n objetivo (fval)=228 </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Raz&oacute;n  de parada (exit)=convergencia a la soluci&oacute;n </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Comparaci&oacute;n  de los resultados</B> </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Como  se observa <I>bintprog</I> se detiene producto que excede el n&uacute;mero de  ramificaciones por defecto aproximadamente a los 28 minutos como muestra la <a href="/img/revistas/riha/v35n1/t0505114.gif">tabla  5</a>; aqu&iacute; cabe la posibilidad de modificar el valor de MaxNodes, pero  no es el objetivo. Pese a que el programa se detiene, ofrece la mejor soluci&oacute;n  que presenta hasta el momento, con el inconveniente que dicha soluci&oacute;n  posee una TolFun=0,78%. Esta tolerancia significa que, a los 28 minutos de c&oacute;mputo,  existen nodos vivos y por tanto la posibilidad de encontrar mejores soluciones  que la mostrada. Como se muestra en la <A HREF="/img/revistas/riha/v35n1/t0505114.gif">tabla  5</A>, cuando <I>bintprog</I> se detiene a&uacute;n presenta 23165 nodos vivos.  Esta significativa desaceleraci&oacute;n de la convergencia a la soluci&oacute;n  se debe al aumento del n&uacute;mero de variables. </font>     
<P> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#191;Por  qu&eacute; el incremento de variables desacelera significativamente la convergencia  a la soluci&oacute;n? </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  En la primera ramificaci&oacute;n del ejemplo 3, el nodo 2 tiene la soluci&oacute;n  [x=0,67; y=1], sin embargo al ramificarlo, el Nodo 2-1 tiene como variables [x=0;  y=1,5], v&eacute;ase que al hacer entera (x), la variable (y) que era entera producto  de la primera ramificaci&oacute;n del modelo vuelve a tomar un valor fraccionario.  Por tanto, una variable entera dentro de la soluci&oacute;n puede dejar de serlo  ante la ramificaci&oacute;n de otras, por lo que el programa va restringiendo  el dominio de cada variable fraccionaria hasta que encuentre una combinaci&oacute;n  de variables enteras o se cierre el dominio y no se encuentre soluci&oacute;n,  entonces salta a otro nodo vivo. Si el n&uacute;mero de variables es grande, mientras  se hace entera una, son m&aacute;s las que pueden dejar de serlo. De modo que  para que <I>bintprog</I> logre que las 62 variables binarias sean enteras tiene  que realizar muchas ramificaciones. Por dicha raz&oacute;n <I>bintprog</I> no  encuentra su primera soluci&oacute;n hasta la ramificaci&oacute;n 12789. Adem&aacute;s,  un incremento de ramificaciones significa generar mayor cantidad de nodos vivos  que posteriormente puede ser obligatorio ramificar. De modo que cuando <I>bintprog  </I>encontr&oacute; su primera soluci&oacute;n ya contaba con 6596 nodos vivos,  esto se puede corroborar en la tabla de resultados iterativos de <I>bintprog</I>  cuando se corre el modelo. Por esta raz&oacute;n el hecho de que la cantidad de  variables binarias de <I>bintprog</I> dependa de la capacidad m&aacute;xima de  las variables no binarias puede resultar insatisfactorio. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><I>Nbintprog</I>  no se encuentra sometido a dicho fen&oacute;meno por lo que converge m&aacute;s  r&aacute;pido a la soluci&oacute;n. En el caso del modelo de aspersores no solo  converge a la soluci&oacute;n 14 veces m&aacute;s r&aacute;pido que <I>bintprog</I>  (<a href="/img/revistas/riha/v35n1/t0505114.gif">tabla 5</a>), sino que el  resultado presenta una calidad superior (<I>TolFun</I>=0), lo que significa que  se ramificaron todos los nodos vivos y no se encontr&oacute; mejor soluci&oacute;n  entera. Para hacer una comparaci&oacute;n con soluciones de igual calidad se puede  decir que <I>nbintprog</I> alcanza una <I>TolFun</I> ligeramente menor que 0,78%  en la iteraci&oacute;n n&uacute;mero 23 para un tiempo de un minuto y medio, queda  por parte del lector comprobarlo. </font>     
<P>&nbsp;     <P>     <P><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><B>CONCLUSIONES</B>  </font>     ]]></body>
<body><![CDATA[<P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se presenta  la funci&oacute;n <I>nbintprog</I> para MATLAB, capaz de resolver modelos de programaci&oacute;n  lineal entera pura (PLEP) utilizando como base matem&aacute;tica el m&eacute;todo  de ramificaci&oacute;n y acotaci&oacute;n (branch and bound) empleando la estrategia  BIFO (best input first output). Dicha herramienta, a diferencia de la funci&oacute;n  <I>bintprog</I> (intr&iacute;nseca de MATLAB), no requiere de una adecuaci&oacute;n  de su formulaci&oacute;n est&aacute;ndar a un modelo binario para resolver problemas  no binarios de programaci&oacute;n lineal entera. </font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se  realiza una comparaci&oacute;n integral basada en el empleo de <I>bintprog</I>  y <I>nbintprog</I> para resolver un problema de ingenier&iacute;a. De esta comparaci&oacute;n  se puede concluir que se evidencian los inconvenientes que trae consigo el hecho  de que la cantidad de variables binarias que se requieren para la adecuaci&oacute;n  de un modelo no binario dependa de la capacidad m&aacute;xima de las variables  no binarias. Esto hace que la soluci&oacute;n brindada por la funci&oacute;n <I>bintprog</I>  tarde 14 veces m&aacute;s que la brindada por <I>nbintprog</I>. Adem&aacute;s  con la soluci&oacute;n de <I>nbintprog</I> se ramifican todos los nodos vivos  y no se encuentra mejor soluci&oacute;n entera, mientras que <I>bintprog</I> brinda  un resultado cuando excede el n&uacute;mero m&aacute;ximo prefijado de ramificaciones  por defecto. </font>     <P>&nbsp;    <P>     <P>     <P>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B><font size="3">REFERENCIAS</font></B>  </font>     <!-- ref --><P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Cabrera  E. &#171;Programaci&oacute;n lineal.&#187;, Conferencia de planeamiento y operaci&oacute;n  de los recursos hidr&aacute;ulicos, CIH, Facultad de Ingenier&iacute;a Civil,  Cujae, La Habana, 2012.     </font>     <!-- ref --><P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Lahoz  P. &#171;Programaci&oacute;n lineal entera&#187;, Investigacion operativa, extra&iacute;do  de: <U><FONT  COLOR="#0000ff"> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><U><FONT  COLOR="#0000ff"><a href="http://ocw.unizar.es/modelos-de-investigacion-operativa/OCWProgEntera.pdf%20" target="_blank">http://ocw.unizar.  es/modelos-de-investigacion-operativa/OCWProgEntera.pdf</a></FONT></U></font></FONT></U>,  en enero 2013 2009.     </font>     <!-- ref --><P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Troncoso  A. &#171;T&eacute;cnicas avanzadas de predicci&oacute;n y optimizaci&oacute;n  aplicadas a sistemas de potencia&#187;, Tesis de doctorado, Dpto. de lenguajes  y sistemas, Univ. de Sevilla, Espa&ntilde;a, 2005.     </font>     <!-- ref --><P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Marrero  N. &#171;T&eacute;cnicas de optimizaci&oacute;n aplicadas a la ingenier&iacute;a  hidr&aacute;ulica&#187;, Ed. ISPJAE, Facultad de Ingenier&iacute;a Civil, ISPJAE,  La Habana,1985.     </font>     <!-- ref --><P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MathWorks  &#171;Solve binary integer programming problems&#187;, Optimization Toolbox For  Use with MATLAB&#174;, MATLAB, USA, 2012.     </font>     <!-- ref --><P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Society  I. C. &#171;The Nature of Mathematical Programming&#187;. Mathematical Programming  Glossary extra&iacute;do de: <U><FONT  COLOR="#0000ff"><a href="http://www.glossary.computing.society.informs.org" target="_blank">http://www.glossary.computing.society.informs.org</a></FONT></U>  en enero 2013, 2010.     </font>     <!-- ref --><P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Wolsey  L. and Nemhauser G. &#171;Integer and Combinatorial Optimization.&#187;, Ed. John  Wiley&amp; Sons, New York, 1998.     </font>     <P>&nbsp;     <P>&nbsp;     <P>     <P>     <P>     <P>     <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Recibido:  11 de octubre de 2013.    <BR> Aprobado: 15 de octubre de 2013. </font>     <P>&nbsp;     ]]></body>
<body><![CDATA[<P>&nbsp;     <P>      <P>     <P>     <P>     <P><em><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Daniel  Molina P&eacute;rez, Eric Cabrera Estupi&ntilde;&aacute;n</font></em><font size="2" face="Verdana, Arial, Helvetica, sans-serif">,  Centro de Investigaciones Hidr&aacute;ulicas<B> </B>(CIH), Instituto Superior  Polit&eacute;cnico Jos&eacute; Antonio Echeverr&iacute;a (Cujae). La Habana, Empresa  de Ingenier&iacute;a y Proyectos del Petr&oacute;leo (EIPP). La Habana. e-mail:  <U><FONT  COLOR="#0000ff"><a href="mailto:danielmolinaperez90@gmail.com">danielmolinaperez90@gmail.com</a>,</FONT></U>  e-mail: <U><FONT COLOR="#0000ff"><a href="mailto:ecabrera@cipp.minbas.cu">ecabrera@cipp.minbas.cu</a>  </FONT><FONT COLOR="#0000ff"> </FONT></U></font>       ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Cabrera]]></surname>
<given-names><![CDATA[E]]></given-names>
</name>
</person-group>
<source><![CDATA[Programación lineal.]]></source>
<year>2012</year>
<publisher-loc><![CDATA[La Habana ]]></publisher-loc>
<publisher-name><![CDATA[CIH, Facultad de Ingeniería Civil, Cujae,]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Lahoz]]></surname>
<given-names><![CDATA[P]]></given-names>
</name>
</person-group>
<source><![CDATA[Programación lineal entera]]></source>
<year>2009</year>
</nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Troncoso]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
</person-group>
<source><![CDATA[Técnicas avanzadas de predicción y optimización aplicadas a sistemas de potencia]]></source>
<year>2005</year>
<publisher-name><![CDATA[Dpto. de lenguajes y sistemas, Univ. de Sevilla]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Marrero]]></surname>
<given-names><![CDATA[N]]></given-names>
</name>
</person-group>
<source><![CDATA[Técnicas de optimización aplicadas a la ingeniería hidráulica]]></source>
<year>1985</year>
<publisher-loc><![CDATA[La Habana ]]></publisher-loc>
<publisher-name><![CDATA[ISPJAE, Facultad de Ingeniería Civil, ISPJAE]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="book">
<collab>MathWorks</collab>
<source><![CDATA[Solve binary integer programming problems]]></source>
<year>2012</year>
<publisher-name><![CDATA[MATLAB]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Society]]></surname>
<given-names><![CDATA[I. C.]]></given-names>
</name>
</person-group>
<source><![CDATA[The Nature of Mathematical Programming]]></source>
<year>2010</year>
</nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Wolsey]]></surname>
<given-names><![CDATA[L]]></given-names>
</name>
<name>
<surname><![CDATA[Nemhauser]]></surname>
<given-names><![CDATA[G]]></given-names>
</name>
</person-group>
<source><![CDATA[Integer and Combinatorial Optimization.]]></source>
<year>1998</year>
<publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[Ed. John Wiley& Sons]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
