<?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-77432010000100002</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[La aplicación del álgebra abstracta y las computadoras para la solución de problemas de caminos en redes orientadas]]></article-title>
<article-title xml:lang="en"><![CDATA[The Application of Abstract Algebra and Computers to the Solution of Path Problems in Oriented Networks]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Murray-Lasso]]></surname>
<given-names><![CDATA[M.A.]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Universidad Nacional Autónoma de México Facultad de Ingeniería Programa de Posgrado en Ingeniería]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>03</month>
<year>2010</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>03</month>
<year>2010</year>
</pub-date>
<volume>11</volume>
<numero>1</numero>
<fpage>1</fpage>
<lpage>16</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.mx/scielo.php?script=sci_arttext&amp;pid=S1405-77432010000100002&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-77432010000100002&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-77432010000100002&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[Se presenta la matriz de conexión de gráficas orientadas y una generalización introducida por Gondran y Minoux para resolver una gran variedad de problemas de caminos, incluyendo diversos problemas de optimización (maximizar o minimizar longitudes, capacidad mínima, probabilidad, etc.), enumeración de caminos, cuenta de caminos, y conexión. Para lograr lo anterior, se tratan a las componentes de las matrices como elementos de una estructura algebraica llamada semianillo o dioide (extensión de un monoide). Se explora la posibilidad de utilizar MATLAB en el manejo de matrices y se dan listados de programas cuyo objetivo es educativo y no de producción. Se pretende rescata run tema que no se ha popularizado debido, en la opinión del autor, a que los originadores Gondran y Minoux (1984) han tratado el tema en forma muy abstracta, orientado a matemáticos y difícil de captar por ingenieros. En este artículo se tratan los temas informalmente y se dan ejemplos ilustrativos (cosa que Gondran y Minoux, no proveen en gran detalle), así como listados de programas en el lenguaje de MATLAB. El tema se presta para seguirlo extendiendo y diseñar proyectos educativos computarizados para el aprendizaje de temas importantes de redes cuyas aplicaciones son muy extensas.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[The connection matrix of oriented graphs and a generalization introduced by Gondran and Minoux to solve a great variety of path problems, including various optimization problems (maximize or minimize lengths, minimum capacity, probability, etc.), ennumeration of paths, path counting, and connection. To achieve this the matrix components are treated as elements of an algebraic structure called semiring or diod (an extension of a monoid.) The possibilities of using MATLAB for handling the matrices are explored and listings of educational programs (not for production runs) are provided. The purpose is to rescue a topic which has not become very popular due, in the authors opinion, to the fact that the originators Gondran and Minoux (Ref. 3) have treated the topic in a very abstract manner, oriented to mathematicians and difficult to grasp by engineers. In this article the topics are treated informally and illustrative examples are given (something that Ref. 3 does not provide) in great detail as well as listings in the MATLAB language. The topic is ammenable to extensions and it is possible to design educational computerized projects for learning important network topics with very wide applications.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[álgebra abstracta]]></kwd>
<kwd lng="es"><![CDATA[matriz de conexión]]></kwd>
<kwd lng="es"><![CDATA[MATLAB]]></kwd>
<kwd lng="es"><![CDATA[caminos en redes]]></kwd>
<kwd lng="es"><![CDATA[optimización en redes]]></kwd>
<kwd lng="en"><![CDATA[Abstract algebra]]></kwd>
<kwd lng="en"><![CDATA[connection matrix]]></kwd>
<kwd lng="en"><![CDATA[MATLAB]]></kwd>
<kwd lng="en"><![CDATA[paths in networks]]></kwd>
<kwd lng="en"><![CDATA[network optimization]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="center"><font face="verdana" size="4"><b>La aplicaci&oacute;n del &aacute;lgebra abstracta y las computadoras para la soluci&oacute;n de problemas de caminos en redes orientadas</b></font></p>     <p align="center"><font face="verdana" size="2">&nbsp;</font></p>     <p align="center"><font face="verdana" size="3"><b><i>The Application of Abstract Algebra and Computers to the Solution of Path Problems in Oriented Networks</i></b></font></p>     <p align="center"><font face="verdana" size="2">&nbsp;</font></p>     <p align="center"><font face="verdana" size="2"><b>M.A. Murray&#150;Lasso</b></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><i>Divisi&oacute;n de Ingenier&iacute;a Mec&aacute;nica e Industrial. Programa de Posgrado en Ingenier&iacute;a. Facultad de Ingenier&iacute;a, Universidad Nacional Aut&oacute;noma de M&eacute;xico. E&#150;mail</i>: <a href="mailto:mamurraylasso@yahoo.com">mamurraylasso@yahoo.com</a></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2">Recibido: julio de 2006    <br> Reevaluado: enero de 2008    ]]></body>
<body><![CDATA[<br> Aceptado: agosto de 2009</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Resumen</b></font></p>     <p align="justify"><font face="verdana" size="2">Se presenta la matriz de conexi&oacute;n de gr&aacute;ficas orientadas y una generalizaci&oacute;n introducida por Gondran y Minoux para resolver una gran variedad de problemas de caminos, incluyendo diversos problemas de optimizaci&oacute;n (maximizar o minimizar longitudes, capacidad m&iacute;nima, probabilidad, etc.), enumeraci&oacute;n de caminos, cuenta de caminos, y conexi&oacute;n. Para lograr lo anterior, se tratan a las componentes de las matrices como elementos de una estructura algebraica llamada <i>semianillo o dioide </i>(extensi&oacute;n de un monoide). Se explora la posibilidad de utilizar MATLAB en el manejo de matrices y se dan listados de programas cuyo objetivo es educativo y no de producci&oacute;n. Se pretende rescata run tema que no se ha popularizado debido, en la opini&oacute;n del autor, a que los originadores Gondran y Minoux (1984) han tratado el tema en forma muy abstracta, orientado a matem&aacute;ticos y dif&iacute;cil de captar por ingenieros. En este art&iacute;culo se tratan los temas informalmente y se dan ejemplos ilustrativos (cosa que Gondran y Minoux, no proveen en gran detalle), as&iacute; como listados de programas en el lenguaje de MATLAB. El tema se presta para seguirlo extendiendo y dise&ntilde;ar proyectos educativos computarizados para el aprendizaje de temas importantes de redes cuyas aplicaciones son muy extensas.</font></p>     <p align="justify"><font face="verdana" size="2"><b>Descriptores: </b>&aacute;lgebra abstracta, matriz de conexi&oacute;n, MATLAB, caminos en redes, optimizaci&oacute;n en redes.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b><i>Abstract</i></b></font></p>     <p align="justify"><font face="verdana" size="2"><i>The connection matrix of oriented graphs and a generalization introduced by Gondran and Minoux to solve a great variety of path problems, including various optimization problems (maximize or minimize lengths, minimum capacity, probability, etc.), ennumeration of paths, path counting, and connection. To achieve this the matrix components are treated as elements of an algebraic structure called semiring or diod (an extension of a monoid.) The possibilities of using MATLAB for handling the matrices are explored and listings of educational programs (not for production runs) are provided. The purpose is to rescue a topic which has not become very popular due, in the authors opinion, to the fact that the originators Gondran and Minoux (Ref. 3) have treated the topic in a very abstract manner, oriented to mathematicians and difficult to grasp by engineers. In this article the topics are treated informally and illustrative examples are given (something that Ref. 3 does not provide) in great detail as well as listings in the MATLAB language. The topic is ammenable to extensions and it is possible to design educational computerized projects for learning important network topics with very wide applications.</i></font></p>     <p align="justify"><font face="verdana" size="2"><b><i>Keywords: </i></b><i>Abstract algebra, connection matrix, MATLAB, paths in networks, network optimization.</i></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><b>Introducci&oacute;n</b></font></p>     <p align="justify"><font face="verdana" size="2">En la soluci&oacute;n de ciertos problemas de redes que tienen que ver con caminos, la matriz de conexi&oacute;n generalizada juega un papel central. Si los problemas se plantean adecuadamente, algunos algoritmos cl&aacute;sicos como los de Jacobi y Gauss&#150;Seidel para resolver sistemas lineales de ecuaciones por iteraci&oacute;n, pueden utilizarse para resolver una variedad muy grande de problemas de caminos en redes. Los algoritmos resultantes son f&aacute;ciles de automatizar en lenguajes que manejan arreglos.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>La matriz de conexi&oacute;n y su generalizaci&oacute;n</b></font></p>     <p align="justify"><font face="verdana" size="2">Sea G una gr&aacute;fica orientada con <i>n </i>nodos, cada par (<i>i, j</i>) de los cuales est&aacute;n conectados en un sentido por, a lo m&aacute;s, una sola rama, a la cual se le da un peso <i>c<sub>ij</sub></i>. Se admiten conexiones entre un nodo y s&iacute; mismo. (Los pesos son n&uacute;meros reales que se pueden interpretar como longitudes, capacidades, confiabilidades, etc&eacute;tera). Se define la <i>matriz de conexi&oacute;n C </i>(tambi&eacute;n llamada <i>matriz asociada con la gr&aacute;fica </i>o <i>matriz de adyacencia) </i>como la matriz <i>n</i>&times;<i>n </i>que tiene como componentes <i>c<sub>ij</sub></i>,<i> i = 1, 2,... ,n</i>. (Bellman <i>et al</i>., 1970 y Mayeda, 1972). Cuando no existe conexi&oacute;n entre un par de nodos (o de un nodo con s&iacute; mismo) se pone un peso de cero. (Estamos pensando en pesos interpretados como capacidades; en caso de que fueran longitudes, se pondr&iacute;an infinitos que como veremos m&aacute;s adelante juegan un papel similar al cero para las operaciones que se utilizar&aacute;n al generalizar el concepto de matriz de conexi&oacute;n.)</font></p>     <p align="justify"><font face="verdana" size="2">Por ejemplo, para la gr&aacute;fica de la <a href="#f1">figura 1</a> con los pesos indicados junto a las ramas se tendr&iacute;a la matriz <i><b>C</b> </i>que se muestra en la <a href="#f1">figura 1</a>.</font></p>     <p align="center"><font face="verdana" size="2"><a name="f1"></a></font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2f1.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Una primera generalizaci&oacute;n de la matriz de conexi&oacute;n <i><b>C</b> </i>se puede hacer admitiendo m&aacute;s de una rama en paralelo en la misma direcci&oacute;n entre dos nodos o de un nodo con s&iacute; mismo. En este caso, simplemente se suman los pesos de las ramas en paralelo. (De nuevo estamos pensando en la interpretaci&oacute;n de capacidad para los pesos, con otras interpretaciones se aplican otras operaciones.) Para la gr&aacute;fica de la <a href="#f2">figura 2</a> su matriz de conexi&oacute;n generalizada es la que se muestra en la propia figura.</font></p>     <p align="center"><font face="verdana" size="2"><a name="f2"></a></font></p>     ]]></body>
<body><![CDATA[<p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2f2.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Una generalizaci&oacute;n adicional que se le puede hacer a la matriz de conexi&oacute;n, consiste en que, en vez que los pesos de las componentes sean n&uacute;meros reales, se les suponga elementos de un conjunto m&aacute;s amplio que permite la posibilidad de ser manipulado con operaciones como max, min, <img src="/img/revistas/iit/v11n1/a2s1.jpg"> (uni&oacute;n), &copy; (concatenaci&oacute;n), y otros. Para muchos de los problemas que nos interesan, basta que los elementos sean miembros de un <i>semianillo. </i>(Gondran y Minoux (1984) le llaman una <i>dioide) </i>&#91;Un semianillo es un conjunto <i>S </i>de elementos y dos operaciones <b><img src="/img/revistas/iit/v11n1/a2s2.jpg"> </b>y <img src="/img/revistas/iit/v11n1/a2s3.jpg">. La operaci&oacute;n <img src="/img/revistas/iit/v11n1/a2s2.jpg"> a la cual llamaremos <i>suma </i>genera en <i>S </i>la estructura de un <i>monoide conmutativo </i>del cual llamaremos &#949; al elemento neutro <i>cero.</i></font></p>     <p align="justify"><font face="verdana" size="2">La operaci&oacute;n <img src="/img/revistas/iit/v11n1/a2s3.jpg">, a la cual llamaremos <i>multiplicaci&oacute;n, </i>genera en <i>S </i>la estructura de un <i>monoide </i>(no necesariamente conmutativo) y tiene un elemento neutro <i>e, </i>llamado <i>unidad. </i>La ley distributiva de la multiplicaci&oacute;n con respecto a la suma se cumple de los dos lados. (Mac&#150;Lane <i>et al., 1967 y </i>Gondran y Minoux, 1984)&#93;. Por ejemplo, el sistema algebraico <i>(<u>R</u>, </i><b>min</b>, +) es un semianillo, donde <i><u>R</u></i> es el conjunto de los reales complementados con &#8734;, <i>cero </i><b><img src="/img/revistas/iit/v11n1/a2s4.jpg"> </b>&#8734; (un n&uacute;mero especial mayor que cualquier real), y la <i>unidad </i><b><img src="/img/revistas/iit/v11n1/a2s4.jpg"><i> </i></b>0 (el cero de los reales). La operaci&oacute;n + es la suma entre reales y <b>min</b> es la funci&oacute;n de dos variables que da como valor la que est&aacute; m&aacute;s a la izquierda en la recta num&eacute;rica.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Propiedad fundamental de la matriz de conexi&oacute;n. Cuenta de caminos</b></font></p>     <p align="justify"><font face="verdana" size="2">La matriz de conexi&oacute;n original de una gr&aacute;fica orientada con pesos en las ramas, obtiene su utilidad de la siguiente propiedad: el cuadrado de la matriz de conexi&oacute;n tiene como elemento (<i>i, j</i>) la suma de los productos de los pesos de las ramas que forman caminos con dos tramos que parten del nodo <i>i</i> y llegan al nodo <i>j</i>. La propiedad proviene de la manera en que se define el producto de dos matrices reales n&times;n; as&iacute; por ejemplo, si <i><b>D</b></i><b><i>=C</i></b><sup>2</sup>, la matriz <i>D </i>tiene componentes</font></p>     <p align="center"><font size="2" face="verdana"><img src="/img/revistas/iit/v11n1/a2s5.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Los caminos de dos tramos que parten del nodo <i>i </i>y llegan al nodo <i>j</i>, necesariamente tienen su primera rama (<i>i,k</i>) saliendo de <i>i </i>y yendo a un nodo <i>k </i>(el cual podr&iacute;a ser el mismo <i>i</i>) y luego su segunda rama parte del nodo <i>k </i>y llega al nodo <i>j.</i></font></p>     <p align="justify"><font face="verdana" size="2">Como en la sumatoria se da a <i>k </i>todos los posibles valores, aparecen todos los posibles caminos con dos tramos, excepto aquellos que en uno de los dos tramos tiene peso cero, es decir, que no existe el tramo. Si calculamos el cuadrado de la matriz <i><b>C</b> </i>de la <a href="#f1">figura 1</a> se obtiene:</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s6.jpg"></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">El lector puede verificar la aseveraci&oacute;n examinando la <a href="#f1">figura 1</a>.</font></p>     <p align="justify"><font face="verdana" size="2">Si se desea la suma de los productos de los pesos de las ramas de todos los caminos con tres ramas que parten del nodo <i>i </i>y llegan al nodo <i>j, </i>basta examinar la componente (<i>i, j</i>) del cubo <i><b>E=C</b></i><sup>3</sup> de la matriz de conexi&oacute;n <i><b>C</b>.</i></font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s7.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Debido a que el componente <i>e<sub>ij</sub> </i>del cubo de <i><b>C</b> </i>combina todos los caminos de dos tramos (contenidos en <i><b>C</b><sup>2</sup></i>) que parten del nodo <i>i </i>y llegan a cualquier nodo <i>k </i>con los caminos de un tramo (contenidos en <i><b>C</b></i>) que van del nodo <i>k </i>al nodo <i>j</i>, dicha componente es igual a la suma de los productos de los pesos de todos los caminos de tres ramas que parten del nodo <i>i</i><b> </b>y llegan al nodo <i>j</i>. Lo anterior se puede verificar para la gr&aacute;fica de la <a href="#f1">figura 1</a> examinando la matriz <i><b>E</b>. </i>Notamos que algunos de los caminos repiten algunas de las ramas y en el caso del lazo que conecta al nodo <i>1 </i>consigo mismo, hasta 3 veces.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>El problema de enumeraci&oacute;n de caminos</b></font></p>     <p align="justify"><font face="verdana" size="2">Si se hubieran dado valores num&eacute;ricos a las letras <i>a, b, c,..., h </i>quiz&aacute;s no hubi&eacute;ramos notado que mientras tengamos cuidado de mostrar los productos en el orden que aparecen los factores, las secuencias nos identifican los caminos. As&iacute;, por ejemplo, en la componente (<i>2, 3</i>) de <i><b>E</b>, dfg </i>denota el camino de tres tramos que parte del nodo 2 y llega al nodo 3 y recorre las ramas <i>d, f </i>y<i> g. </i>Podemos entonces pensar en <i>d, f </i>y<i> g, </i>no como n&uacute;meros reales, sino como s&iacute;mbolos y <i>dfg </i>como una concatenaci&oacute;n de s&iacute;mbolos. En el componente (<i>1,3</i>) a la expresi&oacute;n <i>abd + acg + beg </i>la podemos interpretar como la uni&oacute;n de los tres caminos de 3 tramos <i>abd, acg y beg. </i>Concluimos que si en vez de multiplicaci&oacute;n y suma usamos concatenaci&oacute;n y uni&oacute;n, podemos enumerar los caminos a trav&eacute;s de las potencias de la matriz de conexi&oacute;n. En vez del n&uacute;mero real 0, lo que corresponde en este caso (para la operaci&oacute;n uni&oacute;n) ser&iacute;a <img src="/img/revistas/iit/v11n1/a2s8.jpg">, el <i>conjunto vac&iacute;o. </i>Notamos que a la propiedad de los n&uacute;meros reales <i>0. R = 0 </i>corresponde la propiedad <b><img src="/img/revistas/iit/v11n1/a2s8.jpg"> </b>&copy; <i>c = </i><img src="/img/revistas/iit/v11n1/a2s8.jpg"><i>, </i>donde <i>c </i>es cualquier cadena de s&iacute;mbolos y &copy; es la operaci&oacute;n de concatenaci&oacute;n que corresponde a lo que m&aacute;s abstractamente le llamamos la operaci&oacute;n de multiplicaci&oacute;n <img src="/img/revistas/iit/v11n1/a2s3.jpg">. La interpretaci&oacute;n de esta propiedad es que cualquier cadena que se encuentre en un camino con un hueco (ausencia de camino) tiene el efecto de eliminar el camino. Tambi&eacute;n notamos que con respecto a la operaci&oacute;n de uni&oacute;n el conjunto vac&iacute;o de s&iacute;mbolos es neutro, es decir, <b><img src="/img/revistas/iit/v11n1/a2s8.jpg"><img src="/img/revistas/iit/v11n1/a2s1.jpg"></b><i>T = T </i>donde <i>T </i>es un conjunto de cadenas de s&iacute;mbolos. Con respecto a la operaci&oacute;n de concatenaci&oacute;n el elemento neutro es la cadena vac&iacute;a <img src="/img/revistas/iit/v11n1/a2s9.jpg">, pues se tiene que para cualquier cadena <i>c</i></font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s10.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Regresando a la primera generalizaci&oacute;n de la matriz de conexi&oacute;n con pesos para las ramas, los cuales representan n&uacute;meros de caminos directamente conectados entre 2 nodos, el peso total de un camino que parte del nodo <i>i</i><b> </b>y llega al nodo <i>j</i>, representa el n&uacute;mero total de caminos diferentes que conectan los nodos <i>i</i><b> </b>e <i>j</i>. Por ejemplo, si suponemos en la <a href="#f2">figura 2</a> que todas las letras, con o sin &iacute;ndices valen 1, las matrices <i><b>C</b> </i>, <i><b>C</b></i><sup>2</sup> y <i><b>C</b></i><sup>3 </sup>valdr&iacute;an</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s11.jpg"></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Examinemos la componente <i>e<sub>23</sub></i>= <i>6</i>. Su valor indica que hay 6 diferentes caminos de tres tramos en la gr&aacute;fica de la <a href="#f2">figura 2</a> que parten del nodo 2 y llegan al nodo 3. Dichos caminos son (listando las secuencias de aristas): <i>a<sub>1</sub>bd<sub>1</sub>, a<sub>1</sub>bd<sub>2</sub>, a<sub>1</sub>bd<sub>3</sub>, a<sub>2</sub>bd<sub>1</sub>, a<sub>2</sub>bd<sub>2</sub>, a<sub>2</sub>bd<sub>3</sub>.</i></font></p>     <p align="justify"><font face="verdana" size="2">El lector puede examinar las dem&aacute;s componentes de las matrices <i><b>D</b> </i>y <i><b>E</b> </i>para revisar los caminos de dos y tres tramos.</font></p>     <p align="justify"><font face="verdana" size="2">Si se hace una correspondencia entre las operaciones que se utilizan para la cuenta de caminos y las que se utilizan para enumerar caminos por medio de concatenaci&oacute;n obtenemos lo que se muestra en la <a href="/img/revistas/iit/v11n1/a2t1.jpg" target="_blank">tabla 1</a>.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Enumeraci&oacute;n de caminos elementales</b></font></p>     <p align="justify"><font face="verdana" size="2">Cuando se representan las ramas de una gr&aacute;fica por medio de una letra diferente para cada una y se obtienen simb&oacute;licamente las potencias de la matriz de conexi&oacute;n, aparecen todas las secuencias de las aristas que forman caminos, ya sea que dichos caminos se cierren e incluyan ciclos. Un camino contiene ciclos si aparece un nodo m&aacute;s de una vez. Es dif&iacute;cil detectar si una secuencia de artistas contiene un nodo repetido. Para facilitar la detecci&oacute;n resulta conveniente describir los caminos por medio de sucesiones de nodos tales que un nodo repetido se pueda detectar f&aacute;cilmente. Si adoptamos esta idea, una rama que vaya del nodo <i>i</i> al nodo <i>j</i> queda representada por el par <i>ij.</i></font></p>     <p align="justify"><font face="verdana" size="2">Si la siguiente arista va del nodo<i> j</i> al nodo <i>k </i>el camino con las dos ramas queda descrito por el tr&iacute;o de nodos <i>ijk. </i>Notamos que la operaci&oacute;n para construir las secuencias de nodos resulta ser una concatenaci&oacute;n modificada pues en vez de poner <i>ijjk, </i>una de las <i>j's </i>se elimina. Adicionalmente se debe revisar que, excepto por el &uacute;ltimo nodo de la primera cadena y el primer nodo de la segunda cadena, los dem&aacute;s nodos son todos distintos si los caminos son elementales. A este proceso de eliminar uno de los nodos extremos y evitar nodos repetidos se le llama Multiplicaci&oacute;n Latina (Kaufman <i>et al., </i>1963).</font></p>     <p align="justify"><font face="verdana" size="2">Concluimos que para encontrar caminos elementales en una gr&aacute;fica con <i>n </i>nodos con diferentes n&uacute;meros de tramos, hay que encontrar la suma de las <i>n </i>potencias de la matriz de conexi&oacute;n <i><b>C</b></i><sup>0</sup>, <i><b>C</b></i><sup>1</sup>, <i><b>C</b></i><sup>2</sup>,..., <i><b>C</b></i><sup>n&#150;1</sup> (como en el caso de la enumeraci&oacute;n de caminos sin restricci&oacute;n) solamente que para la segunda operaci&oacute;n se usa la multiplicaci&oacute;n latina en vez de la simple concatenaci&oacute;n. El elemento neutro de la segunda operaci&oacute;n <img src="/img/revistas/iit/v11n1/a2s3.jpg"> (multiplicaci&oacute;n latina) es el conjunto N, cuyos elementos son los nodos de la red, ya que bajo la multiplicaci&oacute;n latina se tiene que si c es una secuencia de nodos representando un camino</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s12.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><b>El problema de la ruta m&aacute;s corta</b></font></p>     <p align="justify"><font face="verdana" size="2">Regresemos ahora a la <a href="#f2">figura 2</a> e interpretemos las letras junto a las aristas como longitudes de las ramas. Nos interesa encontrar la ruta m&aacute;s corta entre los nodos 1 y 3. Dado que todos los ciclos de la gr&aacute;fica tienen longitud positiva, a ninguna ruta m&aacute;s corta entre dos nodos le conviene incluir un ciclo. De esta forma, la ruta m&aacute;s corta a lo mucho, pasar&aacute; por todos los cinco nodos y por lo tanto, tendr&aacute; 4 tramos. Podr&iacute;amos encontrar todos los caminos de 4 tramos entre los nodos 1 y 3. Esto lo podr&iacute;amos hacer encontrando la cuarta potencia de su matriz de conexi&oacute;n. El hacerlo simb&oacute;licamente y a mano es laborioso; sin embargo, con un poco de reflexi&oacute;n nos podemos ahorrar trabajo. En vez de usar la matriz de conexi&oacute;n de la <a href="#f2">figura 2</a>, entre cada par de nodos podemos dejar solamente la rama m&aacute;s corta, a la cual nombramos con la letra correspondiente sin &iacute;ndice. Es as&iacute; que volvemos a la matriz de conexi&oacute;n de la <a href="#f1">figura 1</a> que es m&aacute;s simple.</font></p>     <p align="justify"><font face="verdana" size="2">Al elevar la matriz de conexi&oacute;n al cuadrado podemos hacer de nuevo el razonamiento que debemos dejar de entre todos los caminos de dos tramos entre un par de nodos el m&aacute;s corto. Tambi&eacute;n podemos ignorar todos los caminos que incluyen ciclos. Estos razonamientos se pueden extender a las subsecuentes potencias de la matriz de conexi&oacute;n hasta la cuarta que es la que requerimos.</font></p>     <p align="justify"><font face="verdana" size="2">Por otra parte, aunque hemos usado el t&eacute;rmino potencia, la cual tiene que ver con multiplicaciones, que es el caso para cuenta de caminos, ya que los n&uacute;meros de caminos diferentes se obtienen multiplicando los n&uacute;meros de alternativas entre cada par de nodos en una secuencia de nodos que definen un camino, para el caso de longitudes de caminos dichas longitudes se suman en vez de multiplicarse y como ya hemos visto entre cada par de nodos se toma la longitud m&iacute;nima. Con esto hemos establecido las correspondencias que se muestran en la <a href="/img/revistas/iit/v11n1/a2t2.jpg" target="_blank">tabla 2</a>.</font></p>     <p align="justify"><font face="verdana" size="2">La raz&oacute;n por la cual &#8734; es el elemento neutro de la operaci&oacute;n <i>Min </i>es que para cualquier n&uacute;mero real <i>r </i>se tiene Min (r, &#8734;) = r que es precisamente la caracter&iacute;stica que define al elemento neutro, ya que, por ejemplo,</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s13.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">La &uacute;nica operaci&oacute;n de las introducidas que no es conmutativa es la concatenaci&oacute;n que se usa como segunda operaci&oacute;n; sin embargo, todas las primeras operaciones son conmutativas y todas las segundas operaciones distribuyen de ambos lados con las primeras operaciones y todas, primeras y segundas tienen un elemento neutro por ambos lados.</font></p>     <p align="justify"><font face="verdana" size="2">Las operaciones que se corresponden en las <a href="/img/revistas/iit/v11n1/a2t1.jpg" target="_blank">tablas 1</a> y <a href="/img/revistas/iit/v11n1/a2t2.jpg" target="_blank">2</a> son tan similares que frecuentemente se utilizan los mismos s&iacute;mbolos (en lenguajes de computaci&oacute;n, por ejemplo) para denotar dichas operaciones. En BASIC, se utiliza + para concatenaci&oacute;n de cadenas de s&iacute;mbolos. En algunos libros de matem&aacute;ticas se utiliza el s&iacute;mbolo + para la uni&oacute;n de conjuntos.</font></p>     <p align="justify"><font face="verdana" size="2">En algunos libros se utiliza un cero tachado (que se parece mucho a la letra griega <i>fi</i>) para denotar el conjunto vac&iacute;o.</font></p>     <p align="justify"><font face="verdana" size="2">Para clarificar ideas d&eacute;mosle a las letras que denotan los pesos en la <a href="#f2">figura 2</a> diversos valores que representan longitudes como sigue:</font></p>     ]]></body>
<body><![CDATA[<p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s14.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Aprovechando el trabajo algebraico realizado, podemos ir directamente a la matriz <i><b>F=C</b></i><sup>4</sup>, sustituir en las expresiones algebr&aacute;icas los valores num&eacute;ricos sumando en vez de multiplicar y aplicar en vez del operador suma el operador <i>Min</i>. Comenzamos por exhibir la matriz <i><b>C</b></i><sup>4 </sup>en la <a href="#t3">tabla 3</a>.</font></p>     <p align="center"><font face="verdana" size="2"><a name="t3"></a></font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2t3.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Ante todo, podemos ignorar todos los t&eacute;rminos en los que aparece <i>a. </i>Tambi&eacute;n podemos ignorar todos los t&eacute;rminos en que un s&iacute;mbolo aparece repetido, pues esto indica un ciclo.</font></p>     <p align="justify"><font face="verdana" size="2">Las distancias m&aacute;s cortas de un nodo a si mismo son cero en todos los casos, por lo que a la matriz final de distancias m&aacute;s cortas (<a href="#t4">tabla 4</a>) le ponemos ceros en la diagonal principal. Tenemos que comparar las longitudes de un tramo, dos tramos, tres tramos y cuatro tramos, por lo que habr&aacute; que examinar las matrices <i><b>C</b>,<b>C</b></i><sup>2</sup>, <i><b>C</b></i><sup>3</sup> y <i><b>C</b></i><sup>4</sup>.</font></p>     <p align="center"><font face="verdana" size="2"><a name="t4"></a></font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2t4.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Comentarios a la <a href="#t4">tabla 4</a>: No hay modo de llegar legalmente (sin irse en sentido contrario) entre los pares de nodos que tienen &#8734;. Por ejemplo, la &uacute;nica manera de ir al nodo 5 o al nodo 1 es comenzar en dichos nodos. Verificando sobre la <a href="#f2">figura 2</a> tenemos las siguientes rutas:</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 1&#150;2. Directo de 1 a 2, longitud b = 3.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Ruta 1&#150;3. Dos tramos. 1a4a3, c + g = 4 + 2.4 = 6.4</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 1&#150;4. Directo de 1 a 4, longitud d = 5</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 2&#150;3. Directo de 2 a 3, longitud c = 4</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 2&#150;4. Directo de 2 a 4, longitud e = 7.5</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 3&#150;4. Directo de 3 a 4, longitud f = 4.5</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 4&#150;3. Directo de 4 a 3, longitud g = 2.4</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 5&#150;3. Directo de 5 a 3, longitud h = 8.6</font></p>     <p align="justify"><font face="verdana" size="2">Ruta 5&#150;4. Dos tramos 5a3a4, h + f = 8.6 + 4.5 = 13.1</font></p>     <p align="justify"><font face="verdana" size="2">El calcular las expresiones algebraicas de <i><b>C</b> , <b>C</b></i><sup>2</sup>, <i><b>C</b></i><sup>3</sup>, y <i><b>C</b></i><sup>4</sup> para encontrar todos los caminos de 1, 2, 3 y 4 tramos, luego sustituir valores num&eacute;ricos y encontrar el valor m&iacute;nimo para encontrar las longitudes de los caminos m&aacute;s cortos, aunque correcto, es un proceso largo e ineficiente. El proceso se parece al c&aacute;lculo del determinante de una matriz haciendo la expansi&oacute;n en productos, tomando factores de cada fila y cada columna y afect&aacute;ndolos de un signo que depende de la paridad de la permutaci&oacute;n de los &iacute;ndices. El proceso de comenzar dando a los elementos sus valores num&eacute;ricos y de triangularizar el arreglo por medio de operaciones elementales de las filas, que dejan invariante el valor del determinante y una vez triangularizado calcular el producto de los elementos en la diagonal principal (M&eacute;todo de Gauss) es mucho m&aacute;s eficiente, debido a que va combinando elementos y encontrando sus valores num&eacute;ricos durante el proceso, evitando la explosi&oacute;n de t&eacute;rminos que produce la ley distributiva de la multiplicaci&oacute;n respecto a la suma.</font></p>     <p align="justify"><font face="verdana" size="2">En forma an&aacute;loga, si al calcular las potencias de la matriz de conexi&oacute;n, primero se les dan a los elementos sus valores num&eacute;ricos y se va aplicando el operador <i>Min </i>en el camino, se evita la explosi&oacute;n de t&eacute;rminos, eficientando en forma muy importante el trabajo. Un primer paso en este proceso, lo dimos en la matriz <i><b>C</b> </i>de la <a href="#f2">figura 2</a>, conservando de las ramas paralelas s&oacute;lo la que tiene longitud m&iacute;nima. Invitamos al lector a sentir la explosi&oacute;n de t&eacute;rminos encontrando las matrices <i><b>C</b></i><sup>2</sup>, <i><b>C</b></i><sup>3</sup> y <i><b>C</b></i><sup>4</sup> y percatarse de la enorme simplificaci&oacute;n al haber eliminado las ramas paralelas de la <a href="#f2">figura 2</a>, y haberla dejado con la estructura de la <a href="#f1">figura 1</a>. Hacer simplificaciones adicionales en el camino antes de calcular las dem&aacute;s potencias reduce a&uacute;n m&aacute;s el trabajo.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Lo anterior logra la determinaci&oacute;n de las distancias m&aacute;s cortas entre todos los pares de puntos de una red. No siempre interesa todos los nodos contra todos. Frecuentemente se requiere la distancia m&aacute;s corta de un origen a todos los puntos de la red, o de todos los puntos de la red a un destino. Esto se puede obtener calculando una sola columna o una sola fila de la matriz final. Para calcular una sola columna de la matriz final se "premultiplica" (estamos usando la palabra "multiplicar" en el sentido ampliado que en nuestro caso es sumar; la multiplicaci&oacute;n de matrices por vectores involucra tambi&eacute;n "sumas", es decir, en nuestro caso la aplicaci&oacute;n del operador <i>Min) </i>n&#150;2 veces la matriz <i><b>C</b> </i>por la columna en cuesti&oacute;n.</font></p>     <p align="justify"><font face="verdana" size="2">Es interesante hacer notar que esta operaci&oacute;n equivale al algoritmo de Programaci&oacute;n Din&aacute;mica de Bellman <i>it al. </i>(1962 y 1970) y para encontrar las rutas m&aacute;s cortas de todos los nodos a un destino en una red. Si se desea obtener solamente una fila de la matriz final, entonces dicha fila se "postmultiplica" n&#150;2 veces por la matriz <i><b>C</b></i>. Es instructivo resolver un ejemplo num&eacute;rico para clarificar ideas, por lo tanto, calcularemos las distancias m&aacute;s cortas desde el nodo 7 a todos los nodos de la red de la <a href="#f3">figura 3</a> (Hu, 1969).</font></p>     <p align="center"><font face="verdana" size="2"><a name="f3"></a></font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2f3.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">En la red de la <a href="#f3">figura 3</a> todas las ramas, excepto tres, admiten circulaci&oacute;n en ambos sentidos. Dichas ramas pueden ser sustituidas por pares de ramas con sentidos opuestos, cada una con longitud igual a la marcada. Aunque no hemos dibujado los pares de ramas, est&aacute;n consideradas en la matriz de conexi&oacute;n <i>C . </i>Como tomamos como origen el nodo 7, vamos a "postmultiplicar" la s&eacute;ptima fila de <i><b>C</b> </i>repetidamente por <i><b>C</b>. </i>Mostramos el trabajo en gran detalle para las primeras dos "multiplicaciones."</font></p>     <p align="justify"><font face="verdana" size="2">El vector original es<b> <i>C</i></b><i><sub>7</sub> = </i>&#91;&#8734;,&#8734;,&#8734;, 20, 1, 1, 0&#93;. Las componentes de la s&eacute;ptima fila de <i><b>C</b></i><sup>2</sup> son:</font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>2</sup><sub>71</sub> =   Min &#91;&#8734; + 0, &#8734; + 11, &#8734;+ 30, 20 + &#8734;, 1 + &#8734;, 1 + &#8734;, 0 + &#8734;&#93; = &#8734;</font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>2</sup><sub>72</sub> =   Min &#91;&#8734; + 11, &#8734; + 0, &#8734; + &#8734;, 20 + 12,1 + 2,1 + &#8734;, 0 + &#8734;&#93; = 3 </font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>2</sup><sub>73</sub> =   Min &#91;&#8734; + 30, &#8734; + &#8734; , &#8734; + 0, 20 + 19, 1 + &#8734;, 1 + 4, 0 + &#8734;&#93; = 5 </font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>2</sup><sub>74</sub> =   Min &#91;&#8734; + &#8734;, &#8734; + 12, &#8734; + 19, 20 + 0, 1 + 11, 1 + 9, 0 + 20&#93; = 10 </font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>2</sup><sub>75</sub> =   Min &#91;&#8734; + &#8734;, &#8734; + 2, &#8734; + &#8734;, 20 + 11, 1 + 0, 1 + &#8734;, 0 + 1&#93; = 1 </font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>2</sup><sub>76</sub> =   Min &#91;&#8734; + &#8734;, &#8734; + &#8734;, &#8734; + 4, 20 + 9, 1 + &#8734;, 1 + 0, 0 + 1&#93; = 1 </font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>2</sup><sub>77</sub> =   Min &#91;&#8734; + &#8734;, &#8734; + &#8734;, &#8734; + &#8734;, 20 + &#8734;,1 + &#8734;, 1 + &#8734; , 0 + 0&#93; = 0</font></p>     <p align="justify"><font face="verdana" size="2">El vector resultante (s&eacute;ptima fila de <i><b>C</b></i><sup>2</sup>) es <i><b>C</b></i><sup>2</sup><sub>7</sub> = &#91;&#8734;, 3, 5, 10, 1, 1, 0&#93;.</font></p>     <p align="justify"><font face="verdana" size="2">Al "sumar" el vector &#91;&#8734;, &#8734;, &#8734;, &#8734;, &#8734;, &#8734;, 0&#93; (s&eacute;ptimo vector unitario) con el vector &#91;&#8734;,&#8734;,&#8734;, 20, 1, 1, 0&#93; y con el vector recientemente calculado &#91;&#8734;, 3, 5, 10, 1, 1, 0&#93; obtenemos el vector &#91;&#8734;, 3, 5, 10, 1, 1, 0&#93;. (Recordar que "sumar", en este caso, significa tomar el m&iacute;nimo). A <i><b>C</b></i><sup>2</sup><sub>7</sub> se "postmultiplica" por <i>C y </i>se obtienen las siguientes componentes de la s&eacute;ptima fila de <i><b>C</b></i><sup>3</sup>.</font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>3</sup><sub>71</sub> =   Min &#91;&#8734; + 0, 3 + 11, 5 + 30,10 + &#8734;, 1 + &#8734;, 1 + &#8734;, 0 + &#8734;&#93; = 14</font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>3</sup><sub>72</sub> =   Min &#91;&#8734; + 11, 3 + 0, 5 + &#8734;, 10 + 12, 1 + 2, 1 + &#8734;, 0 + &#8734;&#93; =3</font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>3</sup><sub>73</sub> =   Min &#91;&#8734; + 30, 3 + &#8734;, 5 + 0,10 + 19, 1 + &#8734;, 1 + 4,&nbsp; 0 + &#8734;&#93; = 5</font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>3</sup><sub>74</sub> =   Min &#91;&#8734; + &#8734;, 3 + 12, 5 + 19, 10 + 0, 1 + 11, 1 + 9, 0 + 20&#93; = 10</font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>3</sup><sub>75</sub> =   Min &#91;&#8734; + &#8734;, 3 + 2, 5 + &#8734;, 10 + 11, 1 + 0, 1 + &#8734;, 0 + 1&#93; = 1</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>3</sup><sub>76</sub> =   Min &#91;&#8734; + &#8734; , 3 + &#8734;, 5 + 4,10 + 9, 1 + &#8734;, 1 + 0, 0 + 1&#93; = 1 </font></p>     <p align="justify"><font face="verdana" size="2"><i><b>C</b></i><sup>3</sup><sub>77</sub> =   Min &#91;&#8734;+ &#8734;, 3 + &#8734;, 5 + &#8734;, 10 + &#8734;, 1 + &#8734;, 1 + &#8734;, 0 + 0&#93; = 0 </font></p>     <p align="justify"><font face="verdana" size="2">El vector resultante (s&eacute;ptima fila de <i><b>C</b></i><sup>3</sup>) es <i><b>C</b></i><sup>3</sup><sub>7</sub> = &#91;14, 3, 5,&nbsp; 10, 1, 1, 0&#93;.</font></p>     <p align="justify"><font face="verdana" size="2">Al sumar el vector obtenido en el anterior paso, con &eacute;ste obtenemos el mismo vector. Sin mostrar el trabajo de las siguientes iteraciones se tiene que <i><b>C</b></i><sup>4</sup><sub>7</sub> = <b>C</b><sup>5</sup><sub>7</sub> = <b>C</b><sup>6</sup><sub>7</sub> = &#91;14, 3, 5, 10, 1, 1, 0&#93;  y al sumarlos con el vector que result&oacute; del trabajo previo se obtiene el mismo vector. Cuando un vector se repite, como se multiplica de nuevo por la misma matriz, el vector se sigue repitiendo de all&iacute; en adelante, por lo que el trabajo se puede suspender. Las componentes del vector que se repite nos dan las distancias m&aacute;s cortas del nodo 7 a cada uno de los nodos, es decir,</font></p>     <p align="justify"><font face="verdana" size="2">De 7 a 1: distancia = 14 (nodos 7, 5, 2, 1). </font></p>     <p align="justify"><font face="verdana" size="2">De 7 a 2: distancia = 3 (nodos 7, 5, 2). </font></p>     <p align="justify"><font face="verdana" size="2">De 7 a 3: distancia = 5 (nodos (7, 6, 3). </font></p>     <p align="justify"><font face="verdana" size="2">De 7 a 4: distancia =10 (nodos 7, 6, 4). </font></p>     <p align="justify"><font face="verdana" size="2">De 7 a 5: distancia = 1 (nodos 7, 5). </font></p>     <p align="justify"><font face="verdana" size="2">De 7 a 6: distancia = 1 (nodos 7, 6). </font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">De 7 a 7: distancia = 0 (nodos 7).</font></p>     <p align="justify"><font face="verdana" size="2">Recapitulando, hemos calculado para la red de la <a href="#f3">figura 3</a>, la s&eacute;ptima fila de la matriz <b>C</b><sup>0</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><b>C</b><sup>1</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><b>C</b><sup>2</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><b>C</b><sup>3</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><b>C</b><sup>4</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><b>C</b><sup>5</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><b>C</b><sup>6</sup>, la cual nos da la distancia del nodo 7 a todos los nodos de la red. En esta operaci&oacute;n la "suma" <img src="/img/revistas/iit/v11n1/a2s2.jpg"><i> </i>es el operador <i>Min y </i>la operaci&oacute;n "multiplicaci&oacute;n" que se utiliza para "multiplicar" las matrices por s&iacute; mismas para calcular las potencias, es la operaci&oacute;n "+", entre n&uacute;meros reales.</font></p>     <p align="justify"><font face="verdana" size="2">En la "multiplicaci&oacute;n" de las matrices tambi&eacute;n entran "sumas", las cuales tambi&eacute;n son el operador <i>Min. </i>Debido a que las potencias de las matrices se repiten, no hubo necesidad de calcular m&aacute;s all&aacute; de <i><b>C</b></i><sup>3</sup>. La matriz <i><b>C</b></i><sup>0</sup> es la matriz "unidad," la cual tiene "unos" en la diagonal principal y "ceros" en las dem&aacute;s componentes. Aqu&iacute; los "unos" son los ceros de los reales y los "ceros" son &#8734; (un n&uacute;mero especial que es mayor que cualquier n&uacute;mero real).</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Intervenci&oacute;n de la computadora. Consideraciones de eficiencia computacional</b></font></p>     <p align="justify"><font face="verdana" size="2">Una de las principales ventajas de la matriz de conexi&oacute;n, adem&aacute;s de permitir manejar ideas con una notaci&oacute;n simplificada con pocos s&iacute;mbolos, es que facilita mucho la automatizaci&oacute;n de la soluci&oacute;n de diversos problemas de caminos en redes. Basta automatizar la secuencia de operaciones correspondientes a la suma y multiplicaci&oacute;n de matrices. El haber generalizado la matriz de conexi&oacute;n, nos permite hacer la automatizaci&oacute;n una sola vez y usar el mismo programa para diversos problemas, cambiando solamente la matriz inicial y los operadores que se utilizan para las dos operaciones de "suma" <img src="/img/revistas/iit/v11n1/a2s2.jpg"> y "multiplicaci&oacute;n" <img src="/img/revistas/iit/v11n1/a2s3.jpg">. As&iacute; como sus dos elementos neutros "cero"&#949; y "uno" <i>e</i>. Algunos de los problemas se resuelven buscando <i>C<sup>n</sup></i><sup>&#150;1</sup> mientras que otros se resuelven buscando <i><b>C</b></i><sup>0</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><i><b>C</b></i><sup>1</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg"><i><b>C</b></i><sup>2</sup><img src="/img/revistas/iit/v11n1/a2s2.jpg">...<i><b>C</b><sup>n</sup></i><sup>&#150;1</sup><i>. </i>Por ejemplo, el problema de la determinaci&oacute;n de caminos Hamiltonianos requiere la en&eacute;sima potencia de la matriz de conexi&oacute;n. La enumeraci&oacute;n de caminos requiere la "suma" de las <i>n </i>potencias (de la <i>0 </i>a la <i>n&#150;1) </i>de la matriz de conexi&oacute;n generalizada.</font></p>     <p align="justify"><font face="verdana" size="2">Con frecuencia, no es necesario llegar hasta la <i>n&#150;1 </i>potencia, pues en muchos casos para alguna potencia <i>k </i>menor que <i>n&#150;1 </i>se tiene que las subsecuentes potencias son iguales (a las matrices se le llama entonces <i>idempotentes). </i>Asimismo, es posible ahorrar trabajo computacional expresando el n&uacute;mero <i>k </i>en notaci&oacute;n binaria y notando que s&oacute;lo se requieren ciertas potencias de 2 de la matriz de conexi&oacute;n. &Eacute;stas se pueden calcular multiplicando algunas potencias menores. Por ejemplo, si se requiere <i><b>C</b></i><sup>33</sup>, se nota que (33)<sub>10</sub> = (100001)<sub>2</sub>, el cual se puede calcular 2<sup>5</sup> + 2<sup>0</sup>, es decir,</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s15.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">En la anterior operaci&oacute;n s&oacute;lo se realizan expl&iacute;citamente las multiplicaciones se&ntilde;aladas con <img src="/img/revistas/iit/v11n1/a2s3.jpg"> es decir, 6 multiplicaciones, ya que del resultado de multiplicaciones previas ya se tienen calculadas las potencias necesarias. Para ser m&aacute;s expl&iacute;citos: se multiplica <i><b>C</b> </i>por <i><b>C</b> </i>para obtener <i><b>C</b></i><sup>2</sup>, &eacute;sta a su vez se multiplica por si misma para obtener <i><b>C</b></i><sup>4</sup>; la cual se multiplica por si misma para obtener <i><b>C</b></i><sup>8</sup>; la cual se multiplica por si misma para obtener <i><b>C</b></i><sup>16</sup>; la cual se multiplica por si misma para obtener <i><b>C</b></i><sup>32</sup>; la cual se multiplica por <i><b>C</b> </i>para por fin obtener <i><b>C</b></i><sup>33</sup>. (6 multiplicaciones en total.)</font></p>     <p align="justify"><font face="verdana" size="2">Finalmente, no siempre interesa la matriz completa, en ocasiones s&oacute;lo interesa trabajar algunas filas o algunas columnas o incluso, s&oacute;lo algunas componentes sueltas de la matriz resultante. A este respecto es conveniente recordar que el n&uacute;mero de operaciones depende de c&oacute;mo se aplique la ley asociativa de la multiplicaci&oacute;n de matrices. Por ejemplo, si <i>x </i>es un vector columna con <i>n </i>componentes (que podr&iacute;a ser una columna de <i><b>C</b> </i>) y <i><b>C </b></i>es una matriz &laquo;x&laquo;, y se desea calcular <i><b>C</b></i><sup>2</sup>&#183;x = <i><b>C&#183;C&#183;x</b>. </i>Si primero multiplicamos <i><b>C&#183;C</b> y </i>luego multiplicamos el resultado por <i>x, o </i>sea, hacemos el c&aacute;lculo ((<i><b>C&#183;C</b></i>)<i>&#183;x</i>) el n&uacute;mero de operaciones (multiplicaciones&#150;suma) que se requerir&aacute;n es <i>n<sup>3</sup> </i>para el producto de las matrices y <i>n<sup>2</sup> </i>para el producto de la matriz por el vector, es decir, un total de <i>n<sup>3</sup> + n<sup>2</sup>. </i>Por otra parte, si se multiplica primero <i><b>C&#183;x</b> </i>y el resultado se premultiplica por <i><b>C</b>, </i>en otras palabras, se calcula (<i><b>C&#183;</b></i>(<b>C&#183;x</b>)) en cada paso se requieren <i>n<sup>2</sup></i>multiplicaciones&#150;suma, un total de<i> 2n<sup>2</sup> </i>operaciones<i>. </i>Como suponemos que <i>n&gt;1, </i>se tiene que <i>n<sup>3</sup> + n<sup>2</sup> &gt; 2n<sup>2</sup>, </i>Por ejemplo, si <i>n = 10, n<sup>3</sup> + n<sup>2</sup> = &#150;1100, 2n<sup>2</sup> = 2OO, </i>es decir una alternativa cuesta m&aacute;s de 5 veces m&aacute;s que la otra en tiempo. Para <i>n = 1000, n<sup>3</sup> + n<sup>2</sup> = 10<sup>9</sup> + 10<sup>6</sup>, 2n<sup>2</sup> = 2</i>&#183;<i>10<sup>6</sup>, </i>es decir, una alternativa es 500 veces m&aacute;s costosa en tiempo que la otra. Lo anterior es cierto cuando se manejan n&uacute;meros de punto flotante que en cada secuencia de operaciones multiplicaci&oacute;n&#150;suma producen otro n&uacute;mero de punto flotante. La situaci&oacute;n se complica en otros casos, debido a que las operaciones son m&aacute;s costosas dependiendo de la longitud de cadenas alfab&eacute;ticas que se van presentando. A&uacute;n en el caso de manejar enteros, al ir creciendo los n&uacute;meros en magnitud, el trabajo aumenta.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Implantaci&oacute;n en la computadora. Cuenta de caminos</b></font></p>     <p align="justify"><font face="verdana" size="2">La existencia de paquetes de computaci&oacute;n comerciales para matrices como MATLAB facilita la implantaci&oacute;n de los m&eacute;todos discutidos. El problema m&aacute;s sencillo de computarizar es el de la cuenta de caminos, la cual s&oacute;lo requiere la multiplicaci&oacute;n convencional de matrices. Consideremos la gr&aacute;fica de la <a href="#f4">figura 4</a>, cuya matriz de conexi&oacute;n se muestra.</font></p>     <p align="center"><font face="verdana" size="2"><a name="f4"></a></font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2f4.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Para introducir la matriz <b>C</b> a MATLAB se teclea lo siguiente:</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s16.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">La l&iacute;nea marcada &gt;&gt; la teclea el usuario, lo dem&aacute;s lo escribe el programa. Para calcular el n&uacute;mero de caminos de 2 tramos se calcula <b>C</b><sup>2</sup> tecleando lo siguiente:</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s17.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Igualmente se puede calcular el n&uacute;mero de caminos de 3 tramos:</font></p>     ]]></body>
<body><![CDATA[<p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s18.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Si se calculara <b>C</b><sup>4</sup>, encontrar&iacute;amos que no hay ning&uacute;n camino de 4 tramos.</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s19.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Una vez que aparece una matriz cero entre las potencias de <b>C</b> todas las dem&aacute;s ser&aacute;n cero. Si ahora nos interesa saber el n&uacute;mero de caminos de todas las longitudes en tramos podemos calcular la suma <b>C</b> + <b>C</b><sup>2 </sup>+<b> C</b><sup>3</sup></font></p>     <p align="center"><font size="2" face="verdana"><img src="/img/revistas/iit/v11n1/a2s20.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">El lector puede verificar los resultados anteriores. En redes m&aacute;s grandes que no tengan ciclos (como por ejemplo las redes de ruta cr&iacute;tica) la red no puede tener caminos con m&aacute;s tramos que el n&uacute;mero de nodos en la red. Por lo tanto, si <i>n </i>es el n&uacute;mero de nodos de una red ac&iacute;clica, al n&uacute;mero total de caminos con cualquier n&uacute;mero de tramos se puede calcular obteniendo la suma <b>C</b> + <b>C</b><sup>2 </sup>+ <b>C</b><sup>3</sup> + ... + <i><b>C</b><sup>n</sup>.</i></font></p>     <p align="justify"><font face="verdana" size="2">Cuando <i>n </i>es grande resulta laborioso calcular y sumar tantas potencias. Podemos, sin embargo, echar mano de la teor&iacute;a de matrices que dice que si la serie infinita de potencias de una matriz converge absolutamente, se puede escribir:</font></p>     <p align="center"><font face="verdana" size="2"><b>C</b> + <b>C</b><sup>2</sup> + <b>C</b><sup>3</sup> + ...  = <b>C</b>(I<b> &#150; </b>C)<sup>&#150;1</sup>.</font></p>     <p align="justify"><font face="verdana" size="2">Para el caso de redes ac&iacute;clicas, la serie siempre converge absolutamente pues s&oacute;lo tiene un n&uacute;mero finito de t&eacute;rminos.</font></p>     <p align="justify"><font face="verdana" size="2">Por lo tanto, podemos calcular el n&uacute;mero total de caminos con la f&oacute;rmula, la cual es mucho m&aacute;s eficiente computacionalmente. Si hacemos esto para nuestro ejemplo se tendr&aacute;</font></p>     ]]></body>
<body><![CDATA[<p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s21.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">donde en MATLAB la matriz unidad de orden <i>n </i>se escribe eye(n) y la raya de quebrado nos indica la matriz inversa. Vemos que hemos obtenido el mismo resultado que sumando las potencias no cero de <b>C</b>.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Implantaci&oacute;n en la computadora. Conexiones entre nodos</b></font></p>     <p align="justify"><font face="verdana" size="2">Otro problema que se puede computarizar con facilidad con MATLAB es el de determinar la conectividad de una red. En ese caso, seg&uacute;n se vio antes, en vez de la operaci&oacute;n + se usa la operaci&oacute;n l&oacute;gica OR, que en MATLAB se escribe "&#124;", y en vez de la operaci&oacute;n &times;, se usa la operaci&oacute;n l&oacute;gica AND, que en MATLAB se escribe "&amp;". Los operadores se pueden aplicar a pares de elementos de una matriz y tambi&eacute;n a matrices completas. En el caso de aplic&aacute;rselo a matrices completas, la operaci&oacute;n se aplica elemento por elemento en cada uno de los componentes de las dos matrices. No existe la operaci&oacute;n de multiplicar matrices usando las operaciones "&#124;" y &quot;&amp;&quot; en vez de multiplicaci&oacute;n y suma, por lo que hay que elaborar un M&#150;file que la realice. Escribimos una muy sencilla, simplemente para ilustrar las ideas. En MATLAB los valores "verdadero" y "falso" se representan con 1 y 0, que juegan los papeles de la unidad y el cero del conjunto que se va a manejar. El listado del programa es</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s22.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Para la matriz de conexi&oacute;n que usamos en el ejemplo anterior, su "cuadrado" se obtiene como sigue:</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s23.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Hemos guardado el resultado en C2. La matriz l&oacute;gica M nos indica con 1's los nodos que est&aacute;n conectados por caminos con dos tramos. Para calcular el "cubo" de la matriz de conexi&oacute;n, ponemos M en a y C en b y volvemos a invocar el M&#150;file "lgicMMul" y desplegamos la M resultante</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s24.jpg"></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Hemos guardado el resultado en C3. Para calcular la "cuarta potencia" de C ponemos M en a y C en b y una vez m&aacute;s invocamos &gt; lgicMMul</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s25.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Hemos guardado el resultado en C4. Como la "cuarta potencia" de C result&oacute; cero, es decir, no existen caminos de cuatro tramos en la gr&aacute;fica, todas las potencias m&aacute;s altas que la tercera ser&aacute;n cero.</font></p>     <p align="justify"><font face="verdana" size="2">Si queremos saber cu&aacute;les nodos est&aacute;n conectados (con cualquier n&uacute;mero de tramos) obtenemos la matriz <b>T</b> = <b>C</b> OR <b>C</b><sup>2</sup> OR <b>C</b><sup>3</sup> OR C<sup>4</sup> que est&aacute;n guardadas en <b>C</b>, <b>C</b>1, <b>C</b>2, <b>C</b>3 y <b>C</b>4.</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s26.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Existe otra manera de determinar todas las conexiones de hasta <i>n </i>tramos. Consiste en encontrar la <i>n &#150; &eacute;sima </i>potencia (l&oacute;gica) de (I + C) y a este resultado restarle la matriz unidad, es decir, calcular <b>T</b> = (<b>I</b> + <b>C</b>)<sup>n</sup> &#150; I con operaciones l&oacute;gicas.</font></p>     <p align="justify"><font face="verdana" size="2">Por ejemplo, para el ejemplo que venimos resolviendo se tiene</font></p>     <p align="justify"><font face="verdana" size="2"><b>(<i>I+C</i>)<i><sup>3</sup> &#150; I = I<sup>3</sup>+3IC+3IC<sup>2</sup>+C<sup>3</sup> &#150; I= 3C + 3C<sup>2</sup> + C<sup>3</sup></i> =  <i>C + C<sup>2</sup> + C<sup>3</sup></i></b>,</font></p>     <p align="justify"><font face="verdana" size="2">donde los tres primeros miembros est&aacute;n manejados algebraicamente (como n&uacute;meros reales con multiplicaci&oacute;n y suma) y el cuarto l&oacute;gicamente (con variables booleanas y operaciones AND y OR). Una interpretaci&oacute;n gr&aacute;fica de lo anterior es que se agregan ramas que van de un nodo a s&iacute; mismo, lo cual permite que, por ejemplo, los caminos de tres tramos se formen con todos los "aut&eacute;nticos" de un tramo m&aacute;s dos vueltas a la rama que sale y regresa al nodo inicial (o una vuelta en el nodo inicial y una en el nodo final, o dos vueltas en el nodo final) y una situaci&oacute;n similar para los caminos "aut&eacute;nticos" de dos ramas. Al final, se resta la matriz unidad para desaparecer los tramos que van de un nodo a s&iacute; mismo. Vale la pena se&ntilde;alar que si no se cuenta con un programa con operadores l&oacute;gicos la matriz de conexi&oacute;n se puede deducir f&aacute;cilmente de la matriz de n&uacute;mero de caminos tomando cualquier componente mayor que cero como 1 y cualquiera que es cero como 0. Esto se puede verificar aplic&aacute;ndole el criterio a la matriz de la ecuaci&oacute;n (*).</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><b>Implantaci&oacute;n en la computadora. Rutas m&aacute;s cortas</b></font></p>     <p align="justify"><font face="verdana" size="2">Adem&aacute;s de encontrar las longitudes de las rutas m&aacute;s cortas tambi&eacute;n es importante determinar por d&oacute;nde pasan esas rutas m&aacute;s cortas. Para ello se utiliza una matriz de nodos N que se inicializa, para el ejemplo que nos ocupa, como sigue:</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s27.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Durante el proceso la matriz N se va modificando cada vez que se mejora una distancia con la funci&oacute;n <i>Min</i>. Se utilizar&aacute; un nuevo M&#150;file para resolverlo, ambos con MATLAB, mismo que se muestra a continuaci&oacute;n.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s28.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Vamos a calcular las longitudes de las rutas m&aacute;s cortas de la gr&aacute;fica de la <a href="#f3">figura 3</a>, cuya matriz de conexi&oacute;n se muestra junto a ella. Iremos guardando las potencias de C en las matrices C1, C2, C3. Comenzamos por guardar la matriz de conexi&oacute;n de la <a href="#f3">figura 3</a> en C y la matriz inicial de nodos en N. (Estas operaciones no se anotan). A continuaci&oacute;n, tecleamos en MATLAB lo que se muestra. Las l&iacute;neas precedidas de &gt;&gt; las teclea el usuario, mientras que lo dem&aacute;s lo produce el programa.</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s29.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Comparamos la s&eacute;ptima fila de la &uacute;ltima matriz con los resultados calculados a mano previamente y vemos que son iguales, tomando en consideraci&oacute;n que en vez de infinito hemos escrito 9999 que es un n&uacute;mero muy grande comparado con el resto de los n&uacute;meros de la matriz <b>C</b>. Como ya coincidieron <b>C</b>3 y <b>C</b>4, as&iacute; como <b>N</b>3 y <b>N</b>4, el proceso se puede suspender, pues todas las dem&aacute;s "potencias" de C ser&aacute;n iguales.</font></p>     <p align="justify"><font face="verdana" size="2">Para mostrar la utilidad de la matriz de nodos N4, supongamos que se desea encontrar la ruta m&aacute;s corta entre el nodo <i>7 </i>y el nodo <i>1</i>. Como el arreglo es de <i>&uacute;ltimos nodos intermedios, </i>en la posici&oacute;n (<i>7, 1</i>), es decir, en la fila <i>7 </i>y columna <i>1, </i>se encuentra el &uacute;ltimo nodo intermedio en el camino m&aacute;s corto de <i>1 </i>a <i>7</i>.</font></p>     <p align="justify"><font face="verdana" size="2">Dicho nodo es 2. Es decir, la ruta es 7,..., 2, 1, donde los puntos suspensivos representan otros posibles nodos a&uacute;n desconocidos. Para encontrar el resto de la ruta ahora se busca el &uacute;ltimo nodo intermedio en la ruta m&aacute;s corta de <i>7 </i>a <i>2</i>. Dicho nodo se encuentra en la posici&oacute;n (<i>7, 2</i>) y para nuestro ejemplo es <i>5. </i>La ruta hasta donde sabemos es ahora 7,..., 5, 2, 1. El siguiente paso es consultar la posici&oacute;n (<i>7, 5</i>) cuyo valor es <i>7. </i>Como hemos llegado al nodo de partida, se ha determinado por completo la ruta que es: 7, 5, 2, 1. Consultando la <a href="#f3">figura 3</a>, verificamos que la longitud, que vale 1 + 2 + 11 = 14, es igual a la cantidad en la posici&oacute;n (<i>7, 1</i>) en el arreglo de distancias m&iacute;nimas C4.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Implantaci&oacute;n en la computadora. Enumeraci&oacute;n de caminos</b></font></p>     <p align="justify"><font face="verdana" size="2">Para computarizar la enumeraci&oacute;n de caminos es conveniente hacerlo en un lenguaje que maneje estructuras de tama&ntilde;os variables. Tambi&eacute;n resulta muy conveniente que el lenguaje tenga buenas facilidades para hacer recurrencias. Esto, en general, lo manejan muy bien lenguajes funcionales como LISP y Logo, ambos lenguajes no son muy manejados por los ingenieros, excepto los de ciencias de la computaci&oacute;n. No los utilizamos en este art&iacute;culo para evitar alargarlo m&aacute;s, ya que tendr&iacute;amos que incluir varios listados para leer y desplegar datos, as&iacute; como el procedimiento para hacer los "productos" de las matrices y las funciones necesarias para hacer las concatenaciones de los s&iacute;mbolos y otros detalles como el manejo de arreglos por medio de listas. El lector interesado puede comunicarse con el autor quien le proveer&aacute; todos estos elementos en el caso de Logo. El lenguaje de MATLAB, no obstante de no manejar listas, tiene funciones muy vers&aacute;tiles para manejar cadeas alfab&eacute;ticas, y ser&aacute; con ellos que implantaremos en la computadora la enumeraci&oacute;n de caminos. Se debe aclarar que esencialmente todo se puede lograr en virtualmente cualquier lenguaje de computaci&oacute;n, pero con diferentes grados de dificultad. Esto qued&oacute; ilustrado en el caso de la computarizaci&oacute;n del n&uacute;mero de caminos entre cada par de nodos. El lenguaje de MATLAB nos permite hacer multiplicaciones entre las matrices A y B simplemente escribiendo A*B, lo que en otros lenguajes requerir&iacute;a la escritura de una subrutina con consiguientes declaraciones y dimensionamientos, as&iacute; como subrutinas para desplegarlas, acci&oacute;n que en MATLAB se logra simplemente tecleando el nombre de la matriz. A este respecto, la computarizaci&oacute;n de la enumeraci&oacute;n de caminos se puede lograr con MATLAB siempre que el usuario entre en temas como arreglos de c&eacute;lulas de cadenas simb&oacute;licas y algunas funciones para manejo de cadenas simb&oacute;licas.</font></p>     <p align="justify"><font face="verdana" size="2">Pasamos ahora a computarizar la enumeraci&oacute;n de caminos usando cadenas simb&oacute;licas. Para denotar varios caminos escribiremos un tramo con una letra, un camino con las letras min&uacute;sculas de los tramos que lo componen yuxtapuestas y los diferentes caminos separados con signos "+". Para simplificar, s&oacute;lo consideraremos gr&aacute;ficas con tramos sencillos entre un par de nodos dejando fuera las que tengan tramos en paralelo. Requerimos  una  subrutina  que  a  una  suma  de  varias secuencias de letras yuxtapuestas le anteponga a cada sumando un letra para a&ntilde;adirle a cada conjunto de caminos un tramo m&aacute;s. As&iacute; si llamamos addchar a la subrutina (funci&oacute;n) que logra lo anterior y la letra a a&ntilde;adir es</font></p>     <p align="justify"><font size="2" face="verdana">a= 'x' y los caminos previos son    <br>   b= 'pqr+stu+vwz', entonces la funci&oacute;n    <br>   addchar(a,b) = 'xpqr+xsty+xvwz'. El listado de la    <br>   funci&oacute;n addchar(a,b) es el siguiente</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s30.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Ahora se requiere un programa que "multiplique" matrices, una de ellas con una sola letra en algunas componentes y vac&iacute;a en otros y la segunda con algunas componentes parecidas a b, que fue mostrada arriba y otras vac&iacute;as. Como en la multiplicaci&oacute;n de matrices se requiere tanto la "multiplicaci&oacute;n" de escalares y la "suma" de escalares, como se indic&oacute; (<a href="/img/revistas/iit/v11n1/a2t1.jpg" target="_blank">tabla 1</a>) nuestros escalares ser&aacute;n cadenas alfab&eacute;ticas, el "cero" corresponde al conjunto vac&iacute;o y el "uno" a la cadena alfab&eacute;tica vac&iacute;a, la "multiplicaci&oacute;n" a la concatenaci&oacute;n de cadenas alfab&eacute;ticas y la "suma" a la uni&oacute;n de conjuntos de cadenas de s&iacute;mbolos. La subrutina para hacer la multiplicaci&oacute;n de matrices se muestra a continuaci&oacute;n; est&aacute; dise&ntilde;ada para ir multiplicando la matriz de conexi&oacute;n en la izquierda y las potencias de la matriz de conexi&oacute;n a la derecha. Para multiplicar dos potencias de C es necesario hacerle cambios a la subrutina mataddchar y a la subrutina addchar. Esto no lo mostramos:</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s31.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Ahora, introducimos la matriz de conexi&oacute;n de la <a href="#f1">figura 1</a> que aparece a la izquierda de la gr&aacute;fica. N&oacute;tense las llaves "{" y "}" que denotan arreglos de c&eacute;lulas en vez de matrices. Las matrices tienen elementos del mismo tipo en todas las componentes y con igual longitud, los arreglos de c&eacute;lulas no.</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s32.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">N&oacute;tese que donde no hay ramas se pone la cadena vac&iacute;a que se representa con dos ap&oacute;strofes seguidos. En seguida se calcula el "cuadrado", C2, de la matriz de conexi&oacute;n</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s33.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">y el "cubo", C3, de la matriz de conexi&oacute;n</font></p>     <p align="center"><font face="verdana" size="2"><img src="/img/revistas/iit/v11n1/a2s34.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Estas matrices se hab&iacute;an obtenido arriba manualmente y coinciden con lo calculado por el programa.</font></p>     <p align="justify"><font face="verdana" size="2">Existen varios otros problemas de caminos que se pueden resolver con los programas dados, pero en cuyos detalles no entramos por falta de espacio. Por ejemplo, en la aplicaci&oacute;n del M&eacute;todo de Ruta Cr&iacute;tica interesa encontrar el camino m&aacute;s largo en una red ac&iacute;clica. Para ese problema el semianillo adecuado son los n&uacute;meros reales aumentados con &#8734; y las dos operaciones adecuadas son: "suma": Max (x, y), "multiplicaci&oacute;n": + (suma de reales), neutro de la "suma": &#150;&#8734;, neutro de la "multiplicaci&oacute;n": 0. Otro ejemplo es encontrar el camino de m&aacute;xima capacidad. Aqu&iacute; el semianillo adecuado es el de los reales positivos aumentados con &#8734; y las dos operaciones adecuadas son "suma": Max (x, y); "multiplicaci&oacute;n": Min (x, y); neutro de la "suma": 0; neutro de la "multiplicaci&oacute;n": &#8734;.</font></p>     <p align="justify"><font face="verdana" size="2">Como &uacute;ltimo ejemplo a mencionar es el problema de encontrar el camino de m&aacute;xima confiabilidad, en el cual el semianillo adecuado es el intervalo de los reales entre cero y uno, la "suma" es Max (x, y); la "multiplicaci&oacute;n" es &times; (multiplicaci&oacute;n entre reales), el neutro de la "suma" es 0 (cero de los reales) y el neutro de la "multiplicaci&oacute;n" es 1 (la unidad de los reales).</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Comentarios matem&aacute;ticos</b></font></p>     <p align="justify"><font face="verdana" size="2">Muchos problemas de caminos en redes orientadas tienen una estructura com&uacute;n si dichos problemas se plantean como problemas algebraicos con elementos m&aacute;s generales que el &aacute;lgebra lineal con n&uacute;meros reales y complejos. Un sistema algebraico adecuado es el semianillo o dioide. Las t&eacute;cnicas para resolver problemas algebraicos con dioides, aunque difieren de las del &aacute;lgebra lineal est&aacute;ndar son muy parecidas. Aunque no fueron tratadas en este art&iacute;culo desde el punto de vista matem&aacute;tico con demostraci&oacute;n de teoremas y todo, esencialmente se basan en que las soluciones est&aacute;n dadas por potencias de las matrices o series infinitas de las mismas. En muchos casos de inter&eacute;s las series se truncan porque arriba de ciertas potencias todas las potencias se anulan. Para algunos casos la serie completa se puede calcular utilizando algoritmos que son generalizaciones de los algoritmos cl&aacute;sicos del &aacute;lgebra lineal, tales como el algoritmo de Gauss&#150;Jordan, el de Jacobi y el de Gauss&#150;Seidel. En el art&iacute;culo, sin mencionarlo, se utiliz&oacute; el algoritmo de Jacobi para resolver el problema de rutas m&aacute;s cortas, que coincide con el m&eacute;todo de Programaci&oacute;n Din&aacute;mica de Bellman. Para que el art&iacute;culo sea f&aacute;cilmente accesible a ingenieros, se prefiri&oacute; sacrificar demostraciones matem&aacute;ticas restringiendo la discusi&oacute;n a explicaciones heur&iacute;sticas para tener espacio para mostrar programas en lenguajes correspondientes a paquetes de uso corriente de los ingenieros como MATLAB y dar ejemplos num&eacute;ricos resueltos en todo detalle de diversos tipos de problemas de caminos en redes.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Conclusiones</b></font></p>     <p align="justify"><font face="verdana" size="2">Se ha presentado un enfoque unificado para plantear y resolver con auxilio de una computadora problemas de caminos en redes orientadas. La principal herramienta ha sido la matriz de conexi&oacute;n generalizada para que sus componentes sean elementos de un semianillo o dioide. Los elementos pueden ser n&uacute;meros enteros, n&uacute;meros reales, variables booleanas y conjuntos de cadenas alfa&#150;num&eacute;ricas. Todos ellos se pueden manejar en cualquier lenguaje de programaci&oacute;n con diversos grados de dificultad para hacerlo. Su manejo se ilustr&oacute; por medio de programas en MATLAB haciendo algunos cambios para resolver problemas distintos. Se dieron varios ejemplos ilustrativos en todo detalle, ambos ingredientes que faltan en la obra de Gondran y Minoux (1984).</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Referencias</b></font></p>     <!-- ref --><p align="justify"><font face="verdana" size="2">Bellman R., Cooke K.L. y Lockett J.A. <i>Algorithms, Graphs and Computer. </i>New York. Academic Press. 1970. </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250173&pid=S1405-7743201000010000200001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Bellman R.E. y Dreyfus S.E. <i>Applied Dynamic Programming. </i>Princeton, NJ. Princeton University Press. 1962. </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250174&pid=S1405-7743201000010000200002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Dalhquist G. y Bj&ouml;rck A. <i>Numerical Methods. </i>Englewood Cliffs. NJ. Prentice&#150;Hall, Inc., 1974. Pp. 146&#150;161. </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250175&pid=S1405-7743201000010000200003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Gondran M. y Minoux M. <i>Graphs and Algorithms. </i>New York. John Wiley &amp; Sons, Inc. 1984.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250176&pid=S1405-7743201000010000200004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Hu T.C. <i>Integer Programming and Network Flows. </i>Addison&#150;Wesley Publishing Company. Reading, MA. 1969. Pp. 158&#150;160.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250177&pid=S1405-7743201000010000200005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Kaufman A. y Malgrange Y. Recherche des chemins et circuit hamiltoniens d'un graphe. <i>Rev. Fr.: Rech. Op., </i>26:61&#150;73.1963.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250178&pid=S1405-7743201000010000200006&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">MacLane S. y Birkhoff G. <i>Algebra. </i>New York. The Macmillan Company. 1967.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250179&pid=S1405-7743201000010000200007&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Mayeda W. <i>Graph Theory. </i>New York. John Wiley &amp; Sons, Inc.1972.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4250180&pid=S1405-7743201000010000200008&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Semblanza del autor</b></font></p>     <p align="justify"><font face="verdana" size="2"><i>Marco Antonio Murray&#150;Lasso. </i>Es ingeniero mec&aacute;nico electricista de la UNAM, maestro en ciencias en ingenier&iacute;a el&eacute;ctrica y doctor en ciencias en control autom&aacute;tico, ambos del Massachusetts Institute of Technology (MIT). Ha sido profesor de Case Western Reserve University y del Newark College of Engineering, investigador de Bell Telephone Laboratories y asesor de la NASA. Ha sido investigador nacional y fue presidente fundador de la Academia Nacional de Ingenier&iacute;a, miembro fundador y posteriormente presidente mundial del Consejo de Academias Nacionales de Ingenier&iacute;a y Ciencias Tecnol&oacute;gicas (CAETS). Tambi&eacute;n ha sido secretario de la Academia Mexicana de Ciencias y presidente del Consejo de Honor de la Academia Mexicana de Ciencias, Artes, Tecnolog&iacute;a y Humanidades, as&iacute; como miembro de la Academia de Ciencias de Nueva York, de la Academia Mexicana de Inform&aacute;tica y miembro fundador de la Academia Mexicana de Tecnolog&iacute;a. Actualmente es acad&eacute;mico de honor de la Academia Mexicana de Ciencia de Sistemas, de la Academia de Ingenier&iacute;a y de la Academia Mexicana de Ciencias, Artes, Tecnolog&iacute;a y Humanidades. Ha sido profesor en la Facultad de Ingenier&iacute;a durante 48 a&ntilde;os. Autor o coautor de 12 libros y 250 art&iacute;culos t&eacute;cnicos. Durante 25 a&ntilde;os ha sido Consejero Educativo del MIT. Su biograf&iacute;a aparece en <i>Who is who in Science and Engineering </i>y en <i>Who is who in the World.</i></font></p>      ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Bellman]]></surname>
<given-names><![CDATA[R]]></given-names>
</name>
<name>
<surname><![CDATA[Cooke]]></surname>
<given-names><![CDATA[K.L.]]></given-names>
</name>
<name>
<surname><![CDATA[Lockett]]></surname>
<given-names><![CDATA[J.A.]]></given-names>
</name>
</person-group>
<source><![CDATA[Algorithms, Graphs and Computer]]></source>
<year>1970</year>
<publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[Academic Press]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Bellman]]></surname>
<given-names><![CDATA[R.E.]]></given-names>
</name>
<name>
<surname><![CDATA[Dreyfus]]></surname>
<given-names><![CDATA[S.E.]]></given-names>
</name>
</person-group>
<source><![CDATA[Applied Dynamic Programming]]></source>
<year>1962</year>
<publisher-loc><![CDATA[Princeton^eNJ NJ]]></publisher-loc>
<publisher-name><![CDATA[Princeton University Press]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Dalhquist]]></surname>
<given-names><![CDATA[G]]></given-names>
</name>
<name>
<surname><![CDATA[Björck]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
</person-group>
<source><![CDATA[Numerical Methods]]></source>
<year>1974</year>
<page-range>146-161</page-range><publisher-loc><![CDATA[Englewood Cliffs^eNJ NJ]]></publisher-loc>
<publisher-name><![CDATA[Prentice-Hall, Inc.]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Gondran]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[Minoux]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Graphs and Algorithms]]></source>
<year>1984</year>
<publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[John Wiley & Sons, Inc.]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Hu]]></surname>
<given-names><![CDATA[T.C.]]></given-names>
</name>
</person-group>
<source><![CDATA[Integer Programming and Network Flows]]></source>
<year>1969</year>
<page-range>158-160</page-range><publisher-loc><![CDATA[Reading^eMA MA]]></publisher-loc>
<publisher-name><![CDATA[Addison-Wesley Publishing Company]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Kaufman]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[Malgrange]]></surname>
<given-names><![CDATA[Y]]></given-names>
</name>
</person-group>
<article-title xml:lang="fr"><![CDATA[Recherche des chemins et circuit hamiltoniens d'un graphe]]></article-title>
<source><![CDATA[Rev. Fr.: Rech. Op.]]></source>
<year>1963</year>
<volume>26</volume>
<page-range>61-73</page-range></nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[MacLane]]></surname>
<given-names><![CDATA[S]]></given-names>
</name>
<name>
<surname><![CDATA[Birkhoff]]></surname>
<given-names><![CDATA[G]]></given-names>
</name>
</person-group>
<source><![CDATA[Algebra]]></source>
<year>1967</year>
<publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[The Macmillan Company]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B8">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Mayeda]]></surname>
<given-names><![CDATA[W]]></given-names>
</name>
</person-group>
<source><![CDATA[Graph Theory]]></source>
<year>1972</year>
<publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[John Wiley & Sons, Inc.]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
