2010-05-14 8 views
5

Una pregunta sobre juegos de las 20 preguntas se le pidió here:¿Hay un algoritmo para encontrar un elemento que coincida con ciertas propiedades, como un juego de 20 preguntas?

Sin embargo, si yo estoy entendiendo correctamente, las respuestas parecen asumir que cada pregunta pasará a un árbol jerárquico de ramificación. Un árbol binario debería funcionar si el juego fuera así:

  1. ¿Es un animal? Sí.
  2. ¿Es un mamífero? Sí.
  3. ¿Es un felino? Sí.

Porque el felino es un ejemplo de mamífero y el mamífero es un ejemplo de un animal. Pero, ¿y si las preguntas son así?

  1. ¿Es un mamífero? Sí.
  2. ¿Es un depredador? Sí.
  3. ¿Tiene una nariz larga? No.

No puede ramificar un árbol con ese tipo de preguntas, porque hay muchos depredadores que no son mamíferos. Por lo tanto, no puede hacer que su programa se limite a mamíferos y que los depredadores sean un subconjunto de mamíferos.

Entonces, ¿hay alguna manera de utilizar un árbol de búsqueda binaria que no entiendo o hay un algoritmo diferente para este problema?

Solo para aclarar, solo estoy usando 20 preguntas como ejemplo, por lo que mi pregunta es sobre este tipo de problema de búsqueda en general, no sobre otros problemas involucrados específicamente en un juego de 20 preguntas.

+1

Es aún más complicado cuando se tiene que tomar en cuenta que las personas responden de manera consistente incorrectamente, si por ejemplo mucha gente piensa que los delfines son peces ... Por eso es que se necesita un enfoque más interconectado, como ANN o otro aprendizaje automático. –

+0

Gracias, pero solo estoy usando 20 preguntas como ejemplo para una situación en la que necesita encontrar qué objeto coincide con un conjunto de propiedades. Entonces, por el bien de esta pregunta, me gustaría asumir que siempre recibes la respuesta correcta. Edité mi pregunta para tratar de aclarar eso. – lala

Respuesta

2

Se compara con una búsqueda binaria en la que cada pregunta es sí/no, por lo que cada respuesta divide su conjunto restante en dos partes. Sin embargo, el conjunto de datos probable no se almacenará en un árbol binario real, porque como se dará cuenta, eso solo funcionaría si las preguntas siempre se hicieran en el mismo orden que la dimensión de división del árbol.

Además, fácilmente podría tener más de exactamente 20 dimensiones ('propiedades') para dividir las cosas, y algunos de esos veinte podrían ser compartidos por más de un objeto (por lo que el nodo hoja de un nivel 20 el árbol binario no contendría necesariamente solo un elemento).

Por lo tanto, la "búsqueda binaria" es solo una metáfora de lo que está sucediendo actualmente, ya que en cada paso intenta elegir la propiedad que mejor divida el conjunto restante en dos mitades iguales. En cuanto a las estructuras de datos reales, tendría que usar algo más.

0

Si necesitas seguir con un árbol binario para el problema, no hay nada que diga que no puedes duplicar una rama o un nodo. Coloque el nodo de respuesta felino al final de más de un conjunto de decisiones. O haga la pregunta del depredador dos veces: una vez si el usuario dijo "sí" al mamífero, y una vez si el usuario dijo "no".

Sin duda hay preocupaciones de optimización y eficiencia si se toma esta táctica, pero también hay formas de abordar problemas específicos. (Por ejemplo, si le preocupa el espacio de almacenamiento para el árbol de decisiones, haga que las ramas o los nodos o ambos punteros sean objetos/declaraciones inmutables).

+0

¿No crecerá el árbol exponencialmente de esa manera y se volverá realmente rápido? Solo soy un principiante, pero parece que sería más fácil iterar sobre cada respuesta posible y verificarlas una a la vez. – lala

-1

Si está buscando una coincidencia exacta, simplemente revise todas las propiedades y haga una búsqueda.

Si desea hacer un reconocimiento de patrones para encontrar elementos similares, puede utilizar un método con una asignación bastante 'lineal', como el k-vecino más cercano. Por ejemplo, puede usar un árbol kd para representar el espacio de búsqueda.

+0

"hash on"? ¿Es la jerga del programador algo así? – lala

+0

"Hash on" == poner los valores en una tabla hash. – tzaman

0

Creo que lo que está buscando se conoce más comúnmente como Decision Tree, específicamente para la clasificación. Luego puede usar algoritmos como C4.5 para aprender a ordenar sus preguntas para clasificarlas de manera eficiente.

Cuestiones relacionadas