Sou novo no Minizinc e quero resolver o seguinte problema.
Tenho uma matriz dada de 6x6 células. As linhas são numeradas de 1 a 6, as colunas de A a B. Todas as células devem ser preenchidas com dígitos de 1 a 9 por certas regras:
- Todos os 9 dígitos ocorrem exatamente 4 vezes na matriz.
- Vizinhos diretos em linha ou coluna não podem ter o mesmo valor.
- Todas as células em uma linha e todas as células em uma coluna terão valores diferentes.
- Existem algumas exceções de (3): a) A linha 2 tem dois "6". b) A linha 3 tem dois "3". c) A linha 4 tem dois "5". d) A linha 5 tem três "7". e) A linha 6 tem dois "8". f) A coluna B tem dois "3". g) A coluna D tem dois "8". h) A coluna F tem dois "9".
- A soma de todos os dígitos da linha 1 é >= 38.
- A soma de todos os dígitos da coluna E é = 21.
- A linha 2 não contém um "1".
- A linha 4 não contém um "4".
- A linha 5 não contém um "2".
- A linha 6 não contém um "3".
- A coluna C não contém um "2".
- A coluna B tem apenas dígitos pares, exceto os dois "3".
- A coluna A tem uma sequência crescente ou decrescente, por exemplo, "234567" ou "987654".
A maior dor de cabeça para mim ao construir o modelo em Minzinc são as restrições "contraditórias":
- Todos os dígitos em uma única linha ou coluna devem ser diferentes.
- Mas às vezes essa regra tem exceções.
Como isso pode ser realizado?
Obrigado antecipadamente e os melhores cumprimentos. Guenther
Fiquei curioso sobre como modelar esse problema de forma concisa com Clingo ASP como uma alternativa ao minizinc. Não é Constraint Programming , mas é relacionado e bastante declarativo, então pode lhe dar algumas ideias:
(na verdade, o minizinc também suporta o solucionador relacionado via flatzingo .)
Saída: (copie e cole o código para executá-lo online )
A solução única como uma matriz:
Atualizar:
Adicionei a outra solução do OP ao modelo para verificar em ambas as direções:
… e esta é a saída:
Dica:
Obrigado por todas as dicas! Parece perfeito.
A outra solução está aqui:
Obrigado novamente e os melhores cumprimentos,
Guenther
Este é um trecho de código minizinc para forçar a linha 2 a ter dígitos diferentes, exceto 2x 6, com all_different_except() e count() :
Saída:
Ok, pessoal. Aqui está meu modelo MiniZinc, dando o resultado correto.
Tenho certeza de que várias partes do código poderiam ser codificadas de forma mais elegante. Mas estou feliz por ter construído minha primeira solução em MiniZinc até hoje.
Obrigado por todas as suas contribuições!