Kezdőoldal » Számítástechnika » Programozás » Van itt valaki, aki érti a...

Van itt valaki, aki érti a backtracking (visszalépéses keresés) programozási módszert, és el is tudná nekem magyarázni, ha megkérem?

Figyelt kérdés

Az a gond, hogy egyszerűen nem tudom kigondolni. A lényegét értem, viszont mikor arra kerül sor, hogy leprogramozzam, egyszerűen nem megy... Rekurzívan oldottunk meg 1-2 feladatot, és hiába próbálkozok, egyedül nem megy.

Pl. van egy olyan feladat, hogy: Adott egy n elemű számsorozat. Helyezzünk közéjük n-1 műveletjelet, úgy, hogy az eredmény egyenlő legyen egy adott számmal. A műveletjeleket balról jobbra vesszük figyelembe, nem a matematika szabályainak megfelelően.

Ez hogyan lehetne megoldani? Akárhogyan próbálkozok, viszonylag mindig hamar belebukok a megoldásba. Ha valaki tudna segíteni, nagyon hálás lennék!



2014. jan. 1. 18:16
 1/10 anonim ***** válasza:

[link]


ha ebből nem érted meg, ásd el magad

2014. jan. 1. 18:19
Hasznos számodra ez a válasz?
 2/10 A kérdező kommentje:
A lényegét értem, hogy egymás után próbálja a lehetőségeket ez a módszer, és ha talál egy teljes megoldás, akkor kiírja. Viszont egyszerűen nem tudom implementálni, és nem tudom, hogy mihez kezdjek...
2014. jan. 1. 18:22
 3/10 anonim ***** válasza:

Ott van hozzá kód is alul, olvasd el, látom beraktad a c++-t a címkék közé, szóval még érted is a kódot.

Ezen tovább nem lehet segíteni, kicsit törni kell a fejedet rajta, hiába, ez van.

2014. jan. 1. 18:28
Hasznos számodra ez a válasz?
 4/10 A kérdező kommentje:
Igen, a kódot értem. Tulajdonképpem azt hiszem a feladatok nagy részét megértem, ha meg van írva, mert levezetem, elemezgetem kicsit, stb., és úgy már oké. Nálam azzal van a gond, hogy én hozzam létre a semmiből a kódot. Nem tudom, ezen hogy lehetne javítani vagy segíteni... Hogyan lehet ezt a módszert teljesen elsajátítani és megérteni? :S
2014. jan. 1. 18:59
 5/10 A kérdező kommentje:
Most is próbálkozok az általam leírt feladattal, és olyan hibákat dob ki, hogy nullával való osztás, holott az egész bemeneti adatok között nem található nulla...
2014. jan. 1. 19:02
 6/10 anonim ***** válasza:
Most akkor az baj, ha erre azt mondom: ne foglalkozz te még ilyen módszerek implementálásával, inkább alapozz még egy kicsit kódolás témában? Mármint érted, programozás.
2014. jan. 1. 19:04
Hasznos számodra ez a válasz?
 7/10 A kérdező kommentje:

Bajnak nem baj, hogy ezt mondod, legszívesebben én sem foglalkoznék ilyesmivel. :)) De jelenleg ezt tanuljuk, határidőre kéne feladatokat megoldanom, és nem mennek... Más programozási feladatokat mondhatni könnyen és elég jól meg tudok oldani, sőt, mindig arra törekszek, hogy minnél jobb legyen, minnél több hibát tudjon kezelni, stb.

A rekurziót még úgy ahogy megértettem, és pár próbálkozás után le tudom programozni azt, amit akarok. De ez a backtracking módszer soha nem ment, pedig most tanulom talán másodjára. :(

2014. jan. 1. 19:12
 8/10 anonim ***** válasza:

"A rekurziót még úgy ahogy megértettem"


Pontosan kell érteni a rekurziót, onnan egy ugrás a backtracking megértése majd alkalmazása.


Backtracking az egy fát jár be (mely a problémának az állapotterét reprezenálja) , minden lehetséges megoldás egy-egy levele ennek a fának. Legrosszabb esetben a levélnél látszik hogy megoldás e, akkor hatékony a backtracking módszer, ha már a részfákra megállapítja viszonylag gyorsan hogy annak egyetlen levele sem megoldás. Csillagászati méretű is lehet egy-egy részfa mérete mely teljes bejárása hosszú idő, a backtrack még is gyorsan bejárhatja, mivel nagy részfákat feleslegesen be sem jár. Persze ez implementáció és feladatfüggő.

Mindig kell valamilyen heurisztika,( még ha olyan egyszerű is mint a százas szeg,) az hogy mikor nem érdemes azon a részfán tovább menni.

Pl a 8 királynő problémájánál ha egymás alatt van 2 királynő akkor nem kell próbálkozni a többi királynő rakosgatásával. Amíg nem ismertem a backtracking-ot addig fél óra alatt sem találtam egy megoldást sem fel is adtam. Később amikor megismertem a módszert akkor 5 perc sem kellett hogy találjak egy megoldást, pedig csak gépiesen futtam fejben a Backtracking-ot és rakosgattam közben a sakktáblán a bábukat.

-------------

"van egy olyan feladat, hogy: Adott egy n elemű számsorozat. Helyezzünk közéjük n-1 műveletjelet, úgy, hogy az eredmény egyenlő legyen egy adott számmal. A műveletjeleket balról jobbra vesszük figyelembe, nem a matematika szabályainak megfelelően."


Ez pofon egyszerű. Az én logikám szerint nyilván kell tartani a backtrack-ra használt eljárás/függvény hívási mélységét, hogy a hívott rekurzív eljárás/függvény tudja hogy hol tartunk. Az aktuális részeredményt át kell neki adni. For ciklussal végig kell menni a műveletek halmazán és végre kell hajtani, bele kell "csempészni" a rekurzív hívásokat.

2014. jan. 1. 21:44
Hasznos számodra ez a válasz?
 9/10 anonim ***** válasza:

"Mindig kell valamilyen heurisztika,( még ha olyan egyszerű is mint a százas szeg,) az hogy mikor nem érdemes azon a részfán tovább menni."

Ahhoz hogy hatékony legyen, különben csak akkor lehet hatékony ha kicsi a problématér.

2014. jan. 1. 21:59
Hasznos számodra ez a válasz?
 10/10 anonim ***** válasza:
Implementálni úgy lehet, hogy minden döntést megőrzöl, visszalépéskor pedig törlöd az utolsót, vagy amit már végigpróbáltál. Ezt is nyilván kell tartanod valahogy. De erre nincs külön szükség, ha mindig ugyanabban a sorrendben próbálgatsz, mert az már látszik. Mintha egy szám lenne, amiben ''tízesátlépés'' történik, amikor visszalépsz.
2014. jan. 2. 17:19
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!