Três abordagens aqui, todas envolvem uma redução do SAT em sua língua franca geométrica 2D: quebra-cabeças lógicos não programáticos. As células no quebra-cabeça lógico correspondem a variáveis SAT, restrições a cláusulas.
Para uma explicação completa (e para revisar meu código quanto a erros!), Eu já publiquei algumas dicas sobre padrões dentro do espaço de solução que não é do programa. Consulte https://codereview.stackexchange.com/questions/43770/nonogram-puzzle-solution-space. Enumerar mais de 4 bilhões de soluções de quebra-cabeças e codificá-las para caber em uma tabela de verdade mostra padrões fractais - auto-similaridade e especialmente auto-afinidade. Essa redundância afim demonstra estrutura dentro do problema, explorável para reduzir os recursos computacionais necessários para gerar soluções. Também mostra a necessidade de feedback caótico em qualquer algoritmo bem-sucedido. Há um poder explicativo no comportamento da transição de fase, em que instâncias "fáceis" são aquelas que se encontram ao longo da estrutura grossa, enquanto instâncias "difíceis" exigem iteração adicional em detalhes, bastante ocultos às heurísticas normais. Se você deseja ampliar o canto desta imagem infinita (todas as instâncias de quebra-cabeça <= 4x4 codificadas), consulte http://re-curse.github.io/visualizing-intractability/nonograms_zoom/nonograms.html
Método 1. Extrapole a sombra do espaço da solução não-programa usando mapas caóticos e aprendizado de máquina (pense em funções de ajuste semelhantes às que geram o conjunto Mandelbrot).
Aqui está uma prova visual de indução. Se você pode escanear essas quatro imagens da esquerda para a direita e achar que tem uma boa idéia para gerar as 5as ... 6as ... etc. imagens ausentes, acabei de programá- lo como meu oracle NP para o problema de decisão da solução de nonogram existência. Por favor, avance para reivindicar seu prêmio como o supercomputador mais poderoso do mundo. De vez em quando, alimentarei você com eletricidade, enquanto o mundo agradece por suas contribuições computacionais.
Método 2. Use Transformadas de Fourier na versão de imagem booleana das entradas. As FFTs fornecem informações globais sobre frequência e posição em uma instância. Embora a porção de magnitude deva ser semelhante entre o par de entrada, suas informações de fase são completamente diferentes - contendo informações direcionadas sobre uma projeção de solução ao longo de um eixo específico. Se você for esperto o suficiente, poderá reconstruir a imagem da fase da solução através de uma superposição especial das imagens da fase de entrada. Transforme inversamente a fase e a magnitude comum de volta ao domínio do tempo da solução.
O que esse método poderia explicar? Existem muitas permutações das imagens booleanas com preenchimento flexível entre execuções contíguas. Isso permite um mapeamento entre a solução de entrada -> cuidando da multiplicidade, mantendo a propriedade das FFTs de mapeamentos bidirecionais e únicos entre o domínio do tempo <-> (frequência, fase). Isso também significa que não existe "nenhuma solução". O que diria é que, em um caso contínuo, existem soluções em escala de cinza que você não está considerando ao olhar para a imagem em dois níveis da resolução tradicional de quebra-cabeças sem programa.
Por que você não faria isso? É uma maneira horrível de calcular, pois as FFTs no mundo atual de ponto flutuante seriam altamente imprecisas em grandes instâncias. A precisão é um grande problema, e a reconstrução de imagens de magnitude quantificada e de fase geralmente cria soluções muito aproximadas, embora talvez não visualmente para os limiares do olho humano. Também é muito difícil criar esse negócio de superposição, pois o tipo de função que está realizando atualmente é desconhecido. Seria um esquema simples de média? Provavelmente não, e não há método de pesquisa específico para encontrá-lo, exceto a intuição.
Método 3. Encontre uma regra de autômato celular (de um possível ~ 4 bilhões de tabelas de regras para regras de dois estados de von Neumann) que resolva uma versão simétrica do quebra-cabeça do não-programa. Você usa uma incorporação direta do problema nas células, mostrada aqui.
Este é provavelmente o método mais elegante, em termos de simplicidade e bons efeitos para o futuro da computação. A existência desta regra não está comprovada, mas tenho um palpite de que ela existe. Aqui está o porquê:
Os nonogramas requerem muito feedback caótico no algoritmo para serem resolvidos exatamente. Isso é estabelecido pelo código de força bruta vinculado à Revisão de Código. A CA é a linguagem mais capaz de programar feedback caótico.
Ele parece bem, visualmente. A regra evoluiria através de uma incorporação, propagaria informações horizontal e verticalmente, interferiria e depois se estabilizaria em uma solução que conservasse o número de células definidas. Essa rota de propagação segue o caminho (para trás) em que você normalmente pensa ao projetar a sombra de um objeto físico na configuração original. Os nonogramas derivam de um caso especial de tomografia discreta; imagine-se sentado simultaneamente em dois tomógrafos com ponta de gatinho. É assim que os raios X se propagariam para gerar as imagens médicas. É claro que existem problemas de fronteira - as bordas do universo da CA não podem manter a propagação de informações além dos limites, a menos que você permita um universo toroidal. Isso também lança o quebra-cabeça como um problema periódico de valor-limite.
Explica várias soluções como estados transitórios em um efeito de oscilação contínua entre a troca de saídas como entradas e vice-versa. Explica instâncias que não têm solução como configurações originais que não conservam o número de células definidas. Dependendo do resultado real de encontrar essa regra, ela pode até aproximar instâncias insolúveis com uma solução próxima em que os estados das células são conservados.