Dado um número inteiro e um conjunto de trigêmeos de números inteiros distintos encontre um algoritmo que encontre uma permutação do conjunto modo que ou determina corretamente que não existe tal permutação. Menos formalmente, queremos reordenar os números de 1 a ; cada triplo em indica que deve aparecer antes no novo pedido, mas não deve aparecer entreS ⊆ { ( i , j , k ) ∣ 1 ≤ i , j , k ≤ n , i ≠ j , j ≠ k , i ≠ k } , π { 1 , 2 , … , n } ( i , j , k ) ∈ S
Exemplo 1
Suponha que e . EntãoS = { ( 1 , 2 , 3 ) , ( 2 , 3 , 4 ) }
não é uma permutação válida, porque , mas .π ( 1 ) > π ( 3 )
não é uma permutação válida, porque mas .π (
é uma permutação válida.
Exemplo 2
Se e , não há permutação válida. Da mesma forma, não há permutação válida se e ( Eu acho que pode ter cometido um erro aqui).
Bônus: Quais propriedades de determinam se existe uma solução viável?
fonte
Respostas:
Aqui está um algoritmo ingênuo. Em última análise, depende de força bruta, mas pode funcionar bem algumas vezes.
Cada restrição consiste em dois conjuntos; vamos chamá-los de tipo , e tipo , . Cada restrição do tipo pode ser escrita de forma equivalente como uma disjunção , baseando-se no fato de que .A i < k B ¬ ( i < j < k ) B i > j ∨ j >(σmi,σmj,σmk)∈S⟹i<k∧¬(i<j<k) A i<k B ¬(i<j<k) B i>j∨j>k i≠j,j≠k
Minha abordagem preferida seria, na verdade, codificá-la em um conjunto de restrições e usar um solucionador de restrições como o Choco. Eu introduziria variáveis inteiras no intervalo e exigiria que todas fossem distintas. Então eu codificaria cada uma das restrições acima diretamente como restrições e deixaria a Choco fazer negócios.x i [ 0 , n - 1 ]n xi [0,n−1]
fonte
Aqui está uma resposta parcial:
Se você remover a restrição em cada triplo, seu problema se tornará o problema Sem-Interesse, que é -completo e não há algoritmos eficientes conhecidos para tais problemas. Mas com a restrição , pode forçar uma estrutura agradável que pode ser explorada para encontrar um algoritmo de tempo polinomial para o seu problema.N P i < ki<k NP i<k
fonte