Znajdź optymalne zamówienie

9

Natknąłem się na ten problem i staram się znaleźć sposób, aby go rozwiązać. Jakiekolwiek propozycje będą mile widziane!

Załóżmy, że mamy matrycę {1,0,1}n × k, na przykład,

[1010110001011011101110001]

Nie próbując każdej permutacji, znajdź porządek kolumn ci co maksymalizuje liczbę wierszy, dla których jest pierwszy niezerowy element 1.

W powyższym przykładzie jednym z takich porządków (to nie jest wyjątkowe!) Jest (c3,c4,c1,c2,c5)tzn.

[1010100101100110111100101]

Tutaj dla 4 poza 5 wiersze jest pierwszym niezerowym elementem 1.

haijo
źródło
Jakie metody algorytmiczne próbowałeś? Gdzie napotkałeś ten problem? Czy możesz podać oryginalne źródło? Czy możesz podzielić się czymś na temat kontekstu lub motywacji? Można znaleźć na tej stronie pomocne w poprawie swoje pytanie.
DW
1
Chcę zasugerować krok wstępnego przetwarzania: niech kolumna półpodatnia (odpowiednio wiersz) będzie kolumną (odpowiednio wiersz) z tylko 0 i 1. Sugeruje się usunięcie wszystkich kolumn pół dodatnich, a także wierszy z 1 w kolumnie pół dodatniej. W twoim przykładzie spowoduje to usunięcie wierszy 1, 3 i 4. Teraz pozostały Ci wiersze i kolumny, które zawierają -1. Może nic nie pomoże, ale łatwiej jest o tym myśleć.
Pål GD
Czy możemy założyć, że liczba wierszy jest znacznie mniejsza niż liczba kolumn? Może to ułatwić problem.
Angela Pretorius
1
@ Pål, podobne przetwarzanie wstępne jest możliwe w przypadku wierszy i kolumn, które nie zawierają 1. Jednak nie sądzę, że ułatwia to rozumowanie: po prostu mniejsze.
Peter Taylor
1
FWIW to jest post-cross . haijo, jeśli nie otrzymasz odpowiedzi na jednym stosie i uważasz, że lepszy może być inny, możesz oflagować ją i poprosić o migrację. Przesyłanie postów nie jest dobrą etykietą, ponieważ osoby odpowiadające nie są świadome odpowiedzi, które otrzymałeś na drugiej stronie i mogą tracić czas na ich powtarzanie.
Peter Taylor

Odpowiedzi:

4

Ten problem, który nazywam CO przy porządkowaniu kolumn, jest trudny do rozwiązania . Oto redukcja z trudnego NP NP Vertex Cover (VC) do niego:

Formularze problemów decyzyjnych VC i CO

Niech wejściowa instancja VC będzie (V.,mi,k). Reprezentuje pytanie: „Biorąc pod uwagę wykres(V.,mi), czy można wybrać co najwyżej zestaw k wierzchołki od V. tak, że każda krawędź mi jest incydent na co najmniej jednym wybranym wierzchołku? ”Zbudujemy instancję (ZA,k) CO, które reprezentuje pytanie: „Biorąc pod uwagę macierz ZA z elementami w {-1,0,1}, czy można permutować kolumny ZA tak, że 1 pojawia się przed -1 co najmniej kwiersze? ”Te dwa problemy są określone w formularzu problemu decyzyjnego , przy czym odpowiedź na każdy z nich brzmi TAK lub NIE: formalnie rzecz biorąc, jest to forma problemu NP-zupełna (lub nie). Nie jest zbyt trudne zobacz, że bardziej naturalna forma problemu optymalizacji podana w pytaniu PO jest w przybliżeniu równoważna pod względem złożoności: wyszukiwanie binarne parametru progu może być użyte do rozwiązania problemu optymalizacji za pomocą rozwiązania problemu decyzyjnego, a pojedyncze wywołanie rozwiązania problemu optymalizacji , a następnie pojedyncze porównanie, wystarczy, aby rozwiązać problem decyzyjny.

Konstruowanie instancji CO z instancji VC

Pozwolić n=|V.| i m=|mi|. Zbudujemy macierzZA z (n+1)m+n wiersze i n+1kolumny. Szczyt(n+1)m zostaną utworzone rzędy m bloki n+1rzędy, przy czym każdy blok reprezentuje krawędź, którą należy zakryć . Dółn wiersze zawierają „flagi” wierzchołków, co spowoduje, że kolumna (odpowiadająca wierzchołkowi) poniesie stały koszt, jeśli zostanie uwzględniona po lewej stronie rozwiązania CO (odpowiadającego wierzchołkowi objętemu pokrywą wierzchołków Rozwiązanie VC).

Dla każdego wierzchołka vja, utwórz kolumnę, w której:

  • wśród najlepszych (n+1)m rzędy, jot-ty blok n+1 wszystkie wiersze zawierają +1, gdy krawędź mijot jest incydent na vja, i 0 w przeciwnym razie, i
  • dół n wszystkie wiersze mają wartość 0, z wyjątkiem ja-ty, który wynosi -1.

Utwórz jeszcze jedną kolumnę „ogrodzenia”, która się składa (n+1)m kopie -1, a następnie n kopie +1.

Na koniec ustaw próg k dla skonstruowanej instancji CO: (n+1)m+nk. Innymi słowy, zezwalamy co najwyżejkwiersze, w których -1 pojawia się przed +1. Nazwijmy tę liczbę naruszających wiersze „kosztem” rozwiązania CO.

Dowód

Odpowiednikiem między rozwiązaniem instancji CO a zestawem wierzchołków w oryginalnej instancji VC jest: Każda kolumna po lewej stronie ogrodzenia odpowiada wierzchołkowi znajdującemu się w zestawie, a każda kolumna po prawej stronie ogrodzenia odpowiada wierzchołek, który nie jest.

Intuicyjnie, -1s na górze kolumny „ogrodzenia” wymuszają wybór podzbioru kolumn, które mają być umieszczone po jego lewej stronie, które razem zawierają + 1 we wszystkich tych pozycjach - odpowiadających podzbiorowi wierzchołków, które padają na każdym krawędź. Każda z tych kolumn, która pojawia się po lewej stronie „ogrodzenia”, ma -1 w odrębnym rzędzie gdzieś na dolenwiersze, ponosząc koszt 1; +1 w dolnej części „ogrodzenia” zapewniają, że wszystkie kolumny umieszczone po jego prawej stronie nie poniosą takich kosztów.

Najwyraźniej rozwiązanie VC wykorzystujące co najwyżej k wierzchołki dają rozwiązanie dla skonstruowanego wystąpienia CO przy maksymalnym koszcie k: Wystarczy dowolnie zamówić kolumny odpowiadające wierzchołkom w pokrywie wierzchołków, następnie kolumnę ogrodzenia, a następnie wszystkie pozostałe kolumny w dowolnej kolejności.

Pozostaje pokazać, że rozwiązanie dla instancji CO ma co najwyżej koszt k odpowiada najwyżej osłonie wierzchołka k wierzchołki.

Załóżmy wręcz przeciwnie, że istnieje rozwiązanie dla instancji CO z najwyżej kosztami k który pozostawia jakiś rząd na górze (n+1)mwiersze z -1 przed +1. Ten wiersz należy do bloku(n+1) rzędy odpowiadające konkretnej krawędzi uv. Każdy wiersz w tym bloku w oryginalnej instancjiAjest identyczny pod względem budowy; permutowanie kolumn może zmienić te wiersze, ale nie wpływa to na fakt, że są one identyczne. Tak więc każdy z nichn+1 identyczne rzędy mają -1 przed +1 w rozwiązaniu, co oznacza koszt co najmniej n+1. Alekn<n+1: sprzeczność.

Ponieważ każdy z m bloki rzędów u góry (n+1)mrzędy mają +1 przed -1, każda z odpowiednich krawędzi jest pokryta wierzchołkiem odpowiadającym kolumnie po lewej stronie ogrodzenia: to znaczy ten podzbiór wierzchołków stanowi pokrycie wierzchołków. Ponieważ żaden z najlepszych(n+1)m rzędy mają -1 przed +1, jedynym miejscem, w którym koszty mogą narastać w rozwiązaniu, jest na dole nrzędy, od kolumn umieszczonych na lewo od ogrodzenia. Każda taka kolumna kosztuje dokładnie 1, więc biorąc pod uwagę, że koszt jest co najwyżejk, musi być co najwyżej k takie kolumny i co najwyżej k wierzchołki w okładce.

Wreszcie, jasne jest, że instancja CO może być konstruowana w czasie wielomianowym z instancji VC, co oznacza, że ​​gdyby istniał algorytm wielomianowy do rozwiązywania CO, dowolna instancja VC mogłaby być również rozwiązana w czasie wielomianowym, najpierw konstruując instancję CO zgodnie z opisem powyżej, a następnie rozwiązanie. Ponieważ VC jest trudne dla NP, również CO.

j_random_hacker
źródło
Ilekroć pojawia się taka miła odpowiedź, zastanawiam się, czy „Gorące pytania sieciowe” powinny zostać zastąpione lub dołączone przez coś takiego jak „Wartościowe odpowiedzi sieciowe”.
John L.
Czy mógłbyś rzucić nieco światła na to, jak znaleźć odpowiedź? To powinno być jeszcze bardziej pouczające niż sama odpowiedź.
John L.
1
@ Apass.Jack: Dzięki! :) Nie mam specjalnej strategii i mogę spędzać dużo czasu wędrując w złym kierunku. Na przykład, spędziłem dużo czasu myśląc, że mogę zmniejszyć z cyklu Hamiltoniana (który jest podobny, o ile chodzi o zamawianie elementów), zanim zdałem sobie sprawę, że moja konstrukcja pozwoliłaby na konfiguracje odpowiadające podcieniom, a zatem nie działałaby. Z reguły zawsze staram się redukować z Wierzchołka lub Partycji Wierzchołków, a potem może Clique. „Wartościowe odpowiedzi sieciowe” brzmi jak świetny pomysł :)
j_random_hacker
1
@ Apass.Jack: Jednym z przydatnych ogólnych pomysłów jest zastanowienie się, w jaki sposób można „skalować” wystąpienie problemu docelowego bez zmiany jego odpowiedzi - np. Jeśli problemem docelowym (co próbujemy udowodnić jako trudnym) jest Okładka Wierzchołków, która daje jakiekolwiek pozytywne liczba całkowita r rozłączne kopie wykresu, a także pomnożenie progu k przez rpozostawia odpowiedź bez zmian. Często chcesz, aby niektóre naruszenia (rozwiązania docelowe, które nie odpowiadają prawidłowym rozwiązaniom źródłowym), aby „obezwładnić” niektóre inne, w takim przypadku możesz „pomnożyć” gadżety, które odpowiadają ważniejszym naruszeniom.
j_random_hacker
1
Aby zmniejszyć moją odpowiedź, chcemy zakodować wystąpienie problemu, w którym występują dwie „siły”: Spróbuj zakryć wszystkie krawędzie i spróbuj użyć jak najmniejszej liczby wierzchołków. Pierwszy jest tutaj ważniejszy, więc „pomnożyłem” wiersze odpowiadające krawędziom: teraz naruszenie pojedynczej krawędzi kosztujen+1, co oznacza, że ​​gorzej jest pominąć jedną krawędź niż uwzględnić wszystkie wierzchołki. I właśnie zdałem sobie sprawę, że powinienem edytować odpowiedź, aby wyraźnie powiedzieć, że mamy do czynienia z wersjami problemów decyzyjnych tych dwóch problemów, w których parametry progowe są częścią wystąpienia problemu ...
j_random_hacker
2

Nie wiem, czy rzeczywiście istnieje rozwiązanie wielomianowe. Niemniej jednak w oparciu o komentarz Pål GD można zbudować funkcję uproszczenia. Macierz początkowa jest uproszczona podczas budowania sekwencji wyjściowejS.

function simplification:
while(true)
    if any row i$ has no 1 or no -1 left, remove it
    if any column j has no -1 then,
       remove it and put j on the leftmost available position in S,
       remove all rows where column j has 1.
    if any column j has no 1 then, 
       remove it and put j on the rightmost available position in S.
    if no modification has been done on this loop, break

Następnie musisz przeprowadzić pełne badanie kombinatoryki, używając iteracyjnie wyboru funkcji:

function pick(k):
    put column k on the leftmost available position in S
    remove any row where column k is -1 or 1

Po każdym wyborze możesz dokonać uproszczenia, aby ewentualnie zmniejszyć liczbę możliwości eksploracji. Sugeruję eksplorację chciwie, zaczynając od kolumny mającej mniej -1, więc możesz osiągnąć dolną granicę, stawiając kryterium zatrzymania.

W podanym przykładzie pierwsze uproszczenie daje (jak wyjaśnił Pål GD w komentarzu)

  • S[0]=c3usuń r1, r3
  • S[1]=c4usuń r4
  • S[2]=c2 pozwala to na przeglądanie prostej matrycy.
    [1111]

Myślę, że matryca powodująca, że ​​ta metoda jest dość nieefektywna, miałaby dokładnie jeden 1, a jeden -1 na wiersz / kolumnę, coś w rodzaju

[110000110000001100001100000011000011]

Niemniej uproszczenie wciąż oszczędza około połowy etapów eksploracji. Ten typ macierzy można podzielić na kilka niezależnych podmacierzy.

Optidad
źródło
1
@ Apass.Jack Zredagowałem, by być bardziej precyzyjnym. Tak, miałem na myśli pozycję kolumny w sekwencji wyjściowej.
Optidad
Uznany za krok uproszczenia może być wystarczający do celów praktycznych (takich jak ćwiczenia z programowania online?).
John L.
Dzięki, faktycznie byłem zainteresowany oszacowaniem zamortyzowanego kosztu czasu, ale tak naprawdę nie wiem jak to zrobić. Czy to możliwe ? A może zależy to od problemu?
Optidad
2
Próbowałem analizy czasu zamortyzowanego, co wydaje się trudne. Podejrzewam, że NP jest kompletny. Z drugiej strony etap uproszczenia może być bardziej ogólny. Dla kolumnyi i j tak, że współdzielona niezerowa część z nich jest niezerową częścią i, kolumna j można usunąć, jeśli dodatkowa niezerowa część j nie zawiera 1 i kolumny i można usunąć, jeśli dodatkowa niezerowa część jnie zawiera -1.
John L.
1
Kolejna zasada dominacji to: Ilekroć masz dwie kolumny i i j tak, że jest co najmniej 1 wiersz gdzie i ma -1 i j ma +1 i nie ma wiersza gdzie i ma +1 i j ma -1, nigdy nie ma żadnej korzyści z umieszczenia ipierwszy. Powiedzmy toj dominuje iw tym przypadku. Możesz to zaimplementować wewnątrz pick (k), sprawdzając, czy kdominuje nad dowolną z już umieszczonych kolumn: jeśli tak, możesz przyciąć tę gałąź drzewa wyszukiwania.
j_random_hacker