GeeksforGeeks

Forutsetninger :

  • Rekursjon
  • Kompleksitetsanalyse

Backtracking er en algoritmisk teknikk for å løse problemer rekursivt ved å prøve å bygge en løsning trinnvis, ett stykke om gangen, fjerne de løsningene som ikke klarer å tilfredsstille problemets begrensninger til enhver tid (etter tid, her, refereres til tiden som er gått til et hvilket som helst nivå av søketreet).

i henhold til wiki-definisjonen,

Backtracking kan defineres som en generell algoritmisk teknikk som vurderer å søke alle mulige kombinasjoner for å løse et beregningsproblem.

det er tre typer problemer i backtracking–

  1. Beslutningsproblem – i dette søker vi etter en mulig løsning.
  2. Optimaliseringsproblem-I dette søker vi etter den beste løsningen.
  3. Opplistingsproblem-I dette finner vi alle mulige løsninger.

hvordan avgjøre om et problem kan løses ved Hjelp Av Backtracking?

generelt kan ethvert problem med begrensning av tilfredshet som har klare og veldefinerte begrensninger på enhver objektiv løsning, som trinnvis bygger kandidat til løsningen og forlater en kandidat («backtracks») så snart det bestemmer at kandidaten ikke muligens kan fullføres til en gyldig løsning, løses ved Backtracking. Imidlertid kan de fleste problemene som diskuteres, løses ved hjelp av andre kjente algoritmer som Dynamisk Programmering eller Grådige Algoritmer i logaritmisk, lineær, lineær-logaritmisk tidskompleksitet i rekkefølge av inngangsstørrelse, og derfor skygge backtracking algoritmen i alle henseender (siden backtracking algoritmer er generelt eksponentiell i både tid og rom). Imidlertid er det fortsatt noen problemer som bare har backtracking algoritmer for å løse dem til nå.

Tenk på en situasjon at du har tre bokser foran deg, og bare en av dem har en gullmynt i den, men du vet ikke hvilken. Så, for å få mynten, må du åpne alle boksene en etter en. Du vil først sjekke den første boksen, hvis den ikke inneholder mynten, må du lukke den og sjekke den andre boksen og så videre til du finner mynten. Dette er hva backtracking er, som løser alle delproblemer en etter en for å nå best mulig løsning.

Vurder eksemplet nedenfor for å forstå Backtracking-tilnærmingen mer formelt,

Gitt en forekomst av et hvilket som helst beregningsproblem  P Og data D som svarer til forekomsten, er alle begrensningene som må tilfredsstilles for å løse problemet representert ved  C . En backtracking algoritme vil da fungere som følger:

Algoritmen begynner å bygge opp en løsning, og starter med et tomt løsningssett  S . S = {}

  1. Legg til  S det første trekket som fortsatt er igjen (Alle mulige trekk legges til S en etter en). Dette oppretter nå et nytt sub-tre  s i søketreet til algoritmen.
  2. Kontroller om  S + s oppfyller hver av begrensningene i C .
    • hvis Ja, er undertreet s » kvalifisert «for å legge til flere»barn».
    • Ellers er hele undertreet s ubrukelig, så går tilbake til trinn 1 ved hjelp av argument  S .
  3. i tilfelle» kvalifikasjon » av det nylig dannede undertreet  s , går tilbake til trinn 1, ved hjelp av argument  S + s .
  4. hvis sjekken for S+s returnerer at det er en løsning for hele dataene D . Utgang og avslutte programmet.
    hvis ikke, returner du at ingen løsning er mulig med gjeldende  s og kast den derfor.

Forskjell Mellom Rekursjon og Backtracking:

i rekursjon kaller funksjonen seg til den når en base sak. I backtracking bruker vi rekursjon for å utforske alle mulighetene til vi får det beste resultatet for problemet.

Pseudokode For 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. Finne om en løsning eksisterer eller ikke

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;

La oss prøve å løse et standard Backtracking problem, N-Queen Problem.
N Queen er problemet med å plassere n sjakkdronninger på Et N×n sjakkbrett slik at ingen to dronninger angriper hverandre. For eksempel er følgende en løsning for 4 Queen problem.

forventet utgang er en binær matrise som har 1s for blokkene der dronninger er plassert. For eksempel er følgende utgangsmatrisen for ovennevnte 4 queen-løsning.

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

Backtracking Algoritme: ideen er å plassere dronninger en etter en i forskjellige kolonner, fra venstre kolonne. Når vi plasserer en dronning i en kolonne, ser vi etter sammenstøt med allerede plasserte dronninger. I den nåværende kolonnen, hvis vi finner en rad der det ikke er sammenstøt, merker vi denne raden og kolonnen som en del av løsningen. Hvis vi ikke finner en slik rad på grunn av sammenstøt, går vi tilbake og returnerer 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 referere til artikkelen Om Backtracking / Set 3 (N Queen Problem) for fullstendig implementering av ovennevnte tilnærming.
Flere Backtracking Problemer:

  • Backtracking / Sett 1(Ridderens turproblem)
  • Backtracking | Sett 2 (Rotte i En Labyrint)
  • Backtracking / Sett 4 (Delmengde Sum)
  • Backtracking | Sett 5 (M Fargeproblem)
  • –> Klikk her For Mer
Artikkel Tags:
Praksis Tags:

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.