From 480a1ddb0b83e0a5f80ba3e607b0ea9c3ac68dd6 Mon Sep 17 00:00:00 2001 From: Juan Marín Noguera Date: Fri, 8 Jan 2021 20:28:33 +0100 Subject: graph::algorithm --- graf/n.lyx | 39 ++ graf/n4.lyx | 1856 ++++++++++++++++++++++++++++++----------------------------- 2 files changed, 986 insertions(+), 909 deletions(-) (limited to 'graf') diff --git a/graf/n.lyx b/graf/n.lyx index ac8fe4c..56e4ca8 100644 --- a/graf/n.lyx +++ b/graf/n.lyx @@ -173,6 +173,31 @@ Borůvka's algorithm . \end_layout +\begin_layout Itemize +Richard C. + Larson & Amadeo R. + Odoni (1999). + +\emph on +\lang english +Urban Operations Research +\emph default +, chapter 6.4.4 +\lang spanish + ( +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://web.mit.edu/urban_or_book/www/book/chapter6/6.4.4.html +\end_layout + +\end_inset + +). +\end_layout + \begin_layout Chapter Grafos \end_layout @@ -213,6 +238,20 @@ filename "n3.lyx" \end_inset +\end_layout + +\begin_layout Chapter +Algoritmos en grafos +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand input +filename "n4.lyx" + +\end_inset + + \end_layout \end_body diff --git a/graf/n4.lyx b/graf/n4.lyx index ed819e4..e84afd8 100644 --- a/graf/n4.lyx +++ b/graf/n4.lyx @@ -80,1143 +80,941 @@ algorithm2e \begin_body -\begin_layout Standard -Un -\series bold -bosque -\series default - o grafo -\series bold -acíclico -\series default - es un grafo sin ciclos. - Un -\series bold -árbol -\series default - es un bosque conexo. - Un -\series bold -árbol generador -\series default - de un grafo es un subgrafo generador que es un árbol. +\begin_layout Section +Caminos más cortos \end_layout \begin_layout Standard -Como -\series bold -teorema -\series default -, un grafo -\begin_inset Formula $G=(V,E)$ +Dada una red +\begin_inset Formula $(V,E,\ell)$ \end_inset - no vacío es un árbol si y sólo si entre cada -\begin_inset Formula $u,v\in V$ + y un camino +\begin_inset Formula $P:=v_{0}e_{1}v_{1}\cdots e_{k}v_{k}$ \end_inset - distintos existe un único camino, si y sólo si es conexo con -\begin_inset Formula $|E|=|V|-1$ + en +\begin_inset Formula $(V,E)$ \end_inset -, si y sólo si es acíclico con -\begin_inset Formula $|E|=|V|-1$ +, llamamos +\series bold +longitud +\series default + de +\begin_inset Formula $P$ \end_inset -, si y sólo si es conexo minimal (todos los ejes son de corte), si y solo - si es acíclico maximal (añadir un eje forma un ciclo), en cuyo caso el - ciclo formado al añadir el eje es único. -\end_layout + a +\begin_inset Formula +\[ +\ell(P):=\sum_{i=1}^{k}\ell(e_{i}). +\] -\begin_layout Description -\begin_inset Formula $1\implies2]$ \end_inset - El camino existe por conexión. - Supongamos que existen +El problema del +\series bold +camino más corto +\series default + entre dos vértices \begin_inset Formula $u,v\in V$ \end_inset - distintos con dos caminos de -\begin_inset Formula $u$ + es el de minimizar +\begin_inset Formula $\ell(P)$ \end_inset - a -\begin_inset Formula $v$ + siendo +\begin_inset Formula $P$ \end_inset - distintos, -\begin_inset Formula $uu_{1}\cdots u_{p-1}v$ + un camino que une +\begin_inset Formula $u$ \end_inset - y -\begin_inset Formula $uv_{1}\cdots v_{q-1}v$ + con +\begin_inset Formula $v$ \end_inset . - Sean -\begin_inset Formula $u_{0}:=v_{0}:=u$ -\end_inset - -, -\begin_inset Formula $u_{p}:=u_{q}:=v$ -\end_inset - - e -\begin_inset Formula $i\in\{1,\dots,\min\{p,q\}\}$ -\end_inset +\end_layout - mínimo con -\begin_inset Formula $u_{i}\neq v_{i}$ +\begin_layout Standard +Si +\begin_inset Formula $v_{0}v_{1}\cdots v_{k}$ \end_inset -, el paseo -\begin_inset Formula $u_{i}\cdots u_{p-1}vv_{q-1}\cdots v_{i}$ + es el camino más corto de +\begin_inset Formula $v_{0}$ \end_inset -, que no contiene a -\begin_inset Formula $u_{i-1}=v_{i-1}$ + a +\begin_inset Formula $v_{k}$ \end_inset -, contiene un camino no trivial -\begin_inset Formula $P$ +, +\begin_inset Formula $v_{i}v_{i+1}\cdots v_{j}$ \end_inset - de -\begin_inset Formula $u_{i}$ + es el camino más corto de +\begin_inset Formula $v_{i}$ \end_inset a -\begin_inset Formula $v_{i}$ +\begin_inset Formula $v_{j}$ \end_inset -, y entonces -\begin_inset Formula $(u_{i-1},u_{i})P(v_{i},v_{i-1})$ + para +\begin_inset Formula $0\leq iD_{ik}+D_{kj}$}{ \end_layout \begin_layout Plain Layout -$T -\backslash -gets + $D_{ij} \backslash -emptyset$ +gets D_{ik}+D_{kj}$ \backslash ; \end_layout \begin_layout Plain Layout - -\backslash -Para{$i + $P_{ij} \backslash -gets1$ +gets P_{kj}$ \backslash -KwA $|L|$}{ +; \end_layout \begin_layout Plain Layout - $(u,v) -\backslash -gets L_i$ -\backslash -; + } \end_layout \begin_layout Plain Layout - -\backslash -lSSi{no existe un camino de $u$ a $v$ en $(V,T)$}{añadir $L_i$ a $T$} + } \end_layout \begin_layout Plain Layout @@ -1235,11 +1033,11 @@ lSSi{no existe un camino de $u$ a $v$ en $(V,T)$}{añadir $L_i$ a $T$} \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label -name "alg:kruskal" +name "alg:dantzig" \end_inset -Algoritmo de Kruskal. +Algoritmo de Dantzig. \end_layout \end_inset @@ -1252,36 +1050,148 @@ Algoritmo de Kruskal. \end_layout +\begin_layout Section +Tours eulerianos +\end_layout + \begin_layout Standard -El +Dado un grafo +\begin_inset Formula $G=(V,E)$ +\end_inset + +, un +\series bold +tour +\series default + o +\series bold +recorrido euleriano +\series default + es un paseo cerrado que atraviesa cada eje del grafo exactamente una vez. + Un grafo es +\series bold +euleriano +\series default + si admite un recorrido euleriano. + Como +\series bold +teorema +\series default +, un grafo conexo es euleriano si y solo si todos los vértices tiene orden + par, en cuyo caso se puede obtener un tour euleriano con el \series bold -algoritmo de Kruskal +algoritmo de Hierholzer \series default (algoritmo \begin_inset CommandInset ref LatexCommand ref -reference "alg:kruskal" +reference "alg:hierholzer" plural "false" caps "false" noprefix "false" \end_inset -) construye el árbol generador minimal de una red conexa, pues se asegura - de que todo par de vértices adyacentes de la red estén conectados en el - árbol, no crea ciclos y, si una arista -\begin_inset Formula $(u,v)$ +). +\end_layout + +\begin_layout Itemize +\begin_inset Argument item:1 +status open + +\begin_layout Plain Layout +\begin_inset Formula $\implies]$ \end_inset - queda fuera del árbol, todas las aristas del camino de -\begin_inset Formula $u$ + +\end_layout + \end_inset - a +Sean +\begin_inset Formula $T$ +\end_inset + + un tour euleriano, +\begin_inset Formula $v\in V$ +\end_inset + + y +\begin_inset Formula $e_{1},\dots,e_{k}$ +\end_inset + + los ejes adyacentes a +\begin_inset Formula $v$ +\end_inset + +, cada eje está en +\begin_inset Formula $T$ +\end_inset + + exactamente una vez y puede ser entrante (el siguiente nodo es +\begin_inset Formula $v$ +\end_inset + +) o saliente (lo es el anterior), pero a todo eje entrante le sigue uno + saliente y a todo saliente le precede uno entrante (podemos suponer que + +\begin_inset Formula $T$ +\end_inset + + no empieza por \begin_inset Formula $v$ \end_inset - en el árbol ya habían sido consideradas y por tanto tienen peso menor. +), luego el número de entrantes y salientes es el mismo y +\begin_inset Formula $k$ +\end_inset + + es par. +\end_layout + +\begin_layout Itemize +\begin_inset Argument item:1 +status open + +\begin_layout Plain Layout +\begin_inset Formula $\impliedby]$ +\end_inset + + +\end_layout + +\end_inset + +Claramente el algoritmo de Hierholzer toma cada eje exactamente una vez, + crea un paseo cerrado y termina, y queda ver que no da errores. + Si queda algún eje por tomar, alguno debe ser adyacente a un nodo en +\begin_inset Formula $P$ +\end_inset + +, pues de lo contrario los nodos y ejes de +\begin_inset Formula $P$ +\end_inset + + formarían una componente conexa y, al haber más ejes, +\begin_inset Formula $G$ +\end_inset + + sería disconexo. +\begin_inset Formula $\#$ +\end_inset + + Respecto al paso de tomar un eje, en la primera iteración hemos tomado + un nodo de forma que se pueda, y en el resto hemos tomado un número par + de ejes adyacentes a +\begin_inset Formula $i$ +\end_inset + + como ejes entrantes y salientes más el nodo usado para entrar, y como el + orden es par, debe quedar otro eje sin añadir a +\begin_inset Formula $P$ +\end_inset + +. \end_layout \begin_layout Standard @@ -1298,21 +1208,20 @@ status open \backslash -Entrada{Red conexa $G=(V,E, -\backslash -ell)$.} +Entrada{Grafo $G=(V,E)$ conexo en el que todos los vértices tienen orden + par.} \end_layout \begin_layout Plain Layout \backslash -Salida{Árbol generador minimal $(V,T)$ de $G$.} +Salida{Tour euleriano $P$ de $G$.} \end_layout \begin_layout Plain Layout -Tomar $r +Elegir $s \backslash in V$ \backslash @@ -1321,73 +1230,91 @@ in V$ \begin_layout Plain Layout -$V_1 -\backslash -gets -\backslash -{r +$P \backslash -}$ +gets(s)$ \backslash ; \end_layout \begin_layout Plain Layout -$V_2 -\backslash -gets V + \backslash -setminus +Mientras{$E \backslash -{r +neq \backslash -}$ +emptyset$}{ +\end_layout + +\begin_layout Plain Layout + + Tomar un nodo $i$ en $P$ adyacente a algún eje \backslash ; \end_layout \begin_layout Plain Layout -$T -\backslash -gets + $k \backslash -emptyset$ +gets i$ \backslash ; \end_layout \begin_layout Plain Layout - + $P_0 +\backslash +gets(i)$ \backslash -Mientras{$|V_1|<|V|$}{ +; \end_layout \begin_layout Plain Layout - Tomar $v_1 + \backslash -in V_1$ y $v_2 +Repetir{$i=k$}{ +\end_layout + +\begin_layout Plain Layout + + Sacar un $(i,j)$ de $E$ \backslash -in V_2$ con $e:=(v_1,v_2) +; +\end_layout + +\begin_layout Plain Layout + + $P_0 \backslash -in E$ de peso mínimo +gets P_0j$ \backslash ; \end_layout \begin_layout Plain Layout - Añadir $e$ a $T$ + $i +\backslash +gets j$ \backslash ; \end_layout \begin_layout Plain Layout - Mover $v_2$ de $V_2$ a $V_1$ + } +\end_layout + +\begin_layout Plain Layout + + Con $P=:P_1kP_2$, hacer $P +\backslash +gets P_1P_0P_2$ \backslash ; \end_layout @@ -1408,11 +1335,11 @@ in E$ de peso mínimo \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label -name "alg:prim" +name "alg:hierholzer" \end_inset -Algoritmo de Prim. +Algoritmo de Hierholzer. \end_layout \end_inset @@ -1426,43 +1353,146 @@ Algoritmo de Prim. \end_layout \begin_layout Standard -El +También se puede obtener un tour euleriano con el \series bold -algoritmo de Prim +algoritmo de Fleury \series default (algoritmo \begin_inset CommandInset ref LatexCommand ref -reference "alg:prim" +reference "alg:fleury" plural "false" caps "false" noprefix "false" \end_inset -) hace lo mismo, pues se asegura de que todos los vértices estén conectados - a -\begin_inset Formula $r$ +). + +\series bold +Demostración: +\series default + Es claro que si el algoritmo funciona genera un tour euleriano. + Sea +\begin_inset Formula $s$ \end_inset -, no crea ciclos porque no considera ejes cuyos vértices ya hayan sido conectado -s en el árbol y, cuando selecciona una arista -\begin_inset Formula $e$ + el nodo inicial, cuando +\begin_inset Formula $o(s)>0$ \end_inset -, que estaría separando al árbol en -\begin_inset Formula $V_{1}$ +, +\begin_inset Formula $P$ \end_inset - y -\begin_inset Formula $V_{2}$ + es un paseo que no repite ejes, por lo que todos los nodos salvo el primero + y el último tienen orden par (por ser +\begin_inset Formula $G$ +\end_inset + + euleriano) y, como estos dos tienen orden impar, se puede salir del último + añadiendo otro eje al camino en cada paso hasta llegar a +\begin_inset Formula $s$ +\end_inset + + y no poder salir, momento en que queremos ver que +\begin_inset Formula $E=\emptyset$ +\end_inset + +. + Si no fuera así, al final existiría un +\begin_inset Formula $e\in E$ +\end_inset + + en una componente conexa de +\begin_inset Formula $G$ +\end_inset + + distinta a la de +\begin_inset Formula $s$ +\end_inset + +, pero la conexión con +\begin_inset Formula $s$ +\end_inset + + salvo en nodos aislados es un invariante del bucle. + En efecto, al principio de una iteración, +\begin_inset Formula $i$ +\end_inset + + conecta con +\begin_inset Formula $s$ +\end_inset + + porque no es aislado y solo se rompe la conexión si se quita un eje de + corte, pero entonces todos los ejes adyacentes a +\begin_inset Formula $i$ +\end_inset + +, +\begin_inset Formula $(i,j_{1}),\dots,(i,j_{k})$ \end_inset -, se asegura de que tenga peso mínimo entre las aristas de -\begin_inset Formula $\omega_{G}(V_{1})$ +, serían de corte y +\begin_inset Formula $G-i$ +\end_inset + + tendría +\begin_inset Formula $k$ +\end_inset + + componentes conexas. + Sea entonces +\begin_inset Formula $V_{p}$ +\end_inset + + la componente conexa con +\begin_inset Formula $j_{p}$ +\end_inset + +, si fuera +\begin_inset Formula $s\notin V_{p}$ +\end_inset + +, como todos los nodos de +\begin_inset Formula $V_{p}$ +\end_inset + + tienen orden par salvo +\begin_inset Formula $j_{p}$ +\end_inset + + que tendría orden impar al haber eliminado +\begin_inset Formula $(i,j_{p})$ +\end_inset + +, la suma de los órdenes sería impar +\begin_inset Formula $\#$ +\end_inset + +, luego +\begin_inset Formula $s\in V_{p}$ +\end_inset + + y, como +\begin_inset Formula $V_{1},\dots,V_{k}$ +\end_inset + + es una partición, +\begin_inset Formula $k=1$ \end_inset . + Por tanto +\begin_inset Formula $i$ +\end_inset + + es un nodo hoja y eliminar el eje de corte deja a +\begin_inset Formula $i$ +\end_inset + + aislado. \end_layout \begin_layout Standard @@ -1479,84 +1509,77 @@ status open \backslash -Entrada{Red conexa $(V,E, -\backslash -ell)$} +Entrada{Grafo euleriano conexo $G=(V,E)$.} \end_layout \begin_layout Plain Layout \backslash -Salida{Árbol generador minimal $(V,T)$ de $G$.} +Salida{Tour euleriano $P$ de $G$.} \end_layout \begin_layout Plain Layout -$T +Tomar $i \backslash -gets -\backslash -emptyset$ +in V$ \backslash ; \end_layout \begin_layout Plain Layout - +$P \backslash -Mientras{$(V,T)$ sea disconexo}{ -\end_layout - -\begin_layout Plain Layout - - +gets(i)$ \backslash -ParaCada{componente conexa $V_i$ de $(V,T)$}{ +; \end_layout \begin_layout Plain Layout - Tomar $u_i -\backslash -in V_i$ y $v_i -\backslash -in V + \backslash -setminus V_i$ con $(u_i,v_i) +Mientras{$E \backslash -in E$ de peso mínimo +neq \backslash -; +emptyset$}{ \end_layout \begin_layout Plain Layout - } + +\backslash +lSSi{existe $(i,j) +\backslash +in E$ que no sea de corte}{sacar $(i,j)$ de $E$} \end_layout \begin_layout Plain Layout \backslash -ParaCada{componente conexa $V_i$ de $(V,T)$}{ +lEnOtroCaso{sacar un $(i,j)$ de $E$} \end_layout \begin_layout Plain Layout - + $P \backslash -lSSi{$u_i$ y $v_i$ no están conectados en $(V,T)$}{$T +gets Pj$ \backslash -gets T -\backslash -cup(u_i,v_i)$} +; \end_layout \begin_layout Plain Layout - } + $i +\backslash +gets j$ +\backslash +; \end_layout \begin_layout Plain Layout @@ -1575,11 +1598,11 @@ cup(u_i,v_i)$} \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label -name "alg:boruvka" +name "alg:fleury" \end_inset -Algoritmo de Sollin. +Algoritmo de Fleury. \end_layout \end_inset @@ -1592,54 +1615,69 @@ Algoritmo de Sollin. \end_layout +\begin_layout Section +Problema del cartero chino +\end_layout + \begin_layout Standard -Otro algoritmo para hacer esto es el +Dada una red +\begin_inset Formula $(V,E,\ell)$ +\end_inset + +, el \series bold -algoritmo de Sollin +problema del cartero chino \series default - (algoritmo -\begin_inset CommandInset ref -LatexCommand ref -reference "alg:boruvka" -plural "false" -caps "false" -noprefix "false" + consiste en obtener un paseo cerrado de longitud mínima que incluya todos + los ejes al menos una vez. + Para resolverlo: +\end_layout -\end_inset +\begin_layout Enumerate +Calculamos la longitud de los caminos más cortos entre cada par de nodos, + por ejemplo con el algoritmo de Dantzig. +\end_layout -) -\begin_inset Foot -status open +\begin_layout Enumerate +Identificamos los nodos de orden impar, de los que habrá un número par, + y los emparejamos minimizando la suma de las longitudes de los caminos + más cortos entre cada par. +\end_layout -\begin_layout Plain Layout -Se recomienda comprobar la conexión de -\begin_inset Formula $(V,T)$ -\end_inset +\begin_layout Enumerate +Duplicamos los ejes de un camino más corto entre cada par, obteniendo un + grafo euleriano. +\end_layout + +\begin_layout Enumerate +Obtenemos un tour euleriano, que será la solución. +\end_layout - manteniendo un conjunto cociente con las componentes conexas. - Ver el capítulo 3 de los apuntes de AED I para más información. +\begin_layout Section +Grafos hamiltonianos \end_layout +\begin_layout Standard +Dado un grafo +\begin_inset Formula $G=(V,E)$ \end_inset -. - Finalmente, podemos calcular un árbol generador -\series bold -maximal -\series default - o +, un camino es \series bold -máximo +hamiltoniano \series default - de una red -\begin_inset Formula $(V,E,\ell)$ -\end_inset + si contiene a todos los vértices. + Un grafo es hamiltoniano si admite un ciclo hamiltoniano. +\begin_inset Note Note +status open + +\begin_layout Plain Layout + +\end_layout - (el de mayor peso) como un árbol generador minimal de -\begin_inset Formula $(V,E,-\ell)$ \end_inset -, o invirtiendo el sentido de las comparaciones en los algoritmos anteriores. + \end_layout \end_body -- cgit v1.2.3