• Nem Talált Eredményt

Az információ terjesztése a kényszereken keresztül

In document Mesterséges Intelligencia (Pldal 166-169)

A keresési algoritmusunk eddig csak akkor foglalkozott egy változóra vonatkozó kényszerrel, ha a változót a HOZZÁRENDELETLEN-VÁLTOZÓ-KIVÁLASZTÁS kiválasztotta. De ha néhány kényszert a keresés folyamán korábban vagy akár még a keresés megkezdése előtt megvizsgálunk, akkor drasztikusan csökkenthető a keresési tér mérete.

2.2.1. Előrenéző ellenőrzés

A kényszerek keresés közbeni jobb felhasználásának egyik módszerét előrenéző ellenőrzésnek (forward checking) nevezzük. Az előrenéző ellenőrzési folyamat minden egyes alkalommal, amikor egy X változó értéket kap, minden, az X-hez kényszerrel kötött, hozzárendeletlen Y-t megvizsgál, és Y tartományából törli az X számára választott értékkel inkonzisztens értékeket. Az 5.6. ábra bemutatja az előrenéző ellenőrzéses keresés menetét a térképszínezési probléma során. Két fontos dolgot kell megemlítenünk ezzel a példával kapcsolatban.

Először is vegyük észre, hogy miután elvégeztük az NyA = vörös és a Q = zöld hozzárendeléseket, ÉT és DA tartományai egyetlen elemre szűkültek, és azzal, hogy az NyA-ból és a Q-ból származó információt terjesztettük, teljesen megszüntettük az ezen változók szerinti elágazást. Az MRV-heurisztika, amely az előrenéző ellenőrzés nyilvánvaló partnere, automatikusan DA-t és ÉT-t választja következőnek. (Tulajdonképpen még hatékonyabb eljárássá tehetjük az előrenéző ellenőrzést, ha az MRV-heurisztika munkájához szükséges információt inkrementálisan számítjuk.) A másik dolog, amire érdemes felfigyelni, az az, hogy a V = kék hozzárendelés után DA tartománya üres lett. Ezért az előrenéző ellenőrzés megállapítja, hogy a {NyA = vörös, Q =zöld, V = kék}

részleges hozzárendelés inkonzisztens a probléma kényszereivel, és az algoritmus azonnal visszalép.

2.2.2. A kényszerek terjesztése

Az előrenéző ellenőrzés ugyan sok inkonzisztenciát észrevesz, de nem mindet. Például nézzük csak az 5.6. ábra harmadik sorát. Az látható itt, hogy amikor DA vörös és Q zöld, mind ÉT-nek, mind DA-nak kéknek kell lennie.

De ezek szomszédosak, és nem lehet azonos az értékük. Az előrenéző ellenőrzés nem veszi észre ezt az inkonzisztenciát, mert nem néz elég messze előre. A kényszerek terjesztése (constraint propagation) általános kifejezés jelöli azt, ha az egyik változó kényszerének a többi változót érintő következményeit terjesztjük: esetünkben NyA-ról Q-ra és ÉT-ről DA-ra kell terjeszteni (ahogy ezt már az előrenéző ellenőrzés is megtette), majd az ÉT és DA közti kényszerre, hogy észrevehessük az inkonzisztenciát. Ezt pedig gyorsan szeretnénk tenni: semmi értelme a keresés méretét csökkenteni, ha több időt töltünk a kényszerek terjesztésével, mint az egyszerű kereséssel tennénk.

5.6. ábra - A térképszínezés folyamata előrenéző ellenőrzéses keresés esetén. Az első hozzárendelés az NyA = vörös, majd az előrenéző ellenőrzés törli a vörös értéket a szomszédos ÉT és DA változók tartományaiból. A Q = zöld hozzárendelés után a zöld is kikerül az ÉT, DA és ÚDW változók tartományaiból. A V = kék-et követően a kék is törlődik a DA és ÚDW változók tartományaiból, és DA számára nem marad megengedett érték.

Az élkonzisztencia (arc consistency) alapul szolgálhat egy gyors, az előrenéző ellenőrzésnél lényegesen erősebb kényszerterjesztéshez. Az „él” itt a kényszergráf irányított éleit jelenti, amilyen például a DA-ból az ÚDW-be mutató él. Ha adott DA és ÚDW aktuális tartománya, akkor ez az él konzisztens, ha DA mindegyik x értékéhez található egy x-szel konzisztens valamilyen y érték ÚDW-ben. Az 5.6. ábra harmadik sorában DA és ÚDW pillanatnyi tartománya rendre a {kék}, illetve a {vörös, kék}. A DA = kék esetén található egy konzisztens hozzárendelés ÚDW-hez, nevezetesen az ÚDW = vörös; ezért a DA-ből ÚDW-be mutató él konzisztens. Viszont az ÚDW-ből a DA-ba mutató él nem konzisztens, mert az ÚDW = {kék} hozzárendelésnél a DA-hoz nem tudunk színt találni. Az él úgy tehető konzisztenssé, hogy az ÚDW tartományából töröljük a kék értéket.

A DA-ból ÚT-be mutató él mentén is alkalmazhatjuk a keresési folyamat ugyanazon fázisában az élkonzisztenciát. Az 5.6. ábra harmadik sora szerint mindkét változó értéktartománya {kék}. Ez azt eredményezi, hogy törölnünk kell a kék-et DA tartományából, amely ezzel kiürül. Az élkonzisztencia ellenőrzés tehát lehetővé teszi, hogy korábban észrevegyük az egyszerű előrenéző ellenőrzés által fel nem fedett inkonzisztenciát.

Az élkonzisztencia-ellenőrzés alkalmazható előfeldolgozó lépésként a keresés megkezdése előtt, vagy a keresési folyamat minden egyes hozzárendelését követő terjesztési lépésként (az előrenéző ellenőrzéshez hasonlóan).

(Az utóbbi algoritmust Élkonzisztencia fenntartásának is, angol rövidítéssel MAC-nak nevezik.) Mindkét esetben addig kell ismételve alkalmazni a folyamatot, amíg nem marad inkonzisztencia. Erre azért van szükség, mert amikor egy élinkonzisztenciát eltávolítandó egy érték kikerül egy változó tartományából, az ehhez a változóhoz mutató éleknél új inkonzisztencia jöhet létre. Az AC-3, az élkonzisztencia teljes algoritmusa egy sort használ annak nyilvántartására, hogy mely élek inkonzisztenciáját kell még ellenőriznie (lásd 5.7. ábra). Minden egyes (Xi, Xj) élet sorban egyenként levesszük a tennivalók listájáról és ellenőrizzük; ha pedig Xi tartományának bármely változóját törölni kell, akkor minden Xi -be mutató (Xk, Xi) élet visszateszünk ellenőrzésre a sorba. Az élkonzisztencia-ellenőrzés komplexitása az alábbiak szerint vizsgálható: egy bináris kényszerkielégítési problémában legfeljebb O(n2) él van; minden egyes (Xk, Xi) él csak d alkalommal kerülhet napirendre, mert Xi -ben összesen d törölhető érték van; egy él konzisztenciájának ellenőrzése elvégezhető O(d2) időben; tehát a legrosszabb esetben vett teljes idő O(n2d3). Ez ugyan lényegesen költségesebb, mint az előretekintő ellenőrzés, de az extra költség általában kifizetődik.1

5.7. ábra - Az AC-3 élkonzisztencia algoritmus. Az AC-3 alkalmazását követően vagy mindegyik él élkonzisztens, vagy néhány változó tartománya üres, azaz a kényszerkielégítési probléma nem hozható élkonzisztens alakra (tehát nem oldható meg). Az „AC-3” nevet az algoritmus kitalálója (Mackworth, 1977) vezette be, mert ezt az algoritmust mutatta be cikkében harmadikként.

1 A Mohr és Henderson (Mohr és Henderson, 1986) bemutatta AC-4 algoritmus O(n2d2) alatt fut. (Lásd 5.10. feladat.)

Mivel a kényszerkielégítési problémák speciális esetként tartalmazzák a 3SAT-ot, ezért nem várhatjuk, hogy polinom idejű algoritmust találunk annak eldöntésére, hogy egy adott kényszerkielégítési probléma konzisztens-e. Ebből arra következtethetünk, hogy az élkonzisztencia nem tár fel minden lehetséges inkonzisztenciát.

Például az 5.1. ábrán az {NyA = vörös, ÚDW = vörös} részleges hozzárendelés inkonzisztens, de az AC-3 nem találja meg. Definiálható a terjesztés erősebb formája is, amit k-konzisztenciának (k-consistency) nevezünk.

Egy kényszerkielégítési probléma akkor k-konzisztens, ha bármely k – 1 változóból álló halmaz és ezen változók bármely konzisztens hozzárendelése esetén mindig lehet a k-adik változónak konzisztens értéket találni. Az 1-konzisztencia például azt jelenti, hogy mindegyik individuális változó önmagában véve is konzisztens; ezt csomópont-konzisztenciának (node consistency) is nevezik. A 2-konzisztencia ugyanaz, mint az élkonzisztencia. A 3-konzisztencia azt jelenti, hogy egymás melletti változók bármely párja mindig kiterjeszthető egy szomszédos változóra; ezt útvonal-konzisztenciának (path consistency) is nevezik.

Egy gráf erősen k-konzisztens akkor, ha k-konzisztens, valamint (k – 1)-konzisztens, (k – 2)-konzisztens és így tovább le egészen az 1-konzisztenciáig. Tegyük fel most, hogy van egy n csomópontból álló kényszerkielégítési problémánk, és tegyük erősen n-konzisztenssé (azaz k-konzisztenssé k = n esetében). Ekkor visszalépés nélkül megoldhatjuk a problémát. Először egy konzisztens értéket választunk X1 számára. Ezután garanciánk van arra, hogy tudunk X2 számára értéket választani, mert a gráf 2-konzisztens, X3 számára, mert a gráf 3-konzisztens és így tovább. Minden egyes Xi változó esetén csak d értéket kell ellenőriznünk a tartományból, hogy egy X1 ,..., Xi 1-gyel konzisztens értéket találjunk. Garanciánk van tehát arra, hogy O(nd) időben megoldást találunk. Persze semmit sem adnak ingyen: az n-konzisztenciát biztosító bármely algoritmus legrosszabb esetben n-ben exponenciális lesz.

Az n-konzisztencia és az élkonzisztencia között egy széles köztes mező húzódik: az erősebb konzisztencia-ellenőrzések futtatása tovább fog tartani, de több eredménnyel jár az elágazási tényező csökkentésében és az inkonzisztens részleges hozzárendelések felderítésében. Ki lehet számolni a legkisebb olyan k értéket, melyre a k-konzisztencia ellenőrzésének futtatása visszalépés nélküli problémamegoldást tesz lehetővé (lásd 5.4.

alfejezet), de ez gyakran nem célszerű. A legmegfelelőbb konzisztencia-ellenőrzési szint kiválasztása valójában leginkább empirikus tudomány.

2.2.3. Speciális kényszerek kezelése

A kényszerek bizonyos típusai gyakran fordulnak elő a valós problémákban és speciális célú algoritmusokkal jóval hatékonyabban kezelhetők, mint az eddig leírt általános célú módszerekkel. Például a MindKül kényszer azt állítja, hogy a benne szereplő öszszes változóknak mind különböző értéket kell felvennie (ahogy a betűrejtvényes példában láttuk). A MindKül kényszer inkonzisztencia-ellenőrzésére egy egyszerű módszer az, hogy ha m változó szerepel a kényszerben, és ha ezeknek együttesen n különböző értéke lehet, akkor m > n esetén a kényszert nem lehet kielégíteni.

Ez a következő egyszerű algoritmushoz vezet: először vegyünk ki a kényszerből minden változót, amelynek egyelemű tartománya van, és vegyük ki ezeknek a változóknak az értékeit a megmaradó változók tartományaiból. Ismételjük ezt a lépést mindaddig, amíg van ilyen változónk. Ha bármely ponton egy üres

tartomány jön létre, vagy több változónk marad, mint értékünk a tartományban, akkor egy inkonzisztenciát derítettünk fel.

Ezt a módszert használhatjuk arra, hogy az 5.1. ábra {NyA = vörös, ÚDW = vörös} részleges hozzárendelésében észrevegyük az inkonzisztenciát. Figyeljünk fel arra, hogy a DA, az ÚT és a Q változók lényegében egy MindKül kényszerrel vannak összekötve, mert mindegyik párnak különböző színűnek kell lennie. Miután alkalmaztuk az AC-3-at a részleges hozzárendelésre, az egyes változók tartománya a {zöld, kék} tartományra szűkült le. Azaz három változónk van és csupán két színünk, tehát megszegtük a MindKül kényszert. Tehát a magasabb szintű kényszerekre alkalmazott egyszerű konzisztencia-ellenőrzések néha hatékonyabbak, mintha az ekvivalens bináris kényszerek halmazára vizsgáltuk volna az élkonzisztenciát.

A legfontosabb magasabb rendű kényszer talán az erőforráskényszer (resource constraint), amit néha legfeljebb kényszernek is neveznek. Jelölje például PA1, ..., PA4 rendre négy feladathoz hozzárendelt személyzet számát. Azt a kényszert, miszerint öszszesen nem lehet 10-nél több embernek feladatot adni, így írhatjuk fel:

legfeljebb(10, PA1, PA2, PA3, PA4). Az inkonzisztenciát egyszerűen ki lehet mutatni az aktuális tartományok minimális értékeinek összegzésével: ha például mindegyik változó tartománya a {3, 4, 5, 6}, akkor a legfeljebb kényszert nem lehet kielégíteni. A konzisztenciát azáltal is érvényesíthetjük, hogy töröljük bármely tartomány maximális értékét, amely nem konzisztens az összes többi tartomány minimális értékével. Így ha példánkban mindegyik változónak {2, 3, 4, 5, 6} a tartománya, akkor az 5 és a 6 értékeket mindegyik tartományból törölni lehet.

A nagy erőforrás-korlátozott egész értékű problémáknál – ilyenek például az emberek ezreit és járművek százait mozgató logisztikai problémák – általában nem tehető meg az, hogy mindegyik változó tartományát egy nagy egészhalmazzal ábrázoljuk, majd ezt a halmazt a konzisztencia-ellenőrző módszerek segítségével fokozatosan csökkentjük. Ehelyett a tartományokat az alsó és a felső határaikkal ábrázoljuk, és határterjesztés segítségével kezeljük. Tegyük fel például, hogy két repülőjárat van, a 271-es és a 272-es, amelyekre a repülőgépek kapacitása rendre 165 és 385. A repülőjárat utasszámának kezdeti tartománya tehát

Járat271 ∈ [0, 165] és Járat272 ∈ [0, 385]

Tegyük fel most, hogy van egy külön korlát, miszerint a két járatnak együtt 420 embert kell szállítania. Járat271 + Járat272 ∈ [420, 420]. A határkényszereket terjesztve a tartományokat a következőkre csökkentjük:

Járat271 ∈ [35, 165] és Járat272 ∈ [225, 385]

Akkor nevezünk egy kényszerkielégítési problémát határkonzisztensnek, ha minden X változóra ennek a változónak mind az alsó, mind a felső határértékére található minden Y változóhoz olyan érték, amely kielégíti az X és Y közti kényszereket. Ezt a fajta kényszerterjesztést (bound propagation) széles körben használják a gyakorlati kényszerkielégítési problémák során.

In document Mesterséges Intelligencia (Pldal 166-169)