Welkom op de Nederland Computer Kennisnetwerk!  
 
Zoeken computer kennis
Home Hardware Netwerken Programmering Software Computerstoring Besturingssysteem
Computer Kennis >> Software >> Back- up maken van gegevens >> Content
Wat is backtracking en hoe wordt het gebruikt bij het programmeren?

Teruggaan:een systematische probleemoplossende techniek

Backtracking is een krachtige algoritmische techniek die wordt gebruikt voor het oplossen van problemen waarbij naar een oplossing moet worden gezocht uit een groot aantal mogelijkheden. Het werkt door stapsgewijs kandidaat-oplossingen op te bouwen en een kandidaat in de steek te laten ("backtracking") zodra wordt vastgesteld dat de kandidaat onmogelijk tot een geldige oplossing kan leiden. Zie het als een slimme, gestructureerde manier om diepgaand te zoeken in een beslisboom.

Belangrijkste ideeën:

* Incrementeel bouwen: Backtracking bouwt oplossingen stap voor stap, waarbij stukje voor stukje wordt toegevoegd.

* Snoeien (tevredenheidsbeperking): Bij elke stap wordt gecontroleerd of de huidige deeloplossing voldoet aan de beperkingen van het probleem. Als dit niet het geval is, verlaat het dat pad onmiddellijk en keert terug naar het vorige beslissingspunt. Deze snoeistap verkleint de zoekruimte dramatisch.

* Recursie (vaak): Backtracking wordt vaak geïmplementeerd met behulp van recursieve functies, waarbij elke recursieve aanroep een keuze of stap in het oplossingsbouwproces vertegenwoordigt.

* Beslissingsboom: Je kunt het zoekproces visualiseren als een beslissingsboom, waarbij elk knooppunt een toestand (deeloplossing) vertegenwoordigt en de randen keuzes of acties vertegenwoordigen. Backtracking verkent deze boom op een diepgaande manier.

Hoe het werkt (algemeen algoritme):

1. Begin met een lege (of gedeeltelijk geïnitialiseerde) oplossing.

2. Maak een keuze (verken een branche): Selecteer een mogelijke waarde of actie om de huidige oplossing uit te breiden.

3. Controleer op geldigheid:

* Als de oplossing geldig is (voldoet aan beperkingen):

* Is de oplossing compleet?

* Ja: Retourneer de oplossing.

* Nee: Roep recursief de backtracking-functie aan om een ​​andere keuze te maken en door te gaan met het bouwen van de oplossing.

* Als de oplossing ongeldig is (beperkingen schendt):

* Terug: Maak de laatste keuze ongedaan en probeer een andere. Als alle keuzes op dit niveau zijn geprobeerd, ga dan terug naar het vorige niveau.

4. Geen oplossing: Als alle mogelijke keuzes zijn uitgeput zonder een geldige oplossing te vinden, geef dan aan dat er geen oplossing bestaat.

Analogie:een doolhof oplossen

Stel je voor dat je een doolhof aan het oplossen bent. Je begint bij de ingang en probeert verschillende paden.

* Vooruit: Je maakt een ‘keuze’ door een pad af te leggen.

* Goed pad (geldig): Als het pad naar de uitgang lijkt te leiden, ga je verder.

* Doodlopend (ongeldig): Als je op een doodlopende weg komt, ga je "terug" door je stappen terug te volgen naar het laatste kruispunt (beslissingspunt) en een ander pad te proberen.

* Opgelost: Als u de uitgang bereikt, heeft u een oplossing gevonden.

Veelvoorkomende gebruiksscenario's bij programmeren:

* Constraint Tevredenheidsproblemen (CSP's): Problemen waarbij het doel is om een ​​reeks waarden te vinden voor variabelen die aan een reeks beperkingen voldoen.

* N-Queens-probleem: N-schaakvrouwen op een NxN-schaakbord plaatsen, zodat geen twee koninginnen elkaar bedreigen.

* Sudoku-oplosser: Een 9x9-raster vullen met cijfers, zodat elke rij, kolom en 3x3-subraster alle cijfers van 1 tot en met 9 bevat.

* Kaartkleuring: Kleuren toewijzen aan regio's op een kaart, zodat geen twee aangrenzende regio's dezelfde kleur hebben.

* Combinatorische optimalisatieproblemen: Het vinden van de beste oplossing uit een groot aantal mogelijke combinaties.

* Probleem met reizende verkopers (TSP): Het vinden van de kortst mogelijke route die elke stad in een lijst bezoekt en terugkeert naar de startstad (backtracking kan worden gebruikt voor kleine instanties, maar andere algoritmen zijn efficiënter voor grotere instanties).

* Knapzakprobleem: Bepalen van de meest waardevolle subset van items die in een knapzak met een beperkt draagvermogen passen.

* Probleem met subsetsom: Het vinden van een subset van een reeks getallen die optellen tot een bepaalde doelwaarde.

* Parsing en syntaxisanalyse:

* Contextvrije grammatica: Backtracking kan in parsers worden gebruikt om verschillende afleidingen van een zin uit te proberen totdat een geldige ontleedboom wordt gevonden.

Voorbeeld:N-Queens-probleem (vereenvoudigd)

Laten we het N-Queens-probleem illustreren met N=4 (een 4x4-bord).

```python

def is_safe(bord, rij, col):

"""Controleert of het plaatsen van een dame op bord[rij][kol] veilig is."""

# Controleer dezelfde kolom

voor i binnen bereik (rij):

als bord[i][col] ==1:

terugkeer Vals

# Controleer diagonaal linksboven

voor i, j in zip(bereik(rij - 1, -1, -1), bereik(kol ​​- 1, -1, -1)):

als bord[i][j] ==1:

terugkeer Vals

# Controleer diagonaal rechtsboven

voor i, j in zip(bereik(rij - 1, -1, -1), bereik(kol ​​+ 1, 4)):

als bord[i][j] ==1:

terugkeer Vals

terugkeer Waar

def solve_n_queens_util(bord, rij):

"""Recursieve helperfunctie om het N-Queens-probleem op te lossen."""

if rij ==4:# Alle koninginnen zijn succesvol geplaatst

terugkeer Waar

voor kleur binnen bereik(4):

if is_safe(bord, rij, col):

bord[rij][col] =1 # Plaats de koningin

if solve_n_queens_util(bord, rij + 1):# Plaats recursief de volgende koningin

terugkeer Waar

board[row][col] =0 # Backtrack:verwijder de dame als deze niet tot een oplossing leidt

return False # Geen oplossing gevonden voor deze rij

def solve_n_queens():

"""Lost het N-Queens-probleem op voor N=4."""

board =[[0 for _ in range(4)] for _ in range(4)] # Initialiseer een leeg bord

zo niet solve_n_queens_util(bord, 0):

print("Oplossing bestaat niet")

opbrengst

# Druk de oplossing af

voor rij in bord:

afdrukken(rij)

solve_n_queens()

```

Uitleg van de code:

1. `is_safe(bord, rij, col)`: Controleert of het veilig is om een ​​koningin op `board[row][col]` te plaatsen. Er wordt gecontroleerd op conflicten in dezelfde kolom en diagonalen.

2. `solve_n_queens_util(bord, rij)`:

* Basisscenario: `if row ==4:` Als we de laatste rij hebben bereikt (alle koninginnen geplaatst), hebben we een oplossing, dus retourneer `True`.

* Iteratie: Loop door elke kolom in de huidige rij (`for col in range(4)`).

* Controleer de veiligheid: `if is_safe(board, row, col):` Als het veilig is om een ​​koningin in deze kolom te plaatsen:

* Plaats de Koningin: `bord[rij][kol] =1`

* Recursieve oproep: `if solve_n_queens_util(board, row + 1):` Probeer recursief de volgende koningin in de volgende rij te plaatsen. Als deze recursieve aanroep 'True' retourneert, betekent dit dat er vanaf dit punt een oplossing is gevonden, dus retourneren we ook 'True'.

* Terug: `board[row][col] =0` Als de recursieve aanroep `False` retourneert (er is geen oplossing gevonden), maken we de plaatsing van de koningin *ongedaan* (backtrack) en proberen we de volgende kolom in de huidige rij.

* Geen oplossing in deze rij: `return False` Als we alle kolommen in de huidige rij hebben geprobeerd zonder een oplossing te vinden, betekent dit dat er geen geldige plaatsing van koninginnen is, dus retourneren we `False`.

3. `solve_n_queens()`:

* Initialiseert het bord.

* Roept `solve_n_queens_util` aan om het backtrackingproces te starten.

* Drukt de oplossing af als deze wordt gevonden.

Voordelen van backtracking:

* Systematisch zoeken: Garandeert het vinden van een oplossing als die bestaat (uitputtende zoektocht).

* Snoeien: Voorkomt het verkennen van onnodige takken van de zoekruimte, waardoor dit efficiënter is dan een brute-force-aanpak.

* Conceptuele eenvoud: Het kernidee is relatief eenvoudig te begrijpen.

Nadelen van backtracking:

* Tijdcomplexiteit: Kan nog steeds een hoge tijdscomplexiteit hebben (exponentieel in het ergste geval) voor grote probleemgevallen, omdat het veel doodlopende wegen zou kunnen onderzoeken.

* Ruimtecomplexiteit: Kan veel geheugen vereisen, vooral voor diepe recursie.

Belangrijke overwegingen bij het toepassen van Backtracking:

* Beperkingen: Definieer duidelijk de beperkingen van het probleem.

* Keuze van actie: Denk goed na over hoe u bij elke stap keuzes maakt.

* Snoeistrategie: Ontwikkel een efficiënte snoeistrategie om ongeldige kandidaten zo vroeg mogelijk te elimineren. Dit is cruciaal voor de prestaties.

* Probleemstructuur: Backtracking werkt het beste bij problemen waarbij deeloplossingen gemakkelijk op validiteit kunnen worden beoordeeld.

Samenvattend is backtracking een veelzijdige probleemoplossende techniek die op een breed scala aan problemen kan worden toegepast. Door systematisch mogelijke oplossingen te verkennen en de zoekruimte te beperken, biedt het een krachtige aanpak voor het vinden van oplossingen die aan specifieke beperkingen voldoen. Hoewel het in het ergste geval een hoge tijdscomplexiteit kan hebben, kunnen zorgvuldige beperkingen en efficiënt snoeien de prestaties aanzienlijk verbeteren.

Previous: Next:
  Back- up maken van gegevens
·Hoe data een magneetband herst…
·Hoe te Individual Exchange-pos…
·Over een externe harde schijf …
·Welke vergoedingen worden geas…
·Hoe je het adresboek back-up o…
·Hoe om een back-up naar een Ne…
·Kunt u op betrouwbare wijze sc…
·Een back-up Parallels Desktop …
·Hoe je MySQL Backup Met Cron 
  Related Articles
Welke maatregelen kunnen worden genomen …
Wat is de worst-case tijdscomplexiteit v…
Wat is de tijdscomplexiteit van vectorin…
Wat is de tijdscomplexiteit van het back…
Wat is de tijdscomplexiteit van het back…
Wat is de tijdscomplexiteit van quicksor…
Wat is de tijdscomplexiteit van het quic…
Wat is de tijdscomplexiteit van het verw…
Wat is de tijdscomplexiteit van backtrac…
  Software Articles
·Hoe maak je een Mini DV branden op een D…
·Gereedschappen in MS Word 
·Hoe kan ik AVI converteren naar Mpeg voo…
·Hoe Word- en Excel converteren naar Work…
·Hoe kan ik muziek van de ene site naar W…
·Superscript Uitlijningsopties in PageMak…
·Hoe te Soundtrack Toevoegen aan een AVI …
·Wat is Mirar ? 
·Hoe je harde ondertiteling Met VirtualDu…
Copyright © Computer Kennis https://www.nldit.com