Commit e106ae9b by Stalin Munoz

Se agrega algoritmo bidireccional

parent 52cdd879
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
\relax
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
\global\let\oldcontentsline\contentsline
\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
\global\let\oldnewlabel\newlabel
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
\AtEndDocument{\ifx\hyper@anchor\@undefined
\let\contentsline\oldcontentsline
\let\newlabel\oldnewlabel
\fi}
\fi}
\global\let\hyper@last\relax
\gdef\HyperFirstAtBeginDocument#1{#1}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\catcode `"\active
\catcode `<\active
\catcode `>\active
\@nameuse{es@quoting}
\@writefile{toc}{\beamer@endinputifotherversion {3.36pt}}
\@writefile{nav}{\beamer@endinputifotherversion {3.36pt}}
\select@language{spanish}
\@writefile{toc}{\select@language{spanish}}
\@writefile{lof}{\select@language{spanish}}
\@writefile{lot}{\select@language{spanish}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/5}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {2}{5}}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{6/16}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {6}{16}}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{17/17}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}}
\@writefile{nav}{\headcommand {\beamer@partpages {1}{18}}}
\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{18}}}
\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{18}}}
\@writefile{nav}{\headcommand {\beamer@documentpages {18}}}
\@writefile{nav}{\headcommand {\def \inserttotalframenumber {5}}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{18/18}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}}
This is BibTeX, Version 0.99d (TeX Live 2015/Debian)
Capacity: max_strings=35307, hash_size=35307, hash_prime=30011
The top-level auxiliary file: bidireccional.aux
I found no \citation commands---while reading file bidireccional.aux
I found no \bibdata command---while reading file bidireccional.aux
I found no \bibstyle command---while reading file bidireccional.aux
You've used 0 entries,
0 wiz_defined-function locations,
83 strings with 500 characters,
and the built_in function-call counts, 0 in all, are:
= -- 0
> -- 0
< -- 0
+ -- 0
- -- 0
* -- 0
:= -- 0
add.period$ -- 0
call.type$ -- 0
change.case$ -- 0
chr.to.int$ -- 0
cite$ -- 0
duplicate$ -- 0
empty$ -- 0
format.name$ -- 0
if$ -- 0
int.to.chr$ -- 0
int.to.str$ -- 0
missing$ -- 0
newline$ -- 0
num.names$ -- 0
pop$ -- 0
preamble$ -- 0
purify$ -- 0
quote$ -- 0
skip$ -- 0
stack$ -- 0
substring$ -- 0
swap$ -- 0
text.length$ -- 0
text.prefix$ -- 0
top$ -- 0
type$ -- 0
warning$ -- 0
while$ -- 0
width$ -- 0
write$ -- 0
(There were 3 error messages)
\beamer@endinputifotherversion {3.36pt}
\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
\headcommand {\beamer@framepages {1}{1}}
\headcommand {\slideentry {0}{0}{2}{2/5}{}{0}}
\headcommand {\beamer@framepages {2}{5}}
\headcommand {\slideentry {0}{0}{3}{6/16}{}{0}}
\headcommand {\beamer@framepages {6}{16}}
\headcommand {\slideentry {0}{0}{4}{17/17}{}{0}}
\headcommand {\beamer@framepages {17}{17}}
\headcommand {\beamer@partpages {1}{18}}
\headcommand {\beamer@subsectionpages {1}{18}}
\headcommand {\beamer@sectionpages {1}{18}}
\headcommand {\beamer@documentpages {18}}
\headcommand {\def \inserttotalframenumber {5}}
\headcommand {\slideentry {0}{0}{5}{18/18}{}{0}}
\headcommand {\beamer@framepages {18}{18}}
\documentclass[xcolor=dvipsnames]{beamer}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{pgfpages}
\usepackage[makeroom]{cancel}
% descomentar para generar handouts con notas
\setbeameroption{show notes on second screen=right}
\usepackage{tikz}
\tikzstyle{every picture}+=[remember picture]
\usefonttheme[onlymath]{serif}
\usepackage{verbatim}
\usepackage{pifont}
\usetheme{Antibes}
\usecolortheme{lily}
\usepackage{graphicx}
\usepackage{hyperref}
\newcommand{\I}[1]{\mathit{#1}}
\newcommand{\cierto}{\I{cierto}}
\newcommand{\falso}{\I{falso}}
\DeclareMathOperator*{\argmax}{argmax}
\spanishdecimal{.}
\title{Algoritmo de búsqueda Bidireccional}
\author{Stalin Muñoz Gutiérrez}
\institute{
Centro de Ciencias de la Complejidad\\
Universidad Nacional Aut\'onoma de Mexico (UNAM)}
\date{}
\begin{document}
\parindent 2em
\frame
{
\titlepage
\note<1>{
Hoy veremos el algoritmo de búsqueda bidireccional.
Este es una variación interesante del algoritmo BFS.
Para poder aplicar el algoritmo vamos a requerir de condiciones adicionales.
Una condición es conocer el estado meta. Si no conocemos el estado meta o hay varios estados meta, no podemos aplicar el algoritmo directamente.
La otra condición es que para cualquier estado podamos conocer el conjunto de acciones y estados de los que es sucesor.
}
}
\begin{frame}[<+->]
\frametitle{Algoritmo de búsqueda bidireccional}
\begin{block}{Algoritmo basado en BFS}
Dos búsquedas por turnos.
\note<1>{
El algoritmo de búsqueda bidireccional, es en realidad dos búsquedas por turnos.
Las búsquedas podrían hacerse de manera paralela, pero requeriría modificar ligeramente el algoritmo que vamos a presentar.
}
\begin{itemize}
\item Una búsqueda progresiva o hacia adelante comenzando en el nodo inicial.
\note<2>{
La primera de las búsquedas es una búsqueda progresiva tipo BFS que comienza con el nodo inicial.
}
\item Otra búsqueda regresiva o hacia atrás comenzando con el nodo meta.
\note<3>{
La segunda búsqueda es una búsqueda regresiva o hacía atrás tipo BFS empezando del nodo meta.
}
\item El algoritmo termina cuando las búsquedas se encuentran a la mitad del camino.
\note<4>{
Cada dirección de exploración tiene una frontera de búsqueda.
El objetivo de cada exploración es descubrir un estado que es común a las dos fronteras.
Cuando dicha intersección se encuentra se puede conformar la ruta total a partir de las rutas parciales al estado común.
}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Búsqueda bidireccional}
\only<1>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-10.pdf}
\end{center}
}
\note<1>{
El estado inicial se agrega a la frontera de la búsqueda progresiva.
El estado meta se agrega a la frontera de la búsqueda regresiva.
}
\only<2>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-09.pdf}
\end{center}
}
\note<2>{
La búsqueda progresiva expande el nodo inicial.
La nueva frontera son todos los estados a profundidad 1.
La búsqueda progresiva busca que su frontera se intersecte con la frontera de la búsqueda regresiva.
Esto no ha pasado aún.
}
\only<3>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-08.pdf}
\end{center}
}
\note<3>{
Ahora es el turno de la búsqueda regresiva.
Si hacemos las búsquedas por turnos garantizamos que al intersectarse las fronteras, tendremos la solución óptima.
La búsqueda regresiva expande el estado meta.
}
\only<4>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-07.pdf}
\end{center}
}
\note<4>{
Turno de la búsqueda progresiva.
Generamos la frontera actual.
Todos los sucesores de los estados de la frontera anterior.
}
\only<5>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-06.pdf}
\end{center}
}
\note<5>{
Ahora es el turno de la búsqueda regresiva.
Agregamos todos los estados a profundidad 2.
Aún no se intersectan las fronteras.
}
\only<6>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-05.pdf}
\end{center}
}
\note<6>{
Hacia adelante con profundidad 3.
}
\only<7>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-04.pdf}
\end{center}
}
\note<7>{
Hacia atrás con profundidad 3.
}
\only<8>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-03.pdf}
\end{center}
}
\note<8>{
Se alcanza profundidad 4 en la búsqueda progresiva.
No hay intersección todavía.
}
\only<9>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-02.pdf}
\end{center}
}
\note<9>{
La búsqueda regresiva también alcanza profundidad 4.
Sin intersección.
}
\only<10>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-01.pdf}
\end{center}
}
\note<10>{
Turno de la búsqueda hacia adelante.
No mostramos todos los nodos a profundidad 5.
Únicamente el nodo de intersección entre las dos fronteras.
}
\only<11>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-00.pdf}
\end{center}
}
\note<11>{
Considerando que la intersección se encuentra tras expandir todos los estados a profundidad 5 en la frontera de la búsqueda progresiva,
y sumando el total de estados expandidos con el total de ambas fronteras,
tenemos que hemos expandido poco menos de 500 estados.
Dado que en este ejemplo la solución esta a profundidad 9,
un algoritmo BFS convencional habría expandido cerca de 30 mil estados para encontrar la solución.
Esto es un ahorro significativo en memoria.
}
\end{frame}
\begin{frame}
\frametitle{Algoritmo Bidireccional}
\begin{center}
\includegraphics[scale=0.10]{pizarron.jpg}
\end{center}
\note{
Explicamos el algoritmo Bidireccional en el pizarrón.
}
\end{frame}
\begin{frame}
\frametitle{Análisis Asintótico del algoritmo Bidireccional}
\begin{center}
\includegraphics[scale=0.35]{analisis-bidireccional.pdf}
\end{center}
\end{frame}
\note{
El desempeño del algoritmo bidireccional es muy bueno.
A pesar de utilizar memoria exponencial, al dividirse la búsqueda en dos exploraciones por turnos, el crecimiento de memoria es $O(b^{d/2})$.
Este ahorro es sustancial.
Respecto del tiempo, crece a la par con la memoria.
El algoritmo nos da la solución óptima,
y es completo.
Para problemas grandes, aún este ahorro de memoria, puede no ser suficiente.
La desventaja más notable es que el algoritmo no es tan general como los otros.
Se requiere de conocer el estado meta y también de poder ir hacia atrás de los estados para recuperar los estados predecesores.
}
\end{document}
\ No newline at end of file
\documentclass[xcolor=dvipsnames]{beamer}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{pgfpages}
\usepackage[makeroom]{cancel}
% descomentar para generar handouts con notas
\setbeameroption{show notes on second screen=right}
\usepackage{tikz}
\tikzstyle{every picture}+=[remember picture]
\usefonttheme[onlymath]{serif}
\usepackage{verbatim}
\usepackage{pifont}
\usetheme{Antibes}
\usecolortheme{lily}
\usepackage{graphicx}
\usepackage{hyperref}
\newcommand{\I}[1]{\mathit{#1}}
\newcommand{\cierto}{\I{cierto}}
\newcommand{\falso}{\I{falso}}
\DeclareMathOperator*{\argmax}{argmax}
\spanishdecimal{.}
\title{Algoritmo de búsqueda Bidireccional}
\author{Stalin Muñoz Gutiérrez}
\institute{
Centro de Ciencias de la Complejidad\\
Universidad Nacional Aut\'onoma de Mexico (UNAM)}
\date{}
\begin{document}
\parindent 2em
\frame
{
\titlepage
\note<1>{
Hoy veremos el algoritmo de búsqueda bidireccional.
Este es una variación interesante del algoritmo BFS.
Para poder aplicar el algoritmo vamos a requerir de condiciones adicionales.
Una condición es conocer el estado meta. Si no conocemos el estado meta o hay varios estados meta, no podemos aplicar el algoritmo directamente.
La otra condición es que para cualquier estado podamos conocer el conjunto de acciones y estados de los que es sucesor.
}
}
\begin{frame}[<+->]
\frametitle{Algoritmo de búsqueda bidireccional}
\begin{block}{Algoritmo basado en BFS}
Dos búsquedas por turnos.
\note<1>{
El algoritmo de búsqueda bidireccional, es en realidad dos búsquedas por turnos.
Las búsquedas podrían hacerse de manera paralela, pero requeriría modificar ligeramente el algoritmo que vamos a presentar.
}
\begin{itemize}
\item Una búsqueda progresiva o hacia adelante comenzando en el nodo inicial.
\note<2>{
La primera de las búsquedas es una búsqueda progresiva tipo BFS que comienza con el nodo inicial.
}
\item Otra búsqueda regresiva o hacia atrás comenzando con el nodo meta.
\note<3>{
La segunda búsqueda es una búsqueda regresiva o hacía atrás tipo BFS empezando del nodo meta.
}
\item El algoritmo termina cuando las búsquedas se encuentran a la mitad del camino.
\note<4>{
Cada dirección de exploración tiene una frontera de búsqueda.
El objetivo de cada exploración es descubrir un estado que es común a las dos fronteras.
Cuando dicha intersección se encuentra se puede conformar la ruta total a partir de las rutas parciales al estado común.
}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Búsqueda bidireccional}
\only<1>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-10.pdf}
\end{center}
}
\note<1>{
El estado inicial se agrega a la frontera de la búsqueda progresiva.
El estado meta se agrega a la frontera de la búsqueda regresiva.
}
\only<2>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-09.pdf}
\end{center}
}
\note<2>{
La búsqueda progresiva expande el nodo inicial.
La nueva frontera son todos los estados a profundidad 1.
La búsqueda progresiva busca que su frontera se intersecte con la frontera de la búsqueda regresiva.
Esto no ha pasado aún.
}
\only<3>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-08.pdf}
\end{center}
}
\note<3>{
Ahora es el turno de la búsqueda regresiva.
Si hacemos las búsquedas por turnos garantizamos que al intersectarse las fronteras, tendremos la solución óptima.
La búsqueda regresiva expande el estado meta.
}
\only<4>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-07.pdf}
\end{center}
}
\note<4>{
Turno de la búsqueda progresiva.
Generamos la frontera actual.
Todos los sucesores de los estados de la frontera anterior.
}
\only<5>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-06.pdf}
\end{center}
}
\note<5>{
Ahora es el turno de la búsqueda regresiva.
Agregamos todos los estados a profundidad 2.
Aún no se intersectan las fronteras.
}
\only<6>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-05.pdf}
\end{center}
}
\note<6>{
Hacia adelante con profundidad 3.
}
\only<7>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-04.pdf}
\end{center}
}
\note<7>{
Hacia atrás con profundidad 3.
}
\only<8>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-03.pdf}
\end{center}
}
\note<8>{
Se alcanza profundidad 4 en la búsqueda progresiva.
No hay intersección todavía.
}
\only<9>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-02.pdf}
\end{center}
}
\note<9>{
La búsqueda regresiva también alcanza profundidad 4.
Sin intersección.
}
\only<10>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-01.pdf}
\end{center}
}
\note<10>{
Turno de la búsqueda hacia adelante.
No mostramos todos los nodos a profundidad 5.
Únicamente el nodo de intersección entre las dos fronteras.
}
\only<11>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-00.pdf}
\end{center}
}
\note<11>{
Considerando que la intersección se encuentra tras expandir todos los estados a profundidad 5 en la frontera de la búsqueda progresiva,
y sumando el total de estados expandidos con el total de ambas fronteras,
tenemos que hemos expandido poco menos de 500 estados.
Dado que en este ejemplo la solución esta a profundidad 9,
un algoritmo BFS convencional habría expandido cerca de 30 mil estados para encontrar la solución.
Esto es un ahorro significativo en memoria.
}
\end{frame}
\begin{frame}
\frametitle{Algoritmo Bidireccional}
\begin{center}
\includegraphics[scale=0.10]{pizarron.jpg}
\end{center}
\note{
Explicamos el algoritmo Bidireccional en el pizarrón.
}
\end{frame}
\begin{frame}
\frametitle{Análisis Asintótico del algoritmo Bidireccional}
\begin{center}
\includegraphics[scale=0.35]{analisis-bidireccional.pdf}
\end{center}
\end{frame}
\note{
El desempeño del algoritmo bidireccional es muy bueno.
A pesar de utilizar memoria exponencial, al dividirse la búsqueda en dos exploraciones por turnos, el crecimiento de memoria es $O(b^{d/2})$.
Este ahorro es sustancial.
Respecto del tiempo, crece a la par con la memoria.
El algoritmo nos da la solución óptima,
y es completo.
Para problemas grandes, aún este ahorro de memoria, puede no ser suficiente.
La desventaja más notable es que el algoritmo no es tan general como los otros.
Se requiere de conocer el estado meta y también de poder ir hacia atrás de los estados para recuperar los estados predecesores.
}
\end{document}
\ No newline at end of file
\beamer@endinputifotherversion {3.36pt}
\select@language {spanish}
......@@ -34,10 +34,12 @@
\@writefile{nav}{\headcommand {\beamer@framepages {5}{8}}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{9/34}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {9}{34}}}
\@writefile{nav}{\headcommand {\beamer@partpages {1}{42}}}
\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{42}}}
\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{42}}}
\@writefile{nav}{\headcommand {\beamer@documentpages {42}}}
\@writefile{nav}{\headcommand {\def \inserttotalframenumber {5}}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{35/42}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {35}{42}}}
\@writefile{nav}{\headcommand {\beamer@partpages {1}{43}}}
\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{43}}}
\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{43}}}
\@writefile{nav}{\headcommand {\beamer@documentpages {43}}}
\@writefile{nav}{\headcommand {\def \inserttotalframenumber {6}}}
\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{43/43}{}{0}}}
\@writefile{nav}{\headcommand {\beamer@framepages {43}{43}}}
......@@ -7,10 +7,12 @@
\headcommand {\beamer@framepages {5}{8}}
\headcommand {\slideentry {0}{0}{4}{9/34}{}{0}}
\headcommand {\beamer@framepages {9}{34}}
\headcommand {\beamer@partpages {1}{42}}
\headcommand {\beamer@subsectionpages {1}{42}}
\headcommand {\beamer@sectionpages {1}{42}}
\headcommand {\beamer@documentpages {42}}
\headcommand {\def \inserttotalframenumber {5}}
\headcommand {\slideentry {0}{0}{5}{35/42}{}{0}}
\headcommand {\beamer@framepages {35}{42}}
\headcommand {\beamer@partpages {1}{43}}
\headcommand {\beamer@subsectionpages {1}{43}}
\headcommand {\beamer@sectionpages {1}{43}}
\headcommand {\beamer@documentpages {43}}
\headcommand {\def \inserttotalframenumber {6}}
\headcommand {\slideentry {0}{0}{6}{43/43}{}{0}}
\headcommand {\beamer@framepages {43}{43}}
No preview for this file type
......@@ -143,181 +143,287 @@ Además, se tiene control total sobre los recurso computacionales del algoritmo a
\includegraphics[scale=0.35]{DLS-ejemplo-1.pdf}
\end{center}
}
\note<1>{}
\note<1>{Vamos a ilustrar la operación del algoritmo DLS en el ejemplo de encontrar la ruta de la estación Bellas Artes a la estación Pino Suarez.
El algoritmo agrega el estado inicial a la agenda.}
\only<2>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-2.pdf}
\end{center}
}
\note<2>{}
\note<2>{
Empezamos la iteración.
Sacamos al estado $B$ de la agenda.
}
\only<3>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-3.pdf}
\end{center}
}
\note<3>{}
\note<3>{
Expandimos a $B$, $B$ tiene 4 estados sucesores.
$B$, $A$, $S$ y $H$.
Agregamos los cuatro a la agenda.
Indicamos en el subíndice el estado del que vienen.
Como superíndice la profundidad del vértice.
Por ser la primera expansión, todos tienen profundidad 1.
}
\only<4>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-4.pdf}
\end{center}
}
\note<4>{}
\note<4>{
Sacamos al estado $H$ y lo expandimos.
Sus sucesores $R$, $J$ y $V$ tienen profundidad 2.
}
\only<5>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-5.pdf}
\end{center}
}
\note<5>{}
\note<5>{
Sacamos el tope de la pila, el estado $V$.
}
\only<6>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-6.pdf}
\end{center}
}
\note<6>{}
\note<6>{
Como DLS es una búsqueda en profundidad, observamos que la profunidad de los nodos está aumentando.
Aún estamos dentro de la cota.
}
\only<7>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-7.pdf}
\end{center}
}
\note<7>{}
\note<7>{
No hay sucesores de $V$ que tengamos que agregar.
}
\only<8>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-8.pdf}
\end{center}
}
\note<8>{}
\note<8>{
En el siguiente paso, se saca a $J$ de la agenda.
}
\only<9>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-9.pdf}
\end{center}
}
\note<9>{}
\note<9>{
Con su expansión se agrega el estado $D$.
$D$ ha alcanzado la cota de profundidad.
}
\only<10>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-10.pdf}
\end{center}
}
\note<10>{}
\note<10>{
Sacamos a $D$ de la agenda.
}
\only<11>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-11.pdf}
\end{center}
}
\note<11>{}
\note<11>{
DLS no puede agregar nodos que superen la cota de profundidad.
Los sucesores de $D$ son ignorados.
El nodo simplemente no se expande.
}
\only<12>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-12.pdf}
\end{center}
}
\note<12>{}
\note<12>{
El tope de la pila ahora es $R$.
Lo sacamos.
}
\only<13>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-13.pdf}
\end{center}
}
\note<13>{}
\note<13>{
Al expandirlo agregamos a $G$ y a $U$.
}
\only<14>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-14.pdf}
\end{center}
}
\note<14>{}
\note<14>{
Sacamos de la agenda a $U$.
No se expande porque su profundidad es 3.
Sus sucesores superarían la cota.
}
\only<15>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-15.pdf}
\end{center}
}
\note<15>{}
\note<15>{
Ahora sacamos a $G$.
Tampoco se expande.
}
\only<16>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-16.pdf}
\end{center}
}
\note<16>{}
\note<16>{
El siguiente estado en salir es $S$.
}
\only<17>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-17.pdf}
\end{center}
}
\note<17>{}
\note<17>{
Al expandir a $S$ se agrega $O$ a la agenda.
}
\only<18>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-18.pdf}
\end{center}
}
\note<18>{}
\note<18>{
Se saca $O$.
}
\only<19>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-19.pdf}
\end{center}
}
\note<19>{}
\note<19>{
Agregamos dos sucesores, el estado $I$ y el estado $D$.
}
\only<20>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-20.pdf}
\end{center}
}
\note<20>{}
\note<20>{
En el tope queda $D$.
Lo sacamos.
No se expandirá dado que su profundidad es igual a la cota.
}
\only<21>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-21.pdf}
\end{center}
}
\note<21>{}
\note<21>{
Similarmente para $I$, no agregamos sucesores.
}
\only<22>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-22.pdf}
\end{center}
}
\note<22>{}
\note<22>{
El tope de la pila ahora es $A$.
Lo sacamos.
}
\only<23>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-23.pdf}
\end{center}
}
\note<23>{}
\note<23>{
Al expandir $A$ agregamos a $Z$.
}
\only<24>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-24.pdf}
\end{center}
}
\note<24>{}
\note<24>{
$Z$ es el tope.
Lo sacamos.
}
\only<25>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-25.pdf}
\end{center}
}
\note<25>{}
\note<25>{
Al expandirlo descubrimos a $P$.
Nuestra meta.
}
\only<26>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-26.pdf}
\end{center}
}
\note<26>{}
\note<26>{
Antes de terminar, recuperamos la ruta.
$P$ viene de $Z$.
$Z$ viene de $A$.
$A$ viene de $B$.
La ruta es $B$,$A$,$Z$,$P$.
}
\end{frame}
\begin{frame}[<+->]
......@@ -349,4 +455,18 @@ Es óptima únicamente si $c = d$.
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Algoritmos tipo DFS}
\begin{table}[]
\begin{tabular}{l|llll}
Algoritmo&DFS&DLS&ID&DFBB\\
\hline
Memoria&$O(b^m)$&$O(b c)$&{\color{red}$O(b d)$}&$O(b c)$\\
Tiempo&$O(b^m)$&$O(b^c)$&{\color{red}$O(b^d)$} &$O(b^c)$\\
Calidad&Subóptima&Subóptima&Óptima&Óptima\\
Completez&Incompleto&Incompleto&Completo&Incompleto
\end{tabular}
\end{table}
\end{frame}
\end{document}
\ No newline at end of file
......@@ -125,6 +125,12 @@ La razón más importante, es la de evitar que el agente caiga en un ciclo infinit
Al controlar la profundidad máxima de la búsqueda, DLS no podrá caer en un ciclo infinito.
A lo más dará vueltas un número finito de veces.
Esto puede sonar muy ineficiente.
Sin embargo el ahorro en memoria es sustancial.
Además, se tiene control total sobre los recurso computacionales del algoritmo a través de la cota de profundidad.
}
\end{frame}
......@@ -137,181 +143,287 @@ A lo más dará vueltas un número finito de veces.
\includegraphics[scale=0.35]{DLS-ejemplo-1.pdf}
\end{center}
}
\note<1>{}
\note<1>{Vamos a ilustrar la operación del algoritmo DLS en el ejemplo de encontrar la ruta de la estación Bellas Artes a la estación Pino Suarez.
El algoritmo agrega el estado inicial a la agenda.}
\only<2>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-2.pdf}
\end{center}
}
\note<2>{}
\note<2>{
Empezamos la iteración.
Sacamos al estado $B$ de la agenda.
}
\only<3>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-3.pdf}
\end{center}
}
\note<3>{}
\note<3>{
Expandimos a $B$, $B$ tiene 4 estados sucesores.
$B$, $A$, $S$ y $H$.
Agregamos los cuatro a la agenda.
Indicamos en el subíndice el estado del que vienen.
Como superíndice la profundidad del vértice.
Por ser la primera expansión, todos tienen profundidad 1.
}
\only<4>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-4.pdf}
\end{center}
}
\note<4>{}
\note<4>{
Sacamos al estado $H$ y lo expandimos.
Sus sucesores $R$, $J$ y $V$ tienen profundidad 2.
}
\only<5>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-5.pdf}
\end{center}
}
\note<5>{}
\note<5>{
Sacamos el tope de la pila, el estado $V$.
}
\only<6>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-6.pdf}
\end{center}
}
\note<6>{}
\note<6>{
Como DLS es una búsqueda en profundidad, observamos que la profunidad de los nodos está aumentando.
Aún estamos dentro de la cota.
}
\only<7>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-7.pdf}
\end{center}
}
\note<7>{}
\note<7>{
No hay sucesores de $V$ que tengamos que agregar.
}
\only<8>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-8.pdf}
\end{center}
}
\note<8>{}
\note<8>{
En el siguiente paso, se saca a $J$ de la agenda.
}
\only<9>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-9.pdf}
\end{center}
}
\note<9>{}
\note<9>{
Con su expansión se agrega el estado $D$.
$D$ ha alcanzado la cota de profundidad.
}
\only<10>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-10.pdf}
\end{center}
}
\note<10>{}
\note<10>{
Sacamos a $D$ de la agenda.
}
\only<11>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-11.pdf}
\end{center}
}
\note<11>{}
\note<11>{
DLS no puede agregar nodos que superen la cota de profundidad.
Los sucesores de $D$ son ignorados.
El nodo simplemente no se expande.
}
\only<12>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-12.pdf}
\end{center}
}
\note<12>{}
\note<12>{
El tope de la pila ahora es $R$.
Lo sacamos.
}
\only<13>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-13.pdf}
\end{center}
}
\note<13>{}
\note<13>{
Al expandirlo agregamos a $G$ y a $U$.
}
\only<14>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-14.pdf}
\end{center}
}
\note<14>{}
\note<14>{
Sacamos de la agenda a $U$.
No se expande porque su profundidad es 3.
Sus sucesores superarían la cota.
}
\only<15>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-15.pdf}
\end{center}
}
\note<15>{}
\note<15>{
Ahora sacamos a $G$.
Tampoco se expande.
}
\only<16>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-16.pdf}
\end{center}
}
\note<16>{}
\note<16>{
El siguiente estado en salir es $S$.
}
\only<17>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-17.pdf}
\end{center}
}
\note<17>{}
\note<17>{
Al expandir a $S$ se agrega $O$ a la agenda.
}
\only<18>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-18.pdf}
\end{center}
}
\note<18>{}
\note<18>{
Se saca $O$.
}
\only<19>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-19.pdf}
\end{center}
}
\note<19>{}
\note<19>{
Agregamos dos sucesores, el estado $I$ y el estado $D$.
}
\only<20>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-20.pdf}
\end{center}
}
\note<20>{}
\note<20>{
En el tope queda $D$.
Lo sacamos.
No se expandirá dado que su profundidad es igual a la cota.
}
\only<21>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-21.pdf}
\end{center}
}
\note<21>{}
\note<21>{
Similarmente para $I$, no agregamos sucesores.
}
\only<22>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-22.pdf}
\end{center}
}
\note<22>{}
\note<22>{
El tope de la pila ahora es $A$.
Lo sacamos.
}
\only<23>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-23.pdf}
\end{center}
}
\note<23>{}
\note<23>{
Al expandir $A$ agregamos a $Z$.
}
\only<24>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-24.pdf}
\end{center}
}
\note<24>{}
\note<24>{
$Z$ es el tope.
Lo sacamos.
}
\only<25>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-25.pdf}
\end{center}
}
\note<25>{}
\note<25>{
Al expandirlo descubrimos a $P$.
Nuestra meta.
}
\only<26>{
\begin{center}
\includegraphics[scale=0.35]{DLS-ejemplo-26.pdf}
\end{center}
}
\note<26>{}
\note<26>{
Antes de terminar, recuperamos la ruta.
$P$ viene de $Z$.
$Z$ viene de $A$.
$A$ viene de $B$.
La ruta es $B$,$A$,$Z$,$P$.
}
\end{frame}
\begin{frame}[<+->]
......@@ -343,4 +455,18 @@ Es óptima únicamente si $c = d$.
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Algoritmos tipo DFS}
\begin{table}[]
\begin{tabular}{l|llll}
Algoritmo&DFS&DLS&ID&DFBB\\
\hline
Memoria&$O(b^m)$&$O(b c)$&{\color{red}$O(b d)$}&$O(b c)$\\
Tiempo&$O(b^m)$&$O(b^c)$&{\color{red}$O(b^d)$} &$O(b^c)$\\
Calidad&Subóptima&Subóptima&Óptima&Óptima\\
Completez&Incompleto&Incompleto&Completo&Incompleto
\end{tabular}
\end{table}
\end{frame}
\end{document}
\ No newline at end of file
\documentclass[xcolor=dvipsnames]{beamer}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{pgfpages}
\usepackage[makeroom]{cancel}
% descomentar para generar handouts con notas
\setbeameroption{show notes on second screen=right}
\usepackage{tikz}
\tikzstyle{every picture}+=[remember picture]
\usefonttheme[onlymath]{serif}
\usepackage{verbatim}
\usepackage{pifont}
\usetheme{Antibes}
\usecolortheme{lily}
\usepackage{graphicx}
\usepackage{hyperref}
\newcommand{\I}[1]{\mathit{#1}}
\newcommand{\cierto}{\I{cierto}}
\newcommand{\falso}{\I{falso}}
\DeclareMathOperator*{\argmax}{argmax}
\spanishdecimal{.}
\title{Algoritmo de búsqueda Bidireccional}
\author{Stalin Muñoz Gutiérrez}
\institute{
Centro de Ciencias de la Complejidad\\
Universidad Nacional Aut\'onoma de Mexico (UNAM)}
\date{}
\begin{document}
\parindent 2em
\frame
{
\titlepage
\note<1>{
Hoy veremos el algoritmo de búsqueda bidireccional.
Este es una variación interesante del algoritmo BFS.
Para poder aplicar el algoritmo vamos a requerir de condiciones adicionales.
Una condición es conocer el estado meta. Si no conocemos el estado meta o hay varios estados meta, no podemos aplicar el algoritmo directamente.
La otra condición es que para cualquier estado podamos conocer el conjunto de acciones y estados de los que es sucesor.
}
}
\begin{frame}[<+->]
\frametitle{Algoritmo de búsqueda bidireccional}
\begin{block}{Algoritmo basado en BFS}
Dos búsquedas por turnos.
\note<1>{
El algoritmo de búsqueda bidireccional, es en realidad dos búsquedas por turnos.
Las búsquedas podrían hacerse de manera paralela, pero requeriría modificar ligeramente el algoritmo que vamos a presentar.
}
\begin{itemize}
\item Una búsqueda progresiva o hacia adelante comenzando en el nodo inicial.
\note<2>{
La primera de las búsquedas es una búsqueda progresiva tipo BFS que comienza con el nodo inicial.
}
\item Otra búsqueda regresiva o hacia atrás comenzando con el nodo meta.
\note<3>{
La segunda búsqueda es una búsqueda regresiva o hacía atrás tipo BFS empezando del nodo meta.
}
\item El algoritmo termina cuando las búsquedas se encuentran a la mitad del camino.
\note<4>{
Cada dirección de exploración tiene una frontera de búsqueda.
El objetivo de cada exploración es descubrir un estado que es común a las dos fronteras.
Cuando dicha intersección se encuentra se puede conformar la ruta total a partir de las rutas parciales al estado común.
}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Búsqueda bidireccional}
\only<1>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-10.pdf}
\end{center}
}
\note<1>{
El estado inicial se agrega a la frontera de la búsqueda progresiva.
El estado meta se agrega a la frontera de la búsqueda regresiva.
}
\only<2>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-09.pdf}
\end{center}
}
\note<2>{
La búsqueda progresiva expande el nodo inicial.
La nueva frontera son todos los estados a profundidad 1.
La búsqueda progresiva busca que su frontera se intersecte con la frontera de la búsqueda regresiva.
Esto no ha pasado aún.
}
\only<3>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-08.pdf}
\end{center}
}
\note<3>{
Ahora es el turno de la búsqueda regresiva.
Si hacemos las búsquedas por turnos garantizamos que al intersectarse las fronteras, tendremos la solución óptima.
La búsqueda regresiva expande el estado meta.
}
\only<4>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-07.pdf}
\end{center}
}
\note<4>{
Turno de la búsqueda progresiva.
Generamos la frontera actual.
Todos los sucesores de los estados de la frontera anterior.
}
\only<5>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-06.pdf}
\end{center}
}
\note<5>{
Ahora es el turno de la búsqueda regresiva.
Agregamos todos los estados a profundidad 2.
Aún no se intersectan las fronteras.
}
\only<6>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-05.pdf}
\end{center}
}
\note<6>{
Hacia adelante con profundidad 3.
}
\only<7>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-04.pdf}
\end{center}
}
\note<7>{
Hacia atrás con profundidad 3.
}
\only<8>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-03.pdf}
\end{center}
}
\note<8>{
Se alcanza profundidad 4 en la búsqueda progresiva.
No hay intersección todavía.
}
\only<9>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-02.pdf}
\end{center}
}
\note<9>{
La búsqueda regresiva también alcanza profundidad 4.
Sin intersección.
}
\only<10>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-01.pdf}
\end{center}
}
\note<10>{
Turno de la búsqueda hacia adelante.
No mostramos todos los nodos a profundidad 5.
Únicamente el nodo de intersección entre las dos fronteras.
}
\only<11>{
\begin{center}
\includegraphics[scale=0.13]{bidireccional-diagrama-00.pdf}
\end{center}
}
\note<11>{
Considerando que la intersección se encuentra tras expandir todos los estados a profundidad 5 en la frontera de la búsqueda progresiva,
y sumando el total de estados expandidos con el total de ambas fronteras,
tenemos que hemos expandido poco menos de 500 estados.
Dado que en este ejemplo la solución esta a profundidad 9,
un algoritmo BFS convencional habría expandido cerca de 30 mil estados para encontrar la solución.
Esto es un ahorro significativo en memoria.
}
\end{frame}
\begin{frame}
\frametitle{Algoritmo Bidireccional}
\begin{center}
\includegraphics[scale=0.10]{pizarron.jpg}
\end{center}
\note{
Explicamos el algoritmo Bidireccional en el pizarrón.
}
\end{frame}
\begin{frame}
\frametitle{Análisis Asintótico del algoritmo Bidireccional}
\begin{center}
\includegraphics[scale=0.35]{analisis-bidireccional.pdf}
\end{center}
\end{frame}
\note{
El desempeño del algoritmo bidireccional es muy bueno.
A pesar de utilizar memoria exponencial, al dividirse la búsqueda en dos exploraciones por turnos, el crecimiento de memoria es $O(b^{d/2})$.
Este ahorro es sustancial.
Respecto del tiempo, crece a la par con la memoria.
El algoritmo nos da la solución óptima,
y es completo.
Para problemas grandes, aún este ahorro de memoria, puede no ser suficiente.
La desventaja más notable es que el algoritmo no es tan general como los otros.
Se requiere de conocer el estado meta y también de poder ir hacia atrás de los estados para recuperar los estados predecesores.
}
\end{document}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment