Não se acredita que a satisfação geral (com algumas exceções, como Cláusulas de Horn), tenha uma solução algorítmica. No entanto, o algoritmo a seguir parece ser uma solução para satisfação geral. Qual é exatamente a falha com o seguinte algoritmo?
- Deixei seja um conjunto vazio que conterá todas as variáveis que necessariamente precisam ser verdadeiras ou falsas.
- Deixei ser o conjunto de cláusulas.
- Repetir .
- Sempre que uma variável não condicional † for encontrada, remova-a de e insira-o .
- Se isso deixar uma implicação AND vazia ‡ , remova todas as variáveis nessa implicação vazia de e insira no .
- Se isso deixar uma implicação OR vazia ‡ , crie novas instâncias do algoritmo, onde cada instância lida com uma variável na implicação (ou seja, se a implicação for:, crie uma instância em que é inserido em um onde é inserido em e um onde e são inseridos em )
- Defina todas as variáveis em para o valor que eles necessariamente têm que ser.
- Reinsira as variáveis em no com seus valores alterados e verifique se todas as cláusulas foram atendidas.
- Se a satisfação for alcançada, retorne , caso contrário, retorne "Não satisfeito".
† Uma variável não condicional é definida como uma variável necessária verdadeira ou falsa, por exemplo ou .
‡ Uma implicação vazia é definida como uma implicação em que um lado está vazio (por exemplo,) ou o outro lado é necessariamente verdadeiro (por exemplo, .
Para obter uma compreensão mais intuitiva do algoritmo, considere o seguinte conjunto de cláusulas :
O algoritmo fará o seguinte:
1) Desde , , são variáveis não condicionais, o algoritmo irá inseri-las em . .
2) Remoção , e deixará as cláusulas vazias: . Estes serão adicionados a. .
3) Reinserir as variáveis em resultará na violação das primeiras cláusulas: . Desde a é falso, é falso, significando que a cláusula (v) é violada. O algoritmo retornará "Incompatível"
Estou ciente de que o algoritmo parece confuso. Por favor, não hesite em pedir esclarecimentos.
A partir dos comentários, agora percebo que não existe um algoritmo de satisfação geral eficiente e conhecido . Ainda estou interessado em comentários sobre o meu algoritmo. Funciona? Como ele se compara com algoritmos comuns?
fonte
Respostas:
Problema 1
O caso de(x→y∨y¯¯¯) deve ser uma "variável não condicional" em relação a x (ou seja, que x¯¯¯ agora deve ser inserido no W ) Se isso não for verdade, seu algoritmo precisará de uma etapa extra para inferir isso. Assumindo(x→y∨y¯¯¯) é uma " variável não condicional ", continuamos.
Problema 2
NOTA: esse é um problema que eu notei; pode muito bem haver outros problemas.
O problema está com a " implicação OR vazia " dividida em dois algoritmos, é que, na sua forma atual, a divisão não cobre todos os casos. Em particular:
Você começa com(x∨c→y) , então c é removido e ficamos com uma implicação OU vazia de(x∨[]→y) . Você sugere agora dividi-lo em dois novos problemas e resolver cada um deles; Um comx=T∧y=T e um onde y=T . Mas isso não cobre todos os casos. E o caso quandox=F∨y=F . No entanto, seu algoritmo nunca considera a possibilidade dey é falso.
Eu acho que você pode consertar isso formulando os dois novos problemas como um comy e um com x¯¯¯ .
Problema 3
O que acontece quando você fica com várias cláusulas no formulário:
ou
Depois de reduzir tudo, essas cláusulas permanecerão e você não poderá testar sua satisfação facilmente.
Análise
Nota : Esta notação "O",O(something) etc., é chamado de Big O notação .Ω(something) é chamado Big-ômega.
Supondo que o algoritmo funcionasse em geral, ele seria executado no tempo deΩ(2m) pior caso, m sendo o número de variáveis. O motivo é que cada divisão do problema em problemas de tamanho semelhante significa que o algoritmo é executado em tempo exponencial. Para visualizar esse conceito, observe a seguinte imagem de uma árvore binária completa (imagem daqui ):
Agora imagine que o problema original é o nó no topo. Dividimos o problema em dois problemas no segundo nível, mas eles são de tamanho semelhante (apenas nos livramos de uma variável,x ou y da implicação OR vazia , portanto, ainda teremos muitas implicações OR vazias para executar cada nível). Teremos que dividir o problemaO(m) vezes para se livrar de m variáveis. Isso significa que teremos que lidar com uma árvore comm níveis. Uma árvore comm níveis tem 2m nós de folha (nós na parte inferior). Isso é chamado tempo exponencial e é informalmente um tanto parecido com todos os algoritmos de satisfação booleanos conhecidos. Mas o mesmo acontece com a força bruta: existem2m possíveis atribuições das variáveis; portanto, com força bruta, você pode adivinhar cada tarefa e verificar a satisfação com desempenho semelhante!
fonte
Antes de sentir que possui um "novo" algoritmo SAT, revise o algoritmo padrão / clássico de retorno / pesquisa na literatura para o problema que data de ~ 1962, o algoritmo Davis – Putnam – Logemann – Loveland . a maioria dos algoritmos de retorno / recursividade para o problema provavelmente acabará parecendo um pouco semelhante a esse algoritmo, embora possa demorar um pouco para demonstrar essa equivalência.
A análise séria envolveria a comparação do seu algoritmo com exemplos (ou instâncias aleatórias) vs DPLL.
E, portanto, é útil apenas resumir como o algoritmo difere dele. sem revisar seu código, as chances são de:
O algoritmo pode ser facilmente entendido por um graduado inteligente, no entanto, raramente parece ser ensinado no nível de graduação ou em livros didáticos de graduação, ou talvez nem mesmo frequentemente referenciado, possivelmente levando a uma visão ou impressão equivocada de que os algoritmos básicos de SAT não são bem compreendidos etc.
Recentemente, recentemente, deparei com este site "ao vivo" chamado ToughSat de Yuen e Bebel para gerar instâncias rígidas para uso com benchmarking, algumas baseadas em fatoração [um dos métodos clássicos de geração de instâncias SAT]. existem outros, por exemplo, DIMACs que armazenam arquivos de instâncias rígidas, embora ele não esteja mais online.
fonte