GeeksforGeeks

wymagania wstępne :

  • Rekurencja
  • Analiza złożoności

Backtracking jest algorytmiczną techniką rekurencyjnego rozwiązywania problemów, próbując zbudować rozwiązanie stopniowo, jeden kawałek na raz, usuwając te rozwiązania, które nie spełniają ograniczeń problemu w dowolnym momencie (przez czas, tutaj, odnosi się do czasu, jaki upłynął do osiągnięcia dowolnego poziomu drzewa wyszukiwania).

wg definicji wiki,

Backtracking można zdefiniować jako ogólną technikę algorytmiczną, która uwzględnia wyszukiwanie każdej możliwej kombinacji w celu rozwiązania problemu obliczeniowego.

istnieją trzy rodzaje problemów w cofaniu–

  1. problem decyzyjny-w tym szukamy realnego rozwiązania.
  2. Problem optymalizacji-w tym szukamy najlepszego rozwiązania.
  3. Problem wyliczania-w tym znajdujemy wszystkie możliwe rozwiązania.

Jak ustalić, czy problem można rozwiązać za pomocą śledzenia wstecznego?

Ogólnie rzecz biorąc, każdy problem z satysfakcją z ograniczeń, który ma jasne i dobrze zdefiniowane ograniczenia dotyczące dowolnego obiektywnego rozwiązania, który stopniowo buduje kandydata do rozwiązania i porzuca kandydata („backtracks”), gdy tylko stwierdzi, że kandydat nie może zostać ukończony do poprawnego rozwiązania, może zostać rozwiązany przez Backtracking. Jednak większość problemów, które są omawiane, można rozwiązać za pomocą innych znanych algorytmów, takich jak programowanie dynamiczne lub algorytmy chciwe w logarytmicznej, liniowej, liniowo-logarytmicznej złożoności czasu w kolejności wielkości wejściowej, a zatem przyćmić algorytm cofania pod każdym względem (ponieważ algorytmy cofania są na ogół wykładnicze zarówno w czasie, jak i przestrzeni). Jednak nadal pozostaje kilka problemów, które do tej pory mają tylko algorytmy backtrackingu, aby je rozwiązać.

zastanów się nad sytuacją, że masz przed sobą trzy pudełka i tylko jedno z nich ma w sobie złotą monetę, ale nie wiesz, która. Tak więc, aby zdobyć monetę, będziesz musiał otworzyć wszystkie pola jeden po drugim. Najpierw zaznaczysz pierwsze pole, jeśli nie zawiera monety, będziesz musiał je zamknąć i zaznaczyć drugie pole itd., aż znajdziesz monetę. Tym właśnie jest backtracking, czyli rozwiązywanie wszystkich problemów podrzędnych jeden po drugim w celu osiągnięcia najlepszego możliwego rozwiązania.

rozważ poniższy przykład, aby zrozumieć podejście do Backtrackingu bardziej formalnie,

biorąc pod uwagę wystąpienie dowolnego problemu obliczeniowego P i dane D odpowiadające instancji, wszystkie ograniczenia, które muszą być spełnione, aby rozwiązać problem, są reprezentowane przez C . Algorytm backtrackingu będzie wtedy działał w następujący sposób:

algorytm zaczyna budować rozwiązanie, zaczynając od pustego zestawu rozwiązań S . S = {}

  1. Dodaj do s pierwszy ruch, który nadal pozostaje (wszystkie możliwe ruchy są dodawane do S jeden po drugim). To teraz tworzy nowe pod drzewem s w drzewie wyszukiwania algorytmu.
  2. sprawdź, czy S+s spełnia każde z ograniczeń w C .
    • jeśli tak, to sub-drzewo  s jest „uprawnione”, aby dodać więcej „dzieci”.
    • w przeciwnym razie całe drzewo podrzędne s jest bezużyteczne, więc powraca do kroku 1 używając argumentu s .
  3. w przypadku „kwalifikowalności” nowo utworzonego pod drzewem s , powraca do kroku 1, używając argumentu S+s .
  4. jeśli sprawdzenie dla S+s zwróci, że jest to rozwiązanie dla całych danych D . Wyjście i zakończenie programu.
    jeśli nie, zwróć, że żadne rozwiązanie nie jest możliwe z bieżącym s i w związku z tym odrzuć je.

różnica między Rekurencją a cofaniem:

w rekurencji funkcja wywołuje się do momentu osiągnięcia przypadku bazowego. W backtrackingu używamy rekurencji, aby zbadać wszystkie możliwości, aż uzyskamy najlepszy wynik dla problemu.

Pseudo kod do Backtrackingu :

1. Rekurencyjne rozwiązanie backtrackingu.

void findSolutions(n, other params) : if (found a solution) : solutionsFound = solutionsFound + 1; displaySolution(); if (solutionsFound >= solutionTarget) : System.exit(0); return for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); findSolutions(n+1, other params); removeValue(val, n);

2. Znajdowanie, czy rozwiązanie istnieje, czy nie

boolean findSolutions(n, other params) : if (found a solution) : displaySolution(); return true; for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); if (findSolutions(n+1, other params)) return true; removeValue(val, n); return false;

spróbujmy rozwiązać standardowy problem śledzenia, Problem N-Queen.
N Queen to problem polegający na umieszczeniu N królowych szachów na szachownicy N×N tak, aby żadna z dwóch królowych nie atakowała się nawzajem. Na przykład, poniżej znajduje się rozwiązanie problemu 4 Królowej.

oczekiwany wynik to macierz binarna, która ma 1s dla bloków, w których umieszczone są królowe. Na przykład poniżej znajduje się macierz wyjściowa dla powyższego rozwiązania 4 queen.

{ 0, 1, 0, 0}{ 0, 0, 0, 1}{ 1, 0, 0, 0}{ 0, 0, 1, 0}

algorytm Backtrackingu: chodzi o umieszczenie królowych jeden po drugim w różnych kolumnach, zaczynając od lewej kolumny. Kiedy umieszczamy królową w kolumnie, sprawdzamy, czy nie ma starć z już umieszczonymi królowymi. W bieżącej kolumnie, jeśli znajdziemy wiersz, dla którego nie ma kolizji, oznaczamy ten wiersz i kolumnę jako część rozwiązania. Jeśli nie znajdziemy takiego wiersza z powodu kolizji to cofamy się i zwracamy false.

1) Start in the leftmost column2) If all queens are placed return true3) Try all rows in the current column. Do following for every tried row. a) If the queen can be placed safely in this row then mark this as part of the solution and recursively check if placing queen here leads to a solution. b) If placing the queen in leads to a solution then return true. c) If placing queen doesn't lead to a solution then unmark this (Backtrack) and go to step (a) to try other rows.3) If all rows have been tried and nothing worked, return false to trigger backtracking.

możesz zapoznać się z artykułem na temat Backtrackingu | Set 3 (Problem N Queen), aby uzyskać pełną implementację powyższego podejścia.
więcej problemów z Backtrackingiem:

  • Backtracking / Set 1 (Problem z wyprawą Rycerza)
  • Backtracking / Set 2 (Szczur w labiryncie)
  • Backtracking / Set 4 (suma podzbiorów)
  • Backtracking / Set 5 (problem z kolorowaniem m)
  • –> Kliknij tutaj, aby uzyskać więcej
Tagi artykułu :
Tagi praktyki:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.