GeeksforGeeks

Edeltävät opinnot :

  • rekursio
  • kompleksisuusanalyysi

Backtracking on algoritminen-tekniikka ongelmien ratkaisemiseksi rekursiivisesti yrittämällä rakentaa ratkaisu vähitellen, pala kerrallaan, poistamalla ne ratkaisut, jotka eivät täytä ongelman rajoitteita missään vaiheessa (ajan, tässä, viitataan kuluneeseen aikaan, kunnes saavuttaa minkä tahansa tason hakupuun).

wikin määritelmän mukaan,

Backtracking voidaan määritellä yleinen algoritminen tekniikka, joka pitää etsimällä jokainen mahdollinen yhdistelmä, jotta voidaan ratkaista laskennallinen ongelma.

peräänajossa on kolmenlaisia ongelmia–

  1. Päätösongelma-tässä etsimme toteuttamiskelpoista ratkaisua.
  2. Optimointiongelma-tässä etsitään parasta ratkaisua.
  3. Luettelointiongelma – tästä löydämme kaikki toteuttamiskelpoiset ratkaisut.

Miten määritetään, voidaanko ongelma ratkaista takaisinkytkennällä?

yleensä jokainen rajoite-tyytyväisyysongelma, jolla on selkeät ja tarkoin määritellyt rajoitteet mille tahansa objektiiviselle ratkaisulle, joka vähitellen rakentaa ehdokkaan ratkaisuun ja hylkää ehdokkaan (”backtracks”) heti, kun se toteaa, ettei ehdokasta voida mitenkään täydentää pätevään ratkaisuun, voidaan ratkaista Takaisinvedolla. Kuitenkin, useimmat ongelmat, joista keskustellaan, voidaan ratkaista käyttämällä muita tunnettuja algoritmeja, kuten dynaaminen ohjelmointi tai ahne algoritmeja logaritminen, lineaarinen, lineaarinen-logaritminen aika monimutkaisuus järjestyksessä tulon koko, ja siksi, outshine backtracking algoritmi joka suhteessa (koska backtracking algoritmit ovat yleensä eksponentiaalisia sekä aika ja tila). Kuitenkin, muutamia ongelmia on vielä jäljellä, että on vain taaksepäin algoritmeja ratkaista ne tähän asti.

mieti tilannetta, että edessäsi on kolme laatikkoa ja vain yhdessä niistä on kultakolikko, mutta et tiedä, kummassa. Joten, saadakseen kolikon, sinun täytyy avata kaikki laatikot yksi kerrallaan. Valitset ensin ensimmäisen laatikon, jos se ei sisällä kolikkoa, sinun täytyy sulkea se ja tarkistaa toinen laatikko ja niin edelleen, kunnes löydät kolikon. Tätä on perääntyminen, eli kaikkien alaongelmien ratkaiseminen yksitellen parhaan mahdollisen ratkaisun saavuttamiseksi.

tarkastellaan alla olevaa esimerkkiä, jotta voidaan ymmärtää taaksepäin suuntautuva lähestymistapa muodollisemmin,

kun otetaan huomioon mikä tahansa laskennallinen ongelma P ja tieto D , kaikkia niitä rajoitteita, jotka on täytettävä ongelman ratkaisemiseksi, esittää C . Tämän jälkeen palautusalgoritmi toimii seuraavasti:

algoritmi alkaa rakentaa ratkaisua, joka alkaa tyhjällä ratkaisujoukolla s . Lä = {}

  1. lisätään s ensimmäinen jäljellä oleva siirto (kaikki mahdolliset siirrot lisätään s yksitellen). Tämä luo nyt algoritmin hakupuuhun uuden osapuun s .
  2. tarkistetaan, täyttääkö  S + S kaikki  C vaatimukset.
    • jos kyllä, niin alapuu s on ”kelpoinen” lisäämään ”lapsia”.
    • muuten koko alapuu s on hyödytön, joten palautuu takaisin vaiheeseen 1 käyttäen argumenttia s .
  3. jos vastaperustetun alapuun ”kelpoisuus” s palautuu takaisin vaiheeseen 1 käyttäen argumenttia S + S .
  4. jos tarkistuksessa  S + S todetaan, että se on ratkaisu koko aineistoon D . Output ja lopettaa ohjelman.
    jos näin ei ole, palautetaan, että ratkaisu ei ole mahdollinen nykyisellä s ja hävitetään.

ero rekursion ja takaisinvedon välillä:

rekursiossa funktio kutsuu itseään, kunnes se saavuttaa kantatapauksen. Takaisinvedossa hyödynnämme rekursiota tutkiaksemme kaikkia mahdollisuuksia, kunnes saamme parhaan tuloksen ongelmaan.

Pseudo-koodi takaisinvetoa varten:

1. Rekursiivinen taustaratkaisu.

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. Selvittäkäämme, onko

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;

ratkaisua olemassa vai ei, yrittäkäämme ratkaista vakio-Backtracking-ongelma, N-Queen-ongelma.
N kuningatar on ongelma, jossa n shakkikuningattaret asetetaan N×N-shakkilaudalle niin, ettei kaksi kuningatarta hyökkää toistensa kimppuun. Esimerkiksi seuraavassa on ratkaisu 4 Queen ongelma.

odotettu lähtö on binäärimatriisi, jossa on 1s lohkoille, joihin kuningattaret sijoitetaan. Esimerkiksi seuraavassa on lähtömatriisi edellä 4 queen ratkaisu.

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

Taustanalgoritmi: ideana on sijoittaa kuningattaret yksitellen eri sarakkeisiin, alkaen vasemmanpuoleisimmasta sarakkeesta. Kun asetamme kuningattaren kolonnaan, Tarkistamme, onko se ristiriidassa jo sijoitettujen kuningattarien kanssa. Nykyisessä sarakkeessa, jos löydämme rivin, jolle ei ole yhteentörmäystä, merkitsemme tämän rivin ja sarakkeen osana ratkaisua. Jos emme löydä tällaista riitaa, joka johtuu yhteenotoista, peräännymme ja palaamme väärinä.

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.

voit viitata artikkeliin ”Backtracking / Set 3” (n Queen Problem) edellä mainitun lähestymistavan täydelliseen toteuttamiseen.
lisää Taustaongelmia:

  • Backtracking | Set 1 (The Knight ’ s tour problem)
  • Backtracking | Set 2 (Rat in a Maze)
  • Backtracking | Set 4 (Subset Sum)
  • Backtracking / Set 5 (m Coloring Problem)
  • –> Klikkaa tästä lisää
artikkeli tagit:
käytännön tagit:

Vastaa

Sähköpostiosoitettasi ei julkaista.