2015-06-23 20 views
5

Szukam algorytmu, który znajdzie minimalny podzbiór wierzchołków w taki sposób, że po usunięciu tego podzestawu (i krawędzi łączących te wierzchołki) z wykresu wszystkie pozostałe wierzchołki staną się niepołączone (tzn. Wykres nie będzie mieć dowolne krawędzie).Odłącz wszystkie wierzchołki na wykresie - Algorytm

  • Czy istnieje taki algorytm?
  • Jeśli nie: Czy możesz polecić heurystyki do wyznaczenia wierzchołków?

Posiadam podstawową wiedzę z zakresu teorii grafów, więc przepraszamy za wszelkie nieprawidłowości.

+0

pytania zadaje nam polecić lub znaleźć książki, narzędzia, biblioteki oprogramowania, samouczek lub innych zasobów poza miejscem są off-topic na przepełnienie stosu, ponieważ mają tendencję, aby przyciągnąć uparty odpowiedzi i spam. Zamiast tego opisz problem i to, co zostało zrobione do tej pory, aby go rozwiązać. – cybermonkey

+2

@cybermonkey Nie ma takiej prośby o rekomendację. To pytanie jest na temat, i nie ma wyraźnej odpowiedzi na to (patrz @ AmiTavory's). (Oczywiście jest więcej odpowiedzi, ale żaden nie będzie spamem z opiniami). Opisuje problem i otrzymuje odpowiedź. – amit

+0

@amit Prosi o algorytm, który jest taki sam jak "kod dla mnie". – cybermonkey

Odpowiedz

7

IIUC, jest to klasyczny problem o nazwie Minimum Vertex Cover, który jest, niestety, NP Complete.

Na szczęście model most intuitive and greedy possible algorithm jest tak dobry, jak się da w tym przypadku.

+0

"Najbardziej intuicyjny i chciwy algorytm jest" tylko "tak dobry, jak to tylko możliwe", gdy [1.2738^(czas częściowy)) (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.432 .831) jest za długi. Wcześniejsze –

1

Algorytm zachłanności jest 2-przybliżeniem dla pokrywy wierzchołków, która pod w teorii, pod Unique Games Conjecture, jest tak dobra, jak to tylko możliwe. W praktyce rozwiązanie formuły zakrycia wierzchołków jako programu typu integer zapewne przyniesie znacznie lepsze wyniki. Program jest

min sum_{v in V} x(v) 
s.t. 
forall {u, v} in E, x(u) + x(v) >= 1 
forall v in V, x(v) in {0, 1}. 
0

Spróbuj w ten sposób:

  • zdefiniować zmienną policzyć liczbę wierzchołków, począwszy od 0;
  • Utwórz maks. Stertę wierzchołków posortowanych według długości sąsiedniej listy każdego wierzchołka;
  • Usuń wszystkie krawędzie z pierwszego wierzchołka sterty (ten z największą liczbą krawędzi) i usuń go ze sterty, dodając 1 do liczby;
  • Zmień kolejność sterty teraz, gdy liczba krawędzi wierzchołków się zmieniła, powtarzając poprzedni krok, dopóki długość sąsiedniej listy z pierwszego wierzchołka nie będzie równa 0;

    Heap Q 
    int count = 0 
    
    while(1){ 
    
        Q = Create_Heap(G) 
        Vertex first = Q.pop 
        if(first.adjacents.size() == 0) { 
         break 
        } 
    
        for(Vertex v : first.adjacent){ 
         RemoveEdge(first, v) 
         RemoveEdge(v, first) /* depends on the implementation */ 
        } 
    
        count = count + 1 
    
    } 
    
    return count