Van egy olyan spéci algoritmus-család amelyben minden algoritmust le lehet bontani három nagyon jól elkülöníthatő részre:
    • Adatbázis: Az adatbázis tárolja az állapottér-gráfnak a keresés során már előállított részét. Ezt áldalában csomópontokkal tartja nyilván de, hogy mit tárol egyy adott csomópont azt az adott algoritmus dönti el.
    • Műveletek: Ez trükkös mert két részből tevődik össze.
      • Operátorokból származtatott műveletek: Ez ismét visszaköszön mert mik is ezek?Hát az operátorok amiket bevezettünk a gráfban is. Ugye nekünk csak a gráf egyetlen csúcsa adott a startcsúcs, és a kereséssel építjük fel az adott operátorok segítségével. Miért is működik ez? Egy operátort egy állapotra alkalmazva egy másik állapotot kapunk, ami a gráfban úgy jelenik meg, hogy az adott állapotot reprezentálú csúcsból elindul egy nyilacska, valahol megáll; majd a nyíl végén megjelenik egy másik állapotot reprezentáló csúcs. Így szépen épül a fa, nade mikor érünk el egy terminális csúcsot?!
      • Technikai műveletek: Olykor-olykor nem elég nekünk, hogy van 288 alkalmazási előfeltétel és adott 324 kényszerfeltétel mert a keresés piszkosul lassú szépen lassan komótosan építgeti a gráfot de mindíg belefut egy körbe vagy zsákutcába aztán ott behal. A technikai műveleteket pont arra találták ki valamikor a ’60-as ’70-es években, hogy ne dögöljön már ki a keresés hanem akkor csináljon valamit és menjen tovább. Ilyen lehetne például a kezd előrről a keresést igaz nem sok értelme lenne.
    • Vezérlő: A vezérlő az a része az algoritmusnak ami figyeli, hogy az adatbázisban megjelent-e már a célfeltételeknek eleget tévő állapotok valamelyikét reprezentáló csúcsok valamelyike. Ha igen akkor leállítja a keresést mert lett egy megoldásunk, ha pedig nem akkor eldönti, hogy mely produkciós szabály legyen alkalmazva a gráf mely részére. Apropó produkciós szabály semmi extra dologra nem kell itt gondolni, a produkciós szabályok halmazát az összes művelet alkotja.

Azokat az algoritmusokat amelyek teljesítik ezt keresőrendszereknek nevezzük. A kereső rendszereket számos módon lehet osztályozgatni mint például:

  1. A keresés iránya szerint:
    • Előrehaladó: Ez azt jelenti, hogy a startcsúcsból indulva keres az algoritmus egészen addig amíg nem talál egy terminális csúcsot, vagy esetleg rájön, hogy nincs megoldás.
    • Visszafelé haladó: Ez nagyon szellemesen pont azt jelenti, hogy kap egy terminális csúcsot, és abból próbálja meg majd rekonstruálni azt az irányított utat amelyen a startcsúcsból eljuthatuunk a kapott terminális csúcsig. Igen erre nagyon jól tippeltetetk elég körülményes implementálni és amennyire én udom elég kevés helyen akalmazzák, nem úgy mint a harmadikat amin meglepődtem.
    • Kétirányú kereső: Ez elindul a startcsúcsból és egy terminális csúcsból is aztán majd találkozik egyszer valamikor.
  2. Módosíthatóság szerint:
    • Nem módosítható kereső: Akkor beszélünk nem módosítható keresőről, amikor egy operátor hatását nem tudjuk visszavonni. Vagyis egy csúcsból választunk egy élt és továbbmegyünk az élen a következő csúcshoz, de gőzünk nincs utánna arról, hogy honnan is kerültünk ide.
    • Módosítható kereső: Nagyon szellemesen pont az előző ellentettje ha lehet nem fejteném ki.
  3. Speciális ismeret áll-e a kereső rendelkezésére a keresés során: Itt nem árt először tisztázni, hogy mit is értünk speciális ismeret alatt. Nos az egész ott kezdődik, hogy a Vezérlő is lebontható két részre aszerint, hogy milyen vezérlési stratégiákat alkalmaz. Így megkülönböztetünk elsődleges vezérlési stratégiákat, amelyek lényegében adottak az állapottér-reprezentációból (minden perátor cakk-um-pakk); illetve a másik csoport a másodlagos vezérlési stratágiákat tartalmazza. Na most mik is tartoznak ide amiket nem írtunk bele az állapottér-reprezentációba? Nem-nem bizony, hogy nem felejtettük el! Ide olyan spéci ismeretek tartoznak amik problémaspecifikusak, azaz csak az adott problémára vonatkozva egyszerűsíthetik a keresést.
    • Szisztematikus: Ezt nem igazán szeretném ragozni szisztematikusan mindenki tud keresni, csak nem biztos, hogy talál. Hacsak nem tud valami spéci módszert amivel garantáltan találni fog megoldást. Igen igazad van bizony, hogy létezik ilyen módszer nem is egy!
    • Heurisztikus: Mi is az a heurisztika? Ha heurisztika, az egy olyan tipikusan másodlagos vezérlési stratégia amelyet pont azért építünk be, hogy:
      • Jobb "minőségű" megoldást kapjunk.
      • Gyorsabban találjunk megoldást

DE van a heurisztikának egy jó nagy hátránya is. Nem, hogy azt nem garantálja amit elvárnánk tőle, de még azt sem garantálja, hogy egyáltalán megoldást találunk. Ráadásul még bonyolítja az algoritmusunkat is (növeli a futiási idejét). Hát ez van ezt kell szeretni.

Aztán mint gondolni való volt, akárcsak minden algoritmust, úgy a keresőrendszereket is lehet osztályozni az alábbi szempontok alapján:

  1. Teljesség: Bármilyen esetben amikor egy adott problmának létezik megoldása, akkor az algoritmus azt meg is fogja találni.
  2. Optimalitás: Jobban szorítja az algoritmust általában ez az ún. Bottleneck, ugyanis itt nem elég az, hogy talál egy megoldást de ha egy adott problémának több megoldása is létezik akkor ő a legjobbat találja meg. Hogy miként értelmezett a legjobb azt, most hanyagoljuk, maradjunk annyiban, hogy a legrövidebb irányított út lesz a legjobb. De vannak más szempontok is amire nem szeretnék kitérni mert nem írtam bele az állapottér reprezentációba.
  3. Időigény: Nagyon szellemes értelmezés következik, az az idő ami alatt az algoritmus vagy sikeresen vagy sikerertelenül de befejezi a keresést. Magyarul tökmindegy, hogy talál e megoldást avagy sem csak áljon le!
  4. Tárigény: Ismét szellemes értelmezés, az a lényege, hogy a keresés során maximum mennyi memóriát zabbantott föl.

És ennyi lenne általánosan a keresőrendszerekről. A továbbiakban minden spéci kereőrendszer ezt a sémát fogja felvenni. Ja igen elfelejtettem megmutatni, hogy miként is fest egy ilyen algoritmus:

    1.  Procedure kereso(<A, kezdo, c, O>, …)
    2.     Műveletek <- Inicializál(O)
    3.     Terminálisok <- Inicializál(c)
    4.     VanMegoldás <- False
    5.     aktuális <- kezdo
    6.     WHILE(IGAZ) LOOP
    7.         o <- SELECT * FROM Műveletek WHERE alkalmazási_előfeltétel(aktuális)
    8.         aktuális <- o.alkalmaz(aktuális)
    9.         IF aktuális IS IN Terminálisok THEN 
    10.             VanMegoldás <- True
    11.             STOP
    12.         ENDIF
    13.     END LOOP
    14.     IF VanMegoldás IS True THEN
    15.         KiírMegoldás(aktuális)
    16.     ENDIF
    17. END

Ez lenne a lehető legegyszerűbb általános megoldáskereső rendszer formája.Amennyire lehet ragaszkodni fogok később is ehhez a formához főleg azért mert itt nincs lehetőségem logikai formulákat bevésni, ahhoz meg türelmem nincs, hogy mindet megrajzoljam és beillesztgessem a megfelelő helyre. Amint látható ez SQL sintaxist tartalmaz amit kiemeltem kékkel és szerintem ettől jobban magáért kitevő szintaxissal még nem találkoztam. Szinte ordít, hogy mit csinál.

Reklámok