GeeksforGeeks

förutsättningar :

  • rekursion
  • Komplexitetsanalys

Backtracking är en algoritmisk teknik för att lösa problem rekursivt genom att försöka bygga en lösning stegvis, en bit i taget, ta bort de lösningar som inte uppfyller problemets begränsningar vid någon tidpunkt (med tiden hänvisas här till tiden som förflutit till att nå någon nivå i sökträdet).

enligt wiki-definitionen,

Backtracking kan definieras som en allmän algoritmisk teknik som överväger att söka alla möjliga kombinationer för att lösa ett beräkningsproblem.

det finns tre typer av problem i backtracking–

  1. beslutsproblem-i detta söker vi efter en genomförbar lösning.
  2. optimeringsproblem-här söker vi efter den bästa lösningen.
  3. Uppräkningsproblem-Här hittar vi alla möjliga lösningar.

hur man bestämmer om ett problem kan lösas med Backtracking?

generellt kan varje problem med begränsningstillfredsställelse som har tydliga och väldefinierade begränsningar för någon objektiv lösning, som stegvis bygger kandidat till lösningen och överger en kandidat (”backtracks”) så snart den bestämmer att kandidaten omöjligt kan slutföras till en giltig lösning, lösas genom Backtracking. De flesta av de problem som diskuteras kan emellertid lösas med hjälp av andra kända algoritmer som dynamisk programmering eller giriga algoritmer i logaritmisk, linjär, linjär-logaritmisk tidskomplexitet i ordning efter inmatningsstorlek och överträffar därför backtracking-algoritmen i alla avseenden (eftersom backtracking-algoritmer i allmänhet är exponentiella i både tid och rum). Men några problem kvarstår, som bara har backtracking algoritmer för att lösa dem tills nu.

Tänk på en situation som du har tre lådor framför dig och bara en av dem har ett guldmynt i det men du vet inte vilken. Så, för att få myntet, måste du öppna alla rutorna en efter en. Du kommer först att markera den första rutan, om den inte innehåller myntet, måste du stänga den och markera den andra rutan och så vidare tills du hittar myntet. Detta är vad backtracking är, det är att lösa alla delproblem en efter en för att nå bästa möjliga lösning.

Tänk på exemplet nedan för att förstå Backtracking-metoden mer formellt,

givet en förekomst av något beräkningsproblem P och data D motsvarande instansen representeras alla begränsningar som måste uppfyllas för att lösa problemet av C . En bakåtspårningsalgoritm fungerar sedan enligt följande:

algoritmen börjar bygga upp en lösning, börjar med en tom lösningsuppsättning s . S = {}

  1. Lägg till S det första draget som fortfarande är kvar (alla möjliga drag läggs till s en efter en). Detta skapar nu ett nytt underträd s i algoritmens sökträd.
  2. kontrollera om  S + s uppfyller var och en av begränsningarna i C .
    • om ja, är underträdet s ”berättigat” för att lägga till fler ”barn”.
    • annars är hela underträdet s värdelöst, så återkommer tillbaka till steg 1 med argument s .
  3. i händelse av ”behörighet” för det nybildade underträdet s , återkommer tillbaka till steg 1 med argument S+s .
  4. om kontrollen för S+s returnerar att det är en lösning för hela data D . Utgång och avsluta programmet.
    om inte, returnera att ingen lösning är möjlig med nuvarande  s och kassera den därmed.

skillnad mellan rekursion och Backtracking:

i rekursion anropar funktionen sig själv tills den når ett basfall. I backtracking använder vi rekursion för att utforska alla möjligheter tills vi får det bästa resultatet för problemet.

pseudokod för Backtracking :

1. Rekursiv backtracking lösning.

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. Hitta om en lösning finns eller inte

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;

Låt oss försöka lösa ett standard Backtracking problem, N-Queen Problem.
n-drottningen är problemet med att placera n schackdrottningar på ett n-schackbräde, så att inga två drottningar attackerar varandra. Till exempel, Följande är en lösning för 4 drottning problem.

den förväntade utgången är en binär matris som har 1s för blocken där drottningar placeras. Till exempel, Följande är utgångsmatrisen för ovanstående 4 drottning lösning.

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

backtracking algoritm: tanken är att placera drottningar en efter en i olika kolumner, från den vänstra kolumnen. När vi placerar en drottning i en kolumn, kontrollerar vi efter kollisioner med redan placerade drottningar. I den aktuella kolumnen, om vi hittar en rad för vilken det inte finns någon konflikt, markerar vi den här raden och kolumnen som en del av lösningen. Om vi inte hittar en sådan rad på grund av sammandrabbningar så backtrackar vi och returnerar 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.

du kan hänvisa till artikeln om Backtracking | Set 3 (N Queen Problem) för fullständigt genomförande av ovanstående tillvägagångssätt.
fler Bakåtspårningsproblem:

  • Backtracking / Set 1 (riddarens tour problem)
  • Backtracking / Set 2 (råtta i en labyrint)
  • Backtracking / Set 4 (delmängd summa)
  • Backtracking / Set 5 (m färgproblem)
  • –> Klicka här för mer
artikel taggar:
öva taggar:

Lämna ett svar

Din e-postadress kommer inte publiceras.