GeeksforGeeks

:

  • recursie
  • Complexiteitsanalyse

Backtracking is een algoritmische techniek om problemen recursief op te lossen door stapsgewijs een oplossing te bouwen, stuk voor stuk, waarbij oplossingen worden verwijderd die niet voldoen aan de beperkingen van het probleem op elk moment van de tijd (door de tijd wordt hier verwezen naar de tijd die verstreken is tot het bereiken van elk niveau van de zoekboom).

volgens de wiki-definitie,

Backtracking kan worden gedefinieerd als een algemene algoritmische techniek die elke mogelijke combinatie onderzoekt om een computationeel probleem op te lossen.

er zijn drie soorten problemen in backtracking–

  1. beslissingsprobleem – hierin zoeken we naar een haalbare oplossing.
  2. Optimalisatieprobleem-hierin zoeken we naar de beste oplossing.
  3. Enumeratieprobleem – hierin vinden we alle haalbare oplossingen.

Hoe kan een probleem worden opgelost met Backtracking?

in het algemeen kan elk probleem van constrainttevredenheid dat duidelijke en welomschreven beperkingen heeft voor elke objectieve oplossing, dat stapsgewijs kandidaat bouwt tot de oplossing en een kandidaat verlaat (“backtracks”) zodra het vaststelt dat de kandidaat onmogelijk kan worden voltooid tot een geldige oplossing, worden opgelost door Backtrack. Echter, de meeste van de problemen die worden besproken, kunnen worden opgelost met behulp van andere bekende algoritmen zoals dynamische programmering of hebzuchtige algoritmen in logaritmische, lineaire, lineair-logaritmische tijd complexiteit in volgorde van invoergrootte, en daarom, overtreffen de backtracking algoritme in elk opzicht (aangezien backtracking algoritmen zijn over het algemeen exponentieel in zowel tijd en ruimte). Echter, een paar problemen nog steeds, die alleen backtracking algoritmen om ze op te lossen tot nu toe.

overweeg een situatie dat u drie dozen voor u hebt en slechts één van hen een gouden munt erin heeft, maar u weet niet welke. Dus, om de munt te krijgen, moet u alle dozen een voor een te openen. U zult eerst het eerste vakje aanvinken, als het de munt niet bevat, moet u het sluiten en het tweede vakje aanvinken enzovoort totdat u de munt vindt. Dit is wat backtracking is, dat is het oplossen van alle sub-problemen een voor een om de best mogelijke oplossing te bereiken.

beschouw het onderstaande voorbeeld om de Backtracking-benadering formeler te begrijpen,

gegeven een exemplaar van een computationeel probleem P en gegevens D die overeenkomen met de instantie, worden alle beperkingen waaraan moet worden voldaan om het probleem op te lossen weergegeven door C . Een backtracking algoritme zal dan als volgt werken:

het algoritme begint een oplossing op te bouwen, beginnend met een lege oplossingsset S . S = {}

  1. voeg aan S de eerste zet toe die nog over is (alle mogelijke zetten worden één voor één toegevoegd aan S ). Dit maakt nu een nieuwe substructuur s aan in de zoekstructuur van het algoritme.
  2. Controleer of S+s aan elk van de voorwaarden in C voldoet.
    • zo ja, dan is de subboom s “in aanmerking komen” om meer “kinderen”toe te voegen.
    • anders is de gehele subboom s nutteloos, dus keert terug naar stap 1 met argument S .
  3. in het geval van “subsidiabiliteit” van de nieuw gevormde subboom s , keert u terug naar stap 1 met argument s+s .
  4. als de controle op s+s aangeeft dat het een oplossing is voor de volledige gegevens D . Uitvoer en beëindig het programma.
    zo niet, geef dan terug dat er geen oplossing mogelijk is met de huidige s en gooi deze dan weg.

verschil tussen recursie en Backtracking:

bij recursie roept de functie zichzelf aan tot het een basiscase bereikt. In backtracking gebruiken we recursie om alle mogelijkheden te verkennen totdat we het beste resultaat voor het probleem hebben.

Pseudo-Code voor Backtracking :

1. Recursieve backtracking oplossing.

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. Vinden of een oplossing bestaat of niet

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;

laten we proberen een standaard Backtracking probleem, n-Queen probleem op te lossen.
de n koningin is het probleem van het plaatsen van n schaakkoninginnen op een N×N schaakbord, zodat geen twee koninginnen elkaar aanvallen. Bijvoorbeeld, volgende is een oplossing voor 4 Koningin probleem.

de verwachte output is een binaire matrix die 1s heeft voor de blokken waar koninginnen zijn geplaatst. Hieronder volgt bijvoorbeeld de uitvoermatrix voor de bovenstaande 4 queen-oplossing.

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

Backtracking-algoritme: het idee is om koninginnen één voor één in verschillende kolommen te plaatsen, beginnend bij de meest linkse kolom. Wanneer we een koningin in een colonne plaatsen, controleren we op botsingen met reeds geplaatste koninginnen. Als we in de huidige kolom een Rij vinden waarvoor er geen botsing is, markeren we deze rij en kolom als onderdeel van de oplossing. Als we zo ‘ n ruzie niet vinden als gevolg van botsingen dan keren we terug en keren vals terug.

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.

u kunt verwijzen naar het artikel over Backtracking | Set 3 (N Queen probleem) voor de volledige implementatie van de bovenstaande aanpak.
meer Backtracking-problemen:

  • Backtracking / Set 1 (The Knight ‘ s tour probleem)
  • Backtracking / Set 2 (Rat in a Maze)
  • Backtracking / Set 4 (subset Som)
  • Backtracking | Set 5 (m kleurprobleem)
  • –> Klik hier voor meer
artikel Tags:
praktijk Tags:

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.