Porządkowanie elementów, aby niektóre elementy nie znajdowały się między innymi


10

Biorąc pod uwagę liczbę całkowitą n i zestaw trojaczków różnych liczb całkowitych

S{(i,j,k)1i,j,kn,ij,jk,ik},
znajdź algorytm, który albo znajduje permutację π zbioru {1,2,,n} taką, że
(i,j,k)S(π(j)<π(i)<π(k))  (π(i)<π(k)<π(j))
lub poprawnie określa, że ​​taka permutacja nie istnieje. Mniej formalnie chcemy zmienić kolejność liczb od 1 don ; każdy potrójne(i,j,k) wS wskazuje, żei musi pojawić się przedj i kkw nowej kolejności, ale nie może występować między a .jik

Przykład 1

Załóżmy, że i S = { ( 1 , 2 , 3 ) , ( 2 , 3 , 4 ) } . Następnien=5S={(1,2,3),(2,3,4)}

  • jestnieważne permutacji, ponieważ ( 1 , 2 , 3 ) S , ale π ( 1 ) > π ( 3 ) .π=(5,4,3,2,1)(1,2,3)Sπ(1)>π(3)

  • jestnieważne permutacji, ponieważ ( 1 , 2 , 3 ) S ale π ( 1 ) < π ( 3 ) < π ( 5 ) .π=(1,2,4,5,3)(1,2,3)Sπ(1)<π(3)<π(5)

  • jest prawidłową permutacją.(2,4,1,3,5)

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 )n=5S={(1,2,3),(2,1,3)}n=5 (myślę, że popełniłem tutaj błąd).S={(1,2,3),(3,4,5),(2,5,3),(2,1,4)}

Premia: Jakie właściwości określają, czy istnieje możliwe rozwiązanie?S


Dlaczego nie przeformułować drugiego warunku jako ? Masz wtedy prosty, mniej lub bardziej, problem satysfakcji z ograniczeń. (Zwróć uwagę, że uprościłem ten warunek w oparciu o inne założenia).(σmi,σmj,σmk)S(i>jj>k)
Dave Clarke

BTW: Jaka jest motywacja tego problemu?
Dave Clarke

@DaveClarke Zobacz moją edycję. Problem ten został wyodrębniony z dyskusji wokół problemu planowania, o którym rozmawiałem z kilkoma innymi studentami w laboratorium. Zasadniczo chodzi o to, że masz wiele zadań, z których niektóre muszą być wykonywane w określonej kolejności. Jednak nie chcesz, aby niektóre zadania były planowane między zadaniami w sekwencji, być może z bardzo subtelnych powodów.
Patrick87

3
Dlaczego sigma? Wystarczy zdefiniować . Zagnieżdżone indeksy dolne powodują, że mały Jezus płacze. Σ={1,2,,n}
JeffE

@JeffE Szczerze mówiąc, po prostu lubię wymówkę, żeby grać z równaniem. Jest coś po prostu bardzo satysfakcjonującego w pisaniu kodu, który kompiluje się do tych małych . Nie bierz tego ode mnie, stary. σ
Patrick87

Odpowiedzi:


3

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)Si<k¬(i<j<k)Ai<kB¬(i<j<k)Bi>jj>kij,jk

  1. Zbierz wszystkie ograniczenia typu Nazwij to Θ . Sprawdź, czy są one spójne, a mianowicie czy jest to linearyzacja uporządkowania. Wymaga to czasu O ( | S | ) w liczbie ograniczeń przy użyciu sortowania topologicznego.AΘO(|S|)
  2. Dla każdego z rozłączników w wiązaniu typu sprawdź, czy jest on zgodny z częściowym porządkiem Θ . Jeśli nie jest spójny, usuń środek rozdzielający. Jeśli oba rozłączenia są niezgodne z Θ , to zawodzą. Ilekroć usuwane jest tylko jedno wiązanie typu B , dodaj pozostałe do Θ . Ten krok to O ( | S | 2 ) .BΘΘBΘO(|S|2)
  3. Teraz istnieje oczywisty algorytm znajdowania rozwiązania, a mianowicie wzięcie pod uwagę wszystkich kombinacji par rozłącznych typu i przetestowanie ich zgodności z Θ , ale jest to wyraźnie wykładnicze w | S | . Jedną heurystyczną poprawą wydajności byłoby traktowanie par rozłącznych typu B jako gałęzi drzewa --- jedna para tworzy korzeń, jego dzieci są przekazywane przez drugą parę, ich dzieci przez trzecią i tak dalej. Korzystając z tej struktury danych, można znaleźć rozwiązanie, przechodząc przez drzewo w pierwszej kolejności. Za każdym razem, gdy dodawane jest nowe ograniczenie (przy użyciu etykiety na gałęzi), można sprawdzić spójność. Niespójne poddrzewa mogą być przycinane.BΘ|S|
    B
  4. Po osiągnięciu liścia drzewa mamy spójny zestaw ograniczeń składający się ze wszystkich wiązań typu i jednego rozłącznika wiązań typu B. Zlinearyzuj wynik, aby uzyskać pożądane uporządkowanie.AB

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.nxi[0,n1]


1

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<kNPi<k

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.