Tilbagesporingsalgoritme

Hvad er Backtracking Algorithm?

Backtracking er en algoritme, der sรธger efter mulige kombinationer at lรธse beregningsmรฆssige problemer. Det opbygger gradvist kandidater og fjerner dem, der ikke opfylder givne begrรฆnsninger. Denne teknik er meget nyttig i situationer, hvor du skal vรฆlge en gennemfรธrlig lรธsning blandt flere mulige resultater.

Denne algoritme anses for at vรฆre bedre og mere effektiv end Brute Force-tilgangen. I modsรฆtning til Bruteforce, der forsรธger alle mulige lรธsninger, fokuserer Backtracking pรฅ kun at finde รฉn endelig lรธsning i henhold til given begrรฆnsninger. Det sparer ogsรฅ tid og hukommelse ved at fortryde det sidste trin (backtrack) og prรธve en anden mulighed efter at have nรฅet en blindgyde. Derudover stopper den, sรฅ snart en gyldig lรธsning er fundet.

Backtracking er en meget brugt teknik, fordi den kan lรธse komplekse problemer uden udtรธmmende ressourceforbrug. Det er isรฆr nyttigt til problemer, hvor adskillige begrรฆnsninger skal vรฆre opfyldt, sรฅsom Sudoku, n queen problem og planlรฆgning. Ved intelligent at navigere gennem potentielle lรธsninger kan backtracking finde et svar, der opfylder alle betingelser. Dette gรธr den uvurderlig til opgaver, der krรฆver bรฅde prรฆcision og effektivitet.

Hvordan fungerer tilbagesporingsalgoritme?

Backtracking-algoritmer er en problemlรธsningsteknik, der involverer at finde valide lรธsninger trin for trin. Hvis begrรฆnsningerne for et trin ikke opfylder visse betingelser, vender algoritmen tilbage til det forrige trin.

Tilbagesporingsalgoritme

Det fortsรฆtter derefter med andre mulige kombinationer, der opfylder de givne begrรฆnsninger. Da der findes mange mulige kombinationer, vรฆlger den en af โ€‹โ€‹de mest tilfredsstillende muligheder og lรธser problemet sekventielt. Denne algoritmiske teknik er nyttig, nรฅr du skal lรธse en eller flere mulige muligheder. Tilbagetrรฆkning betyder, at du annullerer dit valg, nรฅr der opstรฅr en situation, som ikke giver en gyldig lรธsning.

Tilbagesporingsalgoritmen har fรธlgende trin generelt for at lรธse et problem:

Trin 1) Initialisering: Start med en indledende tom/delvis oplรธsning.

Trin 2) Udvรฆlgelse: Baseret pรฅ specifikke kriterier og begrรฆnsninger, vรฆlg รฉn mulighed for at udvide den nuvรฆrende lรธsning.

Trin 3) Udforskning: Lรธs rekursivt ved at overveje den valgte kandidat og komme videre i problemlรธsningsprocessen.

Trin 4) Kontrol af begrรฆnsninger: Tjek, om den aktuelle delvise lรธsning overtrรฆder nogen begrรฆnsninger ved hvert trin. Hvis det gรธr det, skal du gรฅ tilbage til det forrige trin og prรธve en anden kandidat.

Trin 5) Opsigelse: Tilbagesporingsprocessen stopper, nรฅr enten en gyldig lรธsning er fundet, eller alle kombinationer er opbrugt.

Trin 6) Backtracking: Hvis den aktuelle indstilling ikke lรธser det givne problem, vender den tilbage til den tidligere tilstand. Den overvejer derefter den nye mulighed for at lรธse det givne problem.

Trin 7) Gentag: Fortsรฆt med disse trin, indtil problemet er lรธst, eller alle muligheder er undersรธgt.

Rekursiv karakter af tilbagesporingsalgoritme

Tilbagesporingsalgoritmer er af rekursive natur. Det betyder, at algoritmen kalder sig selv med forskellige parametre, indtil den finder en lรธsning eller har testet alle muligheder:

def find_solutions(n, other_params):
    if found_a_solution():
        increment_solutions_found()
        display_solution()
        if solutions_found >= solution_target:
            exit_program()
        return	

    for val in range(first, last+1):
        if is_valid(val, n):
            apply_value(val, n)
            find_solutions(n + 1, other_params)
            remove_value(val, n)

Almindelige vilkรฅr relateret til problemer med tilbagesporing

Disse er nogle grundlรฆggende udtryk relateret til Backtracking-teknikken:

  • Lรธsningsvektor: Reprรฆsenterer lรธsninger som n-tupler, som (X1, X2, โ€ฆ, Xn).
  • Begrรฆnsninger: Regler, der begrรฆnser X-vรฆrdier, implicit og eksplicit.
  • Lรธsningsplads: Alle gyldige X-vรฆrdier, der opfylder eksplicitte begrรฆnsninger.
  • Statens rumtrรฆ: Reprรฆsenterer lรธsningsrummet som et trรฆ.
  • Statens Rum: Beskriver stier i et tilstandsrumtrรฆ.
  • Problemtilstand: Noder i sรธgetrรฆet, der reprรฆsenterer dellรธsninger.
  • Lรธsningsstater: Stater, der danner gyldige lรธsningstupler i S.
  • Svar stater: Opfyld implicitte begrรฆnsninger og giv รธnskede lรธsninger.
  • Lovende knude: Fรธrer til รธnskede lรธsninger og forbliver gennemfรธrlige.
  • Ikke-lovende node: Fรธrer til uigennemfรธrlige tilstande, ikke udforsket yderligere.
  • Live Node: Genereret med uudforskede bรธrn.
  • E-knude: Live node med igangvรฆrende bรธrnegenerering.
  • Dรธd knude: Ingen yderligere udvidelse af alle bรธrn genereret.
  • Dybde-fรธrste knudegenerering: Bruger den seneste live node som den nรฆste E-node.
  • Afgrรฆnsningsfunktion: Maksimerer eller minimerer B(x1, x2, โ€ฆ, Xa) for optimering.
  • Statiske trรฆer: Trรฆformulering uafhรฆngig af probleminstansen.
  • Dynamiske trรฆer: Trรฆets formulering varierer med problemforekomsten.

Hvornรฅr skal man bruge en backtracking-algoritme?

Vi kan vรฆlge Backtracking-teknikken til at lรธse et komplekst problem, nรฅr:

  • Der er mange valgmuligheder: Backtracking er velegnet, hvis der findes mange muligheder pรฅ hvert trin i problemlรธsningsprocessen. Disse muligheder kan relatere til udvรฆlgelsen af โ€‹โ€‹emner og trรฆk.
  • Intet klart bedste valg: Nรฅr der er utilstrรฆkkelig information til at bestemme det bedste valg blandt tilgรฆngelige muligheder, kan en Backtracking-algoritme bruges.
  • Beslutningen fรธrer til flere valg: Du kan vรฆlge backtracking-teknik til at gennemgรฅ valg systematisk.
  • Har brug for at udforske alle mulige lรธsninger: Backtracking udforsker systematisk alle lรธsningerne ved at trรฆffe en rรฆkke beslutninger, der bygger pรฅ hinanden.

Typer af tilbagesporingsproblemer

Der er tre typer problemer i backtracking-algoritmer: beslutningsproblemer, optimeringsproblemer og optรฆllingsproblemer. Lad os lรฆre om dem nedenfor.

  1. Beslutningsproblem: I denne type problemer er mรฅlet at afgรธre, om der findes en gennemfรธrlig lรธsning. Vi tjekker "ja" og "nej" svarene. For eksempel n-queens-problemet. Det er et beslutningsproblem, der undersรธger sandsynligheden for at placere n dronninger pรฅ et n ร— n skakbrรฆt uden at angribe hinanden.
  2. Optimeringsproblem: Ved optimeringsproblemer er mรฅlet at finde den bedst mulige lรธsning blandt mange muligheder. Dette kan involvere at bestemme maksimum- og minimumvรฆrdierne for en bestemt funktion eller variabel. Overvej for eksempel rygsรฆkproblemet, hvor mรฅlet er at maksimere den samlede vรฆrdi af genstandene i tasken, samtidig med at dens vรฆgtgrรฆnse overholdes.
  3. Optรฆllingsproblem: Dens formรฅl er at finde alle mulige lรธsninger pรฅ et givet problem. Vi lister alle gyldige muligheder uden nogen udeladelser. Et eksempel ville vรฆre at generere alle mulige bogstavkombinationer fra et givet sรฆt af tegn.

Anvendelser af backtracking & eksempler

Der er forskellige anvendelser af Backtracking. Nogle af dem er forklaret nedenfor med deres pseudokode.

  1. Sudoku Solver: Dette problem indeholder et 3ร—3 undergitter med duplikerede numre. Backtracking-teknikken vil vise, at lรธsningen returnerer falsk, hvilket indikerer behovet for en anden nummerplacering.
  2. function solveSudoku(board):
        if no empty cells:
            return true  # Sudoku is solved
        for each empty cell (row, col):
            for num from 1 to 9:
                if num is valid in (row, col):
                    place num in (row, col)
                    if solveSudoku(board):
                        return true
                    remove num from (row, col)
        return false  # No valid solution
    
  3. N-Queen problem: Backtracking-tilgangen bestemmer, hvordan dronninger skal prรฆsenteres pรฅ et N ร— N skakbrรฆt, sรฅ ingen af โ€‹โ€‹dem truer hinanden.
  4. function solveNQueens(board, col):
        if col >= N:
            return true  # All queens are placed
        for each row in the column col:
            if isSafe(board, row, col):
                place queen at (row, col)
                if solveNQueens(board, col + 1):
                    return true
                remove queen from (row, col)
        return false  # No valid solution in this branch
    
  5. Subset Sum Problem: Det bruges til at finde delmรฆngden af โ€‹โ€‹tal fra et givet sรฆt, der summerer til en bestemt mรฅlsum.
  6. function subsetSum(nums, target, index, currentSubset):
        if target == 0:
            print(currentSubset)  # Subset with the target sum found
            return
        if index >= len(nums) or target < 0:
            return
       currentSubset.add(nums[index])
       subsetSum(nums, target - nums[index], index + 1, currentSubset)
       currentSubset.remove(nums[index])
       subsetSum(nums, target, index + 1, currentSubset)
    
  7. Hamiltonsk cyklusproblem: Tilbagesporing kan anvendes til at finde en lukket tur i en graf, der besรธger hvert hjรธrne nรธjagtigt รฉn gang.
  8. Rotte i labyrint-problem: Backtracking-teknikken bruges til at finde en rottes vej fra labyrintens startpunkt til udgangen.

Fordele og ulemper ved Backtracking Algorithm

Fordele ved Backtracking Algorithm

Backtracking-teknikker bruges til at lรธse komplekse problemer. Det har mange fordele som:

  • Backtracking-teknikken er effektiv til hรฅndtering af begrรฆnsninger.
  • Denne metode er god til at lรธse optimeringsproblemer.
  • Teknikken virker til forskellige typer problemer.
  • Denne procedure kan hjรฆlpe med at gennemgรฅ alle mulige lรธsninger.
  • Da det gรฅr tilbage, sparer det mere hukommelse end Bruteforce-teknikken.

Ulemper ved Backtracking Algorithm

Backtracking-teknikker har ogsรฅ nogle begrรฆnsninger, sรฅsom tidskompleksitet. Denne teknik har fรธlgende ulemper:

  • Der er ingen garanteret lรธsning.
  • Det er langsommere pรฅ grund af mange kombinationer.
  • Det har hรธj tidskompleksitet pรฅ grund af mange muligheder.
  • Det er uegnet til realtidsbegrรฆnsninger, da det kan tage lang tid at finde den bedste lรธsning.
  • Effektiviteten afhรฆnger af problemets kompleksitetsniveau.

Forskellen mellem tilbagesporing og rekursion

rekursion backtracking
Kalder sig selv indtil basissagen er nรฅet. Bruger rekursion til at gennemgรฅ alle muligheder, indtil det bedst mulige resultat er fundet.
Bottom up tilgang. Top down tilgang.
Ingen vรฆrdi kasseres. Ikke-levedygtige lรธsninger afvises.

Konklusion

Backtracking er en nyttig algoritmisk strategi til at lรธse komplekse problemer ved systematisk at udforske gennemfรธrlige lรธsninger og backtracke, nรฅr det er nรธdvendigt. Vi kan forvente, at tilbagesporingsteknikker forbedres med forbedringer i beregningskraft og algoritmisk effektivitet. Disse fremskridt vil give dem mulighed for at tackle stรธrre og mere komplekse problemer effektivt.

Derudover kan maskinlรฆringsmodeller guide tilbagelรธbende beslutninger baseret pรฅ tidligere lรฆrte mรธnstre.

Alle disse teknologiske innovationer vil revolutionere backtracking-algoritmer, hvilket gรธr dem til et kraftfuldt og alsidigt vรฆrktรธj til at lรธse komplicerede problemer i forskellige domรฆner.

Opsummer dette indlรฆg med: