Algoritmo para produzir quebra-cabeças 'Lady or Tiger'?

8

Qual é o meu problema:

Há um quebra-cabeça de Raymond Smullyan que funciona mais ou menos assim: você está em uma sala com muitas portas. Atrás de algumas daquelas portas, há damas; atrás dos outros, existem tigres. Seu objetivo é escolher uma das portas certas (aquelas com as mulheres). Em toda porta, há uma placa que diz algo como: Há uma senhora atrás desta porta ou Há um leão atrás da porta II e VI e assim por diante. Agora, você também tem algumas informações adicionais, como Apenas um dos sinais diz a verdade ou O sinal na porta é verdadeiro apenas se houver uma mulher atrás dessa porta e assim por diante. Por exemplo, o primeiro quebra-cabeça é assim:

Existem duas portas com um sinal cada. Um dos sinais é verdadeiro, o outro é falso:

 ---------------------    ---------------------
|      DOOR I         |  |      DOOR II        |
| There's a lady in   |  | In one of those     |
| this room and a     |  | rooms, there's a    |
| a tiger in the      |  | lady, in the other  |
| other one           |  | one there's a tiger |
 ---------------------    ---------------------

Atrás de qual porta está uma dama?

Agora, chegando ao tópico desta pergunta: estou procurando maneiras possíveis de gerar automaticamente esses quebra-cabeças. O objetivo (distante) é criar um algoritmo que exija, como parâmetros, o número de portas (e talvez a dificuldade do quebra-cabeça resultante) e crie textos correspondentes para as portas.

O que eu tentei até agora:

Não muito, porque eu realmente não sei por onde começar. É fácil criar um padrão para o texto nos sinais e também é fácil atribuir aleatoriamente declarações verdadeiras e falsas a esses sinais, correspondendo à regra verdadeira-falsa que você usa (por exemplo, apenas um sinal diz a verdade ). Mas essa é a parte em que fica complicado: como criar um quebra-cabeça solucionável e com uma solução única ? Minha primeira idéia foi criar um quebra-cabeça aleatório e usar o backtracking para procurar soluções. Mas, dessa forma, pode demorar muito tempo até que o algoritmo finalmente encontre um conjunto de sinais de trabalho. Além disso, dessa forma, você não pode determinar facilmente o quão difícil é um determinado quebra-cabeça.

Então, resumindo: você tem alguma idéia, algum link útil etc.? Qualquer ajuda é apreciada, não espero que ninguém poste uma solução perfeita e completa para o meu problema.

(Nota: originalmente fiz a seguinte pergunta no stackoverflow, mas me disseram lá que seria mais provável obter uma resposta aqui!)

vauge
fonte
Você pode achar aaai.org/Papers/AAAI/2007/AAAI07-361.pdf útil.
19413 Adam
11
Na verdade, acho que você pode obter melhores respostas na matemática SE. Eu diria que essa é uma variante do problema do SAT, que é ingênuo O (2 ^ n), o que significa que a solução de um problema pode ser provada única por força bruta para portas de 20 portas muito rapidamente. Eu diria que a dificuldade está diretamente ligada ao comprimento da expressão e criaria expressões semi-aleatoriamente com padrões de restrição predefinidos.
Panda Pyjama
Você pode estar interessado em esta questão bem
Panda Pajama

Respostas:

1

A geração de texto é uma questão separada, mas para um pequeno número de portas talvez você possa usar um mapa de Karnaugh. Escolha uma célula aleatória que seja verdadeira, todas as outras serão falsas e use um algoritmo apropriado para encontrar a expressão booleana mais eficiente que corresponda a esse mapa, por exemplo

http://www.codeproject.com/Articles/37031/Karnaugh-Map-Minimizer-3-Variables

David Cummins
fonte
Isso encontrará um quebra-cabeça com uma solução válida, mas acho que não posso garantir que ele tenha uma solução única ... Ou pode?
Panda Pyjama
Ao definir todas as outras células como zero, você garante que não haverá outras soluções, acredito.
David Cummins