1. fejezet Állapottér-reprezentálható problémák 1.1. Irány a Margitsziget! 1.1.1. A feladat Végre itt a tavasz, irány a természet! Amennyiben a fővárosban élünk, s a zöldbe vágyunk, ám mégsem szeretnénk hosszú túrára indulni, célozzuk meg a Margitszigetet! Persze, ha ezt egy napsütötte szombat délután tesszük, nem mi leszünk az egyetlenek. Kótyagosan bóklászó turistákkal, szerelmesen andalgó fiatalokkal, s önfeledten játszó-sportoló családokkal találkozhatunk lépten-nyomon. Rejtvényünkben ezúttal az utóbbiakra fókuszálunk, egészen pontosan öt családot veszünk górcső alá. A megadott információk segítenek eldönteni, hogy az egyes famíliák hány gyermeket számlálnak, honnan érkeztek, s hogy mivel múlatják az időt a Margitszigeten. 1. Az angyalföldi család tagjai egész délután görkorcsolyáztak. Kardosék is gurulva közlekedtek, igaz, ők két keréken, s a Duna másik oldaláról érkeztek. 2. Az ötgyerekes anyuka nagy bánata, hogy egyetlen kislányt sem hozott még világra. Férje azonban nem panaszkodik, fiaival ugyanis remek focimeccset vívhat. 3. A csillaghegyi családban kevesebb a gyerek, mint a tollaslabdázó famíliában. 4. Nem Bognárék azok, akik kocogással töltik ezt a szép délutánt. 5. A belvárosi házaspár egy csemetével, Szűcsék kettővel büszkélkedhetnek. Vadászék egy hatalmas családi házban élnek Újpesten, de náluk sincs öt gyerek. A feladat eredeti szövege megtalálható a [14] folyóiratban. 1.1.2. Egy lehetséges állapottér-reprezentáció Problémánk lényeges jellemzői a családok, valamint hozzájuk kapcsolódóan az, hogy hány gyerek van a családban, honnan érkeztek, és hogy milyen szabadidős tevékenységet választottak. Ez a fajta megközelítés egyúttal azt is meghatározza, hogy a gyerekszámokat, a lakóhelyeket és a tevékenységeket a családokhoz próbáljuk meg majd hozzárendelni. 1 Hogy a későbbiekben sorrendet tudjunk értelmezni a családok között, rendeljünk hozzájuk sorszámokat a következőképpen: Család neve: Bognárék Kardosék Szűcsék Vadászék Vargáék Sorszám: 1 2 3 4 5 Hasonlóan a kategóriákhoz is rendeljünk sorszámokat: Kategória neve: gyerekszám lakóhely tevékenység Sorszám: 1 2 3 1 Lehetne másképp is csinálni: megpróbálhatnánk például meghatározni azt, hogy az egyes lakóhelyekről melyik család hány gyerekkel érkezett, s milyen szabadidős tevékenységet választott.
8 1. Állapottér-reprezentálható problémák A továbbiakban a családokra is és a kategóriákra is a sorszámaikkal fogunk hivatkozni. Ezek után definiáljuk azoknak a lehetőségeknek a halmazait, amelyek azt írják le, hogy az egyes családokhoz milyen gyerekszámokat rendelhetünk: H i,1 = { 1, 2, 3, 4, 5 } { 0 }, i { 1, 2, 3, 4, 5 } A 0 szimbólum itt azt fogja jelenteni, hogy az i-vel jelölt családhoz még nem rendeltünk hozzá semmilyen gyerekszámot sem. Ezt követően definiáljuk azoknak a lehetőségeknek a halmazait, amelyek azt írják le, hogy az egyes családokhoz milyen lakóhelyeket rendelhetünk: H i,2 = { Angyalföld, Belváros, Csillaghegy, Óbuda, Újpest } { 0 }, i { 1, 2, 3, 4, 5 } A 0 szimbólum itt azt fogja jelenteni, hogy az i-vel jelölt családhoz még nem rendeltük hozzá egyik lakóhelyet sem. Végezetül definiáljuk azoknak a lehetőségeknek a halmazait, amelyek azt írják le, hogy az egyes cslaádokhoz milyen tevékenységeket rendelhetünk: H i,3 = { görkorcsolya, foci, kerékpár, kocogás, tollaslabda } { 0 }, i { 1, 2, 3, 4, 5 } A 0 szimbólum itt azt fogja jelenteni, hogy az i-vel jelölt családhoz még nem rendeltünk hozzá semmilyen tevékenységet sem. Képezzük a fenti halmazok Descartes-szorzatát! H 1,1 H 2,1 H 3,1 H 4,1 H 5,1 H 1,2 H 2,2 H 3,2 H 4,2 H 5,2 H 1,3 H 2,3 H 3,3 H 4,3 H 5,3 = 0 0 0 0 0 1 0 0 0 0 2 0 0 0 0 = 0 0 0 0 0, 0 0 0 0 0, 0 0 0 0 0,..., 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 Csillaghegy 0,..., 1 5 0 0 0 0 0 0 Csillaghegy 0,..., 0 0 0 0 0 0 0 görkorcsolya 0 0 0 1 0 0 0 0 0 Csillaghegy 0 0,..., kerékpár görkorcsolya tollaslabda foci kocogás 1 0 0 0 4 Óbuda 0 0 Csillaghegy 0,..., tollaslabda 0 görkorcsolya 0 foci 1 2 3 4 5 Angyalföld Belváros Csillaghegy Óbuda Újpest,..., görkorcsolya foci kerékpár kocogás tollaslabda 5 3 2 4 1 Óbuda Csillaghegy Angyalföld Újpest Belváros,... foci kerékpár görkorcsolya tollaslabda kocogás Ennek a halmaznak az elemei rendezett számtizenötösök (3 5-ös mátrixok, ha az elemeiket mátrix alakban rendezzük el). Sokan vannak, számuk 6 15 = 470 184 984 576. Ha azonban figyelembe vesszük azt, hogy ugyanazt a gyerekszámot, lakóhelyet, illetve tevékenységet nem rendelhetjük hozzá egyszerre több családhoz, rögtön kevesebb elemtizenötössel lesz dolgunk. Ráadásképpen tehetünk olyan megszorításokat is, melyek szerint a gyerekszámokat, a lakóhelyeket és a tevékenységeket ebben a sorrendben rendeljük hozzá a családokhoz, azaz először azt mondjuk meg, hogy melyik családban hány gyerek van, aztán azt, hogy melyik család hol lakik, végül pedig azt, hogy ki milyen szabadidős tevékenységgel kapcsolódott ki. Még tovább szűkíthetjük az állapotok halmazát, ha a családok között is felállítunk valamilyen
1.1 Irány a Margitsziget! 9 sorrendet, például azt a sorrendet követjük, amelyet az alaphalmazok definiálásánál is megadtunk: először Bognárékhoz rendelünk adatot, aztán Kardosékhoz, később Szűcsékhez, ezt követően Vadászékhoz, befejezésképpen pedig Vargáékhoz. Az előzőekben megfogalmazottak alapján egy h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 H 1,1 H 2,1 H 3,1 H 4,1 H 5,1 H 1,2 H 2,2 H 3,2 H 4,2 H 5,2 H 1,3 H 2,3 H 3,3 H 4,3 H 5,3 elemtizenötös a probléma állapota, ha teljesülnek rá a következő kényszerfeltételek: két tetszőleges (de nem azonos) családot kiválasztva, ha mindkettőhöz rendeltünk már gyerekszámot, akkor azok különbözőek: i j (h i,1 0 h j,1 0 h i,1 h j,1 i = j) (1) két tetszőleges (de nem azonos) családot kiválasztva, ha mindkettőhöz rendeltünk már lakóhelyet, akkor azok különbözőek: i j (h i,2 0 h j,2 0 h i,2 h j,2 i = j) (2) két tetszőleges (de nem azonos) családot kiválasztva, ha mindkettőhöz rendeltünk már tevékenységet, akkor azok különbözőek: i j (h i,3 0 h j,3 0 h i,3 h j,3 i = j) (3) a mátrixot felülről lefelé, az egyes sorokon belül pedig balról jobbra töltjük ki (ez azt jelenti, hogy ha a mátrix egy eleme már nem 0 értékű, akkor a tőle balra lévő elemek, valamint a felette lévő sorokban lévő elemek sem 0 értékűek): i j (h i,j 0 k (k < j h i,k 0) s (s < i o(h s,o 0))) (4) ha már tudjuk, hogy mivel töltötte az időt az angyalföldi család, akkor az a tevékenység csak a görkorcsolyázás lehetett: i (h i,2 = Angyalföld h i,3 0 h i,3 = görkorcsolya) (5) az a család, amelyik görkorcsolyázással töltötte az idejét, Angyalföldön lakik: i (h i,3 = görkorcsolya h i,2 = Angyalföld) (6) ha tudjuk, milyen tevékenységet folytattak Kardosék (a 2-es számú család), akkor ezt csak kerékpárral tehették: h 2,3 0 h 2,3 = kerékpár (7) ha tudjuk, hogy hol laknak Kardosék (a 2-es számú család), akkor a lakóhelyük csak Csillaghegy vagy Óbuda lehet: h 2,2 0 h 2,2 = Csillaghegy h 2,2 = Óbuda (8) ha tudjuk, hogy kik laknak Csillaghegyen és Óbudán, akkor közülük az egyiknek Kardoséknak (a 2-es számú családnak) kell lenni: i j (h i,2 = Csillaghegy h j,2 = Óbuda i = 2 j = 2) (9) ha tudjuk, hogy mivel töltötte az idejét az ötgyerekes család, akkor az a tevékenység csak a foci lehetett: i (h i,1 = 5 h i,3 0 h i,3 = foci) (10)
10 1. Állapottér-reprezentálható problémák abban a családban, amelyik focival múlatta az időt, öt gyereknek kell lenni: i (h i,3 = foci h i,1 = 5) (11) az a család, amelyik tollaslabdázással töltötte el az időt, nem Csillaghegyen lakik: nem a csillaghegyi családban van a legtöbb (öt) gyerek: i (h i,3 = tollaslabda h i,2 Csillaghegy) (12) nem a tollaslabdázó famíliában van a legkevesebb (egy) gyerek: i (h i,2 = Csillaghegy h i,1 5) (13) i (h i,4 = tollaslabda h i,1 1) (14) ha tudjuk, hogy hány gyerek van abban a családban, amelyik Csillaghegyen lakik, és azt is tudjuk, hogy hány gyerek van abban a családban, akik tollaslabdáztak, akkor az előbbi család gyerekszáma kisebb az utóbbiénál: i j (h i,2 = Csillaghegy h j,3 = tollaslabda h i,1 0 h j,1 0 h i,1 < h j,1 ) (15) Bognárék (az 1-es számú család) nem kocogással töltik ezt a szép délutánt: a belvárosi házaspárnak egy csemetéje van: h 1,3 kocogás (16) i (h i,2 = Belváros h i,1 = 1) (17) ha tudjuk, hogy hol lakik az a család, ahol csak egy gyerek van, akkor ez a lakóhely csak a Belváros lehet: i (h i,1 = 1 h i,1 0 h i,2 = Belváros) (18) ha tudjuk, hogy hány gyerekük van Szűcséknek (a 3-as számú családnak), akkor ez az érték csak a 2 lehet: h 3,1 0 h 3,1 = 2 (19) Szűcsék (a 3-as számú család) nem a Belvárosban laknak: h 3,2 Belváros (20) ha tudjuk, hogy hol laknak Vadászék (a 4-es számú család), akkor ez a lakóhely csak Újpest lehet: Vadászéknál (a 4-es számú családnál) nincs öt gyerek: h 4,2 0 h 4,2 = Újpest (21) h 4,1 5 (22) Ezeknek a kényszerfeltételeknek mindössze 341 értéktizenötös tesz eleget, így problémánk állapotterét ennyi állapot alkotja: A = h h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 kényszerfeltétel(h), ahol kényszerfeltétel(h) = (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
1.1 Irány a Margitsziget! 11 (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22). A kezdőállapot az a helyzet, amikor még senkihez nem rendeltünk hozzá semmit: kezdő = 0 0 0 0 0 0 0 0 0 0. (23) 0 0 0 0 0 A célállapotok halmazának azok az állapotok lesznek az elemei, amelyekben már azt is meghatároztuk, hogy a Varga család milyen szabadidős tevékenységet választott (azaz a mátrix jobb alsó elemének az értéke nem 0): C = h h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 h 5,3 0 A. (24) ahol Az operátorok halmazát a következő, beszédes nevű operátorazonosítókkal definiáljuk: O = {Gyerek(cs, gyerekszám), Lakóhely(cs, lakóhely), Tevékenység(cs, tevékenység)}, cs { 1, 2, 3, 4, 5 } gyerekszám { 1, 2, 3, 4, 5 } lakóhely { Angyalföld, Belváros, Csillaghegy, Óbuda, Újpest } tevékenység { görkorcsolya, foci, kerékpár, kocogás, tollaslabda } A Gyerek(cs, gyerekszám) operátor akkor alkalmazható egy h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 állapotra, ha teljesülnek a következő alkalmazási előfeltételek: a cs sorszámú családhoz még nem rendeltünk hozzá gyerekszámot: h cs,1 = 0 (25) ha nem a Bognár családról van szó (azaz nem az első családhoz próbálunk hozzárendelni gyerekszámot), akkor az eggyel kisebb sorszámú családhoz már rendeltünk gyerekszámot: cs 1 h cs 1,1 0 (26) a gyerekszámot még nem rendeltük hozzá egyetlen olyan családhoz sem, akinek cs-nél kisebb a sorszáma: i (i < cs h i,1 gyerekszám) (27) Szűcsékhez (a 3-as számú családhoz) csak 2 gyereket rendelhetünk: 2 gyereket csak Szűcsékhez (a 3-as számú családhoz) rendelhetünk: cs = 3 gyerekszám = 2 (28) gyerekszám = 2 cs = 3 (29) Vadászékhoz (a 4-es számú családhoz) nem rendelhetünk öt gyereket: cs = 4 gyerekszám 5 (30)
12 1. Állapottér-reprezentálható problémák A Gyerek(cs, gyerekszám) operátort egy h = állapotra alkalmazva a következőképpen definiált h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 h 1,2 h 2,2 h 3,2 h 4,2 h 5,2 h 1,3 h 2,3 h 3,3 h 4,3 h 5,3 h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 H 1,1 H 2,1 H 3,1 H 4,1 H 5,1 H 1,2 H 2,2 H 3,2 H 4,2 H 5,2 H 1,3 H 2,3 H 3,3 H 4,3 H 5,3 elemtizenötöst kapjuk: h i,j = { gyerekszám, ha i = cs j = 1, h i,j egyébként. (31) A Lakóhely(cs, lakóhely) operátor akkor alkalmazható egy h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 állapotra, ha teljesülnek a következő alkalmazási előfeltételek: a cs sorszámú családhoz még nem rendeltünk hozzá lakóhelyet: h cs,2 = 0 (32) Bognárékhoz (az 1-es számú családhoz) csak akkor rendelhetünk lakóhelyet, ha Vargáékhoz (az 5-ös számú családhoz) már rendeltünk gyerekszámot: cs = 1 h 5,1 0 (33) ha nem Bognárékhoz (az 1-es számú családhoz) szeretnénk lakóhelyet rendelni, akkor az eggyel kisebb számú családhoz már rendeltünk lakóhelyet: cs 1 h cs 1,2 0 (34) a lakóhelyet még nem rendeltük hozzá egyetlen olyan családhoz sem, akinek cs-nél kisebb a sorszáma: i (i < cs h i,2 lakóhely) (35) a (2-es számú) Kardos család lakóhelye Csillaghegy vagy Óbuda lehet: cs = 2 lakóhely = Csillaghegy lakóhely = Óbuda (36) ha Csillaghegy a lakóhely, akkor azt nem rendelhetjük hozzá olyan családhoz, ahol öt gyerek van: lakóhely = Csillaghegy h cs,1 5 (37) ha a lakóhely a Belváros, akkor a cs családban egyetlen gyereknek szabad csak lennie: lakóhely = Belváros h cs,1 = 1 (38) Szűcsékhez (a 3-as számú családhoz) nem rendelhetjük a Belvárost: cs = 3 lakóhely Belváros (39)
1.1 Irány a Margitsziget! 13 Vadászékhoz (a 4-es számú családhoz) csak Újpestet rendelhetjük: Újpestet csak Vadászékhoz (a 4-es számú családhoz) rendelhetjük: A Lakóhely(cs, lakóhely) operátort egy h = állapotra alkalmazva a következőképpen definiált h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 h 1,2 h 2,2 h 3,2 h 4,2 h 5,2 h 1,3 h 2,3 h 3,3 h 4,3 h 5,3 cs = 4 lakóhely = Újpest (40) lakóhely = Újpest cs = 4 (41) h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 H 1,1 H 2,1 H 3,1 H 4,1 H 5,1 H 1,2 H 2,2 H 3,2 H 4,2 H 5,2 H 1,3 H 2,3 H 3,3 H 4,3 H 5,3 elemtizenötöst kapjuk: h i,j = { lakóhely, ha i = cs j = 2, h i,j egyébként. (42) A Tevékenység(cs, tevékenység) operátor akkor alkalmazható egy h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 állapotra, ha teljesülnek a következő alkalmazási előfeltételek: a cs sorszámú családhoz még nem rendeltünk hozzá tevékenységet: h cs,3 = 0 (43) Bognárékhoz (az 1-es számú családhoz) csak akkor rendelhetünk tevékenységet, ha Vargáékhozz (az 5-ös számú családhoz) már rendeltünk lakóhelyet: cs = 1 h 5,2 0 (44) ha nem Bognárékhoz (az 1-es számú családhoz) szeretnénk tevékenységet rendelni, akkor az eggyel kisebb sorszámú családhoz már rendeltünk tevékenységet: cs 1 h cs 1,3 0 (45) a tevékenységet még nem rendeltük hozzá egyetlen olyan családhoz sem, amelynek cs-nél kisebb a sorszáma: i (i < cs h i,3 tevékenység) (46) az Angyalföldön lakó családhoz csak a görkorcsolyázást rendelhetjük: h cs,2 = Angyalföld tevékenység = görkorcsolya (47) a görkorcsolyázást csak az Angyalföldön lakó családhoz rendelhetjük: tevékenység = görkorcsolya h cs,2 = Angyalföld (48)
14 1. Állapottér-reprezentálható problémák a kerékpározást csak a (2-es azámú) Kardos családhoz rendelhetjük: tevékenység = kerékpár cs = 2 (49) a (2-es azámú) Kardos családhoz csak a kerékpározást rendelhetjük: a focit csak az ötgyerekes családhoz rendelhetjük: az ötgyerekes családhoz csak a focit rendelhetjük: cs = 2 tevékenység = kerékpár (50) tevékenység = foci h cs,1 = 5 (51) h cs,1 = 5 tevékenység = foci (52) ha a cs sorszámú család Csillaghegyen lakik, akkor nem rendelhetjük hozzájuk a tollaslabdát tevékenységként: h cs,2 = Csillaghegy tevékenység tollaslabda (53) ha a tollaslabdázás a tevékenység, akkor azt nem rendelhetjük hozzá olyan családhoz, ahol mindössze egyetlen gyerek van: tevékenység = tollaslabda h cs,1 1) (54) a tollaslabdázást csak olyan családhoz rendelhetjük hozzá, amelyiknek a gyerekszáma nagyobb, mint a csillaghegyi család gyerekszáma: tevékenység = tollaslabda i (h i,2 = Csillaghegy h i,1 < h cs,1 ) (55) Bognárékhoz (az 1-es számú családhoz) nem rendelhetjük hozzá a kocogást: A Tevékenység(cs, tevékenység) operátort egy h = állapotra alkalmazva a következőképpen definiált h = h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 h 1,2 h 2,2 h 3,2 h 4,2 h 5,2 h 1,3 h 2,3 h 3,3 h 4,3 h 5,3 cs = 1 tevékenység kocogás (56) h 1,1 h 2,1 h 3,1 h 4,1 h 5,1 H 1,1 H 2,1 H 3,1 H 4,1 H 5,1 H 1,2 H 2,2 H 3,2 H 4,2 H 5,2 H 1,3 H 2,3 H 3,3 H 4,3 H 5,3 elemtizenötöst kapjuk: { h i,j = tevékenység, ha i = cs j = 3, h i,j egyébként. Mivel operátorainkat úgy sikerült definiálni, hogy állapotból bizonyíthatóan állapotot állítanak elő, és a kezdőállapotunk állapot, ezért a megoldáskeresés során előállított elemtizenötösökre a kényszerfeltételek ellenőrzése elhagyható. Az állapottérnek, a probléma kezdőállapotának, a célállapotok halmazának, az operátorok alkalmazási előfeltételeinek és hatásának a definiálásával megadtuk az A, kezdő, C, O négyest, a probléma egy lehetséges állapottér-reprezentációját. (57)