<?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>2306-0522</journal-id>
<journal-title><![CDATA[Revista Investigación y Tecnología]]></journal-title>
<abbrev-journal-title><![CDATA[Rev Inv Tec]]></abbrev-journal-title>
<issn>2306-0522</issn>
<publisher>
<publisher-name><![CDATA[Universida Mayor de San Andrés]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S2306-05222015000100004</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Algoritmo heurístico para el problema de la partición]]></article-title>
<article-title xml:lang="en"><![CDATA[Heuristic algorithm for partition problem]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Torrico]]></surname>
<given-names><![CDATA[Lucio]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Universidad Mayor de San Andrés Facultad de Ciencias Puras y Naturales Carrera de Informática]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>12</month>
<year>2015</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>12</month>
<year>2015</year>
</pub-date>
<volume>3</volume>
<numero>2</numero>
<fpage>40</fpage>
<lpage>47</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.br/scielo.php?script=sci_arttext&amp;pid=S2306-05222015000100004&amp;lng=en&amp;nrm=iso&amp;tlng=en"></self-uri><self-uri xlink:href="http://www.scielo.br/scielo.php?script=sci_abstract&amp;pid=S2306-05222015000100004&amp;lng=en&amp;nrm=iso&amp;tlng=en"></self-uri><self-uri xlink:href="http://www.scielo.br/scielo.php?script=sci_pdf&amp;pid=S2306-05222015000100004&amp;lng=en&amp;nrm=iso&amp;tlng=en"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[En general las soluciones exactas para el problema de la partición se obtienen a través de algoritmos intratables pues el problema es NP. Además de un famoso algoritmo pseudo-polinomial hay, sin embargo, diversos algoritmos heurísticos polinomiales que buscan aproximaciones a una solución exacta (viendo al problema como un caso del subset-sumproblem). Presentamos un algoritmo heurístico que implementa la idea de ordenar los datos y hacer sumas parciales para obtener nuevos elementos, controlando el crecimiento del número de columnas (para el algoritmo de programación dinámica, el cual hemos cambiado un poco para trabajar con números no secuenciales).Este algoritmo parece comportarse bastante bien para los experimentos realizados]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[In general, exact solutions to the problem of partition are obtained through algorithms intractable because the problem is NP. Besides a famous pseudo-polynomial algorithm there are, however, a number of polynomial heuristic algorithms that find approximations to an exact solution to the problem (seeing it as a subset-sum problem case). We present a heuristic algorithm that implements the idea of ordering the data anddo partial sums for get new elements, with growth control of the number of columns (for the dynamic programming algorithm, which we changed a bit to work with non-sequential numbers). This algorithm seems toperform quite wellfor experiments]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[Problema de la partición]]></kwd>
<kwd lng="es"><![CDATA[algoritmo pseudo-polinomial]]></kwd>
<kwd lng="es"><![CDATA[algoritmo heurístico]]></kwd>
<kwd lng="en"><![CDATA[partition problem]]></kwd>
<kwd lng="en"><![CDATA[pseudo-polynomial algorithm]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="right"><font size="2" face="Verdana"><strong>ART&Iacute;CULOS</strong></font></p>     <p align="right">&nbsp;</p>     <p align="center"><font size="4" face="Verdana"> <b>Algoritmo heurístico para el problema de la partición</b></font></p>     <p align="center">&nbsp;</p>     <p align="center"><strong><font face="Verdana" size="3">Heuristic algorithm for partition problem</font></strong></p>     <p align="center">&nbsp;</p>     <p align="center">&nbsp;</p>     <p align="center"><font face="Verdana" size="2"><strong>Lucio Torrico</strong><b>    <br> </b>      Instituto de Investigaciones en Informática</font>    <br>   <font face="Verdana" size="2">Carrera de Informática</font>    ]]></body>
<body><![CDATA[<br>   <font face="Verdana" size="2">Facultad de Ciencias Puras y Naturales</font>    <br>   <font face="Verdana" size="2">Universidad Mayor de San Andrés</font>    <br>   <font face="Verdana" size="2">La Paz - Bolivia    <br>  Autor de correspondencia:<a href="mailto:luciotorrico@gmail.com">luciotorrico@gmail.com</a></font><font face="Verdana" size="2"></font>    <br> <font face="Verdana" size="2"><b>Presentado: </b>La Paz, 9 de octubre de 2015 | </font><font face="Verdana" size="2"><b>Aceptado: </b>La Paz, 27 de noviembre de 2015</font></p>     <p align="center">&nbsp;</p>     <p align="center">&nbsp;</p> <hr>     <p align="justify"><font face="Verdana" size="2"><b>Resumen</b></font></p>     <p align="justify"><font face="Verdana" size="2">En general las soluciones exactas para el problema de la partición se obtienen a través de algoritmos intratables pues el problema es NP. Además de un famoso algoritmo pseudo-polinomial hay, sin embargo, diversos algoritmos heurísticos polinomiales que buscan aproximaciones a una solución exacta (viendo al problema como un caso del <i>subset-sumproblem).</i></font></p>     <p align="justify"><font face="Verdana" size="2">Presentamos un algoritmo heurístico que implementa la idea de ordenar los datos y hacer sumas parciales para obtener nuevos elementos, controlando el crecimiento del número de columnas (para el algoritmo de programación dinámica, el cual hemos cambiado un poco para trabajar con números no secuenciales).Este algoritmo parece comportarse bastante bien para los experimentos realizados.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2"><b>Palabras clave: </b>Problema de la partición; algoritmo pseudo-polinomial; algoritmo heurístico</font></p> <hr>     <p align="justify"><font face="Verdana" size="2"><b>Abstract</b></font></p>     <p align="justify"><font face="Verdana" size="2">In general, exact solutions to the problem of partition are obtained through algorithms intractable because the problem is NP. Besides a famous pseudo-polynomial algorithm there are, however, a number of polynomial heuristic algorithms that find approximations to an exact solution to the problem (seeing it as a subset-sum problem case).</font></p>     <p align="justify"><font face="Verdana" size="2">We present a heuristic algorithm that implements the idea of ordering the data anddo partial sums for get new elements, with growth control of the number of columns (for the dynamic programming algorithm, which we changed a bit to work with non-sequential numbers). This algorithm seems toperform quite wellfor experiments.</font></p>     <p align="justify"><font face="Verdana" size="2"><strong>Keywords:</strong> partition problem, pseudo-polynomial algorithm</font></p> <hr>     <p align="justify">&nbsp;</p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="3"><b>Introducción</b></font></p>     <p align="justify"><font face="Verdana" size="2">El problema de la partición es conocido en la algorítmica por ser <i><strong>NP</strong> </i>(Garey Michel, Johnson David., 1979).</font></p>     <p align="justify"><font face="Verdana" size="2">Hay formas de cálculo no convencionales para solucionar este problema pero sólo las mencionamos debido a que van por otra dirección: la computación molecular por ADN, cuántica, adabiática, de burbujas de jabón, basada en engranajes, etc. (Mihai O., Oana M., 2009).</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2">Presentamos el problema, algunos algoritmos conocidos y nuestra propuesta</font></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="3"><b>Métodos</b></font></p>     <p align="justify"><font face="Verdana" size="2">La descripción de los métodos empleados se describe a continuación:</font></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="3"><b>El problema</b></font></p>     <p align="justify"><font face="Verdana" size="2">Sea <i><strong>A</strong> = { ai,a2,...,a<sub>n</sub> } </i>un conjunto de números naturales. </font></p>     <p align="center"><img src="/img/revistas/rit/v3n2/a04_figura01.gif" width="169" height="114"></p>     <p align="center">&nbsp;</p>     <p align="justify"><font face="Verdana" size="2">Si <i><strong>B</strong> </i>es impar, es claro que el problema no tiene solución.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2">Si <i><strong>B</strong> </i>es par, la suma de los elementos del subconjunto <i><strong>A'</strong> </i>buscado debe ser<strong> <i>B/2</i></strong><i> </i>(Garey Michel, Johnson David., 1979).</font></p>     <p align="justify"><font face="Verdana" size="2">Ejemplo: Sea <em><strong>A</strong></em> <strong>= <i>{10, 20, 90,100, 200}</i></strong><i></i></font></p>     <p align="justify"><font face="Verdana" size="2">La suma de todos los elementos es <i><strong>B=420</strong></i></font></p>     <p align="justify"><font face="Verdana" size="2">Como <i>B </i>es par, estamos buscando un subconjunto <i><strong>A'</strong> </i>cuya suma sea <i><strong>B/2=210A' = {10, 200}</strong> </i>satisface lo requerido.</font></p>     <p align="justify"><font face="Verdana" size="2">Nótese <i>que <strong>A-A' = {20, 90, 100}</strong> es </i>tal que la suma de sus elementos es también 210.</font></p>     <p align="center"><font face="Verdana" size="2"><i>.<img src="/img/revistas/rit/v3n2/a04_figura02.gif" width="234" height="28"></i></font></p>     <p align="justify"><font face="Verdana" size="2">Toth y Martello le llaman <i>&quot;Valué independent Knapsack Problem&quot; </i>o &quot;<i>Stickstacking ProblenT </i>(Ye Yuli, Borodin Alian., 2008). Y otros prefieren decir que es un caso especial del Problema de la Mochila donde los pesos y los valores son iguales (Kellerer H, Pferschy U., D., 2004).</font></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="3"><b>Algoritmos conocidos</b></font></p>     <p align="justify"><font face="Verdana" size="2">Un algoritmo exacto por fuerza bruta puede diseñarse seleccionando los subconjuntos tomados de a<strong><em> 1</em></strong>, de <i><strong>a 2</strong>, </i>de <i><strong>a 3</strong>, </i>..., de <i><strong>a </strong><b>n </b>. </i>Y verificando si la suma de los elementos suma <i><strong>B/2</strong> </i>Esta idea es claramente intratable.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2">Otro algoritmo, esta vez heurístico y que apela a la <i>técnica greedy </i>es (Zhao Chenyu. (2011):</font></p>     <blockquote>       <p align="justify"><font face="Verdana" size="2">1.&nbsp; &nbsp;Ordenar los elementos de <i><strong>A</strong> </i>en orden descendente</font></p>       <p align="justify"><font face="Verdana" size="2">2.&nbsp; &nbsp;Tomar los primeros<strong> <i>k=2</i></strong><i> </i>elementos y colocarlos en los conjuntos <i><strong>A' </strong>y <strong>A&quot;</strong> </i>respectivamente <em>(</em><strong><em>A&quot;</em></strong> hará el papel de <i><strong>A-A'</strong>)</i></font></p>       <p align="justify"><font face="Verdana" size="2">3.&nbsp; &nbsp;Para   los   siguientes <i><strong>n-k</strong> </i>elementos colocarlos en el conjunto<strong> <i>A' </i></strong><i>o <strong>A&quot;</strong> </i>que tenga la menor suma</font></p> </blockquote>     <p align="justify"><font face="Verdana" size="2">Un algoritmo pseudo-Polinomial (Garey Michel, Johnson David., 1979). Se basa en programación dinámica.</font></p>     <p align="justify"><font face="Verdana" size="2">Sea <i><strong>M<sub>nx</sub></strong></i></font><strong><font face="Verdana" size="2"><i> (B/2)</i></font></strong><font face="Verdana" size="2"><i> </i>una tabla booleana donde</font> <img src="/img/revistas/rit/v3n2/a04_figura03.gif" width="175" height="19"></p>     <p align="justify"><font face="Verdana" size="2"><i><strong>M(ij) = 1</strong> </i>si existe un subconjunto de <i><strong>A={a1,a2,...,ai}</strong></i></font> <font face="Verdana" size="2">para  el  cual  la  suma de todos     sus elementos es exactamente <strong><em>j</em></strong>  0  e.o.c</font></p>     <p align="justify"><font face="Verdana" size="2">Casos base: Nótese que <i><strong>M(1j)=1</strong></i>si y sólo si</font> <font face="Verdana" size="2"><i><strong>j=0 ój=ai</strong></i></font></p>     <p align="justify"><font face="Verdana" size="2">Definiremos<i> <img src="/img/revistas/rit/v3n2/a04_figura04.gif" width="125" height="17"></i></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2">La relación de recurrencia para<img src="/img/revistas/rit/v3n2/a04_figura05.gif" width="80" height="14"><img src="/img/revistas/rit/v3n2/a04_figura06.gif" width="54" height="19">es:</font></p>     <p align="center"><img src="/img/revistas/rit/v3n2/a04_figura07.gif" width="265" height="23"></p>     <p align="justify"><font face="Verdana" size="2">Nótese que, cuando la tabla esté llena, la respuesta está en <i><strong>M(n,B/2)</strong>. </i>Si es <i><strong>1</strong> </i>el problema de partición tiene solución (un rastreo o <i>traceback </i>puede hallarla), en otro caso no.</font></p>     <p align="justify"><font face="Verdana" size="2">Ejemplo:</font></p>     <p align="justify"><font face="Verdana" size="2"><i><strong>A = {(11,(12,(13,(14,(15}= {1,9,5,3,8}</strong></i></font></p>     <p align="justify"><font face="Verdana" size="2">La suma de los elementos de <i><strong>A</strong> </i>es <i><strong>B=26</strong>.</i></font></p>     <p align="justify"><font face="Verdana" size="2">La tabla <i><strong>M</strong> </i>llena es:</font></p>     <p align="center"><img src="/img/revistas/rit/v3n2/a04_figura08.gif" width="315" height="104"></p>     <p align="justify"><font face="Verdana" size="2">Y la respuesta es que la partición sí existe: </font></p>     <p align="justify"><font face="Verdana" size="2"><i><strong>A' = {ai,a<sub>2</sub>,a<sub>4</sub>}={1,9,3}</strong></i></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2"><i><strong>A&quot;=A-A' = {a<sub>3</sub>,a<sub>5</sub>}={5,8}</strong></i></font></p>     <p align="justify"><font face="Verdana" size="2">En ambos casos la suma de los elementos de cada subconjunto es 13.</font></p>     <blockquote>       <p align="justify"><font face="Verdana" size="2">• Como las columnas de la matriz van hasta la mitad de la suma de los elementos, si alguno de ellos es muy grande, por ejemplo <i><strong>ai = </strong></i><strong>2&quot;</strong>, entonces la</font> <font face="Verdana" size="2">matriz será de por lo menos <i><strong>2<sup>n</sup>/2</strong> </i>columnas, haciendo que el llenado de la matriz demore un tiempo <i><strong>O(n-2<sup>n</sup>).</strong> </i>De ahí que <i>B </i>no sea polinomial en términos del tamaño de la entrada <b><i>n</i></b></font></p>       <p align="justify">&nbsp;</p> </blockquote>     <p align="justify"><font face="Verdana" size="3"><b>Algoritmos heurísticos</b></font></p>     <p align="justify"><font face="Verdana" size="2">El problema de la partición también puede verse como un caso especial del <i>subset-sum problem </i>(problema de la suma de subconjuntos) que para el mismo conjunto <i><strong>A={ai,a2,...,a<sub>n</sub>}</strong> </i>se pregunta si hay un subconjunto<img src="/img/revistas/rit/v3n2/a04_figura09.gif" width="45" height="15">tal que <sup><img src="/img/revistas/rit/v3n2/a04_figura10.gif" width="108" height="21"> </sup>(para cualquier <strong><em>c</em></strong>, no sólo para <i><strong>B/2</strong>).</i></font></p>     <p align="justify"><font face="Verdana" size="2">Hay algunas ideas heurísticas (Kellerer H., Pferschy U., D., 2004),( PrzydatekBartosz., 2002), (Ye Yuli, Borodin Alian., 2008), (Martello S., Toth P., 1990), que buscan una aproximación a la solución, es decir, hallar un subconjunto <i><strong>A' </strong></i>cuya suma se acerque por debajo a <i><strong>B/2</strong>. </i>Aquí las exponemos a grandes rasgos:</font></p>     <p align="justify"><font face="Verdana" size="2">Llamaremos <i>Sol </i>a la solución que se construye.</font></p>     <p align="justify"><font face="Verdana" size="2">El algoritmo <strong><em>G</em></strong> (algoritmo <i>Greedy) </i>consiste en añadir<i> <strong>a1</strong></i> a <i>Sol </i>si es menor que <i><strong>c</strong>, </i>añadir <i><strong>a2</strong> </i>a <i>Sol </i>si la nueva <i>Sol </i>es menor que <i><strong>c</strong>, </i>etc.</font> </p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2">Nótese que <i><strong>G</strong> </i>no ordena los <i><strong>ai</strong> <strong>c'&lt;-c</strong></i></font></p>     <p align="center"><img src="/img/revistas/rit/v3n2/a04_figura11.gif" width="307" height="86"></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="2">Aproximación obtenida <strong><em>&lt;- c-c'</em></strong><em></em></font></p>     <p align="justify"><font face="Verdana" size="2">El algoritmo <i><strong>G<sub>ext</sub></strong><sub></sub> (Greedy </i>extendido) consiste en ejecutar <i><strong>G</strong> </i>para hallar <i>Sol </i>por un lado y buscar el máximo de los <i><strong>ai</strong> </i>por otro. Luego elegir de entre ambos el valor más cercano a <strong><em>c</em></strong>, que no lo sobrepase.</font></p>     <p align="justify"><font face="Verdana" size="2">El algoritmo <b><i>GR </i></b><i>{RandomGreedy) </i>consiste en elegir los <i>m </i>que ingresan a <i>Sol </i>ya no de izquierda a derecha sino al azar (obviamente se añaden mientras su suma no supere <i><strong>c</strong>).</i></font></p>     <p align="justify"><font face="Verdana" size="2">Se llama <b><i>GR(t) </i></b>a la ejecución <b><i>t </i></b>veces del <b><i>GR </i></b>y a la selección de la mejor solución de entre la <b><i>t </i></b>obtenidas.</font></p>     <p align="justify"><font face="Verdana" size="2">Llamaremos <i><strong>GS</strong> {Greedy sorteado) </i>a la ejecución (con selecciones de izquierda a derecha) del algoritmo <i><strong>G,</strong> </i>pero con la inclusión de un preprocesamiento: Ordenar los <i><strong>ai </strong></i>de modo decreciente. Nótese que esto añade un tiempo <b><i>O(n-logn).</i></b></font></p>     <p align="justify"><font face="Verdana" size="2">Martello y Toth proponen correr el algoritmo <i><strong>G,n</strong> </i>veces: Primero con los <i><strong>n</strong> </i>elementos de <i><strong>A</strong>, </i>luego con los <i><strong>n-1</strong> </i>elementos (sin contar <i>ai\ </i>luego con los <i><strong>n-2</strong> </i>elementos (sin contar <i><strong>ai</strong> </i>ni <em><strong>a2</strong></em>, etc.).</font></p>     <p align="justify"><font face="Verdana" size="2">Y elegir la mejor solución hallada en estasn ejecuciones.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2">Dado un nivel de alejamiento de la solución (error) <i><strong>€ </strong></i><strong><i>(0&lt;€&lt;l)</i></strong><i>, </i>otros algoritmos dividen los elementos a¿ en pequeños <i><strong>(&lt;€c)</strong> </i>y el resto que son los grandes: Y hallan una solución sólo para el conjunto de elementos grandes.</font></p>     <p align="justify"><font face="Verdana" size="2">Johnson propuso obtener todos los subconjuntos de a lo más <i><strong>(l/€ -1)</strong> </i>elementos grandes (por ej. con <i><strong>€=0.1</strong> </i>serían subconjuntos de a <i><strong>9</strong> </i>elementos) y con la mejor aproximación seguir asignando los otros elementos pequeños a través del algoritmo <i><strong>G</strong>.</i></font></p>     <p align="justify"><font face="Verdana" size="2"><i>Fischetti </i>sugiere hacer un otro procesamiento con los elementos grandes: Agruparlos en <i><strong>q (&lt;l/€ -1)</strong> buckets; </i>elegir un elemento de cada <i>bucket; </i>la mejor selección será la que tenga una aproximación mayor a <i><strong>c</strong>. </i>Se toma ella y los</font> <font face="Verdana" size="2">elementos pequeños se asignan a través del algoritmo <i><strong>G</strong>.</i></font></p>     <p align="justify"><font face="Verdana" size="2">Ibarra y Lawler trabajan bajo la idea de escalar los <i><strong>ai</strong> </i>grandes y por lo tanto <i><strong>c</strong>. </i>Por ejemplo <i><strong><img src="/img/revistas/rit/v3n2/a04_figura12.gif" width="241" height="16">a</strong> </i>y donde<strong> <i>b= max{ai}</i></strong></font></p>     <p align="justify"><font face="Verdana" size="2">Los elementos pequeños se asignan a través del algoritmo <i><strong>G</strong></i></font></p>     <p align="justify"><font face="Verdana" size="2">Przydatek propone el <b><i>RGLI(t) </i></b><i>{RandomGreedy </i>con mejoramiento local -Local <i>Improvement-): </i>Por cada trial obtiene una solución (por ej. al azar); consideramos cada <em><strong>ai </strong></em>de esa solución y vemos si podemos reemplazarlo por otro aj que noesté pero que haga la nueva suma más cercana a <b><i>c </i></b>(sin superarlo). Przydatek se refiere a esto último como el heurístico de Balas y Zemel. Se elige la mejor solución de todos los <i>triáis.</i></font></p>     <p align="justify"><font face="Verdana" size="2">Kellerer también divide los elementos en grandes y pequeños. Estos últimos se asignan a través del algoritmo <i><strong>G</strong></i></font></p>     <p align="justify"><font face="Verdana" size="2">Con los elementos grandes se plantea una idea que aquí la simplificamos mucho:</font></p>     <p align="justify"><font face="Verdana" size="2">Los valores de las columnas en la solución de programación dinámica <i>(<strong>1..c </strong>) </i>y que hacen intratable al problema, se reducen (relajan) a otro conjunto más pequeño:</font></p>     <p align="justify"><font face="Verdana" size="2">Se divide el rango <i><strong>[1, c]</strong> </i>en <b><i>k </i></b>sub intervalos<img src="/img/revistas/rit/v3n2/a04_figura13.gif" width="305" height="19"><b><i>, </i></b>y</font> <font face="Verdana" size="2">tomando los relevantes: el menor y el mayor valor de cada intervalo.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2">La complejidad <i><strong>O(</strong></i><strong><i>n&middot;c)</i></strong><i> </i>cambiará a <b><i>O(n&middot;c) </i></b><i><strong>= O(n/€)</strong>.</i></font></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="3"><b>Data-set</b></font></p>     <p align="justify"><font face="Verdana" size="2">Es claro que una elección siempre presente es la asignación aleatoria (o uniforme) de números dentro de un rango.</font></p>     <p align="justify"><font face="Verdana" size="2">Kellerer nos muestra otros conjuntos de datos para <i><strong>n</strong> </i>entre <strong>5</strong> y <i><strong>100000</strong> </i>(Kellerer H., Pferschy U., D., 2004). (nótese que son datos pensados para el <i>subset-sum):</i></font></p>     <p align="justify"><font face="Verdana" size="2"><i><strong>pthree.</strong> <strong>ai </strong></i>aleatoriamente distribuidos en <i><strong>[1,1O<sup>3</sup>]  </strong></i><strong>y <i>c=int(n&middot;10<sup>3</sup>/4)</i></strong></font></p>     <p align="justify"><font face="Verdana" size="2"><i><strong>psix: a¡</strong> </i>aleatoriamente distribuidos en <i><strong>[1,10<sup>6</sup>] </strong></i><strong>y <i>c=int(n&middot;10<sup>6</sup>/4)</i></strong></font></p>     <p align="justify"><font face="Verdana" size="2"><i><strong>evenodd.</strong> <strong>ai</strong> </i>pares aleatoriamente distribuidos       en       <i><strong>[1,10<sup>3</sup>]</strong>&nbsp;</i>y</font> <em><strong><font size="2" face="Verdana">c=2&middot;int(n&middot;10<sup>3</sup>/8)+1</font></strong></em></p>     <p align="justify"><em><strong><font size="2" face="Verdana">avis: ai=n(n+1)+i </font></strong></em>y  <font size="2" face="Verdana"><em><strong>c=n(n+1)&middot;int((n-1)/2)+ n&middot;((n-1)/2)</strong></em></font></p>     <p align="justify"><font face="Verdana" size="2"><b><i>pl4: </i></b><i><strong>ai </strong></i>uniformemente distribuidos en <i><strong>]1,10<sup>14</sup>[</strong> </i>y <i><strong>c=3</strong></i><strong><i>&middot;10<sup>14</sup></i></strong></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="2"><i><strong>todd: ai=2<sup>k+n+1</sup>+2<sup>k+</sup><sup>J</sup> </strong></i><strong>con <i>k=int(log<sub>2</sub>n) y  c=B/2</i></strong><i></i></font></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="3"><b>La propuesta</b></font></p>     <p align="justify"><font face="Verdana" size="2">Aquí requerimos que los datos sean ordenados. Llamaremos a este el primer nivel.</font></p>     <p align="justify"><font face="Verdana" size="2">Con el primer nivel. Efectuaremos varios ciclos: del primer elemento con sus mayores, del segundo elemento con sus mayores, etc., y hallaremos las sumas de estos pares de elementos.</font></p>     <p align="justify"><font face="Verdana" size="2">Cada suma será ubicada en una estructura de segundo nivel, respetando el orden.</font></p>     <p align="justify"><font face="Verdana" size="2">Con el segundo nivel (y cada nuevo nivel que aparezca): seguiremos hallando sumas de cada elemento con todos los datos del primer nivel que sean mayores al elemento en consideración.</font></p>     <p align="justify"><font face="Verdana" size="2">Colocaremos     estas     sumas     en    un subsiguiente nivel y manteniendo el orden. En todos los casos las sumas se colocan sólo si no sobrepasan a <i><strong>B/2</strong></i></font></p>     <p align="justify"><font face="Verdana" size="2">Con toda esta cantidad finita -no exponencial- de elementos de todos los niveles aplicamos el algoritmo de programación dinámica con el siguiente cambio:</font></p>     <p align="center"><img src="/img/revistas/rit/v3n2/a04_figura15.gif" width="318" height="189"></p>     ]]></body>
<body><![CDATA[<p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="2">El primer nivel es obvio.</font></p>     <p align="justify"><font face="Verdana" size="2">Segundo    nivel:     <i><strong>2+5=7,</strong>     <strong>2+6=8,etc; 5+6=11, 5+9=14,</strong> </i>etc.</font></p>     <p align="justify"><font face="Verdana" size="2">Tercer nivel: <i><strong>7+9=18, 7+10=17 </strong></i>ya existe, <i><strong>7+15=22</strong>, </i>etc.</font></p>     <p align="justify"><font face="Verdana" size="2">La siguiente tabla muestra todos los valores hallados:</font></p>     <p align="center"><img src="/img/revistas/rit/v3n2/a04_figura14.gif" width="683" height="45"></p>     <p align="center">&nbsp;</p>     <p align="justify"><font face="Verdana" size="2">Con ellos como columnas junto a la columna con valor <i>42 </i>hacemos uso del algoritmo    basado     en    programación</font> <font face="Verdana" size="2">dinámica aunque reformulado (nótese que las columnas <i><strong>3, 4,13, 40,41</strong> </i>no existen).</font></p>     <p align="justify"><font face="Verdana" size="2">Dicho algoritmo halla una solución en este caso.</font></p>     <p align="justify">&nbsp;</p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana" size="3"><b>Desempeño</b></font></p>     <p align="justify"><font face="Verdana" size="2">Las pruebas se hicieron en scripts de <i>Matlab (m-file).</i></font></p>     <p align="justify"><font face="Verdana" size="2">La existencia o no de la columna <i><strong>j-ai</strong> </i>se resuelve sin dificultad porque los datos están ordenados.</font></p>     <p align="justify"><font face="Verdana" size="2">Las respuestas son exactas para los ejemplos cortos y parecen corresponder con la realidad en ejemplos más grandes (no se han encontrado sets de datos para testeo generalmente aceptados).</font></p>     <p align="justify"><font face="Verdana" size="2">El tiempo que demora el algoritmo no es exagerado. De hecho es polinomial.</font></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana" size="3"><b>Referencias</b></font></p>     <!-- ref --><p align="justify"><font face="Verdana" size="2">Garey Michel, Johnson David. (1979). &quot; <i>Computer<sup>:</sup>s and intractability: A Guide to the Theory of NP-Completeness&quot;. </i>W.H Freeman and company.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scieloOrg/php/reflinks.php?refpid=S2306-0522201500010000400001&pid=S2306-05222015000100004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');"></a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p align="justify"><font face="Verdana" size="2">Kellerer H., Pferschy U., D. (2004). <i>&quot;Knapsack problems&quot;. </i>Springer.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scieloOrg/php/reflinks.php?refpid=S2306-0522201500010000400002&pid=S2306-05222015000100004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');"></a>&#160;]<!-- end-ref --></font></p>     <p align="justify"><font face="Verdana" size="2">Zhao Chenyu. (2011). <i>&quot;Partition problem: A fast greedy solutiori\ </i>Disponible en: <A href=http://stackoverflow.com/questions/666946 target="_blank">ttp://stackoverflow.com/questions/666946O/the-partition-problem</A>. Visitado el 30/3/2014</font></p>     <!-- ref --><p align="justify"><font size="2" face="Verdana">Mihai O., Oana M. (2009). <i>&quot;Solving the subset-sum problem with a light-based device&quot;. </i>Disponible&nbsp;en <u><a href="http://www.cs.ubbclui.ro/~moltean/optical/optical subset sum.pdf" target="_blank">http://www.cs.ubbclui.ro/~moltean/optical/optical subset sum.pdf</a></A></u>. Visitado el 30/3/2014</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scieloOrg/php/reflinks.php?refpid=S2306-0522201500010000400004&pid=S2306-05222015000100004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');"></a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="Verdana" size="2">PrzydatekBartosz.     (2002). <i>&quot;A     FastApproximation Algorithm for the Subset-</i></font> <font face="Verdana" size="2"><i>Sum</i>Problem&quot;. <u><a href="ftp://ftp.inf.ethz.ch/pub/crypto/publications/Przyda02.ps" target="_blank">ftp://ftp.inf.ethz.ch/pub/crypto/publications/Przyda02.ps</a></u>. Visitado      el</font> <font face="Verdana" size="2">30/3/2014</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scieloOrg/php/reflinks.php?refpid=S2306-0522201500010000400005&pid=S2306-05222015000100004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');"></a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="Verdana" size="2">Ye Yuli, Borodin Alian. (2008). &quot;Priority Algorithms for the Subset-Sum Problem&quot;. Disponible&nbsp;&nbsp;en <u><a href="http://www.cs.toronto.edu/~bor/Papers/prio ritv-subset-sum.pdf" target="_blank">http://www.cs.toronto.edu/~bor/Papers/prio ritv-subset-sum.pdf</a></A></u>. Visitado el 30/3/2014</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scieloOrg/php/reflinks.php?refpid=S2306-0522201500010000400006&pid=S2306-05222015000100004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');"></a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="Verdana" size="2">Martello S., Toth P. (1990). &quot;Knapsack Problems: Algorithms and Computer Implementations&quot;. Wiley.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scieloOrg/php/reflinks.php?refpid=S2306-0522201500010000400007&pid=S2306-05222015000100004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');"></a>&#160;]<!-- end-ref --></font></p>     <p align="justify">&nbsp;</p>      ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Garey Michel]]></surname>
<given-names><![CDATA[Johnson David]]></given-names>
</name>
</person-group>
<source><![CDATA[Computer:s and intractability: A Guide to the Theory of NP-Completeness]]></source>
<year>1979</year>
<publisher-name><![CDATA[W.H Freeman and company]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Kellerer]]></surname>
<given-names><![CDATA[H]]></given-names>
</name>
<name>
<surname><![CDATA[Pferschy]]></surname>
<given-names><![CDATA[U., D]]></given-names>
</name>
</person-group>
<source><![CDATA[Knapsack problems]]></source>
<year>2004</year>
<publisher-name><![CDATA[Springer]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Zhao]]></surname>
<given-names><![CDATA[Chenyu]]></given-names>
</name>
</person-group>
<source><![CDATA[Partition problem: A fast greedy solution]]></source>
<year>2011</year>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Mihai]]></surname>
<given-names><![CDATA[O]]></given-names>
</name>
<name>
<surname><![CDATA[Oana]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Solving the subset-sum problem with a light-based device]]></source>
<year>2009</year>
</nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Przydatek]]></surname>
<given-names><![CDATA[Bartosz]]></given-names>
</name>
</person-group>
<source><![CDATA[A FastApproximation Algorithm for the Subset- SumProblem]]></source>
<year>2002</year>
</nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Borodin Alian]]></surname>
<given-names><![CDATA[Ye Yuli,]]></given-names>
</name>
</person-group>
<source><![CDATA[Priority Algorithms for the Subset-Sum Problem]]></source>
<year>2008</year>
</nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Martello]]></surname>
<given-names><![CDATA[S]]></given-names>
</name>
<name>
<surname><![CDATA[Toth]]></surname>
<given-names><![CDATA[P]]></given-names>
</name>
</person-group>
<source><![CDATA[Knapsack Problems: Algorithms and Computer Implementations]]></source>
<year>1990</year>
<publisher-name><![CDATA[Wiley]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
