<?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>1405-7743</journal-id>
<journal-title><![CDATA[Ingeniería, investigación y tecnología]]></journal-title>
<abbrev-journal-title><![CDATA[Ing. invest. y tecnol.]]></abbrev-journal-title>
<issn>1405-7743</issn>
<publisher>
<publisher-name><![CDATA[Universidad Nacional Autónoma de México, Facultad de Ingeniería]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1405-77432015000400007</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Algoritmo que ejecuta submodelos de un modelo matemático para mayor eficiencia]]></article-title>
<article-title xml:lang="en"><![CDATA[Algorithm that Executes Submodels of a Mathematical Model for Greater Efficiency]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Bauer-Mengelberg]]></surname>
<given-names><![CDATA[Juan Ricardo]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Vega-Ruiz]]></surname>
<given-names><![CDATA[Rafael]]></given-names>
</name>
<xref ref-type="aff" rid="A02"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Colegio de Posgraduados  ]]></institution>
<addr-line><![CDATA[Montecillo Estado de México]]></addr-line>
<country>México</country>
</aff>
<aff id="A02">
<institution><![CDATA[,Colegio de Posgraduados  ]]></institution>
<addr-line><![CDATA[Montecillo Estado de México]]></addr-line>
<country>México</country>
</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>16</volume>
<numero>4</numero>
<fpage>551</fpage>
<lpage>563</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.mx/scielo.php?script=sci_arttext&amp;pid=S1405-77432015000400007&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.mx/scielo.php?script=sci_abstract&amp;pid=S1405-77432015000400007&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.mx/scielo.php?script=sci_pdf&amp;pid=S1405-77432015000400007&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[El tema surge del servicio de información denominado FLAG (flujo de efectivo en agronegocios) que ofrece a sus clientes modelos matemáticos, este contiene variables del cliente y otras de su entorno de negocios. FLAG obtiene valores actualizados de estas variables con la periodicidad requerida por el cliente, quien recalcula las demás variables del modelo, lo que resulta en un impacto que el cliente obtiene de los cambios en los indicadores (otras variables) incluidos en su modelo. Se describen los métodos utilizados para incrementar la eficiencia del cálculo de un modelo matemático, que consiste en un conjunto de fórmulas con las que se obtienen valores actualizados de las variables del modelo. Cada fórmula se crea por operaciones entre otras variables del modelo. La necesidad de reducir los tiempos del proceso se debe a la ejecución de varios modelos, así como la duración total, ya que está acotada por requisitos del sistema que los invoca. Se construyen los algoritmos de modo que se minimicen las operaciones de entrada y salida. Asimismo, cuando se recalcula el modelo como consecuencia del cambio de una sola variable, solo se recalcula el submodelo correspondiente, formado por las variables afectadas directa o indirectamente por el cambio. Ejecuciones de modelos preparados para determinar la eficacia de las mejoras muestran reducciones hasta del orden de 90% en las duraciones.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[The topic arises in an informing service called FLAG (cash flow in agribusinesses) that offers its clients mathematical models consisting of his own variables as well as others from his business environment. FLAG obtains updated values of the latter with the frequency determined by the client, and computes the values of the other variables, thus providing the client with the impact of the changes in the indicators he includes in his model. The methods used to increase the efficiency of the calculations of a mathematical model containing a number of formulae through which the values of its variables are computed are described. It consists of operations to be performed on its operands, variables of the model. The need to reduce processing times results from the processing of several models, where the total duration is limited by constrains of the system that invokes such executions. The algorithms are built to minimize input-output operation. Additionally, whenever the model is invoked by a change of a single variable, only the submodel, consisting of the variables that were directly or indirectly affected by the change, are calculated. Executions of models prepared to confirm the efficacy of the improvements show reductions of up to 90%.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[modelo matemático]]></kwd>
<kwd lng="es"><![CDATA[árbol]]></kwd>
<kwd lng="es"><![CDATA[submodelos]]></kwd>
<kwd lng="es"><![CDATA[servicio de información]]></kwd>
<kwd lng="en"><![CDATA[mathematical model]]></kwd>
<kwd lng="en"><![CDATA[tree]]></kwd>
<kwd lng="en"><![CDATA[submodels]]></kwd>
<kwd lng="en"><![CDATA[informing service]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[  	    <p align="center"><font face="verdana" size="4"><b>Algoritmo que ejecuta submodelos de un modelo matem&aacute;tico para mayor eficiencia</b></font></p>  	    <p>&nbsp;</p>  	    <p align="center"><font face="verdana" size="3"><b>Algorithm that Executes Submodels of a Mathematical Model for Greater Efficiency</b></font></p>  	    <p>&nbsp;</p>  	    <p align="center"><font face="verdana" size="2"><b>Bauer&#45;Mengelberg Juan Ricardo<sup>1</sup>, Vega&#45;Ruiz Rafael<sup>2</sup></b></font></p>      <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><i><sup>1</sup> Colegio de Posgraduados, Montecillo Texcoco, Posgrado de C&oacute;mputo Aplicado. </i>Correo: <a href="mailto:jbauer@colpos.mx">jbauer@colpos.mx</a></font></p>      <p align="justify"><font face="verdana" size="2"><i><sup>2</sup> Colegio de Posgraduados, Montecillo Texcoco, Posgrado de C&oacute;mputo Aplicado. </i>Correo: <a href="mailto:rafael.vega@colpos.mx">rafael.vega@colpos.mx</a></font></p>      <p>&nbsp;</p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Recibido: junio de 2014.    <br> 	Reevaluado: julio de 2014.    <br> 	Aceptado: junio de 2015.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Resumen</b></font></p>  	    <p align="justify"><font face="verdana" size="2">El tema surge del servicio de informaci&oacute;n denominado FLAG (<i>flujo de efectivo en agronegocios</i>) que ofrece a sus clientes modelos matem&aacute;ticos, este contiene variables del cliente y otras de su entorno de negocios. FLAG obtiene valores actualizados de estas variables con la periodicidad requerida por el cliente, quien recalcula las dem&aacute;s variables del modelo, lo que resulta en un impacto que el cliente obtiene de los cambios en los indicadores (otras variables) incluidos en su modelo. Se describen los m&eacute;todos utilizados para incrementar la eficiencia del c&aacute;lculo de un modelo matem&aacute;tico, que consiste en un conjunto de f&oacute;rmulas con las que se obtienen valores actualizados de las variables del modelo. Cada f&oacute;rmula se crea por operaciones entre otras variables del modelo. La necesidad de reducir los tiempos del proceso se debe a la ejecuci&oacute;n de varios modelos, as&iacute; como la duraci&oacute;n total, ya que est&aacute; acotada por requisitos del sistema que los invoca. Se construyen los algoritmos de modo que se minimicen las operaciones de entrada y salida. Asimismo, cuando se recalcula el modelo como consecuencia del cambio de una sola variable, solo se recalcula el submodelo correspondiente, formado por las variables afectadas directa o indirectamente por el cambio. Ejecuciones de modelos preparados para determinar la eficacia de las mejoras muestran reducciones hasta del orden de 90% en las duraciones.</font></p>  	    <p align="justify"><font face="verdana" size="2"><b>Descriptores:</b> modelo matem&aacute;tico, &aacute;rbol, submodelos, servicio de informaci&oacute;n.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Abstract</b></font></p>  	    <p align="justify"><font face="verdana" size="2">The topic arises in an informing service called FLAG (cash flow in agribusinesses) that offers its clients mathematical models consisting of his own variables as well as others from his business environment. FLAG obtains updated values of the latter with the frequency determined by the client, and computes the values of the other variables, thus providing the client with the impact of the changes in the indicators he includes in his model. The methods used to increase the efficiency of the calculations of a mathematical model containing a number of formulae through which the values of its variables are computed are described. It consists of operations to be performed on its operands, variables of the model. The need to reduce processing times results from the processing of several models, where the total duration is limited by constrains of the system that invokes such executions. The algorithms are built to minimize input&#45;output operation. Additionally, whenever the model is invoked by a change of a single variable, only the submodel, consisting of the variables that were directly or indirectly affected by the change, are calculated. Executions of models prepared to confirm the efficacy of the improvements show reductions of up to 90%.</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><b>Keywords:</b> mathematical model, tree, submodels, informing service.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Introducci&oacute;n</b></font></p>  	    <p align="justify"><font face="verdana" size="2">La necesidad de minimizar la duraci&oacute;n de la ejecuci&oacute;n de modelos matem&aacute;ticos surgi&oacute; de un servicio denominado FLAG (<i>flujo de efectivo en agronegocios</i>) descrito por Bauer&#45;Mengelberg (2010) .Este servicio se ofrece a diversos clientes, quienes formulan un modelo matem&aacute;tico integrado por variables propias (VCL, <i>variables del cliente</i>) y variables de su entorno de negocios (VMR, <i>variables del mundo real</i>). El servicio consiste en obtener valores actualizados de las VMR y recalcular las variables que utilizan en sus modelos los clientes.</font></p>  	    <p align="justify"><font face="verdana" size="2">Seg&uacute;n Gackowski (2005) los atributos que exige un servicio de este tipo en la informaci&oacute;n que proporciona a sus clientes, entre otros, se encuentra: ser interpretable, significativa, disponible a tiempo y cre&iacute;ble. Sin embargo, el atributo fundamental es que la informaci&oacute;n sea <i>timely actionable</i>, es decir, que el receptor pueda usar la informaci&oacute;n a tiempo. La incorporaci&oacute;n de los datos actualizables a un modelo permite precisamente eso, comunicar al cliente el impacto de los cambios sobre sus actividades.</font></p>  	    <p align="justify"><font face="verdana" size="2">Generalmente, el servicio ofrece un conjunto de VMR al cliente que lo necesite, cuando alguien solicita una nueva VMR, se le agrega al conjunto. Asimismo, se definen agentes de b&uacute;squeda que ser&aacute;n los que, con la periodicidad requerida, obtengan valores actualizados de las variables a partir de los publicados en Internet. Cuando cambian los valores de algunas variables, se ejecutan los modelos en los que intervienen las que ya sufrieron cambios.</font></p>  	    <p align="justify"><font face="verdana" size="2">El modelo contiene variables calculadas, cuyos valores se obtienen mediante una f&oacute;rmula que se define para ese efecto, y que tendr&aacute; como operandos otras variables, tanto del cliente como del mundo real. Los detalles de las f&oacute;rmulas se proporcionan adelante.</font></p>  	    <p align="justify"><font face="verdana" size="2">De esta manera, cada cliente actualiza una base de datos con sus variables y f&oacute;rmulas, adem&aacute;s de actualizar los valores de las variables "de abajo", que son las que no tienen f&oacute;rmula. Por ejemplo, se introducen los valores de las hect&aacute;reas en las que sembrar&aacute; alg&uacute;n cultivo por mes, estos valores intervendr&aacute;n en una f&oacute;rmula de otra variable, es decir, la cosecha ser&aacute; el n&uacute;mero de hect&aacute;reas multiplicado por el rendimiento ha, donde el rendimiento puede ser un dato calculado (variables de clima, tipo de semilla, fertilizaci&oacute;n, etc&eacute;tera) u otro vector "de abajo".</font></p>  	    <p align="justify"><font face="verdana" size="2">La situaci&oacute;n que se presenta en el FLAG muestra que el servicio puede proporcionarse a muchos clientes, en donde el cuantificador depender&aacute; del contexto o del tipo de equipo de c&oacute;mputo que utilice para ofrecerlo. Cuando los agentes detectan cambios en los valores de las VMR, en ocasiones se ejecuta un gran n&uacute;mero de modelos, por lo tanto, la duraci&oacute;n de estos procesos debe ser suficientemente corta para su conclusi&oacute;n, antes de crear la necesidad de ejecutar otros modelos como consecuencia de nuevos cambios detectados en valores de VMR, ya que se lanzan agentes sin interrupci&oacute;n.</font></p>  	    <p align="justify"><font face="verdana" size="2">El FLAG tiene una serie de mecanismos que le permiten conocer los modelos que se deben recalcular, dados los cambios en valores de VMR. Un proceso lanza los agentes (programas que consiguen datos de una p&aacute;gina de Internet) y le comunica a otro programa peri&oacute;dicamente (t&iacute;picamente cada minuto) dichos cambios. Este &uacute;ltimo, aplica los criterios de ejecuci&oacute;n proporcionados por cada cliente para determinar si alguno de los cambios implica el rec&aacute;lculo de su modelo. Para los modelos afectados se invoca el programa de ejecuci&oacute;n de f&oacute;rmulas que recalcula y regraba los valores de las variables afectadas para cada uno de ellos.</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">La eficiencia del proceso de c&aacute;lculo del modelo es vital cuando se ejecutan varios modelos, por lo tanto, se buscan formas de acortar ejecuciones lo m&aacute;s posible, aqu&iacute; se logr&oacute; con tres pasos:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2"><i>Primero:</i> se minimizan las actividades de lectura y grabaci&oacute;n (I&#45;O).</font></p>  		    <p align="justify"><font face="verdana" size="2"><i>Segundo:</i> se implementan los submodelos, tema central de este trabajo, sustituyendo la ejecuci&oacute;n de todas las f&oacute;rmulas del modelo para recalcular &uacute;nicamente los valores de las variables afectadas en forma directa o indirecta debido a cambios de valores en una sola VMR.</font></p>  		    <p align="justify"><font face="verdana" size="2"><i>Tercero:</i> se emplea el concepto de operando aditivo de una f&oacute;rmula (solo interviene como sumando o sustraendo de la f&oacute;rmula) para reemplazar el c&aacute;lculo completo y no conseguir los valores de sus operandos, as&iacute; se aplica la diferencia entre los valores nuevos y anteriores del operando aditivo.</font></p>           <p align="justify"><font face="verdana" size="2">Para describir c&oacute;mo se implementaron estas estrategias y el impacto que tuvieron sobre los tiempos de ejecuci&oacute;n se organiz&oacute; el desarrollo, tras describir una serie de materiales que se emplearon, asimismo, se proporcionan algunos aspectos de las f&oacute;rmulas del FLAG y de su ejecuci&oacute;n, para lo cual se utiliz&oacute; un ejemplo sencillo. Por otro lado, se indica el motivo de no utilizar hojas de c&aacute;lculo para el servicio FLAG, que es una observaci&oacute;n frecuente a este sistema. Tambi&eacute;n se describe la ejecuci&oacute;n de un modelo con &eacute;nfasis en las operaciones de entrada y salida de datos. Posteriormente se detalla el proceso con el que se crearon los submodelos para las VMR, que son listas de las f&oacute;rmulas a recalcular cuando cambia cada variable. Por &uacute;ltimo, se proporcionan algunas duraciones resultantes de simulaciones que se efectuaron para estimar el impacto sobre los tiempos de ejecuci&oacute;n de cada uno de los tres elementos mencionados. Finalmente las conclusiones incluyen comentarios sobre el uso de los submodelos.</font></p> 	</blockquote>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Materiales y m&eacute;todos</b></font></p>  	    <p align="justify"><font face="verdana" size="2">El &aacute;rbol como estructura de datos</font></p>  	    <p align="justify"><font face="verdana" size="2">En matem&aacute;ticas y ciencias de la computaci&oacute;n un grafo conexo es un conjunto de objetos llamados nodos, unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre elementos de un conjunto. Una de las estructuras de datos m&aacute;s utilizadas es el &aacute;rbol, que se define como un grafo conexo sin bucles (tambi&eacute;n llamados ciclos). Seg&uacute;n Weiss (1992), un &aacute;rbol consiste de un nodo distinguido r, llamado ra&iacute;z, con cero o m&aacute;s sub&aacute;rboles T1, T2, &#8230;, Tk, cuyas ra&iacute;ces est&aacute;n conectadas por un arco dirigido a r.</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">En este trabajo se adopt&oacute; la siguiente terminolog&iacute;a:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2"><i>subnodos</i>: conectados a un nodo,</font></p>  		    <p align="justify"><font face="verdana" size="2"><i>hoja</i>: nodo sin subnodos,</font></p>  		    <p align="justify"><font face="verdana" size="2"><i>v&eacute;rtice o ra&iacute;z</i>: nodo que no es subnodo de otro y</font></p>  		    <p align="justify"><font face="verdana" size="2"><i>orden del &aacute;rbol</i>: n&uacute;mero m&aacute;ximo de subnodos que puede tener un nodo.</font></p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">Entre un nodo y subnodos hay una relaci&oacute;n llamada "padre&#45;hijo". En FLAG se sustituy&oacute; el t&eacute;rmino <i>padre</i> por el de <i>dad</i>, ya que las primeras versiones del paquete se elaboraron en ingl&eacute;s.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2">El FLAG usado para ilustrar los conceptos de eficiencia de procesos</font></p>  	    <p align="justify"><font face="verdana" size="2">Para describir el uso de submodelos de un modelo se consider&oacute; conveniente exponerlo en el contexto de un servicio informativo (<i>informing service</i>) llamado FLAG (<i>flujo de efectivo en agronegocios</i>) que proporciona a sus clientes datos del mundo real (su entorno de negocios). Como se muestra en la <a href="#f1">figura 1</a>, este se compone por m&oacute;dulos, que en conjunto proporcionan el servicio.</font></p> 	    ]]></body>
<body><![CDATA[<p align="center"><a name="f1"></a></p> 	    <p align="center"><img src="/img/revistas/iit/v16n4/a7f1.jpg"></p>      <p align="justify"><font face="verdana" size="2">El concepto principal que define este servicio es el modelo del cliente, donde act&uacute;an todos los procesos, entre ellos: la comunicaci&oacute;n entre cliente y FLAG, las consultas, la actualizaci&oacute;n de variables y la ejecuci&oacute;n de las f&oacute;rmulas de un modelo.</font></p>  	    <p align="justify"><font face="verdana" size="2">FLAG se concibi&oacute; como un servicio a varios clientes, en donde cada uno elabora un modelo del tipo descrito anteriormente. El servicio ofrece valores actualizados de diversas <i>variables del mundo real</i> (VMR) y cada cliente puede incluir algunas de ellas en sus modelos. Por ejemplo, un productor puede incluir el precio de un insumo en el modelo, as&iacute; el servicio contar&aacute; con un agente, que con la periodicidad necesaria, obtendr&aacute; de la fuente indicada para esa variable el valor actualizado del precio.</font></p>  	    <p align="justify"><font face="verdana" size="2">Como parte de las especificaciones, cada cliente proporciona los llamados criterios de ejecuci&oacute;n, para ello, indica las variables del mundo real de su modelo, aquellas que cuando cambien los valores, har&aacute;n que se ejecute el modelo. Esto permite determinar el impacto de los cambios en sus actividades o indicadores.</font></p>  	    <p align="justify"><font face="verdana" size="2">El criterio formulado para una VMR se especifica por un intervalo alrededor del valor anterior, es decir, si el nuevo valor cae fuera de este intervalo se ejecutar&aacute; el modelo.</font></p>  	    <p align="justify"><font face="verdana" size="2">Los intervalos se pueden especificar por sus extremos y tambi&eacute;n como porcentajes de cambio detectados en los valores actualizados. Por ejemplo, se puede indicar que si el cambio en el valor es menor que &#45;1 o mayor que +2 se ejecute el modelo, o hacer lo propio, pero proporcionando porcentajes del valor anterior.</font></p>  	    <p align="justify"><font face="verdana" size="2">Considerando que el servicio tiene muchos clientes, los cambios en los valores de las VMR pueden resultar en la ejecuci&oacute;n de una gran cantidad de modelos, ya que el tiempo disponible para las ejecuciones est&aacute; acotado por la periodicidad con la que se obtienen los cambios en las variables del mundo real, por lo que la eficiencia de estos procesos es crucial. Esto constituye el motivo de la investigaci&oacute;n que se describe en donde se buscan formas de mejorar los procesos en cualquier sentido que resulten en una mayor eficiencia computacional.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2">Los modelos definidos en FLAG</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">La <a href="/img/revistas/iit/v16n4/a7f2.jpg" target="_blank">figura 2</a> ilustra un ejemplo de un modelo del tipo FLAG. Se aprecian los nodos del &aacute;rbol que est&aacute;n conectados entre s&iacute;. Los nodos corresponden a variables que representan alg&uacute;n factor de negocio o cualquier otro uso del modelo. Los subnodos (hijos) de un nodo representan los operandos de una f&oacute;rmula mediante la cual se calculan los valores del nodo padre en funci&oacute;n de los valores de sus "hijos". De ese modo, los nodos que no tienen subnodos (hojas) no tienen f&oacute;rmula, y se denominan variables "de abajo".</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2">FLAG y las hojas de c&aacute;lculo</font></p>  	    <p align="justify"><font face="verdana" size="2">En las hojas de c&aacute;lculo m&aacute;s populares se encuentra MS&#45;EXCEL, donde la ejecuci&oacute;n de las f&oacute;rmulas es consecuencia de la modificaci&oacute;n de una celda que las afecta. Sin embargo, hay modos de evitar que esto suceda, indicando el inicio de este c&aacute;lculo mediante un comando que se incluye en la hoja para tal efecto. En los modelos implementados en FLAG solo se ejecutar&aacute; el modelo con el sistema cuando reciba una instrucci&oacute;n espec&iacute;fica en ese sentido.</font></p>  	    <p align="justify"><font face="verdana" size="2">Las hojas de c&aacute;lculo modernas tienen algoritmos sofisticados que les permiten decidir qu&eacute; celdas deben recalcularse como consecuencia del cambio de alguna celda (Excel's Smart Recalculation, 2008). En particular, se pueden incluir instrucciones que determinen un rango de celdas con las cuales se ejecutar&aacute; el modelo cuando cambien sus valores (Vbforums, 2011). En ocasiones la regla de decisi&oacute;n aplicada determinar&aacute; que es preferible ejecutar todo el modelo para no limitar el rec&aacute;lculo a una parte del mismo.</font></p>  	    <p align="justify"><font face="verdana" size="2">En este trabajo se describe c&oacute;mo se implement&oacute; este tipo de c&aacute;lculos parciales a los modelos descritos; adelantamos que se utiliza un submodelo y el conjunto de f&oacute;rmulas que se ejecutan para reflejar adecuadamente el cambio de una sola variable.</font></p>  	    <p align="justify"><font face="verdana" size="2">De la analog&iacute;a con las hojas de c&aacute;lculo surge una pregunta &#191;Por qu&eacute; no se utilizan hojas de c&aacute;lculo para el servicio FLAG&#63; Entre las causas principales se encuentran:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Las variables en realidad son vectores de 24 valores llamados periodos. Esto complica el uso de hojas de c&aacute;lculo, a pesar de que en muchas, por ejemplo en Excel, se implementan las f&oacute;rmulas de arreglos (Decisi&oacute;n Models, 2014).</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Se admiten variables aleatorias con distribuciones discretas de hasta 4 valores, adem&aacute;s de las variables escalares. Estas variables consisten de 24 periodos, cada uno con cuatro pares de valores (el valor y su probabilidad).</font></p>  		    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&bull; FLAG ejecuta una serie de acciones adem&aacute;s de las asociadas al c&aacute;lculo de f&oacute;rmulas. Entre otras, se encuentra la formulaci&oacute;n de diversas consultas al modelo y la generaci&oacute;n de alarmas, es decir, avisos urgentes al cliente. Puede resultar complicado incluir esta funcionalidad adicional en las hojas de c&aacute;lculo.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; La actualizaci&oacute;n de los datos que proporciona cada cliente de sus variables "de abajo" se puede realizar directamente sobre una hoja de c&aacute;lculo, pero ser&iacute;a m&aacute;s dif&iacute;cil para el cliente adem&aacute;s de destruir alguna relaci&oacute;n previamente indicada. Esto es cierto cuando modifica su modelo, ya sea agregando variables o cambiando alguna f&oacute;rmula.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Graficar los modelos implementados en hojas de c&aacute;lculo ser&iacute;a considerablemente m&aacute;s complicado que hacerlo con las estructuras que usa FLAG.</font></p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">Como parte del dise&ntilde;o del servicio FLAG se tom&oacute; la decisi&oacute;n de almacenar en sendos archivos las f&oacute;rmulas y los valores de las variables. Para cada modelo, es decir, para cada cliente, se almacenan los valores de todas las variables en un archivo destinado a tal efecto. Hay un archivo similar para las VMR, pero este es &uacute;nico, ya que los valores de las variables ser&aacute;n los que utilicen todos los modelos que las incluyan en sus f&oacute;rmulas.</font></p>  	    <p align="justify"><font face="verdana" size="2">La ejecuci&oacute;n de la f&oacute;rmula de una variable resulta en la actualizaci&oacute;n de sus valores, en el archivo de valores. Para cada operando de una f&oacute;rmula se emplean sus valores, es decir, se cargan a memoria los del registro correspondiente.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2">Las f&oacute;rmulas en FLAG</font></p>  	    <p align="justify"><font face="verdana" size="2">La definici&oacute;n matem&aacute;tica de una f&oacute;rmula que proporciona la RAE (2014) es: <i>ecuaci&oacute;n o regla que relaciona objetos matem&aacute;ticos o cantidades</i>. Un cliente define sus f&oacute;rmulas especificando la variable (resultado) y los objetos (operandos), los cuales relaciona mediante operaciones. Los operandos son variables del modelo por lo que pueden, a su vez, tener una f&oacute;rmula.</font></p>  	    <p align="justify"><font face="verdana" size="2">Los par&eacute;ntesis suelen causar problemas a los que formulan modelos, especialmente cuando hay par&eacute;ntesis anidados; por ello en FLAG se sustituyeron los par&eacute;ntesis por "subtotales" y se construy&oacute; la f&oacute;rmula agrupando operaciones en un subtotal, que de hecho tiene el mismo efecto que incluirlas en un par&eacute;ntesis. Este subtotal ser&aacute; empleado por alguno (o m&aacute;s de uno) de los subtotales subsecuentes. El &uacute;ltimo subtotal proporciona el valor de la variable calculada con la f&oacute;rmula.</font></p>  	    <p align="justify"><font face="verdana" size="2">De ese modo, una f&oacute;rmula consiste de operaciones entre operandos, que pueden ser variables o subtotales calculados anteriormente. Por ejemplo, en la f&oacute;rmula de la VCL156 del modelo ilustrado en la <a href="#f1">figura 1</a>, en lugar de escribir:</font></p>  	    ]]></body>
<body><![CDATA[<blockquote> 		    <p align="justify"><font face="verdana" size="2">VCL156 = (VMR623 + VMR349) * VMR45</font></p>  		    <p align="justify"><font face="verdana" size="2">se especifica: Subtotal (1) = VMR623 + VCL349</font></p>  		    <p align="justify"><font face="verdana" size="2">VCL156 = Subtotal (2) = subtotal (1) * VMR45</font></p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">El orden en el que se ejecutan las f&oacute;rmulas debe cumplir dos condiciones:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Los operandos deben calcularse antes de que los use una formula.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; No debe haber referencias circulares (tambi&eacute;n las llamadas ciclos), t&eacute;rmino que significa que una variable interviene en una f&oacute;rmula de otra variable, que directa o indirectamente interviene en la del operando.</font></p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">En FLAG ambos criterios se satisfacen mediante el uso del concepto de nivel de una f&oacute;rmula. El t&eacute;rmino se explica ampliamente en el resto del trabajo, pero significa que las f&oacute;rmulas se numeran, de manera que se ejecutan en orden ascendente del nivel asignado.</font></p>  	    <p align="justify"><font face="verdana" size="2">Las f&oacute;rmulas se almacenan en un archivo plano a medida que las define el cliente, quien generalmente no lo har&aacute; en un orden que garantice la propiedad mencionada. Por lo tanto, ser&aacute; necesario encontrar un orden de ejecuci&oacute;n de las f&oacute;rmulas que evite que un operando se calcule despu&eacute;s de una f&oacute;rmula que lo usa. Para ello, se ejecuta un proceso llamado <i>preparaci&oacute;n de f&oacute;rmulas</i> que logra ese objetivo, y que adem&aacute;s se aprovecha para otros fines como se explicar&aacute; a detalle en la secci&oacute;n de resultados.</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Se decidi&oacute; limitar el n&uacute;mero de subtotales a cuatro por f&oacute;rmula; del mismo modo, cada subtotal tendr&aacute; como m&aacute;ximo cuatro operaciones. Si una f&oacute;rmula necesitara m&aacute;s de cuatro subtotales, se crear&iacute;a una variable artificial intermedia. Los valores de estos dos m&aacute;ximos (cuatro) no resultan de alguna teor&iacute;a o recomendaci&oacute;n, solo fueron seleccionados como parte del dise&ntilde;o de FLAG, que contempla en forma prioritaria la facilidad para usar el sistema por parte de los interesados en hacerlo.</font></p>  	    <p align="justify"><font face="verdana" size="2">El t&eacute;rmino sin&oacute;nimo se explicar&aacute; posteriormente, pero la estructura con la que se almacenan las f&oacute;rmulas es la siguiente:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; F&oacute;rmula de la variable N&uacute;m. NNN</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Nivel: se agrega durante la preparaci&oacute;n</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Cu&aacute;ntos subtotales usa (puede usar menos de los 4)</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Subtotal (1 a 4)</font></p>  		    <blockquote> 		      <p align="justify"><font face="verdana" size="2">&#45; Cu&aacute;ntos operandos: los empleados en este subtotal</font></p>  			    <p align="justify"><font face="verdana" size="2">&#45; Operaci&oacute;n (1 a 4): solo las que se usan</font></p>  			    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&#45; Operandos (1 a 4): algunos operandos se reemplazar&aacute;n por sin&oacute;nimos.</font></p> 		</blockquote> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">Los operandos se indican con el tipo de operando (VCL, VMR, Sin&oacute;nimo, Subtotal) y n&uacute;mero de la variable o del subtotal.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2">Operandos aditivos</font></p>  	    <p align="justify"><font face="verdana" size="2">El operando de una f&oacute;rmula es aditivo si las operaciones que lo relacionan con los restantes operandos son la suma o la resta. Por ejemplo, en la f&oacute;rmula:</font></p>  	    <blockquote> 	      <p><font face="verdana" size="2">V(3) = V(4) + V(5) &#45; V(6)*V(7)</font></p> </blockquote>  	    <p align="justify"><font face="verdana" size="2">las variables V(4) y V(5) son operandos aditivos, mientras que V(6) y V(7) no lo son. Supongamos que V(4) cambi&oacute; en +21 unidades, y V(3) val&iacute;a (antes) 200. Entonces V(3) valdr&aacute; 221 despu&eacute;s de calculada la f&oacute;rmula, siempre que no hubieran cambiado los valores de los restantes operandos. En cambio, en la f&oacute;rmula de la variable n&uacute;mero 14:</font></p>  	    <p align="center"><font face="verdana" size="2">Subtotal (1) = V(30) + V(31); V(14) = subtotal (2)= subtotal (1) * V(32)</font></p>  	    <p align="justify"><font face="verdana" size="2">las variables V(30) y V(31) no son aditivas, ya que aunque lo son dentro del primer subtotal, este es un operando no aditivo de otro subtotal. De ese modo, si V(30) aument&oacute; en 15, el subtotal (1) tambi&eacute;n aumenta en 15, pero la V(14) no. El cambio en esta ser&aacute; 15* el valor de la variable (32).</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Cuando esto sucede, en lugar de ejecutar toda la f&oacute;rmula, se procede de la siguiente forma: supongamos que la variable C100 interviene en la f&oacute;rmula de la variable C120 y se determina que lo hace de forma aditiva. Solo variables calculadas del cliente se toman en cuenta para su aditividad (si la variable es "de abajo", los cambios en los valores son resultado de tecleo, de modo que no resultan en una ejecuci&oacute;n del modelo):</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">" Cuando cambia el valor de la variable C100 se almacena en memoria la diferencia entre el valor anterior y el nuevo (calculado).</font></p>  		    <p align="justify"><font face="verdana" size="2">" Para calcular el valor de la variable C120, se suma esa diferencia al valor que ten&iacute;a la variable C120 (o se restan, si el operando fuera un sustraendo).</font></p>  		    <p>&nbsp;</p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2"><b>Resultados</b></font></p>  	    <p align="justify"><font face="verdana" size="2">Transformaci&oacute;n del modelo en un &aacute;rbol</font></p>  	    <p align="justify"><font face="verdana" size="2">Cuando el cliente define las variables y f&oacute;rmulas del modelo, no se le exige determinar el orden en el que se ejecutan las f&oacute;rmulas; adem&aacute;s, en ocasiones, su modelo contendr&aacute; ciclos. Para eliminar estos &uacute;ltimos y preparar el modelo para su ejecuci&oacute;n correcta, FLAG <i>prepara</i> los modelos para lograr estos objetivos. El cliente prepara sus f&oacute;rmulas en un archivo y el FLAG lo transforma en otro mediante el proceso llamado: preparaci&oacute;n del archivo de f&oacute;rmulas. Este proceso se aprovecha para otras tareas.</font></p>  	    <p align="justify"><font face="verdana" size="2">En un &aacute;rbol, un subnodo no puede ser de m&aacute;s de un nodo, lo que se puede interpretar como: una variable no puede estar en m&aacute;s de una f&oacute;rmula. En general, cuando se formula un modelo, no se cumple esta condici&oacute;n. Por ejemplo, la superficie en has puede ser un operando de la f&oacute;rmula del volumen cosechado, pero tambi&eacute;n de la cantidad de semilla que se tiene que adquirir</font></p>  	    <p align="justify"><font face="verdana" size="2">En FLAG, se usa el concepto de <i>sin&oacute;nimo</i> de una variable para lograr la estructura deseada, es decir, cuando una variable se utiliza en m&aacute;s de una f&oacute;rmula se genera un sin&oacute;nimo. Los sin&oacute;nimos son entidades adicionales a las variables de cliente y a las VMR; toman los valores de las variables que reemplazan. En el modelo de la figura las variables VCL36, VCL156 y VCL349, VCL623, VMR023 y VMR45 requieren sin&oacute;nimos, ya que son operandos de m&aacute;s de una f&oacute;rmula.</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">El uso de los sin&oacute;nimos permite contemplar el modelo como &aacute;rbol sin imponer la restricci&oacute;n de que una variable no pueda estar en m&aacute;s de una f&oacute;rmula, lo que resultar&iacute;a en modelos mucho m&aacute;s limitados e insuficientes para diversas aplicaciones. El hecho de que sea un &aacute;rbol tambi&eacute;n permite graficar el modelo y construir los submodelos, el conjunto de variables que se ven afectadas por los cambios en los valores de una sola VMR.</font></p>     <p align="justify">&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2">Preparaci&oacute;n del archivo de f&oacute;rmulas</font></p>  	    <p align="justify"><font face="verdana" size="2">La preparaci&oacute;n del modelo para su ejecuci&oacute;n tiene los siguientes objetivos:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Calcular los niveles de las f&oacute;rmulas y con ellos una lista de f&oacute;rmulas en orden ascendente de nivel.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Para cada operando de cada f&oacute;rmula se determina si se trata de un operando aditivo.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Se reemplazan los operandos "repetidos" por sin&oacute;nimos, mismos que se numeran en orden progresivo a medida que se les necesita.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Se crea un nuevo archivo de f&oacute;rmulas, donde se guardar&aacute;n en orden, pero con los operandos sustituidos por sin&oacute;nimos cuando sea necesario.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Se agrega el submodelo de cada VMR que utiliza el modelo, es decir, una lista de f&oacute;rmulas que se ejecutar&aacute;n cuando la invocaci&oacute;n del modelo se deba a cambios de una &uacute;nica VMR.</font></p> 	</blockquote>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">A continuaci&oacute;n, se describe brevemente el programa que crea el archivo final a partir del archivo de f&oacute;rmulas preparado por el cliente, aqu&iacute; se dividi&oacute; la descripci&oacute;n en varios pasos, mismos que corresponden al orden en el que se ejecutan las diversas funciones necesarias.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Paso 1. Sin&oacute;nimos y aditividad (primera pasada)</b></font></p>  	    <p align="justify"><font face="verdana" size="2">El t&eacute;rmino "pasada" se usa en programaci&oacute;n para indicar que se leen todos los datos en forma secuencial. En este caso, se lee cada f&oacute;rmula en el orden en el que aparece dentro del archivo de f&oacute;rmulas. Para abreviar procesos posteriores se construye un arreglo de todas las f&oacute;rmulas en memoria.</font></p>  	    <p align="justify"><font face="verdana" size="2">El objetivo de este primer paso es comenzar el c&aacute;lculo del nivel de las f&oacute;rmulas, reemplazar operandos repetidos por sus sin&oacute;nimos y determinar la aditividad de los operandos de cada f&oacute;rmula. Para ello, se construyen tres arreglos con las estructuras que se muestran en las <a href="#t1">tablas 1</a>, <a href="#t2">2</a> y <a href="#t3">3</a>, respectivamente.</font></p>  	    <p align="center"><font face="verdana" size="2"><a name="t1"></a></font></p>  	    <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v16n4/a7t1.jpg"></font></p>  	    <p align="center"><font face="verdana" size="2"><a name="t2"></a></font></p>  	    <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v16n4/a7t2.jpg"></font></p>  	    <p align="center"><font face="verdana" size="2"><a name="t3"></a></font></p>  	    ]]></body>
<body><![CDATA[<p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v16n4/a7t3.jpg"></font></p>  	    <p align="justify"><font face="verdana" size="2">De esta manera, se procesa cada f&oacute;rmula del arreglo creado anteriormente a partir de las f&oacute;rmulas del archivo. Conviene recordar que solo las variables del cliente pueden tener una f&oacute;rmula y para cada una:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Si la variable con la que se calcula todav&iacute;a no se encuentra en el arreglo de variables del cliente, se agrega.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Se actualiza el campo "tiene f&oacute;rmula" a verdadero.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Para cada variable que aparece como operando de cada subtotal de la f&oacute;rmula, se actualizan los datos en el arreglo correspondiente a su tipo (del cliente o del mundo real), es decir, se suma 1 al campo "En cu&aacute;ntas f&oacute;rmulas aparece" y si el resultado es mayor que 1 se crea un sin&oacute;nimo de esa variable y se agrega al arreglo de sin&oacute;nimos (<a href="#t3">tabla 3</a>) con los datos que le corresponden, se actualiza el campo "variable que reemplaza" con la variable del operando actual y "<i>dad</i>" con el n&uacute;mero de la variable de la f&oacute;rmula en proceso; finalmente se reemplaza en la f&oacute;rmula el operando por su sin&oacute;nimo.</font></p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">Para cada operando de tipo VCL, se determina si interviene en la f&oacute;rmula como operando aditivo, examinando primero el subtotal en el que aparece, despu&eacute;s se hace lo propio con los subtotales en los que se encuentra ese subtotal como operando. De este modo se asigna un valor al campo es&#45;aditiva: 0 si no es aditivo, 1 si es sumando y &#45;1 si es sustraendo. Si un operando est&aacute; en m&aacute;s de un subtotal no es aditivo. Se hace lo mismo con los sin&oacute;nimos una vez que agregaron al arreglo de estos.</font></p>  	    <p align="justify"><font face="verdana" size="2">Para las VMR no se determina si intervienen como operandos aditivos, ya que al invocar una ejecuci&oacute;n solo se conocen los valores "nuevos" de estas variables, de modo que no se cuenta con una diferencia aplicable a la variable calculada con la f&oacute;rmula.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Paso 2. C&aacute;lculo de niveles</b></font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Se procesan todas las f&oacute;rmulas con el n&uacute;mero de pasadas que sean necesarias. Se calcula:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">Nivel de la f&oacute;rmula = Max (nivel de sus operandos) + 1</font></p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">Cada vez que cambia se actualiza el nivel de la variable en el arreglo de variables del cliente. Este proceso se repite hasta que ya no haya cambios de nivel. Si el n&uacute;mero de lecturas excede el n&uacute;mero de f&oacute;rmulas del modelo, hay por lo menos una referencia circular (bucle) en el modelo.</font></p>  	    <p align="justify"><font face="verdana" size="2">Para determinar las variables involucradas en el ciclo, se ejecuta el mismo proceso varias veces, pero ahora almacenando la informaci&oacute;n de los operandos que originan el cambio de nivel. Se interrumpe el proceso tras desplegar en el monitor del usuario las f&oacute;rmulas y sus operandos, que intervienen en el ciclo para que el encargado de formular el modelo pueda eliminarlo. Estos procesos tambi&eacute;n detectan la presencia de m&aacute;s de un ciclo.</font></p>  	    <p align="justify"><font face="verdana" size="2">Al t&eacute;rmino del c&aacute;lculo de niveles, se actualiza el nivel de cada f&oacute;rmula en el arreglo de f&oacute;rmulas en memoria, a partir del arreglo de variables del cliente. En la <a href="/img/revistas/iit/v16n4/a7f3.jpg" target="_blank">figura 3</a> se muestran los sin&oacute;nimos y los niveles de cada f&oacute;rmula del modelo, as&iacute; como la lista de f&oacute;rmulas en el orden que se producen en el siguiente paso.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Paso 3. Creaci&oacute;n de un arreglo de variables con f&oacute;rmulas en orden ascendente de nivel</b></font></p>  	    <p align="justify"><font face="verdana" size="2">Se recorre el arreglo de f&oacute;rmulas, de las que ya se ha calculado su nivel. Se agregan a un nuevo arreglo (el de f&oacute;rmulas en orden ascendente), insertando cada una en la posici&oacute;n que le corresponde con el ordenamiento por nivel y n&uacute;mero de variable.</font></p>  	    <p align="justify"><font face="verdana" size="2">Con el fin de proporcionar informaci&oacute;n sobre el archivo de f&oacute;rmulas preparado para la ejecuci&oacute;n del modelo, se describen algunos aspectos de este archivo. Su dise&ntilde;o result&oacute; de la b&uacute;squeda de eficiencia en la ejecuci&oacute;n del modelo, a pesar de que el impacto del dise&ntilde;o adoptado es m&iacute;nimo (se usa una vez por ejecuci&oacute;n) pero el hecho de que sustituye el uso de tablas de la base de datos es significativo.</font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">El archivo, es un archivo plano que se usa como "binario", y se divide en secciones:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Una parte fija, que contiene informaci&oacute;n del resto del archivo (de hecho, apuntadores a las dem&aacute;s secciones).</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Un arreglo que consta de los n&uacute;meros de las f&oacute;rmulas en orden creciente de nivel: es de longitud variable (depende del n&uacute;mero de f&oacute;rmulas del modelo). Se agrega la posici&oacute;n de cada f&oacute;rmula en el archivo: esto permite leer las f&oacute;rmulas (almacenadas en la siguiente del archivo) sin efectuar operaciones para determinar el segmento del archivo que la contiene.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Las f&oacute;rmulas mismas una tras otra con todas sus especificaciones, se graban a partir del arreglo de f&oacute;rmulas en memoria, en donde se incluye el nivel de la f&oacute;rmula y se reemplazan los operandos "repetidos" por sus sin&oacute;nimos.</font></p>  		    <p>&nbsp;</p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2"><b>Paso 4. Se graba el arreglo de f&oacute;rmulas ordenadas en el archivo de f&oacute;rmulas</b></font></p>  	    <p align="justify"><font face="verdana" size="2">Para cada una se indica la posici&oacute;n de esta f&oacute;rmula en el archivo final de f&oacute;rmulas (el byte en cual comienza).</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Paso 5. Se agregan las f&oacute;rmulas (que est&aacute;n en memoria) al archivo</b></font></p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Se recorre el "arreglo de f&oacute;rmulas en orden" y se graba cada una en el archivo, usando el campo "Posici&oacute;n en archivo final" actualizado en el paso anterior.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Paso 6. El armado del submodelo correspondiente a cada VMR</b></font></p>  	    <p align="justify"><font face="verdana" size="2">El submodelo correspondiente a una VMR consiste en el conjunto de variables cuyos valores pueden cambiar como resultado de cambios en los valores de esa VMR. Se recorre el arreglo de VMR armado en el paso 1 (<a href="#t2">tabla 2</a>) y se prepara un arreglo que denominamos arreglo &iacute;ndice de submodelos que contiene la informaci&oacute;n de cada VMR del arreglo. Posteriormente se completan los datos con la cantidad de f&oacute;rmulas del submodelo y la posici&oacute;n de la lista de sus f&oacute;rmulas en el archivo.</font></p>  	    <p align="justify"><font face="verdana" size="2">Para cada VMR, se actualiza un "arreglo de arreglos", donde el arreglo secundario corresponde a la lista de f&oacute;rmulas del submodelo. En una secci&oacute;n posterior dedicada precisamente a este tema de proporci&oacute;n se muestra la descripci&oacute;n detallada de la rutina con la que se arman los submodelos.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Paso 7. Se graba el arreglo &iacute;ndice de submodelos creado en el paso 6 en el archivo</b></font></p>  	    <p align="justify"><font face="verdana" size="2">En el registro base del archivo tambi&eacute;n se actualiza la posici&oacute;n inicial a partir de la cual se grab&oacute; este &iacute;ndice de submodelos. Al terminar el proceso para cada VMR, se agrega el "arreglo de arreglos" al archivo.</font></p>  	    <p align="justify"><font face="verdana" size="2">Con esto concluye el proceso de preparaci&oacute;n del archivo de f&oacute;rmulas para la ejecuci&oacute;n del modelo. En realidad, el programa tiene una funci&oacute;n adicional relacio&#45; nada con las alarmas (avisos urgentes) solicitadas por los clientes, tema que no se incluy&oacute;, ya que es independiente del asunto de art&iacute;culo. Los interesados en este tema pueden consultar detalles en Bauer y Vel&aacute;zquez (2010) . Se agregan al archivo los criterios de alarma del cliente, mismos que est&aacute;n en su base de datos. El prop&oacute;sito de incluirlos aqu&iacute; es el de no tener que usar esta base de datos.</font></p>  	    <p>&nbsp;</p>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Armado del submodelo de una VMR</font></p>  	    <p align="justify"><font face="verdana" size="2">El modelo que ilustra la <a href="/img/revistas/iit/v16n4/a7f4.jpg" target="_blank">figura 4</a> se incluy&oacute; con el &uacute;nico fin de ilustrar el proceso de creaci&oacute;n de un submodelo, por lo que no es necesaria la interpretaci&oacute;n de las diversas variables como parte de una situaci&oacute;n real. Un signo "+" o "&#45;" en los conectores de las variables con sus " dads " indica que esa variable interviene de forma aditiva en la f&oacute;rmula de dicho padre.</font></p>  	    <p align="justify"><font face="verdana" size="2">En la <a href="/img/revistas/iit/v16n4/a7f5.jpg" target="_blank">figura 5</a>, donde se describe el proceso de armado del submodelo, se utiliz&oacute; la siguiente notaci&oacute;n:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Arr&#95;dads: los "<i>dads</i> " de los sin&oacute;nimos de la variable. Para cada f&oacute;rmula de la lista se incluye el n&uacute;mero de variable, el nivel de la f&oacute;rmula y la hija que invoca dicha f&oacute;rmula.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; &#8594; L: agregar esta f&oacute;rmula a la lista de f&oacute;rmulas del submodelo.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; SRR (Ci, H) invoca la subrutina recursiva con los argumentos:</font></p> 	           <blockquote> 	          <p align="justify"><font face="verdana" size="2">Ci= variable</font></p> 	          <p align="justify"><font face="verdana" size="2">H = n&uacute;mero de la variable que invoc&oacute; la ejecuci&oacute;n de Ci.</font></p>       </blockquote> 	</blockquote>  	    ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Los valores del par&aacute;metro H son:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Cero si H no es operando aditivo.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Si es sumando, se usa el n&uacute;mero de la variable.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Si es restando (sustraendo) se cambia el signo del n&uacute;mero de la variable.</font></p> </blockquote>  	    <p align="justify"><font face="verdana" size="2">En el diagrama de la <a href="/img/revistas/iit/v16n4/a7f5.jpg" target="_blank">figura 5</a> se muestra la lista de f&oacute;rmulas conforme se agregaron al submodelo, esto es, en el orden en el que se generaban. Tambi&eacute;n se agreg&oacute; una lista final de f&oacute;rmulas, la cual debe tener las siguientes caracter&iacute;sticas:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Se especifica "la hija" si esta interviene en modo aditivo en la f&oacute;rmula que la invoca (de lo contrario, se indica hija = 0). Tambi&eacute;n se mencion&oacute; que las VMR no se consideran aditivas.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Las f&oacute;rmulas deben estar en orden ascendente de nivel. Observe que los niveles de las f&oacute;rmulas se calcularon previamente y se registraron en el arreglo de f&oacute;rmulas.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Si una f&oacute;rmula se repite en este arreglo, se elimina la repetida y se indica "hija = 0". Se podr&iacute;a invocar dos veces el c&aacute;lculo si ambas tuvieran hijas aditivas, pero se decidi&oacute; no contemplar esta situaci&oacute;n (ver C18 en el modelo de la <a href="/img/revistas/iit/v16n4/a7f3.jpg" target="_blank">figura 3</a>).</font></p>  		    ]]></body>
<body><![CDATA[<p>&nbsp;</p> 	</blockquote>  	    <p align="justify"><font face="verdana" size="2">Ejecuci&oacute;n de modelos</font></p>  	    <p align="justify"><font face="verdana" size="2">La ejecuci&oacute;n de las f&oacute;rmulas consiste en:</font></p>  	    <blockquote> 		    <p align="justify"><font face="verdana" size="2">&bull; Leer los valores de la variable a calcular.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Efectuar las operaciones de cada subtotal, para cada subtotal se cargan los valores de los operandos.</font></p>  		    <p align="justify"><font face="verdana" size="2">&bull; Cuando se haya calculado el &uacute;ltimo subtotal, se regraban los valores de la variable calculada con los del &uacute;ltimo subtotal (<a href="#f6">figura 6</a>).</font></p> 	</blockquote> 	    <p align="center"><a name="f6"></a></p> 	    <p align="center"><img src="/img/revistas/iit/v16n4/a7f6.jpg"></p>     <p align="justify"><font face="verdana" size="2">Si la f&oacute;rmula tiene la indicaci&oacute;n de que la invoc&oacute; un operando aditivo, no se efect&uacute;an las operaciones: solamente se aplica la diferencia de valores de la variable hija a los de la variable calculada (esa diferencia se ha calculado previamente en el mismo proceso).</font></p>  	    ]]></body>
<body><![CDATA[<p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2">Simulaci&oacute;n para cuantificar la reducci&oacute;n de las duraciones de los procesos</font></p>  	    <p align="justify"><font face="verdana" size="2">Para determinar el impacto de las mejoras sobre la duraci&oacute;n de la ejecuci&oacute;n de los modelos se formularon dos: Mod1 con 44 variables y 33 f&oacute;rmulas y Mod2 con 332 variables y 264 f&oacute;rmulas. En ambos se incluyeron VMRs con sin&oacute;nimos.</font></p>  	    <p align="justify"><font face="verdana" size="2">Se mencion&oacute; que uno de los aspectos que se contemplaron para reducir el tiempo de proceso era minimizar las operaciones de entrada y salida. Cuando se usan los valores de una variable (como variable a calcular o como operando) se dejan en memoria para evitar obtenerlas nuevamente de disco, cuando aparezcan como operandos en otra f&oacute;rmula como sin&oacute;nimos (un operando es un sin&oacute;nimo de la variable en cuesti&oacute;n). Esto es lo que se indica como "guardar valores ya le&iacute;dos".</font></p>  	    <p align="justify"><font face="verdana" size="2">Las ejecuciones son demasiado breves para comparar los algoritmos (duran pocos milisegundos) por lo que se invocaron ambos modelos 1000 veces. Adem&aacute;s se determin&oacute; la duraci&oacute;n de ejecutar el Mod1 500 veces y el Mod2 500 veces (para reflejar una situaci&oacute;n en la que hay que recalcular modelos de distintas dimensiones). Para comprobar que la duraci&oacute;n de N ejecuciones del mismo modelo es lineal (es N veces mayor a la de una sola ejecuci&oacute;n del modelo), se ejecutaron los modelos 500 veces y las duraciones eran pr&aacute;cticamente la mitad de las correspondientes a 1000 repeticiones. Las duraciones (en segundos con 3 decimales) que se muestran en la <a href="#f6">figura 6</a> se midieron desde el momento en que inicia el c&aacute;lculo del primer modelo hasta el fin del proceso de todos los modelos. Para determinar el impacto de cada una de las mejoras incorporadas a la nueva versi&oacute;n, se repitieron los procesos, incluyendo y excluyendo cada una de ellas.</font></p>  	    <p align="justify"><font face="verdana" size="2">En la <a href="/img/revistas/iit/v16n4/a7f7.jpg" target="_blank">Figura 7</a> se muestran los resultados de todas las combinaciones de opciones. En el uso de este programa, se ejecuta la simulaci&oacute;n para cada combinaci&oacute;n de opciones y se agregan las duraciones a un arreglo como el que se muestra en la imagen.</font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Conclusiones</b></font></p>  	    <p align="justify"><font face="verdana" size="2">Las simulaciones indican que se logr&oacute; el objetivo principal de reducir significativamente la duraci&oacute;n en las ejecuciones. Por un lado, los cambios hechos para evitar la lectura repetida de valores de operandos por s&iacute; solos redujeron las duraciones en aproximadamente 10%. El uso de los submodelos naturalmente produce una reducci&oacute;n mucho mayor, en especial cuando el modelo tiene operandos aditivos o cuando tiene muchas f&oacute;rmulas. De ese modo, esta versi&oacute;n del paquete FLAG es mucho m&aacute;s eficiente que su predecesora, lo que a su vez, significa que se podr&iacute;a ofrecer el servicio a un n&uacute;mero mayor de clientes.</font></p>  	    <p align="justify"><font face="verdana" size="2">Los algoritmos utilizados para crear y ejecutar los submodelos son aplicables a otro tipo de modelos, lo que le da generalidad al trabajo realizado. En particular, el nombre del FLAG surgi&oacute; de la conveniencia de poder ofrecer ese servicio a agronegocios, pero ning&uacute;n componente del servicio (ni de los aspectos t&eacute;cnicos) limita su aplicaci&oacute;n a cualquier otra situaci&oacute;n: la naturaleza de los modelos que permiten utilizar submodelos reside en su estructura, y no depende del tipo de f&oacute;rmulas o de las operaciones que se implementan.</font></p>  	    ]]></body>
<body><![CDATA[<p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Referencias</b></font></p>  	    <!-- ref --><p align="justify"><font face="verdana" size="2">Bauer&#45;Mengelberg J.R. An informing service based on models defined by its clients. <i>Informing Science: the International Journal of an Emerging Transdiscipline,</i> volumen 13, 2010: 87&#45;119.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4303707&pid=S1405-7743201500040000700001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>  	    <!-- ref --><p align="justify"><font face="verdana" size="2">Bauer&#45;Mengelberg J.R. and Vel&aacute;zquez G.D. Timely informing clients of the impact of changes in their business environment. <i>Issues in Informing Science and Information Technology,</i> volumen 7, 2010: 377&#45;392.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4303709&pid=S1405-7743201500040000700002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>  	    <p align="justify"><font face="verdana" size="2">Decision Models, <i>Array formulae</i> &#91;en l&iacute;nea&#93; &#91;fecha de consulta: 16 de febrero de 2014&#93;. Disponible en: <a href="http://www.decisionmodels.com/optspeedj.htm" target="_blank">http://www.decisionmodels.com/optspeedj.htm</a>.</font></p>  	    <!-- ref --><p align="justify"><font face="verdana" size="2">Decision Models, <i>Excel's smart recalculation,</i> 2008 &#91;en l&iacute;nea&#93; &#91;fecha de consulta: 4 de junio de 2014&#93;. Disponible en: <a href="http://www.decisionmodels.com/calcsecrets.htm" target="_blank">http://www.decisionmodels.com/calcsecrets.htm</a>.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4303712&pid=S1405-7743201500040000700003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>  	    <!-- ref --><p align="justify"><font face="verdana" size="2">Gackowski Z. Informing systems in business environments: a purpose&#45;focused view. <i>Informing Science Journal,</i> volumen 8, 2005: 101&#45;122.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4303714&pid=S1405-7743201500040000700004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>  	    <!-- ref --><p align="justify"><font face="verdana" size="2">RAE. Diccionario de la Real Academia Espa&ntilde;ola, <i>Definici&oacute;n: "F&oacute;rmula",</i> 2014 &#91;en l&iacute;nea&#93; &#91;fecha de consulta: 19 de febrero de 2014&#93;. Disponible en: <a href="http://lema.rae.es/drae/?val=f%C3%B3rmula" target="_blank">http://lema.rae.es/drae/?val=f&oacute;rmula</a>.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4303716&pid=S1405-7743201500040000700005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>  	    <!-- ref --><p align="justify"><font face="verdana" size="2">Vbforums. Specify a range for worksheet&#95;calculate method, 2011, &#91;en l&iacute;nea&#93; &#91;fecha de consulta: 2 de junio de 2014&#93;. Disponible en:<a href="http://www.vbforums.com/showthread.php?659881&#45;RESOLVED&#45;Specify&#45;a&#45;range&#45;for&#45;worksheet_calculate&#45;method" target="_blank">http://www.vbforums.com/showthread.php?659881&#45;RESOLVED&#45;Specify&#45;a&#45;range&#45;for&#45;worksheet_calculate&#45;method</a>.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4303718&pid=S1405-7743201500040000700006&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>  	    <!-- ref --><p align="justify"><font face="verdana" size="2">Weiss M.A. <i>Data structures and algorithm analysis,</i> 2a ed., Reedwood City, The Benjamin/Cummings Publishing Company, 1996, pp. 87&#45;93, 133&#45;138.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4303720&pid=S1405-7743201500040000700007&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>  	    <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Este art&iacute;culo se cita:</b></font></p>  	    <p align="justify"><font face="verdana" size="2"><b>Citaci&oacute;n estilo Chicago</b></font>    ]]></body>
<body><![CDATA[<br>     <font face="verdana" size="2">Bauer&#45;Mengelberg Juan Ricardo, Rafael Vega&#45;Ruiz. Algoritmo que ejecuta submodelos de un modelo matem&aacute;tico para mayor eficiencia. <i>Ingenier&iacute;a Investigaci&oacute;n y Tecnolog&iacute;a</i>, XVI, 04 (2015): 551&#45;563.</font></p>     <p align="justify"><font face="verdana" size="2"><b>Citaci&oacute;n estilo ISO 690</b></font>    <br> <font face="verdana" size="2">Bauer&#45;Mengelberg J.R., Vega&#45;Ruiz R. Algoritmo que ejecuta submodelos de un modelo matem &aacute;tico para mayor eficiencia. <i>Ingenier&iacute;a Investigaci&oacute;n y Tecnolog&iacute;a</i>, volumen XVI (n&uacute;mero 4), octubre&#45;diciembre 2015: 551&#45;563.</font></p>     <p>&nbsp;</p>  	    <p align="justify"><font face="verdana" size="2"><b>Semblanzas de los autores</b></font></p>  	    <p align="justify"><font face="verdana" size="2"><i><b>Juan Ricardo Bauer&#45;Mengelberg.</b></i> Licenciado en matem&aacute;ticas por la Universidad de Buenos Aires, Argentina. PhD en estad&iacute;stica e investigaci&oacute;n de operaciones por la University of Wisconsin, Madison donde imparti&oacute; cursos de programaci&oacute;n estoc&aacute;stica en la misma universidad. En M&eacute;xico, adem&aacute;s de ser profesor del Colegio de Posgraduados, una instituci&oacute;n dedicada a la ense&ntilde;anza e investigaci&oacute;n en agronom&iacute;a, pero que cuenta con departamentos de estad&iacute;stica y computaci&oacute;n aplicada, ha ocupado diversos puestos siempre en el campo de sistemas de informaci&oacute;n, tema del cual ha sido consultor toda su vida profesional.</font></p>  	    <p align="justify"><font face="verdana" size="2"><b><i>Rafael Vega&#45;Ruiz.</i></b> Ingeniero egresado de la carrera de irrigaci&oacute;n por la Universidad Aut&oacute;noma Chapingo. Obtuvo el grado de maestr&iacute;a en ciencias en el Colegio de Postgraduados con la tesis titulada: "Desarrollo completo del sistema FLAG". Actualmente es consultor en sistemas de informaci&oacute;n.</font></p>      ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Bauer-Mengelberg]]></surname>
<given-names><![CDATA[J.R.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[An informing service based on models defined by its clients]]></article-title>
<source><![CDATA[Informing Science: the International Journal of an Emerging Transdiscipline]]></source>
<year>2010</year>
<volume>13</volume>
<page-range>87-119</page-range></nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Bauer-Mengelberg]]></surname>
<given-names><![CDATA[J.R.]]></given-names>
</name>
<name>
<surname><![CDATA[Velázquez]]></surname>
<given-names><![CDATA[G.D.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Timely informing clients of the impact of changes in their business environment]]></article-title>
<source><![CDATA[Issues in Informing Science and Information Technology]]></source>
<year>2010</year>
<volume>7</volume>
<page-range>377-392</page-range></nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="">
<collab>Decision Models</collab>
<source><![CDATA[Excel's smart recalculation]]></source>
<year>2008</year>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Gackowski]]></surname>
<given-names><![CDATA[Z.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Informing systems in business environments: a purpose-focused view]]></article-title>
<source><![CDATA[Informing Science Journal]]></source>
<year>2005</year>
<volume>8</volume>
<page-range>101-122</page-range></nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="">
<collab>RAE</collab>
<source><![CDATA[Definición: "Fórmula"]]></source>
<year>2014</year>
</nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="">
<collab>Vbforums</collab>
<source><![CDATA[Specify a range for worksheet_calculate method]]></source>
<year>2011</year>
</nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Weiss]]></surname>
<given-names><![CDATA[M.A.]]></given-names>
</name>
</person-group>
<source><![CDATA[Data structures and algorithm analysis]]></source>
<year>1996</year>
<edition>2</edition>
<page-range>87-93</page-range><publisher-loc><![CDATA[Reedwood City ]]></publisher-loc>
<publisher-name><![CDATA[The Benjamin/Cummings Publishing Company]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
