¿Qué entienden al leer este enunciado? Tema Algoritmia

E

Hola gente, os cuento:

Tengo que desarrollar una serie de algoritmos de búsqueda en python (para la universidad), y estoy muy muy estancado. Por más que leo el enunciado no me aclaro. Mi problema está en el segundo algoritmo, al aplicar backtracking. Os dejo por aquí un enlace al enunciado del trabajo: https://www.dropbox.com/s/ucsuoiiy70djwsp/BeamSearch.pdf?dl=0

¿Qué entendéis vosotros? Según yo he podido entender, elimina en memoria el último bloque, y pasa al siguiente y así sucesivamente hasta que se terminan los bloques de un nivel y retrocede, es decir, hace el backtracking. Pero si os fijáis en el dibujo que te proporcionan(figura 2) pasa del nivel 3 al 5 sin revisar todos los bloques restantes. No se si es que estoy muy 'tonto' o que está mal explicado, pero estoy bastante estancado, he hecho ya varias implementaciones (llevo casi dos semanas dándole vueltas) y no me termina de cuajar ninguna, y puede que esté entendiendo el concepto mal, por lo que un nuevo punto de vista, nunca viene mal.

Un saludo y muchas gracias de antemano.

PD: envié email a casi todos los profesores del departamento, pero se ve que no trabajan ni en julio, ni agosto :(

maxmalkav

No hago un ejercicio de backtracking desde verano de 2004, pero vamos a ver si puedo aportar algo :-)

Puede que el dibujo quedase más claro si en lugar de una pirámide dibujasen una estructura de árbol (al menos es como yo lo he considerado para la explicación que viene a continuación)

En la traza representada en el dibujo, el algoritmo sí ha explorado todo lo que podía explorar en el nivel 5 (no puede seguir saltando alegremente al resto de nodos del nivel 5, el acceso a esos nodos se hace desde nodos padre, no desde nodos "contiguos", pertenecientes al mismo nivel). Por tanto, una vez no se puede explorar nada más en el nivel 5, el algoritmo realiza el "backtracking" y retrocede (deshaciendo los pasos añadidos a la solución parcial) hasta el nodo donde aún quedan posibles subsoluciones sin examinar (en este caso el nivel 3, ya que en el nivel 4 no queda nada que podamos explorar, los candidatos a solución que pueden construirse desde ahí no proporcionan una solución al problema. Rrecuerda que la estructura debe verse como un árbol para tener claro cuando quedan o no soluciones por explorar que partan de un determinado nodo).

1 respuesta
E

#2 Buenas, muchas gracias. Me has ayudado a verlo desde otro punto de vista. Pero hay una cosa que no me queda clara. ¿Por qué dices que desde el nivel 4 no hay posibles soluciones y pasa directamente al 3? Esa parte no me ha quedado clara. Como tú lo planteas tiene bastante sentido, en el enunciado como pone que se exploran todos los bloques contiguos de un nivel, y una vez hecho esto se pasa al nivel anterior ahí mi duda. Pero desde luego como lo planteas, tiene mucho sentido.

Muchas gracias de antemano y un saludo.

maxmalkav

Te he descrito una búsqueda en profundidad cutre. Tengo que mirar con más detalle el tema de los haces (no recuerdo haber visto estudiado algo así en concreto). Por curiosidad lo voy a mirar y ver si puedo expresarlo bien.

1 respuesta
E

#4 Vale muchísimas gracias por su dedicación compañero. Yo seguiré pensando, si logro dar con la solución la pondré por aquí y la subiré a github para que nadie jamas tenga que pasar por ésto que estoy pasando yo ahora mismo :-)

Un saludo y muchas gracias de nuevo.

1 respuesta
Gif
     | root
   /  \ vertices
  |    | nodes 1, 2
 /\   /\ vertices
|  | |  | nodes 3,4,5,6

if root.getVal() == val
     return root
stack.push(root);
while stack not empty
     node = stack.pop()
     if(node is not visited)
          for each vertex from node
              if(vertex.next.getVal() == val)
                    return vertex.next
              stack.push(vertex.next)

espero que lo entiendas.

1 respuesta
maxmalkav

#6 estoy ya mayor para esas cosas, pero tu algoritmo me suena a búsqueda en anchura.

#5 tardaré unos días (en el mejor de los casos) en volver a esto. Yo te animaría a mirar bibliografía (en inglés), probablemente buscando por "beam search" vas a encontrar mejores ejemplos e ilustraciones.

2 respuestas
Gif

#7 no, eso es con una queue, con stack es depth-first seach

1 respuesta
maxmalkav

#8 tienes razón
De todas formas parece que el tema de los "haces" es un poco vuelta de tuerca a esto (cuando he leído de lo que va no me ha parecido de primeras muy evidente)

2 respuestas
SillaSentada

#1 yo sé hacer una pagina web con php y css

Gif

#9 es esto lo que tiene que implementar, yo solo he puesto el dfs ya que se le parece.

Gif

#1 #9 paper del algoritmo

1 respuesta
E

#7 #12 Muchas gracias a ambos. Me he mirado bastantes papers en inglés, aparte del que ha puesto Gif, también tengo este http://www.cs.unh.edu/ruml/cs730/paper-examples/wilt.pdf que es donde más claro viene y te pone pseudocódigo. Pero por ejemplo, el que ha puesto Gif, no entiendo muy bien algunas cosas de la nomenclatura, además que me da la sensación de que no corresponde con el enunciado que me dan. Pero es sin duda eso, tiene que ser eso, otra cosa no hay o no he encontrado por internet. ¿Hay alguien que entienda a la perfección ese pseudocódigo aparte del hombre que ha escrito el paper? Porque una mini-explicación vendría muy bien. ¿A que se refieren exactamente con estos símbolos |, \ La verdad que creo que se han pasado un poco, para un trabajo que vale 3 puntos, en una asignatura de tercero. O seré yo que soy muy torpe....

Otra cosa que no me cuadra, es que para la implementación del primer algoritmo normal (sin BT, el cuál ya esta implementado y funciona bastante bien pienso) me dicen que es en anchura. Pero del segundo que me piden (con BT) como bien decís vosotros, solo he encontrado implementaciones en profundidad. No se si deberían ser ambos en anchura...

Os dejo el razonamiento a ver si lo veis correcto (conversación de whatsapp con un compañero) ya que os veo mucho más curtidos que yo, que soy un simple (y pobre) estudiante de Ing. Informática:

Lo que hace es tirar para abajo siempre
Genera sucesores, ordena por heuristica, coge B estados y los analiza
Si alguno es estado final de puta madre, hemos terminado
Pues hace eso en general
Pero si te quedas sin memoria tiene que volver atrás
Entonces imagina que estas en nivel 3 y te quedas sin memoria
Los sucesores que tenías eran de nivel 4, pero ya no tienes memoria
Y ten en cuenta que habías analizado solo los B mejores de nivel 4 QUE SON SUCESORES DE LOS B MEJORES DE NIVEL 3
Entonces tienes que analizar los segundos, terceros, ..., B mejores de los de nivel 4 sucesores de B mejores de nivel 3
Y una vez hayas analizado todos los de nivel 4 sucesores de los B mejores de nivel 3
Aquí viene lo importante
Tienes que volver a nivel 2 y generar sucesores de nivel 3, pero esta vez no vas a considerar los B mejores, sino los segundos B mejores
Y de ahí, partes de una base de nodos de nivel 3, a partir de los cuales vas a generar otros de nivel 4 diferentes (en general) a los anteriores
Esa es la idea general, todo ese proceso se repite
Hasta que hayas considerado todos los de nivel 3 de tal forma que ya no tengas más para generar nodos de nivel 4 que no hayas considerado ya
Entonces se vuelve al 1, se generan los de 2, se coge los segundos mejores, y se repite todo solo que ahora en vez de analizar nivel 4 analizas nivel 3
Y así hasta quedarte con el nodo raíz y punto

PD: vaya agosto más divertido voy a pasar con 20 añitos jajaja. Muchas gracias chicos por vuestras sugerencias no sabéis cuanto lo agradezco.

Usuarios habituales