Biorąc pod uwagę liczbę całkowitą i zestaw trojaczków różnych liczb całkowitych
znajdź algorytm, który albo znajduje permutację zbioru taką, że
lub poprawnie określa, że taka permutacja nie istnieje. Mniej formalnie chcemy zmienić kolejność liczb od 1 do ; każdy potrójne w wskazuje, że musi pojawić się przedj i kw nowej kolejności, ale nie może występować między a .
Przykład 1
Załóżmy, że i S = { ( 1 , 2 , 3 ) , ( 2 , 3 , 4 ) } . Następnie
jestnieważne permutacji, ponieważ ( 1 , 2 , 3 ) ∈ S , ale π ( 1 ) > π ( 3 ) .
jestnieważne permutacji, ponieważ ( 1 , 2 , 3 ) ∈ S ale π ( 1 ) < π ( 3 ) < π ( 5 ) .
jest prawidłową permutacją.
Przykład 2
Jeśli i S = { ( 1 , 2 , 3 ) , ( 2 , 1 , 3 ) } , nie ma prawidłowej permutacji. Podobnie nie ma ważnej permutacji, jeśli n = 5 i S = { ( 1 , 2 , 3 ) , ( 3 , 4 , 5 ) , ( 2 , 5 , 3 ) (myślę, że popełniłem tutaj błąd).
Premia: Jakie właściwości określają, czy istnieje możliwe rozwiązanie?
algorithms
optimization
scheduling
Patrick87
źródło
źródło
Odpowiedzi:
Oto naiwny algorytm. Ostatecznie opiera się na brutalnej sile, ale czasami może działać dobrze.
Każde ograniczenie składa się z dwóch spójników; nazwijmy je typ- A , i < k oraz typ- B , ¬ ( i < j < k ) . Każdeograniczenietypu B można zapisać w równoważny sposób jako rozłączenie i > j ∨ j > k , opierając się na fakcie, że i ≠ j , j ≠ k .(σ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
Moim preferowanym podejściem byłoby zakodowanie go w zestawie ograniczeń i użycie solvera ograniczenia, takiego jak Choco. Wprowadziłbym zmiennych całkowitych x i w zakresie [ 0 , n - 1 ] i wymagam, aby wszystkie były odrębne. Następnie kodowałbym każde z powyższych ograniczeń bezpośrednio jako ograniczenia, a następnie pozwalałem Choco robić to samo.n xi [0,n−1]
źródło
Oto częściowa odpowiedź:
Jeśli usunąć ograniczenia na siebie potrójne wtedy problem staje się problemem dla Betweeness który jest N P -Complete i tam nie są znane efektywne algorytmy dla takich problemów. Ale z ograniczeniem i < k może wymusić jakąś ładną strukturę, którą można wykorzystać do znalezienia algorytmu czasu wielomianowego dla twojego problemu.i<k NP i<k
źródło