Iványi Antal alkotó szerkeszt®
INFORMATIKAI ALGORITMUSOK
mondAt Kiadó Vác, 2013
A könyv a Nemzeti Kulturalis Alap támogatásával készült.
Alkotó szerkeszt®: Iványi Antal Szerz®k: Mira-Cristiana Anisiu (35.
fejezet), Bacsárdi László (38. fejezet), Domoszlai László (39. fejezet), Galambos Máté (38. fejezet), Gombos Gerg® (41. fejezet) Gregorics Tibor (32. fejezet) Imre Sándor(38. fejezet), Iványi Antal (33., 34. és 36. fejezet), Kása Zoltán, Muhammad Ali Khan (34. fejezet) Kiss Attila (40. és 41. fejezet) Kósa Balázs (40. fejezet), Matuszka Tamás (40. fejezet), Pinczel Balázs (40. fejezet), Shariefuddin Pirzada (33. és 34. fejezet), Rácz Gábor (41. fejezet) Szécsi László (37. fejezet), Szidarovszky Ferenc (39. fejezet), Szirmay-Kalos László (37. fejezet),
Lektorok: Antal György (37. fejezet), Blázsik Zoltán (35. fejezet), Kása Zoltán (33., 34.és 36. fejezet), Kátai Zoltán (32. fejezet), Iványi Anna Barbara (Irodalomjegyzék) Iványi Antal (38. fejezet), Molnár Sándor (39. fejezet), Sidló Csaba István (40. és 41. fejezet) c 2013 Mira-Cristiana Anisiu, Bacsárdi László, Domoszlai László,
Gombos Gerg®, Gregorics Tibor, Imre Sándor, Iványi Antal, Kása Zoltán, Muhammad Ali Khan, Kiss Attila, Kósa Balázs, Matuszka Tamás, Pinczel Balázs, Shariefuddin Pirzada, Rácz Gábor, Szécsi László, Szidarovszky Ferenc, Szirmay-Kalos László ISBN: 978-963-87596-8-9 mondAt kiadó, 2600, Vác, Nádas utca 6. Nyomás és kötés: mondAt Nyomdaipari és Szolgáltató Kft.
Tartalomjegyzék
El®szó . . . . . . . . . . . Bevezetés a 3. kötethez
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VII. DISZKRÉT MÓDSZEREK . . . . . . . . . . . . . . . . . 32. Heurisztikus gráfkeres® algoritmusok (Gregorics Tibor)
.
. 32.1. Útkeresési feladatok . . . . . . . . . . . . . . . . . . . . . . . 32.2. Általános gráfkeres® algoritmus . . . . . . . . . . . . . . . . . 32.2.1. Tulajdonságok . . . . . . . . . . . . . . . . . . . . . . 32.3. Nevezetes kiértékel® függvények . . . . . . . . . . . . . . . . . 32.3.1. Nem-informált gráfkeresések . . . . . . . . . . . . . . . 32.3.2. Heurisztika a gráfkeresésben . . . . . . . . . . . . . . . 32.4. Az A algoritmus család . . . . . . . . . . . . . . . . . . . . . . 32.4.1. A algoritmus . . . . . . . . . . . . . . . . . . . . . . . 32.4.2. A∗ algoritmus . . . . . . . . . . . . . . . . . . . . . . . 32.4.3. Ac algoritmus . . . . . . . . . . . . . . . . . . . . . . . 32.5. Az A∗ algoritmus hatékonyságának elemzése . . . . . . . . . . 32.5.1. Memória igény . . . . . . . . . . . . . . . . . . . . . . Különböz® heurisztikájú A∗ algoritmusok memória igényének összehasonlítása . . . . . . . . . . ∗ Az A algoritmus memória igényének összehasonlítása más útkeres® algoritmusokéval . . . . . . . . 32.5.2. Futási id® . . . . . . . . . . . . . . . . . . . . . . . . .
33. Összehasonlítás-alapú rangsorolás (Iványi Antal)
. . . . . . 33.1. Bevezetés a szuperversenyekhez . . . . . . . . . . . . . . . . . 33.2. Bevezetés az (a, b)-versenyekhez . . . . . . . . . . . . . . . . 33.3. El®írt pontsorozattal rendelkez® (1, 1)-versenyek létezése . . . 33.4. El®írt pontsorozattal rendelkez® (a, b)-versenyek ltezése . . . . 33.4.1. Tetsz®leges pontsorozattal rendelkez® verseny létezése 33.4.2. Naiv helyreállító algoritmus . . . . . . . . . . . . . . . 33.4.3. e kiszámítása . . . . . . . . . . . . . . . . . . . . . . . 33.5. El®írt pontsorozattal rendelkez® (a, a)-versenyek létezése . . .
1591 1592 1595 1596
1596 1600 1605 1608 1609 1610 1611 1612 1614 1615 1618 1618 1619 1621 1630
1636
1636 1638 1639 1643 1643 1644 1644 1645
34. Ponthalmazok és királyok (Shariefuddin Pirzada, Iványi Antal, Muhammad Ali Khan) . . . . . . . . . . . . . . . . . . . . 1646
Tartalomjegyzék
1588
35. Szavak bonyolultsága (Kása Zoltán, Mira-Cristiana Anisiu) 1647 35.1. Egyszer¶ bonyolultsági mértékek . . . . 35.1.1. Véges szavak . . . . . . . . . . . 35.1.2. Végtelen szavak . . . . . . . . . . 35.1.3. Szógráfok . . . . . . . . . . . . . De Bruijn-gráfok . . . . . . . . . Rauzy-gráfok . . . . . . . . . . . 35.1.4. Szavak bonyolultsága . . . . . . . Részszóbonyolultság . . . . . . . Maximális bonyolultság . . . . . Globális maximális bonyolultság Teljes bonyolultság . . . . . . . . 35.2. Általános bonyolultsági mértékek . . . . 35.2.1. Szivárvány szavak . . . . . . . . . A d1 = 1 eset . . . . . . . . . . . A d2 = n − 1 eset . . . . . . . . . 35.2.2. Tetsz®leges szavak . . . . . . . . 35.3. Palindrombonyolultság . . . . . . . . . . 35.3.1. Véges szavak palindromjai . . . . Teljes bonyolultság . . . . . . . . 35.3.2. Végtelen szavak palindromjai . .
36. Tökéletes tömbök (Iványi Antal)
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
1647 1647 1649 1651 1651 1655 1657 1659 1662 1662 1667 1669 1670 1673 1676 1680 1680 1681 1684 1684
1690
VIII. PÁRHUZAMOS MÓDSZEREK . . . . . . . . . . . . . . 1692 37.GPGPU: Számítások grakus processzorokon (SzirmayKalos László, Szécsi László) . . . . . . . . . . . . . . . . . . . . 1693 37.1. A grakus cs®vezeték modellje . . . . . . . . . . . . . . . . . . 37.1.1. A GPU mint az inkrementális képalkotás megvalósítása Tesszelláció . . . . . . . . . . . . . . . . . . . . . . . . A csúcspontárnyaló . . . . . . . . . . . . . . . . . . . . A geometria-árnyaló . . . . . . . . . . . . . . . . . . . Vágás . . . . . . . . . . . . . . . . . . . . . . . . . . . Raszterizáció lineáris interpolációval . . . . . . . . . . A pixelárnyaló . . . . . . . . . . . . . . . . . . . . . . Kompozitálás . . . . . . . . . . . . . . . . . . . . . . . 37.2. GPGPU a grakus cs®vezeték modelljének felhasználásával . . 37.2.1. A kimenet . . . . . . . . . . . . . . . . . . . . . . . . . 37.2.2. A bemenet . . . . . . . . . . . . . . . . . . . . . . . . 37.2.3. Függvények és paramétereik . . . . . . . . . . . . . . .
1696 1698 1699 1699 1699 1699 1700 1701 1701 1701 1702 1703 1704
Tartalomjegyzék
1589
37.3. A GPU mint vektorprocesszor . . . . . . . . . . . . . . . 37.3.1. A SAXPY BLAS függvény megvalósítása . . . . 37.3.2. Képsz¶rés . . . . . . . . . . . . . . . . . . . . . . 37.4. A vektorfeldolgozáson túl . . . . . . . . . . . . . . . . . 37.4.1. SIMD vagy MIMD . . . . . . . . . . . . . . . . . 37.4.2. Redukció . . . . . . . . . . . . . . . . . . . . . . 37.4.3. Szórás . . . . . . . . . . . . . . . . . . . . . . . . 37.4.4. Párhuzamosság vagy újrafelhasználás . . . . . . . 37.5. A GPGPU programozási modell: CUDA és OpenCL . . 37.6. Mátrix-vektor szorzás . . . . . . . . . . . . . . . . . . . 37.6.1. A mátrixvektor szorzás további párhuzamosítása 37.7. Esettanulmány: Számítógépes áramlásdinamika . . . . . 37.7.1. Az áramlásdinamika euleri megoldása . . . . . . Advekció . . . . . . . . . . . . . . . . . . . . . . Diúzió . . . . . . . . . . . . . . . . . . . . . . . A küls® er®tér . . . . . . . . . . . . . . . . . . . . Vetítés . . . . . . . . . . . . . . . . . . . . . . . . Euleri szimuláció a GPU-n . . . . . . . . . . . . . 37.7.2. A dierenciálegyenletek lagrange-i megoldása . . Lagrange-i megoldás a GPU-n . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
1705 1708 1709 1710 1710 1712 1714 1716 1717 1718 1720 1722 1725 1726 1726 1727 1727 1728 1730 1733
38. Quantumalapú algoritmusok (Bacsárdi László, Galambos Máté, Imre Sándor) . . . . . . . . . . . . . . . . . . . . . . . . . 1737 IX. GYAKORLATI MÓDSZEREK . . . . . . . . . . . . . . . . 1738 39. Koniktushelyzetek kezelése (Szidarovszky Ferenc, Domoszlai László) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1739 39.1. Többcélú programozás alapjai . . . . . . . . 39.1.1. Hasznossági függvények alkalmazása 39.1.2. Súlyozásos módszer . . . . . . . . . . 39.1.3. Távolságfügg® módszerek . . . . . . 39.1.4. Irányfügg® módszerek . . . . . . . . 39.2. Egyensúlypontok módszere . . . . . . . . . 39.3. Kooperatív játékok módszerei . . . . . . . . 39.4. Csoportos döntéshozatal . . . . . . . . . . . 39.5. Pareto-játékok alkalmazása . . . . . . . . . 39.6. Axiomatikus módszerek . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
1739 1743 1745 1747 1750 1753 1758 1762 1770 1773
40.A Szemantikus Web lekérdez® nyelvei (Pinczel Balázs, Kósa Balázs, Matuszka Tamás, Kiss Attila) . . . . . . . . . . . . . 1780 40.1. Szemantikus adatok . . . . . . . . . . . . . . . . . . . . . . . 1780 40.1.1. RDF reprezentáció . . . . . . . . . . . . . . . . . . . . 1780
Tartalomjegyzék
1590
40.1.2. SPARQL lekérdez® nyelv . . . . . . . . . . Szintaxis . . . . . . . . . . . . . . . . . . . Szemantika . . . . . . . . . . . . . . . . . 40.2. A SPARQL lekérdez®nyelv bonyolultsági kérdései 40.2.1. And és Filter m¶veletek . . . . . . . . . 40.2.2. And, Filter és Union m¶veletek . . . . 40.2.3. Az Opt m¶velet . . . . . . . . . . . . . . 40.2.4. Az unió-normálforma . . . . . . . . . . . . 40.2.5. Jól tervezett SPARQL lekérdezések . . . . 40.3. A SPARQL optimalizálása . . . . . . . . . . . . . 40.3.1. Algebrai optimalizálás . . . . . . . . . . . 40.3.2. Szemantikus optimalizálás . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
1781 1781 1782 1785 1785 1786 1787 1789 1790 1794 1795 1800
41. A Szemantikus Web alkalmazásai (Rácz Gábor, Gombos Gerg®, Kiss Attila) . . . . . . . . . . . . . . . . . . . . . . . . . 1804 41.1. A SPARQL kiértékelése MapReduce módszerrel . . . . . . . . 41.1.1. Adatok tárolása . . . . . . . . . . . . . . . . . . . . . . Bemeneti fájl kiválasztása . . . . . . . . . . . . . . . . 41.1.2. GenerateBestPlan algoritmus . . . . . . . . . . . . 41.2. Alkalmazás közösségi hálók elemzésére . . . . . . . . . . . . . 41.2.1. Közösségi hálózatok reprezentálása RDF segítségével . 41.2.2. Közösségi hálók lekérdezése és transzformálása . . . . 41.2.3. Csoportok kiválasztása hatékonyan . . . . . . . . . . . 41.2.4. Közösségi hálózatok lekérdezése MapReduce módszerrel Többszörös összekapcsolás . . . . . . . . . . . . . . . . Kiválasztó összekapcsolás . . . . . . . . . . . . . . . . Lekérdezésterv generálás . . . . . . . . . . . . . . . . .
Színes ábrák
1804 1805 1805 1805 1810 1811 1814 1818 1822 1823 1824 1825
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1828 36. fejezet színes ábrái . . . . . . . . . . . . . . . . . . . . . . . . . 1828 37. fejezet színes ábrái . . . . . . . . . . . . . . . . . . . . . . . . . 1829
Irodalomjegyzék Tárgymutató . . Névmutató . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1830 1836 1840
El®szó
Nagy örömmel ajánlom az Olvasók gyelmébe az Informatikai algoritmusok cím¶ tankönyvet, Iványi Antal gondos szerkesztésében. A számítógépes algoritmusok az informatika igen fontos és igen gyorsan fejl®d® területét alkotják. Hatalmas hálózatok tervezése és üzemeltetése, nagyméret¶ tudományos számítások és szimulációk, gazdasági tervezés, adatvédelmi módszerek, titkosítás és még sok más alkalmazás igényel hatékony, gondosan tervezett és pontosan elemzett algoritmusokat. Sok évvel ezel®tt Gács Péterrel írtunk egy kis könyvecskét [74] Algoritmusok címmel. Az Informatikai algoritmusok két kötete mutatja, hogy milyen sokrét¶ és szerteágazó területté fejl®dött ez a téma. Külön örömet jelent, hogy a magyar informatika ilyen sok kiváló képvisel®je fogott össze, hogy ez a könyv létrejöjjön. Nyilvánvaló számomra, hogy diákok, kutatók és alkalmazók egyik legfontosabb forrásmunkája lesz hosszú ideig. Budapest, 2013. november Lovász László
Bevezetés a 3. kötethez
A harmadik kötet 3 részt és 10 fejezetet tartalmaz. A Diszkrét módszerek cím¶ VII. rész Gregorics Tibor (ELTE IK) Heurisztikus gráfkeres® algoritmusok cím¶ 32. fejezetével kezd®dik. Az Összehasonlítás-alapú rangsorolás cím¶ 33. fejezetet Iványi Antal (ELTE IK) és Shariefuddin Pirzada (Kashmir University), a Szavak bonyolultsága cím¶ 35. cím¶ fejezetet Kása Zoltán (Sapientia Erdélyi Magyar Tudományegyetem) és Mira-Cristiana Anisiu (Tiberiu Popovici Institute of Numerical Mathematics), a Tökéletes tömbök cím¶ 36. fejezetet Shariefuddin Pirzada (University of Kashmir), Iványi Antal (ELTE IK) és Muhammad Ali Khan (King Fahd University, Saud-Arabia)) írta. A Párhuzamos módszerek cím¶ VIII. részben Szirmay-Kalos László és Szécsi László (mindkett® BME VIK) Általános célú grakai processzorok cím¶ ??., valamint Bacsárdi László,( Galambos Máté és Imre Sándor (mindhárom BME VIK) Kvantum számítások cím¶ 38. fejezetéb®l áll. Végül a Gyakorlati módszerek cím¶ IX. részben Szidarovszky Ferenc (University of Arizona) és Domoszlai László (ELTE IK) Koniktus helyzetek cím¶ 39., Pinczel Balázs, Kósa Balázs, Matuszka Tamás és Kiss Attila A szemantikus web lekérdez® nyelvei cím¶ ??., valamint Rácz Gábor, Gombos Gerg® és Kiss Attila A szemantikus web alkalmazásai cím¶ ??. fejezete van. A LATEX style fájlt Csörnyei Zoltán Belényes Viktor, és Iványi Antal írták. Az ábrákat a szerz®k rajzolták. Az irodalomjegyzék ugrópontjait Iványi Anna Barbara lektorálta és egészítette ki. Az ábrákat Cserg® Bálint konvertálta. A kolofon oldalon lév® ugrópontok segítségével az Olvasók kapcsolatba léphetnek a kötet alkotóival. Új gyakorlatokat és feladatokat, valamint a tartalomra vonatkozó észrevételeket köszönettel fogadunk. A nyomtatott els® két kötet és az elektronikus els® kötet megjelenését az Oktatási Minisztérium, a harmadik nyomtatott kötet megjelenését pedig a Nemzeti Kulturális Alap támogatta. Budapest, 2013. november
Tartalomjegyzék
1593
Iványi Antal (
[email protected])
VII. DISZKRÉT MÓDSZEREK
32. Heurisztikus gráfkeres® algoritmusok
A mesterséges intelligencia (MI) feladatok közös jellemz®je, hogy igen nagy problématérben kell a megoldásukat megtalálni. Ezért ezen feladatok megoldására többnyire keresést alkalmazunk. Egy nagyon nagy problématérben történ® keresés eredményessége is és hatékonysága is er®sen befolyásolható azzal, hogy milyen mértékben és min®ségben tudunk a keres® algoritmusba a megoldandó feladattól származó extra ismereteket beépíteni. Ezt a vezérlési ismeretet szokták heurisztikának nevezni. Annak megítélése, hogy egy heurisztika milyen módon hat annak az algoritmusnak a m¶ködésére, amelyben alkalmazzuk, általában csak empirikus módon határozható meg. Van azonban a kereséseknek egy érdekes csoportja, ahol a heurisztika jól deniált tulajdonságai alapján lehet következtetni az algoritmus eredményességére és hatékonyságára: ezek a heurisztikus gráfkeres® algoritmusok. Miel®tt a gráfkereséseket részletesen megvizsgálnánk, el®ször jellemezzük azokat az úgynevezett útkeresési feladatokat, amelyeket a gráfkeres® algoritmusokkal meg szeretnénk oldani. A fejezet felépítése a következ®. El®ször a 32.1. alfejezetben az útkeresési feladatokat mutatjuk be, majd a . alfejezetben az általános gráfkeres® algoritmust, a 32.3. alfejezetben a nevezetes kiértékel® algoritmusokat, a 32.4. alfejezetben az A algoritmus családot, végül a 32.5. alfejezetben az A∗ algoritmus hatékonyságát elemezzük,
32.1. Útkeresési feladatok Az MI feladatok modellezésére több módszert is kidolgoztak, és ezek meglep®en sokszor képezik le a megoldandó problémát egy élsúlyozott irányított gráfban történ® útkeresési feladatra. Legyen az (N, A, c) egy élsúlyozott irányított gráf, amely csúcsainak halmaza az N , éleinek halmaza az A ⊆ N × N , az (n, m) ∈ A egy n csúcsból m csúcsba irányuló élt jelöl (az él kiinduló csúcsát szül®nek, végcsúcsát gyereknek hívjuk), a c : A → < pedig az élekhez súlyt (a továbbiakban költséget) rendel® függvény. A szokásoktól némileg eltér®en itt feltételezzük, hogy az irányított gráfok-
32.1. Útkeresési feladatok
1597
ban akár végtelen sok csúcs is lehet. Ez abból adódik, hogy a vizsgált feladatok problématerének mérete nagyon nagy, s®t esetenként valóban végtelen. Az informatikai megoldások szempontjából viszont nincs különbség a végtelen és a nagyon nagy méret között: az olyan algoritmusok úgysem használhatók, amelyek arra rendezkednek be, hogy megvizsgálják a teljes problémateret. Fentiek természetes következménye, hogy gráfjainkban végtelen sok irányított él fordulhat el®. Kikötjük azonban azt, hogy a csúcsokból kivezet® élek száma véges, azaz mindegyik csúcsnak csak véges sok gyereke van. (Egy csúcshoz azonban tartozhat végtelen sok szül®csúcs.) Ez a megszorítás nem jelent valódi korlátozást, mert a kivezet® éleket általában a megoldandó feladathoz deniált m¶veleteket generálják. Egy adott pillanatban alkalmazható m¶veletek száma pedig egy valós feladat esetében mindig véges. Ráadásul a m¶veleteknek pozitív végrehajtási költsége van már ha egyáltalán számít a végrehajtási költségük , és meggyelhet®, hogy a m¶veletek költségeinek inmuma is egy pozitív szám. Így azt is kiköthetjük, hogy az él-súlyozott irányított gráfjaink élsúlyai (élköltségei) egy, a teljes gráfra érvényes pozitív valós számnál nem kisebbek. Ezt a súlykorlátot gyakran szokták a görög δ bet¶vel jelölni, az általa leírt tulajdonságot pedig δ -tulajdonságnak hívni. (Az élek súlyait egységesen egységnyinek tekintjük akkor, amikor a feladatban semmilyen utalás sincs a költségekre.) Egy végtelen sok csúcsból álló, de egy csúcshoz csak véges sok kivezet® élt rendel®, δ -tulajdonságú (N, A, c) él-súlyozott irányított gráfot röviden δ gráfnak δ -gráf szoktunk nevezni. Egy útkeresési feladat egy adott tulajdonságú, δ -gráfbeli irányított út megkeresését jelenti. Egy n ∈ N csúcsból m ∈ N csúcsba vezet® irányított úton egy (n, n1 ), (n1 , n2 ), . . . , (nk−1 , m) élsorozatot értünk. Ha csak azt kívánjuk jelölni, hogy egy út milyen csúcsokat érint, akkor az útra hivatkozhatunk az érintett csúcsok sorozatával is: (n, n1 , n2 , . . . , nk−1 , m). (Ez a jelölés azonban nem egyértelm¶, hiszen két csúcs között több él is vezethet.) Az n → m szimbólumot akkor használjuk majd, ha egy n csúcsból m csúcsba vezet® útról kell beszélnünk, de nem lényeges, hogy milyen közbees® csúcsok mentén valósul ez meg. Ha α =< (n, n1 ), (n1 , n2 ), . . . , (nk−1 , m) > egy konkrét n-b®l α m-be vezet® út, akkor ezt az n → m szimbólummal is jelölhetjük. Egy úton ugyanaz a csúcs (s®t ugyanaz az él) többször is el®fordulhat, amennyiben a gráfban vannak körök, azaz kiinduló csúcsukba visszatér® utak. Az {n → m} az összes n-b®l m-be vezet® irányított út halmazát, az n → M , ahol M ⊆ N , pedig az összes n-b®l M valamelyik csúcsába vezet® irányított út halmazát jelöli. Egy irányított út hosszán az utat alkotó élek számát értjük, és egy α út esetében ezt az |α| jelöli. Az út költségét a hosszúság fogalmával analóg
32. Heurisztikus gráfkeres® algoritmusok
1598
módon az utat alkotó élek költségeinek összegeként deniáljuk. Formálisan, ha α =< (n0 , n1 ), (n1 , n2 ), . . . , (nk−1 , mk ) >, akkor
c(α) =
k X
c(ni−1 , ni )
i=1
Az α ∈ {n → m} út költségét a c(α) szimbólum jelöli majd. Nem lesz zavaró, hogy az él-költséget is c-vel jelöltük, hiszen egy (n, m) él egy speciális irányított útnak tekinthet®, amelynek a költsége c(n, m). Az útköltség lényegében az élköltség fogalmának általánosítása. A δ -gráfokban, amennyiben vezet egy csúcsból (n) egy csúcshalmazba (M ) út, akkor létezik ezek között legrövidebb út is, s®t legolcsóbb költség¶, azaz optimális út is. Az els® állításhoz elég azt látni, hogy ha α az egyik n → M út, akkor az ennél rövidebb n → M utak száma véges. Ez abból következik, hogy egy δ -gráfban minden csúcsnak véges sok gyermeke van, így az n csúcsból kiinduló, de egy megadott korlátnál (például az α hosszánál) nem hosszabb utakból véges sok van. Ennél fogva ki lehet választani az n → M utak közül a legrövidebbet. A második állításhoz a δ -tulajdonságot is fel kell használni. Mivel emiatt minden él legalább δ > 0 súlyú, így ha α ∈ n → M , akkor a legolcsóbb n → M -beli út hossza nem lehet nagyobb, mint c(α)/δ . (Ugyanis minden c(α)/δ -nál hosszabb β útra fenn áll, hogy c(β) ≥ |β| · δ > c(α).) Azt pedig éppen az el®bb láttuk be, hogy egy adott korlátnál (ez most c(α)/δ ) nem hosszabb n → M -beli utak száma véges, és ezek közül ki lehet választani a legolcsóbbat. Bevezetjük a c∗ : N × N → < függvényt, amely egy δ -gráfban megadja azt az optimális (legolcsóbb) költséget, amelynek árán egy csúcsból egy másikba el lehet jutni. Ezt mindegyik n és m csúcsra értelmezzük. Ha van út n-b®l m-be, akkor az összes {n → m}-beli út költségének minimumaként, ha nincs, akkor végtelen nagynak tekintjük. Formálisan: ∗
c (n, m) := ∗
minα∈{n→m} c(α) ha van n→m ∞ ha nincs n → m
Az n → m szimbólummal egy n-b®l m-be vezet® optimális utat n o ∗ jelölünk, az összes n → m optimális utat pedig az n → m halmaz tartalmazza. Használhatjuk a c∗ (n, M ) jelölést arra az optimális (legolcsóbb) költségre, amellyel el lehet jutni n-b®l az M csúcshalmaz valamelyikébe, azaz c∗ (n, M ) := minα∈n→M c(α). Ha nincs n → M -beli út, akkor a c∗ (n, M ) értékét végtelen nagynak tekintjük. Egy c∗ (n, M ) költség¶ n → M -beli utat n-b®l M -be vezet® optimális útnak hívunk. Egyszerre több ilyen út is létezhet, ∗ ezért jelöli az n → M az összes n → M -beli optimális utat.
32.1. Útkeresési feladatok
1599
Egy útkeresési feladat modellezésekor az a célunk, hogy a feladat problématerét egy δ -gráfbeli, adott csúcsból (startcsúcsból) induló irányított utak halmazaként fogalmazzuk meg, amelyek között olyan utat keresünk, amely adott csúcsok (célcsúcsok) egyikébe vezet. Gyakran az optimális utat keressük. Ennek megfelel®en egy útkeresési feladat gráfreprezentációján azt értjük, ha megadunk egy (N, A, c) δ -gráfot, az úgynevezett reprezentációs gráfot, kijelöljük annak s ∈ N startcsúcsát és T ⊆ N célcsúcsait. A feladat általánosan az, hogy keresünk egy s → T -beli úgynevezett megoldási utat, ∗ vagy röviden megoldást, esetenként egy s → T -beli optimális megoldást. Több olyan módszert is ismerünk, amelyek segítségével egy problémát útkeresési feladatként fogalmazhatunk meg, és ezáltal lehet®vé válik, hogy a problémára úgy tekinthessünk, mint egy δ -gráfbeli út keresésére. Ezek között talán az egyik legjobban ismert módszer az állapottér reprezentáció. Az állapottér reprezentáció alkalmazása során a megoldandó feladatból kinyert ismereteket négy részben kell megfogalmazni. Az els® az állapottér, amely a feladat homlokterében álló adatok lehetséges érték-együtteseinek (állapotainak) halmaza. Ezen az állapottéren deniáljuk a feladat m¶veleteit, amelyek állapotból állapotba képz® operátorok. Meg kell még adni a feladat lehetséges kezd® állapotait és egy adott kezd®állapothoz tartozó célállapotokat közvetlenül vagy közvetve egy feltétel segítségével. Példaként vegyük az úgynevezett 15-ös kirakó játékot. Ez egy 4 × 4-es keretben elhelyezett 15 sorszámozott (vagy képekkel ellátott) 1 × 1-es lapocskát tartalmaz és egy 1 × 1-es üres helyet. Egy lapocskát a vele szomszédos üres helyre lehet áttolni. A feladat az, hogy egy adott kezd®állásból kiindulva érjünk el egy kívánt célállásba. (Sorszámozott lapocskák esetében ez a célállás gyakran az, ahol a lapocskák számai balról jobbra sorfolytonosan kiterítve növeked® sorozatot alkotnak, az üres hely pedig a jobb alsó sarok.) Ezt a feladatot modellezhetjük egy 4 × 4-es mátrix segítségével, amelyben 0 és 15 közé es® számok mindegyike pontosan egyszer fordul csak el®. A 0 az üres helyet szimbolizálja, a többi szám pedig a megfelel® sorszámú lapocskákat. A feladat egy állása, azaz egy állapota egy ilyen mátrixszal adható meg. Hatékonysági okokból célszer¶ az állapotban külön eltárolni azt is, hogy éppen hol (milyen koordinátán, azaz melyik sorban és oszlopban) található az üres hely. Jelöljük az állapotok halmazát leíró halmazt A-val, az aktuális állapotot akt-tal. A m¶veleteket egy olyan T ol(irány) : A → A operátor írja le, amely az aktuális állapot üres helyét (röviden akt.üres ) tolja el a megadott irányba jobbra, fel, balra vagy le: irány ∈ {(1, 0), (0, 1), (−1, 0), (0, −1)}. A m¶velet végrehajtásának el®feltétele, hogy akt.üres+irány (itt az összeadást koordinátánként kell végrehajtani) egy érvényes pozíció legyen, azaz mind-
32. Heurisztikus gráfkeres® algoritmusok
1600
két koordinátája 1 és 4 közé essen. A m¶velet hatására az aktuális állapot mátrixának akt.üres és akt.üres+irány pozícióin felcserél®dnek az értékek, az akt.üres új értéke pedig akt.üres+irány lesz.
Gyakorlatok
32.1-1.
Adjunk állapottér reprezentációt a huszár bejárás problémára. Egy n × n-es sakktáblán áll egy huszár (ló), amellyel el kell jutni a sakktábla egy adott mez®jér®l egy másik adott mez®jére úgy, hogy a huszár lépés-szabályát követjük (L alakban, tehát el®ször egyik irányban, majd rá mer®leges irányban is lépünk, összesen csak hármat). Becsüljük meg reprezentációnak megfeleltetett irányított gráf csúcsainak számát, valamint startcsúcsból kivezet® utak számát. 32.1-2. Adjunk állapottér reprezentációt az alábbi kocka világ problémára. Adott egy asztalon néhány kocka (A, B, C), valamint egy robotkar. A robotkar négy m¶veletet képes végrehajtani: felemel egy kockát (amelyen nincs másik kocka, azaz szabad) az asztalról; leemel egy szabad kockát egy másik kockáról; lerak egy kockát az asztalra; rátesz egy kockát egy másik szabad kockára. A cél az, hogy egy tetsz®leges kiinduló állásból indulva felépítsünk egy adott konstrukciót, mondjuk az A − B − C tornyot. A reprezentáció megadásán túl becsüljük meg külön az állapottér és külön a problématér méretét. (Tipp: Egy állapot leírásához az alábbi predikátum szimbólumok alappéldányainak listáját használjuk: on(x, y) x rajta van az y -on; ontable(x) x az asztalon van; clear(x) x teteje szabad; holding(x) robotkar fogja az x-et; handempty robotkar üres!) Becsüljük meg reprezentációnak megfeleltetett irányított gráf csúcsainak számát, valamint startcsúcsból kivezet® utak számát. 32.1-3. Adjunk állapottér reprezentációt a kancsó problémára. Adott három eltér® ¶rtartalmú kancsó: egy 5 literes, egy 3 literes és egy 2 literes. Kezdetben az 5 literes tele van borral. Töltögetéssel érjük el, hogy a 2 literes kancsóba pontosan 1 liter bor kerüljön, de a maradék bor is legyen meg hiánytalanul a másik két kancsóban. Egyik kancsóból egy másikba csak úgy szabad tölteni, hogy ennek következtében vagy az egyik kancsó kiürül, vagy a másik kancsó lesz tele. Becsüljük meg reprezentációnak megfeleltetett irányított gráf csúcsainak számát, valamint a startcsúcsból kivezet® utak számát.
32.2. Általános gráfkeres® algoritmus A gráfkeres® algoritmusok a startcsúcsból kiindulva fokozatosan tárják fel a reprezentációs gráfot úgy, hogy a startcsúcsból kiinduló utakat derítik fel. A reprezentációs gráf már felfedezett részét keres® gráfnak hívjuk és azt Gvel jelöljük. A keres® gráf a startcsúcsból kivezet® összes útnak tartalmazza
32.2. Általános gráfkeres® algoritmus
1601
valamilyen hosszan a kezd® szeletét (kezdetben minden útról csak a startcsúcsot). A startcsúcsból kivezet® utaknak mindig lesz egy olyan csúcsa, az úgynevezett nyílt csúcs, amely már G-ben van (már felfedeztük) és éppen arra vár, hogy kiterjesszük, azaz az összes gyerekét megismerjük, megvizsgáljuk. A NYÍLT halmazban a kiterjesztésre váró nyílt csúcsok foglalnak helyet. Azokat a G-beli csúcsokat, amelyeket kiterjesztettünk, zárt csúcsoknak nevezik. A NYÍLT halmazból a cél elérése szempontjából legjobbnak látszó csúcsot választjuk ki mindig kiterjesztésre, és ezzel minden lépésben tulajdonképpen újraértékeljük a startcsúcsból kivezet®, már feltárt utakat abból a célból, hogy a legígéretesebb úton folytassuk a keresést. Ha egy csúcs kiterjesztése során új információhoz jutunk a csúcs gyerekeir®l (például most fedezzük fel azokat, vagy így találunk azokhoz egy új utat), akkor betesszük a NYÍLT halmazba a gyerekeket miközben a kiterjesztett csúcsot kivesszük onnan. Mindezek alapján el lehet készíteni a gráfkeres® algoritmusnak a vázát. Ebben a n := select(NYÍLT) utasítás választja ki egy elemét a NYÍLT halmaznak, a cél() függvény dönti el egy csúcsról, hogy célcsúcs-e, a Γ(n) pedig az n csúcs összes gyerekét tartalmazó halmazt jelöli. Az algoritmusban az "∪Γ(n)" kifejezés kétféle kontextusban is szerepel. Egyik helyen csak az n csúcs gyerekeit uniózza hozzá a nyílt csúcsokat tartalmazó halmazhoz (NYÍLT − {n} ∪ Γ(n)), a másik helyen az n csúcsból annak gyerekeihez vezet® éleket teszi bele a keres® gráfba (G ∪ Γ(n)).
procedure GK0 (hibás változat!) G := {s} : NYÍLT := {s} while NYÍLT 6= ∅ loop n := select(NYÍLT) if cél(n) then return van megoldás G := G ∪ Γ(n) NYÍLT := NYÍLT − {n} ∪ Γ(n) endloop return nincs megoldás
Err®l az algoritmusról rögtön látni, hogy hibás. Egyik baj vele az, hogy ha kört tartalmaz a reprezentációs gráf, akkor ez az algoritmus végtelen ciklusba eshet. A másik probléma az, hogy a megoldás megtalálásakor nem tudja megadni a megoldást, csak jelzi azt, hogy talált-e ilyet vagy sem. A harmadik gond pedig az vele, hogy még csak kísérletet sem tesz arra, hogy optimális megoldási utat találjon. A fenti hibák kijavítása el®tt vezessünk be három függvényt. Legyen az f : NYÍLT → < az úgynevezett kiértékel® függvény, amelyet arra fogunk használni, hogy a segítségével választjuk ki a NYÍLT halmaz
1602
32. Heurisztikus gráfkeres® algoritmusok
legígéretesebb csúcsát kiterjesztésre. Nyilvánvaló, hogy ez a függvény alapvet® fontosságú szerepet játszik majd abban, hogy a keresés találjon megoldást, illetve, hogy optimális megoldást adjon. Ennek a függvénynek a részletesebb vizsgálatával majd kés®bb foglalkozunk, egyel®re csak annyit jegyezzünk meg, hogy ez egy dinamikus függvény. Ez egyfel®l abból látszik, hogy az értelmezési tartománya, a NYÍLT halmaz, folyamatosan változik a gráfkeresés m¶ködése közben, másfel®l a keresés két különböz® id®pillanatában az f függvény ugyanazon csúcshoz eltér® értéket rendelhet. Legyen a π : N → N az a visszamutató pointer, amely minden G-beli (tehát már felfedezett) csúcshoz (a startcsúcs kivételével) megjelöli annak egyik szül®jét. Ennél fogva a keresés során elért bármelyik csúcshoz egyértelm¶en kijelöl egy a startcsúcsból odavezet® irányított utat, így sikeres terminálás esetén a célcsúcsból indulva a megoldási út is könnyen kiolvasható. A visszamutató pointer értékeit az algoritmus segítségével fogjuk kiszámolni. Ezek az értékek dinamikusan változhatnak, hiszen keresés közben célszer¶ egy csúcshoz mindig azt a szül®csúcsot megjelölni, amelyen keresztül a lehet® legolcsóbban lehet oda eljutni. A π visszamutató pointer egy irányított feszít®fát határoz meg a G keres® gráfban, amelyet röviden π feszít®fának hívunk majd. Ennek a fának a gyökere az s startcsúcs, és minden csúcshoz pontosan egy startcsúcsból kiinduló G-beli irányított utat tartalmaz. Úgy kellene módosítani a gráfkeres® algoritmust, hogy a π egy optimális irányított feszít®fát tartson nyilván a G-ben, azaz a feszít®fa minden csúcshoz a startcsúcsból odavezet® G-beli utak közül az egyik legolcsóbbat tartalmazza. Röviden: legyen a π optimális. Hangsúlyozzuk, hogy ez a feszít® fa nem a teljes reprezentációs gráfra, hanem csak a G keres® gráfra nézve lenne optimális. Reményeink szerint ez és egy megfelel® kiértékel® függvény együttesen biztosíthatják majd azt, hogy a gráfkeresés a teljes reprezentációs gráfra nézve optimális megoldást tudjon találni. Az optimális feszít®fa el®állításához szükségünk lesz arra, hogy a G-beli csúcsoknál nyilvántartsuk a startcsúcsból odavezet® π feszít®fabeli út költségét. Erre szolgál majd az algoritmus által számolt g : N → < költségfüggvény. Ez is dinamikus függvény, hiszen egy csúcsba többféle eltér® költség¶ út is vezethet a startcsúcsból, így az ott nyilvántartott költség attól függ®en változik, hogy ezen utak közül eddig melyeket fedezte fel az algoritmus. Valahányszor egy újabb s → n utat talál, össze kell vetni ennek költségét az n csúcsnál eddig nyilvántartott g(n) költséggel, és ha az új költség jobb, akkor le kell cserélni a g(n) értékét erre. Ezzel biztosíthatjuk, hogy a g optimális legyen a G-ben. Ha emellett ügyelünk arra is, hogy a g(n) érték mindig π a π feszít®fa által kijelölt startcsúcsból n csúcsba vezet® út (s → n) költségét mutassa (azaz g(n) = cπ (s, n)), másképpen fogalmazva a textbfg és a π
32.2. Általános gráfkeres® algoritmus
1603
konzisztens legyen, akkor a π feszít®fa is optimális lesz. Egy n ∈ G csúcsra akkor mondjuk majd, hogy korrekt, ha a g a G-ben optimális és konzisztens π -vel. Ellenkez® esetben az n csúcs inkorrekt. Ha egy G keres® gráf minden csúcsa korrekt, akkor a keres® gráfot is korrektnek nevezzük. Hogyan módosítsuk a gráfkeresés GK0 algoritmusát úgy, hogy az képes legyen olyan g és π függvény értékeket kiszámolni, hogy a G keres® gráfja korrekt legyen? Ennek érdekében minden kiterjesztésnél vizsgáljuk meg az éppen kiterjesztett n csúcs összes gyermekét. Egy m ∈ Γ(n) gyermekcsúcsra három eset fordulhat el®. Ha ekkor találkozunk el®ször az m csúccsal, akkor állítsuk be π(m) értékeket az m egyetlen ismert szül®jére, az n-re, így egy n csúcson keresztül vezet® startcsúcsból induló út lesz az m csúcshoz kijelölve. Ez az út az n csúcsig terjed® szakaszból (ennek költsége: g(n)) és az (n, m) élb®l áll, ezért az út költsége g(n) + c(n, m): ez legyen a g(m) értéke. Az m csúcs ebben az esetben bekerül a NYÍLT halmazba. A másik eset az, amikor az m csúccsal már korábban találkoztunk, de most egy minden eddiginél olcsóbb úton jutottunk el hozzá, azaz az m inkorrektté válik. Ennek kijavítására ilyenkor az el®z® esethez hasonlóan módosítjuk a g(m) és π(m) értékeit. A harmadik esetben, amikor az m csúcs már ismert, találunk hozzá egy újabb utat, de az nem olcsóbb a nyilvántartott útnál. Ekkor nem kell semmit se csinálnunk.
if m ∈ / G then π(m) := n : g(m) := g(n) + c(n, m) : NYÍLT := NYÍLT ∪ {m} elseif m ∈ G és g(m) > g(n) + c(n, m) then π(m) := n : g(m) := g(n) + c(n, m) elseif m ∈ G és g(m) ≤ g(n) + c(n, m) then SKIP
Sajnos ez a megoldás nem elégséges: a keres® gráf ezzel együtt is inkorrektté válhat. Tekintsük ennek alátámasztásaként az alábbi példát. Az 32.1. ábrán egy olyan szituáció látható, amikor egy n csúcs kiterjesztése után egy minden korábbinál olcsóbb utat találunk az n csúcs m jel¶ gyermekéhez. A korábban megadott eljárás módosítja az m csúcs g és π értékeit, de mégis inkorrektté válik a keres® gráf. A jelenséget az okozza, hogy az m csúcsot már korábban kiterjesztettük, azaz zárt csúcs lett, így vannak a G-ben leszármazottai. Az n kiterjesztése után a k jel¶ csúcshoz például a feszít®fa egy 3 költség¶ utat mutat, de g(k) = 5, azaz elromlott a k -nál a g és π közötti konzisztencia; az l jel¶ csúcsnál pedig a g(l) és π ugyan konzisztens, de egy 5 költség¶ utat mutatnak, pedig most már egy 4 költség¶ út is vezet l-be, azaz ebben a csúcsban a g nem optimális. Milyen megoldásokat adhatunk erre a problémára feltéve, hogy az n csúcs kiterjesztése el®tt korrekt volt a keres®gráf?
32. Heurisztikus gráfkeres® algoritmusok
1604
32.1. ábra.
Példa arra, amikor egy kiterjesztés után inkorrektté válik a keres® gráf.
1. Járjuk be az m csúcs leszármazottait és módosítsuk azok g és π értékeit, így tegyük újra korrektté a keres® gráfot. 2. Irányítsuk úgy a keresést, hogy soha ne következzen az be, hogy egy zárt csúcshoz minden addiginál olcsóbb utat találjunk. 3. Ne tör®djünk a problémával, csak tegyük vissza az m csúcsot a NYÍLT halmazba. Az els® válasz szerint egy (például mélységi) gráfbejárást kell a gráfkeresésbe beépíteni. Ennek során nem is kell az m csúcs összes leszármazottját feltétlenül megvizsgálni. Ha ugyanis az m csúcs egy k leszármazottjánál nem kell módosítani g és π értékeket, mert a k korrekt maradt, akkor a k csúcs gyerekei is csak úgy válhattak inkorrekté, ha van az m csúcsból a k csúcsot elkerül® másik út is. A mélységi bejárás úgy is minden m csúcsból kivezet® utat megvizsgál, ezért a korrekt k csúcs ellen®rzése után nem kell annak gyerekeivel (és azok leszármazottaival) foglalkozni. A második válasz megvalósítása egy érdekes vállalkozás. A célunkat például elérhetnénk úgy, ha biztosítjuk azt, hogy amikor egy csúcsot kiterjesztünk, akkor már ismerjük az odavezet® (az egész reprezentációs gráfra nézve) optimális utat. Ez az elképzelés azonban jóval messzebbre vezet: azt a kérdést feszegeti, hogy hogyan lehet optimális utat találni az egyes csúcsokhoz. Ehhez azonban egyel®re még keveset tudunk a keresés irányítását végz® kiértékel® függvényekr®l, így ezt a lehet®séget kés®bb tudjuk csak kielemezni. A harmadik válasz els® hallásra igen meglep®, de logikus. Azzal ugyanis, hogy az m csúcsot visszatesszük a NYÍLT halmazba, megteremtjük annak a lehet®ségét, hogy újra ki lehessen terjeszteni. Ha a keresés szempontjából érdekes ez az irány, akkor az m csúcsot ki is fogja újra terjeszti a keresés,
32.2. Általános gráfkeres® algoritmus
1605
és ekkor megtörténik a gyerekeinek is a felülvizsgálata. Összességében így sor kerülhet akár az m összes leszármazottjának az ismételt vizsgálatára is. Ez a lusta megoldás hagyja ugyan elromolni a keres® gráf korrektségét, de abban bízik, hogy ez nem jelent majd problémát a megoldás illetve az optimális megoldás el®állításánál. Az ötlet megvalósítása kétség kívül nem kerül semmibe, a korábban kitalált kódot kell csak annyiban módosítani, hogy egy korrigált csúcs mindig kerüljön vissza a NYÍLT halmazba. Futási id® szempontjából azonban fontos kérdést vet fel: hányszor tud ugyanaz a csúcs visszakerülni a NYÍLT halmazba és újra kiterjeszt®dni. Mi a legutóbbi ötletet karoljuk fel, és ennek alapján adjuk meg a gráfkeres® algoritmus általános változatát.
procedure GK (általános gráfkeres® algoritmus) G := {s} : NYÍLT := {s} : π(s) := nil : g(s) := 0 while NYÍLT 6= ∅ loop n := minf (NYÍLT) if cél(n) then return van megoldás foreach m ∈ Γ(n) loop return van megoldás if m ∈ / G vagy g(m) > g(n) + c(n, m) then
π(m) := n : g(m) := g(n) + c(n, m) NYÍLT := NYÍLT ∪ {m} endif endloop G := G ∪ Γ(n) NYÍLT := NYÍLT − {n} endloop return nincs megoldás
Lényeges eleme az algoritmusnak az, hogy ahhoz, hogy a GK algoritmus megoldást találjon nem elég rátalálnia egy célcsúcsra, mert a célcsúcs NYÍLT halmazbeli megjelenése még nem állítja le a keresést. Csak akkor terminál az algoritmus, amikor kiválasztja kiterjesztésre a célcsúcsot. A kés®bbi szóhasználatban az egyszer¶ség kedvéért ezt a célcsúcs kiterjesztésének mondjuk majd annak ellenére, hogy ilyenkor már nem kerül sor a célcsúcs utódainak vizsgálatára.
32.2.1. Tulajdonságok Az általános gráfkeres® algoritmustól csak speciális kiértékel® függvények esetében várhatunk igazán eredményes és hatékony m¶ködést, de az algoritmus néhány fontos tulajdonságát érdemes már általános is esetre megfogalmazni.
32. Heurisztikus gráfkeres® algoritmusok
1606
Ezeket lemmák és tételek formájában mondjuk ki. Az els® lemma azt vizsgálja meg, hogy hányszor kerülhet sor ugyanannak a csúcsnak a kiterjesztésére. Lehet®vé tettük ugyanis, hogy egy csúcs visszakerülhessen a NYÍLT halmazba, amikor olcsóbb utat találunk hozzá azért, hogy a leszármazottainak esetleges inkorrektségét a csúcs ismételt kiterjesztésével helyre lehessen állítani. Ez lényegesen megnövelheti a futási id®t, de szerencsére az 32.1. lemma szerint erre nem kerülhet végtelen sokszor sor.
32.1. lemma. csak ki.
A GK ugyanazt a csúcsot legfeljebb véges sokszor terjeszti
Bizonyítás.
Egy n csúcs ismételt kiterjesztésére csak azt követ®en kerülhet sor, hogy az algoritmus egyszer már eljutott az n csúcshoz, és kiterjesztette. Jelöljük C -vel az n csúcshoz legels® alkalommal talált s → n út költségét. Becsüljük meg azon s → n utak számát, amelyek olcsóbbak C -nél: legfeljebb ennyiszer kerülhet vissza az n NYÍLT halmazba, és ennyiszer terjeszt®dhet ki újra. Egy δ -gráfban a C -nél olcsóbb utak rövidebbek, mint C/δ . A δ tulajdonság miatt ugyanis minden él költsége legalább δ , és ezért már egy dC/δe hosszú út költsége is nagyobb vagy egyenl® lesz, mint C . Másfel®l viszont a C/δ korlátnál rövidebb s-b®l induló utak száma véges, hiszen minden csúcsból véges sok kivezet® él indul. Tehát egy adott korlátnál rövidebb (C -nél olcsóbb) s → n utak száma véges. A következ® tétel a GK terminálási feltételét fogalmazza meg.
32.2. tétel. Bizonyítás.
Véges δ -gráfban a GK mindig terminál.
Egy véges gráfnak véges sok csúcsa van. δ -gráf esetén ezek mindegyike az 32.1. lemma értelmében legfeljebb véges sokszor terjeszt®dhet ki. Véges sok csúcs tehát összességében véges lépésben végleg kikerül a NYÍLT halmazból, azaz végül a NYÍLT halmaz üres lesz (a GK sikertelenül terminál), hacsak nem áll le korábban a keresés egy célcsúcs megtalálásával (a GK sikeresen terminál). Ez a tétel implicit módon azt is kimondja, hogy a körök nem okozhatnak végtelen ciklust a GK m¶ködésében. A következ® lemma a GK algoritmus m¶ködésére jellemz® invariáns állítást adja meg. Pongyola megfogalmazásban ez annyit tesz, hogy a GK algoritmus minden startcsúcsból kiinduló valamelyik másik csúcshoz (és nemcsak a célcsúcsokhoz) vezet® optimális útnak a kezd® szeletét a m¶ködés bármelyik pillanatában már tökéletesen ismeri. A pontosabb megfogalmazás el®tt be kell vezetnünk egy jelölést. Legyen g ∗ : N → < az úgynevezett eddig megtett
32.2. Általános gráfkeres® algoritmus
1607
út optimális költségfüggvénye, amely minden n ∈ N csúcsra megadja az s →∗ n optimális út költségét, azaz g ∗ (n) = c∗ (s, n).
32.3. lemma.
(invariáns lemma) Legyen n egy tetsz®leges s-b®l elérhet® csúcs. A GK az n csúcs kiterjesztése el®tt minden pillanatban bármelyik s →∗ n optimális úton nyilvántart egy olyan m csúcsot, amelyikre teljesül, hogy 1. m ∈ NYÍLT 2. g(m) = g ∗ (m) 3. minden m csúcsot megel®z® k csúcsra: mind zárt, egyik se nyílt, és g(k) = g ∗ (k).
Bizonyítás. A bizonyítást a GK iterációi szerinti teljes indukcióval végezzük.
A legels® iterációs lépés el®tt mindegyik vizsgált útra az s startcsúcs az, amelyik rendelkezik az 1., 2., 3. tulajdonságokkal. Feltesszük, hogy az i-dik iterációs lépés el®tt teljesül az állítás, és felkészülünk arra, hogy megmutassuk, hogy ez az i-dik lépés során is megmarad. Rögzítsünk egy tetsz®leges α-val jelölt olyan s →∗ n utat, ahol az n csúcsot a GK még az i-dik lépésben sem terjeszti ki. Ennek az útnak az indukciós állítás szerint van olyan m csúcsa, amely rendelkezik az 1., 2., 3. tulajdonságokkal. 1. eset: Lehet, hogy az i-dik lépés során nem az m csúcsot terjesztjük ki, ekkor m-re továbbra is fennáll 1., 2., 3., azaz ebben az esetben készen is vagyunk a bizonyítással. 2. eset: Ha az i-dik lépés során az m csúcsot terjesztjük ki (az m nem lehet azonos n csúccsal, hiszen, feltevésünk szerint, az n csúcsot nem terjeszthetjük még ki), akkor kell keresni egy olyan csúcsot az α úton, amelyik átveszi az invariáns állításban szerepl® m csúcs szerepét. Az m csúcsnak az α úton fekv® utóda az m0 , amely az m csúcs kiterjesztése után vagy nyílt lesz, vagy nem. Ha m0 ∈ NYÍLT , akkor
•
az 1. nyilván teljesül m0 -re,
•
de a g(m0 ) ≤ g(m) + c(m, m0 ) = g ∗ (m) + c(m, m0 ) = g ∗ (m0 ) miatt a 2. is,
•
a 3. pedig azért, mert az α úton az m el®tti k csúcsok már eddig is zártak és nem nyíltak voltak g(k) = g ∗ (k) tulajdonság mellett, az m pedig most vált zárttá a g(m) = g ∗ (m) mellett miközben ki került a NYÍLT halmazból.
Ha viszont m0 ∈ / NYÍLT, akkor ez csak úgy lehetséges, hogy az m kiterjesztése el®tt már g(m0 ) = g ∗ (m0 ) fenn állt. Ehhez kell lenni egy olyan
32. Heurisztikus gráfkeres® algoritmusok
1608
β ∈ {s →∗ m0 } optimális útnak, amely mentén már az i-dik lépés el®tt elértük az m0 -t úgy, hogy a β minden l csúcsa g(l) = g ∗ (l) mellett lett kiterjesztve, és ennél fogva nem lett újra nyílt. Tekintsük most azt az utat, amelyik a β -t magába foglalva elvezet az m0 ig, majd onnan az α-án tovább halad az n-be. Ez is egy s →∗ n optimális út, és erre is érvényes az indukciós állítás, azaz van rajta valahol egy olyan m00 nyílt csúcs, amelyre teljesül az 1., 2., 3. De ez az m00 csúcs csak az m0 után helyezkedhet el ezen az úton, hiszen az m0 -ig (a β -n) nincsenek nyílt csúcsok. Az m00 ezek szerint az α m0 utáni szakaszán van, és ezzel találtunk az α-n olyan csúcsot, amelyre 1., 2., 3. fenn áll az i-dik lépést követ®en. Egy útkeresés helyességének kritériuma az, hogy ha van megoldási út egy δ -gráfban, akkor talál egy megoldást. Ezt az általános gráfkeres® algoritmusra csak véges δ -gráf esetén lehet bebizonyítani.
32.4. tétel.
Ha egy véges δ -gráfban létezik s → t megoldás (t ∈ T ), akkor a GK egy megoldás megtalálásával terminál.
Bizonyítás. Tekintsünk egy s → t megoldási utat. Amíg a t célcsúcsot nem
terjesztjük ki, addig a 32.3. szerint (legyen a lemmabeli n csúcs most a t célcsúcs) a NYÍLT halmaz mindig tartalmaz egy csúcsot err®l az útról, azaz a GK nem terminálhat üres NYÍLT halmazzal. De az 32.2. tétel miatt mindenképpen terminálnia kell. Így ezt nem teheti meg másképpen, mint (vagy a t, vagy egy másik) célcsúcs kiterjesztésével.
Gyakorlatok
32.2-1.
Tervezzünk egy olyan eljárást, amely segítségével egy a NYÍLT halmazba visszakerült csúcs keres® gráfbeli leszármazottait újra korrektté lehet tenni.
32.3. Nevezetes kiértékel® függvények Egy gráfkeres® algoritmus keresési stratégiája a kiértékel® függvényben ölt testet. Ez dönt arról, hogy egy adott pillanatban a már megismert startcsúcsból kivezet® utak közül melyiken lépjen tovább a keresés. Ezeknek az utaknak az utoljára felfedezett csúcsai alkotják a NYÍLT halmazt, amelyeket a kiértékel® függvény értékei alapján rangsorolhatunk: a függvény mutatja meg, melyik nyílt csúcsot kell kiterjeszteni, azaz melyik a legjobb, a legígéretesebb a cél elérése szempontjából, legalábbis a rendelkezésre álló információ alapján. A kiértékel® függvény alapvet®en kétféle lehet: nem-informált, amelyik csak általános, bármelyik feladat gráfkereséssel történ® megoldásánál alkalmazható szempontot vesz gyelembe; illetve heurisztikus, amelyik a
32.3. Nevezetes kiértékel® függvények
1609
konkrét megoldandó feladattól származó többlet ismeretet is tartalmaz.
32.3.1. Nem-informált gráfkeresések Nem-informált kiértékel® függvényt használ például a mélységi gráfkeresés, (M GK ) amely a vizsgált reprezentációs gráf minden élének súlyát egységnyinek tekinti, és a kiértékel® függvénye az egyes csúcsokba vezet® útköltségnek, az algoritmus által számolt g függvénynek mínusz egyszerese, azaz f = −g . Egységnyi élsúlyok esetén a g költségfüggvény egy csúcsban a startcsúcsból odavezet® már megtalált út hosszúságát mutatja, így a −g kiértékelés mindig a startcsúcstól legtávolabb es®, a legmélyebben fekv® nyílt csúcs kiterjesztését részesíti el®nyben. (Azonos mélység¶ csúcsok esetén véletlenszer¶en, vagy valamilyen másodlagos szempont alapján dönt.) Ezt a keresést gyakran egy mélységi korláttal is ellátják, így ha létezik a mélységi korlátnál nem hosszabb megoldási út, akkor a keresés megoldás megtalálásával terminál, hiszen egy δ -gráfnak a startcsúcsból a mélységi korláton belül elérhet® része egy véges gráf, arra pedig érvényesek a 32.2. és a 32.4. tételben kimondott állítások. A mélységi gráfkeresés nem azonos a depth-rst kereséssel, amelyet visszalépéses keresésnek is szoktak nevezni. Kétség kívül sok a közös a két keresésben. Ugyanazon mélységi korlátot alkalmazva hasonló sorrendben vizsgálják meg a reprezentációs gráf csúcsait, ugyanazt a megoldás találják meg, ha van megoldás. Ezeken a hasonlóságokon túllépve azonban az egyik egy gráfkeresés, amelyik a reprezentációs gráfnak a már felfedezett részét teljes egészében eltárolja, a másik pedig csak egyetlen, a startcsúcsból kivezet® aktuális utat tart nyilván. Ennek következtében a mélységi gráfkeresés jóval több memóriát igényel, de kevesebb lépésben képes terminálni, mint egy visszalépéses keresés. Egyrészt azért, mert gráfkeresésként bármelyik pillanatban át tud váltani az eddig preferált út vizsgálatáról egy másikra, és ehhez nem kell számos visszalépést elvégeznie. Másrészt azért, mert nem fordulhat vele el® az, hogy egy már korábban bejárt részt újra megvizsgáljon, ha oda egy másik úton is eljut, mint azt teszi a visszalépéses keresés, amely elfelejti azokat a csúcsokat, ahol már korábban járt, de visszalépett onnan. A mélységi gráfkeresés ellentétpárja a szélességi gráfkeresés. Ennek kiértékel® függvénye a startcsúcshoz legközelebb es® nyílt csúcsot preferálja, azaz f = g . Belátható, hogy ha van megoldás, akkor az SZGK még végtelen nagy δ gráfokban is terminál és a legrövidebb megoldást találja meg. Az is megmutatható, hogy ez a keresés sosem fog egy csúcsot egynél többször kiterjeszteni, mert amikor el®ször kiterjeszti, már ismeri az odavezet® legrövidebb utat, aminél kés®bb nem tud már rövidebbet találni, és így nem teheti vissza a NYÍLT halmazba sem.
1610
32. Heurisztikus gráfkeres® algoritmusok
Az egyenletes gráfkeresés (EGK ) a szélességi gráfkeresés általánosítása abban az értelemben, hogy az élek eredeti súlyát veszi gyelembe. Az f = g kiértékel® függvény ekkor a legolcsóbb úton elért nyílt csúcsnak fog kedvezni, hiszen a g általában egy csúcsba vezet® út költségét, és nem a hosszát mutatja. Bebizonyítható, hogy az EGK végtelen δ -gráfokban mindig az optimális megoldást találják meg, ha van megoldás. Az is igazolható, hogy a keresés egy csúcsot legfeljebb egyszer terjeszt ki, mert amikor el®ször kiterjeszti már ismeri az odavezet® legolcsóbb utat. Ezeket a tulajdonságokat a kés®bb kimondott és bizonyított általánosabb tételek speciális eseteként kaphatjuk meg. Mind a szélességi, mind az egyenletes gráfkeresés alternatív megoldást nyújt arra problémára, hogy mi történjen a gráfkeresés során egy olyan csúcs inkorrekt leszármazottaival, amelyikhez minden eddiginél olcsóbb (rövidebb) utat találunk. Nos, ezeknél az algoritmusoknál ez probléma nem fordulhat el®. Eredményesség szempontjából az EGK a lehet® legjobb keresés, de hatékonyság szempontjából csapnivaló. Az a stratégia, amely mer® óvatosságból mindig a startcsúcshoz legközelebbi nyílt csúcsot terjeszti ki, szélességében terjeszkedve próbálja meg felfedezni a reprezentációs gráfot, ami nemcsak sok iterációs lépést, azaz nagy futási id®t igényel, hanem tekintélyes méret¶ memóriát is. Ez még az egyszer¶bbnek számító 15-ös kirakó játék esetében is azt eredményezi, hogy nem tudjuk ezzel a módszerrel megoldani a feladatot, mert a számítógépeink kapacitása ezt nem teszi lehet®vé. Az EGK nagyon hasonlít Dijkstra legrövidebb utak algoritmusára, de néhány fontos dologban különbözik attól. Az EGK végtelen gráfokon is m¶ködik, ezért nem is képes az összes startcsúcsból kivezet® optimális utat megtalálni, az inicializálása nem tartalmazhatja azt a lépést, amelyben a Dijkstra algoritmus a gráf összes csúcsához egy kezdeti költséget rendel. Ugyanakkor a végtelen gráfok élsúlyaira fenn kell állnia a δ -tulajdonságnak szemben azzal, hogy a Dijkstra algoritmusnál csak a negatív élsúlyokat zárjuk ki.
32.3.2. Heurisztika a gráfkeresésben Az MI problémák szempontjából azok a kiértékel® függvények az érdekesek, amelyek egy nyílt csúcs ígéretességének megítélésekor heurisztikus ismeretekre is támaszkodnak. A heurisztika a gráfkeres® algoritmusoknál olyan függvény formájában fogalmazható meg, amelyik minden csúcsra megbecsüli annak a legolcsóbb útnak a költségét, amelyen az adott csúcsból célcsúcsba lehet eljutni. A továbbiakban ezt a h : N → < függvényt heurisztikus függvénynek hívjuk majd. A 15-ös kirakó játék esetén jól ismert heurisztika a rossz helyen lev® lapok
32.4. Az A algoritmus család
1611
számát megadó függvény (W ), amelyik az aktuális állásra megadja, hogy hány olyan lapocskát tartalmaz, amelyik nem a célállásbeli helyén található. Az, hogy hány lapot kell még a helyére eljuttatni a hátralev® lépések számára ad egy durva alsó becslést. A játék egy másik nevezetes heurisztikus függvénye a Manhattan függvény (P ), amelyik az aktuális állásbeli lapocskáknak a célál lásbeli helyükt®l vett Hamilton távolságainak összegét adja meg. A Hamilton távolság egy lapocskára azt mutatja meg, hogy minimálisan hány lépésben kell azt vízszintes és függ®leges irányban elmozdítani ahhoz, hogy a célbeli helyére kerüljön. A P tehát azt írja le, hogy hány lépést kell minimálisan végezni a cél eléréséig. Ez is alsó becslés, de jóval nomabb, mint a W . A kés®bbi fejezetekben több nevezetes heurisztikus gráfkeresést mutatunk majd. Itt csak a példa kedvéért említünk egyet. El®retekint® gráfkeresésnek (best rst) szokták nevezni azt, amikor a kiértékel® függvény egy az egyben a heurisztikus függvény, azaz egy csúcs kiterjesztésre történ® kiválasztásakor csak azt vizsgáljuk, hogy mekkora költség¶ út vezet az adott csúcsból egy célcsúcsba. Az ilyen f = h kiértékel® függvény¶ keresésekr®l nem sok mindent lehet általában elmondani. Végtelen reprezentációs gráfokban nem biztos, hogy terminálnak, még akkor sem, ha létezik megoldási út. Ennek ellenére vannak olyan speciális feladatok, ahol sikeresen alkalmazzák.
Gyakorlatok
32.3-1.
Mutassuk meg, hogy ha van megoldás, akkor a SZGK egy δ -gráfban mindig a legrövidebb megoldást találja meg. 32.3-2. Adjunk heurisztikákat az el®z® alfejezet gyakorlataiban szerepl® problémákhoz.
32.4. Az A algoritmus család Talán a leghíresebb heurisztikus gráfkeres® algoritmusok azok, amelyek kiértékel® függvényei egy csúcsnál együttesen veszik gyelembe a startcsúcsból oda vezet® út költségét és a célba vezet® hátralev® út költségét. Miel®tt bemutatnánk ezeket, bevezetünk néhány jelölést, amelyet a kés®bbiekben használni fogunk. Találkoztunk már az idevezet® optimális költség függvényével g ∗ : N → < , amely egy tetsz®leges csúcsra megadja annak a legolcsóbb útnak a költségét, amelyen a startcsúcsból az adott csúcsba lehet eljutni, azaz g ∗ (n) := c∗ (s, n). Könny¶ látni, hogy a gráfkeres® algoritmus által számolt g költség függvény a G-beli csúcsokra egy fels® becslése a g ∗ -nak, azaz minden N -beli n csúcsra g(n) ≥ g ∗ (n). Ha nincs s → n út, akkor g ∗ (n) = ∞.
1612
32. Heurisztikus gráfkeres® algoritmusok
Legyen d∗ : N → < az idevezet® optimális távolság függvénye, amely egy tetsz®leges csúcsra megadja annak a legrövidebb útnak a hosszát, amelyen a startcsúcsból az adott csúcsba lehet eljutni, azaz minden N -beli n csúcsra d∗ (n) := minα∈{s→n} |α|. Nyilvánvaló, ha létezik s → n út, akkor minimális hosszúságú is létezik, hiszen hogy δ -gráfokban az adott hosszúságnál rövidebb startcsúcsból induló utak száma véges. Ezen kívül a g ∗ (n) ≥ d∗ (n) · δ is fenn áll, hiszen az optimális s →∗ n út nem biztos, hogy a legrövidebb is. Ha viszont nem létezik s → n út, akkor d∗ (n) = ∞. Legyen h∗ : N → < a hátralev® optimális költség függvénye, amely egy tetsz®leges csúcsra megadja annak a legolcsóbb útnak a költségét, amelyen az adott csúcsból egy célcsúcsba lehet eljutni, azaz minden N -beli n csúcsra h∗ (n) := c∗ (n, T ). Ha nincs n → T út, akkor h∗ (n) = ∞. A h heurisztikus függvény ennek a h∗ függvénynek egy becslése, azaz minden N -beli n csúcsra h(n) ≈ h∗ (n). Legyen f ∗ : N → < az optimális költség függvénye, amely egy tetsz®leges csúcsra megadja annak a legolcsóbb útnak a költségét, amelyen a startcsúcsból indulva az adott csúcsot érintve célcsúcsba lehet jutni, azaz minden N -beli n csúcsra f ∗ (n) := g ∗ (n) + h∗ (n). Könny¶ látni, hogy egy optimális megoldási út mentén az f ∗ állandó, hiszen ennek az útnak minden csúcsán ugyanaz a startcsúcsból induló célcsúcsba vezet® optimális út megy keresztül, így mindegyikre azonos az f ∗ függvény értéke. Ennél fogva az is igaz, hogy az összes optimális megoldási út minden n csúcsára fenn áll, hogy f ∗ (n) = f ∗ (s), azaz f ∗ (s) az optimális megoldás költségét adja meg. Most pedig térjünk rá az A algoritmus-család bemutatására.
32.4.1. A algoritmus Az A algoritmus olyan gráfkeres® algoritmus, amelyik kiértékel® függvénye
f = g + h alakú, ahol g az algoritmus által számolt költségfüggvény, h pedig egy nem-negatív heurisztikus függvény. Meggyelhet®, hogy az additív kiértékel® függvény tagonként ad becslést az f ∗ = g ∗ + h∗ optimális költségfüggvényre, hiszen g ≥ g ∗ és h ≈ h∗ . A heurisztikus függvényre tett nem-negatív megszorítás fontos, de könny¶ biztosítani. Ha ugyanis negatív becslést adunk egy csúcsnál a célba vezet® hátralev® optimális út költségére (ami soha nem lehet negatív), akkor ott a becslést könnyen korrigálhatjuk nullára. Talán meglep®, de paradox módon A algoritmus a nem-informált EGK is, hiszen annak f = g kiértékel® függvénye felírható f = g +0 alakban, ahol a második tag formailag egy nem-negatív heurisztikus függvény, amely nullával becsüli minden hátralev® útnak a költségét. Természetesen sokkal érdekesebbek azok a példák, ahol egy konkrét fel-
32.4. Az A algoritmus család
1613
adathoz készítünk heurisztikus függvényt. A 15-ös kirakó játék rossz helyen lev® lapok számát megadó W függvénye és a hátralev® lépések számát becsl® P biztos nem negatív, így a g + W és g + P kiértékel® függvényt használó gráfkeresések A algoritmusok. Vizsgáljuk most meg, milyen eredményt várhatunk az A algoritmustól.
32.5. lemma.
Ha egy δ -gráfban az A algoritmus nem terminál, akkor bármelyik NYÍLT halmazába bekerült csúcsot véges lépésen belül kiterjeszti.
Bizonyítás.
Mindenekel®tt vegyük észre, hogy egy NYÍLT halmazba került csúcs kiértékel® függvényértéke egyenesen arányos a csúcsnak a startcsúcshoz viszonyított mélységével: minél mélyebben van, annál nagyobb ez az értéke. (Jelölje d(n) a g(n) költség¶ s → n út hosszát.)
f (n) = g(n) + h(n) ≥ g(n) ≥ d(n) · δ ≥ d∗ (n) · δ Tegyük fel, hogy bekerül a NYÍLT halmazba egy m csúcs. Ennek kiterjesztését csak azon csúcsok el®zhetik meg, amelyek kiértékel® függvényértéke kisebb vagy egyenl®, mint f (m). Ennek azonban az a feltétele, hogy ezek a csúcsok ne legyenek mélyebben, mint f (m)/δ . Ha ugyanis egy n csúcs mélyebben van, azaz d∗ (n) > f (m)/δ , akkor az f (n) ≥ d∗ (n) · δ miatt f (n) > f (m), azaz n csúcs nem el®zheti meg m csúcsot a kiterjesztésnél. Egy adott szintnél magasabban elhelyezked® csúcsok száma egy δ gráfban viszont véges. A véges sok f (m)/δ -nál magasabban lev® csúcs a 32.1. lemma következményeként véges lépésben végleg kiterjeszt®dik, azaz elt¶nik a NYÍLT halmazból, és ezután már semmi nem áll az m csúcs kiterjesztésének útjába. Erre a lemmára támaszkodik az alábbi tétel bizonyítása.
32.6. tétel.
Ha egy δ -gráfban létezik megoldás, akkor az A algoritmus egy megoldás megtalálásával terminál.
Bizonyítás.
Ha létezik megoldás, akkor létezik egy α = (s = n0 , n1 , n2 , . . . , nk−1 , nk = t) optimális megoldási út is. Az algoritmus kezdetben kiterjeszti az s startcsúcsot (ha az nem célcsúcs), és nyílt lesz az n1 csúcs, amelyre g(n1 ) = g ∗ (n1 ) teljesül. Az 32.5. lemma miatt n1 véges lépésen belül kiterjeszt®dik, de ezt követ®en is lesz a 32.3. lemma miatt az α úton olyan ni csúcs (0 < i ≤ k ), amely nyílt, g(ni ) = g ∗ (ni ), és minden nj (0 ≤ j < i) csúcs már zárt. Az 32.5. lemma miatt ni is véges lépésen belül kiterjeszt®dik. Folytatva ezt a gondolatsort, véges lépésben a t célcsúcs is kiterjesztésre kerül majd, és terminál az algoritmus.
1614
32. Heurisztikus gráfkeres® algoritmusok
Ez a folyamat csak abban az esetben zajlik le másképp, ha az algoritmus már korábban, a t kiterjesztése el®tt terminál. Ez azonban nem következhet be a NYÍLT halmaz kiüresedésével, hiszen annak mindig lesz egy az α útról származó eleme. Kizárólag egy másik (nem feltétlenül optimális megoldású) célcsúcs megtalálásával állhat le korábban a keresés. Összességében tehát az algoritmus biztosan talál egy megoldást. Ez a tétel lényegesen különbözik a 32.2. és a 32.4. tételek állításaitól. Nem mondja, hogy az A algoritmus mindenképpen terminál, csak rámutat arra, hogy ha létezik megoldás, akkor fog találni egyet akár még végtelen δ -gráfban is.
32.4.2. A∗ algoritmus Az A algoritmus heurisztikus függvénye egy nem-negatív értékkel becsüli a célhoz vezet® hátralev® optimális út költségét. Ha ez a függvény ráadásul alsó becslést ad, akkor egy min®ségében új algoritmushoz jutunk. Az A∗ algoritmus olyan A algoritmus, amelyik heurisztikus függvénye megengedhet® (admissible), azaz minden n ∈ N csúcsra fenn áll, hogy h(n) ≤ h∗ (n). Néz®pont kérdése, hogy az A∗ algoritmust speciális A algoritmusnak tekintjük-e (mi ezt tesszük), vagy speciális heurisztikát használó A algoritmusnak. A mi álláspontunk mellett az szól, hogy az A∗ algoritmusnak megváltoznak a tulajdonságai az A algoritmushoz képest. Könny¶ látni, hogy egy megengedhet® heurisztika minden célcsúcsban nulla értéket ad. Az EGK nemcsak A, hanem egyben A∗ algoritmus is, hiszen az azonosan nulla heurisztika biztos alsó becslést ad a hátralev® optimális út költségére. A 15-ös kirakó játék esetén a W is és a P is alulról becsüli a hátralev® lépések számát, azaz mindkett® megengedhet®. A W durvább becslést ad azzal, hogy csak a rossz, nem a célbeli helyén álló lapocskák számát mutatja, a P ennél nomabb, hiszen azt adja össze, hogy minimálisan mennyit kell különkülön a lapocskákat vízszintes és függ®leges irányban elmozdítani ahhoz, hogy a célbeli helyükre kerüljenek. Az alábbi lemma azt mondja ki, hogy a kiterjesztésre kiválasztott csúcsok kiértékel® függvényértéke nem lehet nagyobb, mint az optimális megoldás költsége.
32.7. lemma.
Az A∗ algoritmus által kiterjesztett minden n csúcsra fenn áll, hogy f (n) ≤ f ∗ (s).
Bizonyítás. Ha nincs megoldási út az algoritmus által vizsgált δ-gráfban, akkor az f ∗ (s) végtelen nagynak tekinthet®, ilyenkor az állítás triviális. Ha ∗ van megoldás, akkor legyen az α egy s → t optimális megoldási út. Amíg
32.4. Az A algoritmus család
1615
az algoritmus nem terminál (tehát a t célcsúcsot sem terjesztette ki) a 32.3. lemma miatt az α úton mindig lesz egy olyan m ∈ N csúcs, amelyik az n csúcs kiterjesztésekor éppen nyílt és g(m) = g ∗ (m). Az algoritmus az n csúcsot terjeszti ki az m ellenében, azaz f (n) ≤ f (m). Az f (m) viszont felírható g ∗ (m)+h(m) alakban, ahol a h(m) ≤ h∗ (m) a heurisztika a megengedhet®sége miatt, így f (m) ≤ g ∗ (m) + h∗ (m) = f ∗ (m) áll el®. Az f ∗ állandó egy optimális megoldási út mentén, azaz f ∗ (m) = f ∗ (s). Összeolvasva megkapjuk a bizonyítandó állítást:
f (n) ≤ f (m) = g(m)+h(m) = g ∗ (m)+h(m) ≤ g ∗ (m)+h∗ (m) = f ∗ (m) = f ∗ (s). A következ® tétel talán a leggyelemreméltóbb eredménye az egész fejezetnek.
32.8. tétel.
Ha egy δ -gráfban létezik megoldás, akkor az A∗ algoritmus egy optimális megoldás megtalálásával terminál.
Bizonyítás. Mivel az A∗ algoritmus egy speciális A algoritmus, ezért a 32.6.
tétel érvényes rá: talál megoldást. Mindössze azt kell csak megmutatnunk, hogy az általa talált megoldás optimális is. Tegyük fel indirekt módon, hogy ez nem igaz: amikor egy t célcsúcs kiterjesztésével terminál, akkor g(t) > f ∗ (s). De a 32.7. miatt (speciálisan t-re felírva) f (t) ≤ f ∗ (s). Az f (t) = g(t) + h(t), ahol a h(t) a megengedhet®ség miatt biztosan nulla, azaz g(t) ≤ f ∗ (s). Ez ellentmond az indirekt feltevésünknek.
32.4.3. Ac algoritmus A heurisztikára tett további megszorításokkal növelni lehet az A∗ algoritmus el®nyös tulajdonságait. Az Ac algoritmus olyan A∗ algoritmus, amelyik heurisztikus függvénye monoton (monotone restriction ), azaz minden (n, m) ∈ A élre fenn áll, hogy h(n) − h(m) ≤ c(n, m). A monoton tulajdonság a heurisztikus függvény által adott becslés következetességére utal. Ilyenkor ugyanis nem fordulhat el® az, hogy a heurisztika rossznak látná a cél elérésének esélyét egy csúcsból, miközben a csúcsból kis költség¶ lépéssel elért utódcsúcsot már hirtelen igen ígéretesnek tartaná. Az azonosan nulla heurisztikus függvény monoton, így már meg sem lep®dünk azon, hogy az EGK egy speciális Ac algoritmus is. De monoton tulajdonságú a 15-ös kirakó játék W és P heurisztikája is, hiszen mindkét heurisztika legfeljebb eggyel csökken egy lépés során.
32. Heurisztikus gráfkeres® algoritmusok
1616
32.2. ábra.
Példa nem mononoton megengedhet® heurisztikára (s startcsúcs, t célcsúcs).
Felvet®dhet az a kérdés, hogy van-e egyáltalán olyan megengedhet® heurisztika, amelyik nem monoton. Az alábbi 32.2. ábra egy ilyenre mutat példát. Jól látható, hogy a heurisztikus függvény minden csúcsban alulról becsli a célba vezet® hátralev® út költségét (tehát megengedhet®), de az (s, n) él mentén nem teljesül a monoton tulajdonság, hiszen h(s) − h(n) > c(s, n).
32.9. lemma.
(háromszög egyenl®tlenség) Ha a h heurisztika monoton, akkor nemcsak az élekre, hanem bármely α ∈ {n → m} útra is fenn áll, hogy h(n) − h(m) ≤ c(α).
Bizonyítás. Vegyünk egy α = (n, n1 ), (n1 , n2 ), . . . , (nk−1 , m) utat, ahol n =
n0 és nk = m. A h monoton, ezért az út éleire fenn áll a monoton tulajdonság: h(n0 ) − h(n1 ) ≤ c(n0 , n1 ) ... h(nk−1 ) − h(m) ≤ c(nk−1 , m)
Adjuk össze ezeket az egyenl®tlenségeket, és azt kapjuk:
h(n) − h(m) ≤
X
c(ni−1 , ni ) = c(α).
i=1..k
A lemma következménye, hogy bármely n, m ∈ N csúcsra a h(n)−h(m) ≤ összefüggés is teljesül. Ha ugyanis nincs n → m út, akkor c∗ (n, m) = ∗ ∞, azaz az állítás triviális, egyébként meg c∗ (n, m) az n → m út költsége, amely útra a lemma állítása ugyanúgy igaz, mint bármelyik más n → m útra.
c∗ (n, m)
32.10. tétel.
Ha egy heurisztikus függvény monoton és a célcsúcsokban nulla értéket vesz fel, akkor szükségképpen megengedhet® is.
Bizonyítás.
Rögzítsünk egy tetsz®leges n ∈ N csúcsot és mutassuk meg, hogy h(n) ≤ h∗ (n). A 32.9. lemma el®bb taglalt következménye miatt minden t ∈ T célcsúcsra is fenn áll, hogy h(n) − h(t) ≤ c∗ (n, t). Ennél fogva a legolcsóbb n → T útra is, amelynek költségét korábban a c∗ (n, T )-vel jelöltük,
32.4. Az A algoritmus család
1617
és ami deníció szerint a h∗ (n). Teljesül tehát a h(n)−h(t) ≤ h∗ (n), de feltétel volt, hogy h(t) = 0, így h(n) ≤ h∗ (n). Ennek a tételnek a gyakorlati haszna az, hogy egy Ac algoritmus felismerésénél nem kell az alkalmazott heurisztikus függvény megengedhet®ségét igazolni. Elég belátni, hogy monoton és a célcsúcsokban nulla értéket vesz fel. A monoton tulajdonság igazolása általában könnyebb a megengedhet®ség bizonyításánál, hiszen egy adott heurisztikus függvényt a szintén ismert élsúlyokkal kell összehasonlítani (h(n)−h(m) ≤ c(n, m)), szemben azzal, amikor a csak elméletben létez® hátralev® optimális költségfüggvénnyel kell összevetni (h(n) ≤ h∗ (n)).
32.11. lemma.
Amikor az Ac algoritmus egy n ∈ N csúcsot kiterjeszt, akkor már ismeri a startcsúcsból hozzá vezet® optimális utat, azaz g(n) = g ∗ (n).
Bizonyítás.
Tegyük fel indirekt módon, hogy az n kiterjesztésekor g(n) > g ∗ (n). (g(n) < g ∗ (n) nyilván nem lehetséges.) Biztos vezet a startcsúcsból út az n csúcsba, így létezik s →∗ n optimális út is. A 32.3. lemma miatt van olyan m ∈ N csúcs a vizsgált s →∗ n optimális úton, amelyre m ∈ NYÍLT és g(m) = g ∗ (m). Az indirekt feltevés miatt ez az m nem lehet azonos nnel, azaz az algoritmus az n csúcsot m ellenében választja ki kiterjesztésre, tehát f (n) ≤ f (m). Tudva, hogy f (m) = g(m) + h(m) = g ∗ (m) + h(m), és a 32.9. lemma miatt h(m) − h(n) ≤ c∗ (m, n), azt kapjuk, hogy f (m) ≤ g ∗ (m) + c∗ (m, n) + h(n). Az m csúcsot is tartalmazó s →∗ n optimális úton érvényes, hogy g ∗ (m) + c∗ (m, n) = g ∗ (n). Felhasználva az indirekt állítást is az
f (n) ≤ f (m) = g(m) + h(m) = g ∗ (m) + h(m) ≤ ≤ g ∗ (m) + c∗ (m, n) + h(n) = g ∗ (n) + h(n) < g(n) + h(n) = f (n) ellentmondásra jutunk. Ennek a lemmának egyenes következménye az alábbi tétel.
32.12. tétel.
Az Ac algoritmus m¶ködése során minden csúcs legfeljebb egyszer terjeszt®dik ki.
Bizonyítás. Nyilvánvaló, hogy ha az algoritmus g(n) = g∗ (n) mellett terjeszt
ki egy n ∈ N csúcsot, akkor nem fordulhat többé el®, hogy talál az n csúcshoz egy minden eddiginél, azaz a g ∗ (n)-nél is olcsóbb utat. Emiatt egy zárt csúcs nem kerülhet vissza a NYÍLT halmazba, tehát nem is kerülhet sor az újbóli kiterjesztésére. Így arra a korábban feltett kérdésre is választ kaptunk, hogy hogyan lehet
1618
32. Heurisztikus gráfkeres® algoritmusok
úgy irányítani egy gráfkeresést, hogy ne keletkezzenek inkorrekt csúcsok. Az inkorrekt csúcsok kialakulása ugyanis a zárt csúcsok újbóli kiterjesztésének következményei.
Gyakorlatok
32.4-1.
Mutassuk meg, hogy az A∗ algoritmus minden olyan n csúcsot kiterjeszt, amely bekerül a NYÍLT halmazba és az f (n) < f ∗ (s) teljesül rá. 32.4-2. Bizonyítsuk be, hogy ha az A∗ algoritmus egy n csúcsot f (n) kiértékel® függvényérték mellett kiterjeszt, akkor minden olyan m csúcsot kiterjeszt, amelyik bekerül a NYÍLT halmazba és az f (m) < f (n) teljesül rá.
32.4-3.
Lássuk be, hogy az Ac algoritmus által kiterjesztett csúcsok kiértékel® függvényértékei monoton növeked® számsorozatot alkotnak.
32.5. Az A∗ algoritmus hatékonyságának elemzése Láttuk, hogy az A∗ algoritmus eredményesség szempontjából a legtöbbet nyújtja: optimális megoldást talál, ha van megoldás. A továbbiakban ennek az algoritmusnak a hatékonyságát vizsgáljuk meg. A hatékonyság vizsgálat során olyan útkeresési feladatok megoldását elemezzük, amelyekhez ismerünk megengedhet® heurisztikákat (csak ekkor van ugyanis értelme az A∗ algoritmusról beszélni). Feltesszük, hogy ezen feladatoknak van megoldása, hiszen az A∗ algoritmus csak ebben az esetben terminál biztosan. Tapasztalni fogjuk, hogy a hatékonysági vizsgálataink rendhagyóak lesznek abból a szempontból, hogy sem a memória igényt, sem a futási id®t nem tudjuk a megoldandó feladat méretének, azaz a keresés tárgyát képez® reprezentációs gráf méretének függvényében megadni, hiszen a reprezentációs gráf végtelen nagy is lehet. Ezért a memória igény elemzésénél az A∗ algoritmust más útkeres® algoritmusokkal fogjuk összehasonlítani, a futási id®t pedig a memória igény függvényében értékeljük majd.
32.5.1. Memória igény Egy gráfkeres® algoritmus memória igényében az algoritmus által nyilvántartott keres® gráf mérete dominál. A keres® gráf mérete jól jellemezhet® azzal, ha csak a lezárt, azaz a ténylegesen kiterjesztett csúcsok számát vizsgáljuk. Nem számítjuk tehát ide a megtalált célcsúcsot, amelynek kiterjesztése, pontosabban kiterjesztésre történ® kiválasztása nem jár együtt az utódainak el®állításával és megvizsgálásával. Mivel a keres® gráf akkor a legnagyobb, amikor
32.5. Az A∗ algoritmus hatékonyságának elemzése
1619
a keresés terminál, ezért a memória igényt a termináláskor ismert zárt csúcsok számával adjuk meg. Kétféle vizsgálatot is végzünk. El®ször azt elemezzük, hogyan változik a memória igény akkor, ha ugyanazon feladatot eltér® heurisztikus függvények mellett oldjuk meg. Utána az A∗ algoritmust más, hasonló eredmény¶ (azaz optimális megoldást adó) útkeres® algoritmusokkal vetjük majd össze. Ez utóbbiak között lehetnek olyanok is, amelyek nem gráfkeres® algoritmusok, ezért nem biztos, hogy ugyanúgy egy lépésben terjesztenek ki egy csúcsot, mint a gráfkeresések, hanem például egyenként tárják fel annak gyerekeit. Egy csúcsot ilyenkor is csak azután tekintünk lezártnak, ha már el®állítottuk az összes gyerekét. Amíg tehát a gráfkereséseknél a kiterjesztés és a lezárás egymás szinonimái, addig más útkereséseknél csak a lezárást lehet értelmezni. Az összehasonlításoknál viszont nem egyszer¶en a zárt csúcsok számát vetjük majd össze, hanem ennél jóval er®sebb kritériumot vizsgálunk. Legyenek X és Y útkeres® algoritmusok. 1. Az X jobb Y -nál egy adott útkeresési problémára nézve , ha az X m¶ködése során az Y által lezárt csúcsok halmazának egy valódi részhalmazát zárja csak le. 2. Az X nem rosszabb Y -nál egy adott útkeresési problémára nézve , ha X m¶ködése során legfeljebb csak azokat a csúcsokat zárja le, amelyet az Y is lezár.
Különböz® heurisztikájú A∗ algoritmusok memória igényének összehasonlítása
A józan ész azt sejteti, hogy ha két heurisztika közül az egyik er®sebb, mint a másik, akkor egy algoritmus az er®sebb heurisztikával jobb, de legalább is nem rosszabb annál, amikor a gyengébb heurisztikát használja. Két heurisztika közül azt tekintjük er®sebbnek, amelyik pontosabb becslést ad a hátralev® optimális költségr®l. Ha h1 és h2 megengedhet® heurisztikák, akkor ezt leírhatja a h1 ≤ h2 összefüggés, hiszen ez már azt mutatja, hogy a h2 közelebb simul alulról a h∗ hátralev® optimális költségfüggvényhez, mint a h1 . Az alábbi deníció egy ennél szigorúbb kritériumot használ. Legyen egy (R = (N, A, c), s, T ) reprezentációval megadott olyan útkeresési problémánk, amelyre ismert a h1 illetve h2 megengedhet® heurisztikus függvény. Legyenek A1 és A2 olyan A∗ algoritmusok, amelyek rendre a h1 illetve h2 heurisztikákat használják. Azt mondjuk, hogy az A2 jobban informált, mint az A1 , ha minden n ∈ N −T csúcsra teljesül, hogy h1 (n) < h2 (n). Az alábbi tétel állítása nem váratlan: az er®sebb heurisztikát használó A∗ algoritmus nem rosszabb, mint a gyengébb heurisztikát használó. Az azonban
32. Heurisztikus gráfkeres® algoritmusok
1620
meglep®, hogy ezt milyen körülményesen lehet csak bebizonyítani.
32.13. tétel.
Legyenek A1 és A2 rendre a h1 és h2 heurisztikát használó A∗ algoritmusok. Ha A2 jobban informált, mint az A1 , akkor A2 nem rosszabb A1 -nél.
Bizonyítás.
Mutassuk meg az A2 algoritmus által lezárt csúcsokra az A2 terminálásakor nyilvántartott feszít®fabeli mélységük (szintjük) szerinti teljes indukcióval, hogy azokat a csúcsokat az A1 algoritmus is mind lezárja. A 0-dik szinten csak a startcsúcs van, amit vagy mindkett® algoritmus lezár, ha a startcsúcs nem célcsúcs, vagy egyik sem, amennyiben a startcsúcs egyben célcsúcs is. A d-edik szintig minden csúcsról feltesszük, hogy ha azt A2 lezárta, akkor A1 is. Most pedig indirekt tegyük fel, hogy a d + 1-edik szinten van olyan m ∈ N csúcs, amit csak az A2 zár le. (Megjegyezzük, hogy ha A2 lezárja az m csúcsot, akkor m nem lehet célcsúcs.) Világos, hogy m csúcsnak be kell kerülnie a NYÍLT halmazba, ahhoz, hogy A2 kiterjeszthesse. Ekkor egyrészt a 32.7. lemma miatt f2 (m) ≤ f ∗ (s) fennáll, ahol az f2 (m) az m csúcs A2 általi lezárásakor számolt kiértékel® függvényértéke. Másrészt mivel az A2 a d szinten keresztül talált utat az m csúcshoz, ezért az m csúcsnak a d szinten van egy A2 által lezárt szül®je, amelyet az indukciós feltevés miatt az A1 is lezár. Következésképpen az m csúcs az A1 m¶ködése során is bekerül a NYÍLT halmazba, de az indirekt feltevés miatt ott is marad. Amikor az A1 terminál, akkor f1 (m) ≥ f ∗ (s), ugyanis ha f1 (m) < f ∗ (s) lenne, akkor az A1 biztosan kiterjesztené az m csúcsot még az f ∗ (s) költség¶ célcsúcs kiterjesztése el®tt, ami ellentmond az indirekt feltevésnek. Harmadrészt g2 (m) ≥ g1 (m), mert az indukciós feltevés miatt az A1 biztosan feltárja az m csúcshoz vezet® A2 által talált legolcsóbb, tehát d szint alatti utat, de lehet, hogy talált egy még olcsóbbat. Itt a g1 az A1 algoritmus költségfüggvénye annak terminálásakor, g2 pedig az A2 algoritmus által számolt költségfüggvény, amikor az m csúcsot kiterjeszti. Összegezve f2 (m) ≤ f ∗ (s) ≤ f1 (m) =
g1 (m) + h1 (m) ≤ g2 (m) + h1 (m) < g2 (m) + h2 (m) = f2 (m), ami ellentmondás, és ezzel beláttuk az indukciós lépést. A fenti tétel bizonyításában ki kellett használni a jobban informáltság éles kritériumát, amely megköveteli, hogy minden n nem célcsúcsra teljesüljön a h1 (n) < h2 (n). Két heurisztika összehasonlítására gyengébb kritériumokat is használhatunk, de ezekre nem ismerünk a fenti tételhez hasonló eredményeket. Ugyanakkor a gyakorlatban, egy-egy konkrét példán meggyelhet®, hogy gyengébb kritérium alapján er®sebbnek tartott heurisztikájú A∗
32.5. Az A∗ algoritmus hatékonyságának elemzése
1621
algoritmus nemhogy nem terjeszt ki több csúcsot, hanem jóval kevesebb zárt csúccsal terminál, mint egy gyengébb heurisztikájú. Más szavakkal, az er®sebb heurisztikájú A∗ algoritmus jobb, a gyengébb heurisztikájú társánál. Példaként vegyük a 15-ös kirakó játék W és P heurisztikáit. Ezekre fenn áll, hogy W ≤ P , és vannak olyan nem célcsúcsok, ahol egyenl® a két heurisztikus érték. Nem mondhatjuk tehát, hogy a P -t használó A∗ algoritmus jobban informált, mint a W -t használó, de a konkrét futtatási eredmények a P -t használó algoritmus memória igényét jóval kisebbre mérik. Az alábbi táblázat a 15-ös kirakó játéknak néhány futtatási eredményét mutatja különböz® távolságú start és cél esetén.
Kiértékel® függvény: 6 lépés hosszú optimális megoldás esetén 13 lépés hosszú optimális megoldás esetén 21 lépés hosszú optimális megoldás esetén 30 lépés hosszú optimális megoldás esetén 34 lépés hosszú optimális megoldás esetén
g+0 117
g+W 7
g+P 6
n.a.
119
13
n.a.
3343
145
n.a.
n.a.
1137
n.a.
n.a.
3971
Ha egy feladathoz több (h1 , . . . , hk ) megengedhet® heurisztikus függvényt is ismerünk, akkor a memória igény csökkentése érdekében elkészíthetjük e függvények maximumát: minden n csúcsnál a h(n) = max(h1 (n), . . . , hk (n)) heurisztikus függvényértékkel számolunk. Az így kapott új heurisztikus függvény továbbra is megengedhet®, de jobban simul alulról a h∗ hátralev® optimális költségfüggvényhez, azaz er®sebb heurisztika, mint a komponens heurisztikák bármelyike. Ha ezzel nem is jutunk feltétlenül jobban informált A∗ algoritmushoz, de a tapasztalatok alapján ez is kevesebb csúcs lezárásával terminál majd.
Az A∗ algoritmus memória igényének összehasonlítása más útkeres® algoritmusokéval
Megengedhet® útkeres® algoritmusoknak nevezzük azokat az algoritmu-
sokat, amelyek (R = (N, A, c), s, T ) reprezentációval megadott útkeresési problémákat képesek megoldani úgy, hogy ha megengedhet® heurisztikát építünk beléjük, akkor garantáltan optimális megoldás megtalálásával terminálnak, feltéve, hogy van a problémának megoldása. Ilyen megengedhet® útkeres® algoritmus az A algoritmus, amelyet
1622
32. Heurisztikus gráfkeres® algoritmusok
megengedhet® heurisztika esetén A∗ algoritmusnak nevezünk. De jó példa az egyenletes gráfkeresés, az EGK is, amely bár nem használ heurisztikát, de garantáltan optimális megoldást talál, ha van megoldás. Megengedhet® útkeres® algoritmus az A∗∗ algoritmus, amely egy olyan gráfkeres® algoritmus, aminek kiértékel® függvénye egy n nyílt csúcshoz a visszamutató pointerekkel nyilvántartott s → n úton fekv® m csúcsok g(m) + h(m) értékeinek maximumát rendeli, azaz f (n) = maxm∈s→π n g(m) + h(m). Továbbá, ha döntenie kell egy célcsúcs és egy vele azonos függvényérték¶ másik csúcs kiválasztása között, akkor mindig a célcsúcsot választja kiterjesztésre. De nemcsak gráfkeres® algoritmus lehet megengedhet® útkeres® algoritmus. Az IDA∗ (iteratívan mélyül® A∗ ) a nevével ellentétben egy iterációba szervezett visszalépéses keresés. Egyre növeked® mélységi korlát mellett járja be a reprezentációs gráfot a mélységi bejárás elve szerint. A megengedhet® heurisztikát arra használja, hogy egyrészt vágásokkal gyorsítson a keresésen, másrészt kiszámolja, hogy a következ® iterációban mekkora mélységi korlátot kell használni ahhoz, hogy az els®ként megtalált megoldási út garantáltan optimális költség¶ legyen. Itt kell megjegyeznünk azt, hogy az ilyen nem gráfkeresést végz® megengedhet® útkeres® algoritmusok memória igénye nem a lezárt csúcsok számától függ. Az IDA∗ algoritmus, mint a visszalépésen kereséseké általában, csak az aktuális utat tartja a memóriában, memória igénye tehát a leghosszabb felderített út hosszával arányos. Azokat a lezárt csúcsokat, amelyekr®l visszalépett, elfelejti, így azok nem terhelik a memóriát. (Ugyanezért viszont az IDA∗ futási ideje jóval hosszabb lehet, mint egy gráfkeresésé, mert egy már lezárt, de elfelejtett csúcsot képes újra és újra lezárni, ráadásul az iterációba szervezés miatt ez több menetben is megismétl®dhet.) Az ilyen nem gráfkeresést végz® algoritmusoknál egy csúcs lezárását tágabban értelmezzük a csúcs kiterjesztésénél. Egy csúcs kiterjesztése során egy lépésben dolgozzuk fel annak gyerekeit; a lezárás több lépésben is történhet, és az összes gyerek feldolgozásával fejez®dik be. Az alább bemutatott memória igényt tárgyaló eredmények a lezárt csúcsok számával kapcsolatosak. Az állítások a nem gráfkeresést végz® megengedhet® útkeres® algoritmusokra is érvényesek, de csak a gráfkeresés jelleg¶ megengedhet® útkeres® algoritmusok memóriaigényének összehasonlítására alkalmasak. Egy X és Y algoritmus memória igényének összehasonlításnál továbbra is azt vizsgáljuk, hogy egy feladaton az X által lezárt csúcsok halmaza részee (nem rosszabb), vagy valódi része-e (jobb) az Y által lezárt csúcsok halmazának. Ahhoz, hogy megállapítsuk, hogy X általában jobb-e, vagy általában nem rosszabb-e mint Y , a m¶ködésüket minden olyan útkeresési prob-
32.5. Az A∗ algoritmus hatékonyságának elemzése
1623
lémára meg kell vizsgálni, amelyekhez ismerünk megengedhet® heurisztikát. Ha ugyanahhoz a feladathoz több megengedhet® heurisztika is kapcsolható, akkor érdemes (legalábbis a memóriaigény vizsgálata során) ezekre önálló feladatokként gondolni, azaz a heurisztikát amelyet eddig inkább az algoritmus speciális része volt most a feladat részének fogjuk tekinteni annak ellenére, hogy nem jelenik meg a feladat reprezentációjában. A megengedhet® heurisztikájú útkeresési feladatokat röviden megengedhet® feladatoknak fogjuk nevezni. Vizsgálataink során fontos szerep jut a megengedhet® feladatok két speciális csoportjának. Az egyik a monoton és célban nullát adó heurisztikus függvény¶ (ezek a 32.10. tétel értelmében megengedhet®ek is) feladatok lesznek. A másik csoportba azok a megengedhet® heurisztikájú feladatok tartoznak, amelyekben létezik olyan optimális megoldási út, hogy annak mentén - a célcsúcs, és esetleg a startcsúcs kivételével - minden csúcsra a h < h∗ egyenl®tlenség áll fenn. Annak eldöntésére, hogy egy feladatosztályon egy X algoritmus a memória igényt tekintve hatékonyabb-e egy Y algoritmusnál, többféle deníciót lehet használni. Az egyik sokszor használt kritérium szerint egy X algoritmus akkor uralkodik egy Y algoritmus felett egy adott feladatosztályra nézve, ha a feladatosztály minden feladatára az X nem rosszabb Y -nál. Ha emellett még az is igaz, hogy az Y nem uralkodik az X felett az adott feladatosztályra nézve (azaz legalább egy feladaton az X jobb az Y -nál), akkor az X szigorúan uralkodik Y felett az adott feladatosztályra nézve. A mi célunk az, hogy az A∗ algoritmus uralkodását vizsgáljuk a megengedhet® útkeres® algoritmusok körében, azaz nem egy algoritmust egy másikkal, hanem egy algoritmust egy algoritmus osztállyal kell összevetnünk. Tovább bonyolítja a helyzetet, hogy az A∗ algoritmus (több más útkeres® algoritmushoz hasonlóan) nem determinisztikus, hiszen el®fordul, hogy kizárólag a kiértékel® függvény értékei alapján nem lehet egyértelm¶en kiválasztani kiterjesztésre a soron következ® csúcsot a NYÍLT halmazból. (Más útkeres®, nem gráfkeres® algoritmusoknál ehhez hasonló helyzet az, amikor azt kell eldönteni, hogy egy csúcs melyik utódjára lépjünk tovább.) Az egyformán jónak t¶n® lehet®ségek közül véletlenszer¶en is választhat az A∗ algoritmus, de valamilyen másodlagos elv (tie-breaking rule) alkalmazásával a m¶ködése determinisztikussá tehet®. Ezért az A∗ algoritmusra úgy tekinthetünk, mint arra az algoritmus családra, amely az A∗ algoritmus determinisztikus változatait tartalmazza. Ennek megfelel®en kiterjesztjük az uralkodás fogalmát algoritmus osztályok (algoritmus családok) közötti összehasonlításra. Az X algoritmus osztály uralkodik az Y algoritmus osztály felett egy adott feladatosztályra nézve, ha minden feladaton az Y minden y
1624
32. Heurisztikus gráfkeres® algoritmusok
tagjára van olyan x tagja az X -nek, hogy x nem rosszabb, mint az y . Ha emellett az Y nem uralkodik az X felett adott feladatosztályra nézve (azaz legalább egy feladaton az Y bármelyik y változatához találni az X -nek olyan x változatát, amelyik jobb y -nál), akkor az X szigorúan uralkodik Y felett
az adott feladatosztályra nézve.
Ennyi el®készítés után térjünk rá annak elemzésére, hogy vajon az A∗ algoritmus (pontosabban algoritmus család) hatékonyabb-e a memória igény tekintetében az összes megengedhet® útkeres® algoritmusnál, vagy ha nem, akkor van-e nála hatékonyabb algoritmus. A továbbiakban, ha mást nem mondunk, akkor egy algoritmuson mindig megengedhet® útkeres® algoritmust értünk, feladaton pedig egy olyan megengedhet® útkeresési problémát, amelynek van megoldása. Egy A∗ algoritmus memória igényének kiszámításánál meghatározóak azok a csúcsok, amelyeket biztosan lezár. Ha egy NYÍLT halmazba került n csúcsra mindvégig az f (n) > f ∗ (s) teljesül, akkor azt a csúcsot biztosan nem terjeszti ki az A∗ , mert ez ellentmondana a 32.7. lemmának. De mi a helyzet azokkal a nyílt csúcsokkal, amelyekre f (n) ≤ f ∗ (s) áll fenn? Mivel az A∗ a megengedhet® feladatokon optimális megoldást talál, így a terminálása egy f ∗ (s) kiértékel® függvényérték¶ célcsúcs kiválasztásakor következik be. Ezért közvetlenül a terminálás el®tt már nem lehet olyan n nyílt csúcs, amelyre az f (n) < f ∗ (s) feltétel igaz lenne. Következésképpen azokat a nyílt n csúcsokat, amelyre f (n) < f ∗ (s) teljesül (ez így is marad, mivel az A∗ m¶ködése során az f (n) értéke nem n®het) biztosan lezárja az A∗ . Ahhoz viszont, hogy egy ilyen n csúcs bekerüljön a NYÍLT halmazba az is kell, hogy vezessen hozzá a startcsúcsból csupa biztosan lezárt csúcson keresztül út. Egy olyan n nyílt csúcs viszont, amelyre az f (n) = f ∗ (s) áll fenn, csak akkor kerül biztosan lezárásra, ha ezen a csúcson keresztül vezet az egyetlen optimális megoldási út. Ha ellenben van n-t elkerül® optimális megoldási út, akkor a 32.3. lemma miatt mindig lesz a NYÍLT halmazban ez utóbbi útnak egy olyan m csúcsa, amelyre fenn áll a g(m) = g ∗ (m), a h megengedhet®sége miatt pedig
f (m) = g ∗ (m) + h(m) ≤ g ∗ (m) + h∗ (m) = f ∗ (m) = f ∗ (s). Ha tehát egyszerre van a NYÍLT halmazban m és n, akkor f (m) ≤ f ∗ (s) = f (n), és az A∗ algoritmus családnak biztos van olyan tagja, amelyik ilyenkor az m-nek kedvez. Összefoglalva, egy feladat reprezentációs gráfjának azon csúcsait az A∗ algoritmus által biztosan lezárt csúcsoknak nevezzük, amelyekhez vezet olyan út a startcsúcsból, amelyiknek a startcsúcs kivételével minden n csúcsa valamikor nyílt lesz és az f (n) < f ∗ (s) feltétel teljesül rá. A startcsúcs kivételét ebben a meghatározásban az indokolja, hogy amen-
32.5. Az A∗ algoritmus hatékonyságának elemzése
1625
nyiben az nem célcsúcs, akkor biztosan lezárja valamennyi gráfkeres® algoritmus, így az A∗ algoritmus is, még f (s) = f ∗ (s) esetén is.
32.14. lemma.
A monoton és célban nulla értéket adó heurisztikájú feladatokon bármelyik megengedhet® útkeres® algoritmus lezárja azokat a csúcsokat, amelyeket az A∗ algoritmus biztosan lezár.
Bizonyítás. Tegyük fel indirekt módon azt, hogy van olyan ((N, A, c), s, T )
feladat egy h monoton és célban nulla heurisztikával, hogy annak egyik n ∈ N csúcsát az A∗ minden változata lezárja, de egy Y megengedhet® útkeres® algoritmus nem. Ebben a feladatban kell lennie az n csúcsot elkerül® optimális megoldási útnak is, különben az Y algoritmus nem találhatna optimális megoldást (hiszen ha nem zárja le az n-t, akkor nem vizsgálja meg az utódait sem), ami ellent mond annak, hogy Y egy megengedhet® útkeres® algoritmus. Mivel pedig a g ∗ (n) + h(n) ≤ f (n) mindig igaz, és valamikor f (n) < f ∗ (s) is, így a g ∗ (n) + h(n) < f ∗ (s) is fenn áll. Vezessünk be két jelölést. Legyen D = g ∗ (n) + h(n), és C = f ∗ (s), amelyekre a fentiek szerint D < C teljesül. Konstruáljunk egy új feladatot az eddig vizsgált ((N, A, c), s, T ) feladat felhasználásával. Egészítsük azt ki egy új célcsúccsal (t), és egy új (n, t) éllel, rendeljünk az új élhez is súlyt és az új célcsúcshoz heurisztikus értéket. Az új feladat tehát ((N ∪ t, A ∪ (n, t), c), s, T ∪ t), amelynek c súlyfüggvénye azonos az eredeti feladat súlyfüggvényével attól eltekintve, hogy kiterjesztjük az új élre is: c(n, t) = h(n)+(C −D)/2. Kiterjesztjük az eredeti feladat heurisztikus függvényét is az új feladatra úgy, hogy az új célcsúcsban legyen nulla: h(t) = 0. Megmutatható, hogy az új feladat heurisztikája monoton és célban nulla érteket vesz fel. Ehhez egyrészt látjuk, hogy a heurisztika az eddigi célcsúcsokon kívül az új célcsúcshoz is nulla értéket rendel, másrészt elég megmutatni, hogy az eddigi éleken kívül az új él mentén is monoton tulajdonságú. Ez az új él súlya miatt adódik:
h(n) − h(t) = h(n) ≤ h(n) + (C − D)/2 = c(n, t) Megjegyezzük, hogy az új feladat heurisztikája a 32.10. tétel értelmében ezek szerint megengedhet® is. Az új feladatnak egyetlen optimális megoldása az s →∗ t út, ugyanis ennek költsége (g ∗ (t)) kisebb az eredeti feladat optimális megoldásának költségénél (C -nél):
g ∗ (t) = g ∗ (n) + c(n, t) = g ∗ (n) + h(n) + (C − D)/2 = D + (C − D)/2 = (C + D)/2 < C.
1626
32. Heurisztikus gráfkeres® algoritmusok
Az Y nem zárja le az n csúcsot, ezért az s →∗ t megoldást sem találhatja meg. Ez ellentmondás, hiszen az Y megengedhet® útkeres® algoritmus, tehát optimális megoldást kellene találnia egy megengedhet® feladaton (az új feladat pedig ilyen). Ennek a lemmának a következménye az alábbi tétel.
32.15. tétel.
A monoton és célban nullát adó heurisztikájú feladatokra nézve az A∗ algoritmus család uralkodik a megengedhet® útkeres® algoritmusokon.
Bizonyítás.
Válasszunk egy tetsz®leges monoton és célban nulla heurisztikájú F feladatot és egy Y megengedhet® útkeres® algoritmust. Ha az F feladatban létezik olyan optimális megoldási út, hogy annak minden csúcsát biztosan lezárja az A∗ algoritmus, akkor az A∗ algoritmus egyik tagja sem fog a biztosan lezárandó csúcsokon kívül mást lezárni, azaz olyan n csúcsokat, amelyekre f (n) = f ∗ (s). Az Y a 32.14. lemma miatt minden olyan csúcsot lezár, amelyet A∗ biztosan lezár, azaz Y bármelyik változatára van annál nem rosszabb A∗ változat (s®t az összes A∗ változat ilyen). Ha az F feladat nem tartalmaz el®bb jellemzett optimális megoldási utat, akkor készítsük el az A∗ algoritmusnak azt a változatát, amelyik a biztosan lezárt csúcsokon kívül csak azokat a csúcsokat zárja le, amelyek az Y (vagy annak egy változata) által talált optimális megoldási úton vannak. Más szavakkal, ha a nyílt halmazban több olyan n csúcs is van, amelyre f (n) = f ∗ (s) igaz, akkor ezek közül az Y által talált megoldási úton fekv® kiválasztását részesítsük el®nyben. Az A∗ ezen változata csak olyan csúcsokat zár le, amelyeket az Y is lezár. Sajnos az A∗ algoritmusról általánosabb esetben, azaz az összes megengedhet® feladatra nézve nem tudunk a fenti tételhez hasonló eredményt mutatni. Lehet ugyanis olyan feladatot és olyan algoritmust találni, hogy ennél az algoritmusnál nincs az A∗ algoritmusnak nem rosszabb változata. Tekintsük a szélességi gráfkeresés alábbi módosítását. A kiterjesztési sorrend a csúcsok mélységét®l függ. Egy m csúcs kiértékel® függvényértékét a csúcs els® felfedezésekor talált úton fekv® n szül®csúcsa alapján az f (m) := f (n) + 1 képlettel számoljuk majd. Ez alól egyetlen kivétel lesz: a startcsúcs "legutolsó" gyereke esetében a mélységet 2.5-re állítjuk. Ez arra szolgál, hogy a legutolsó gyereket majd csak a második szinten lev® csúcsok után válassza ki az algoritmus kiterjesztésre. A keresés a mélység mellett hasonlóan minden más gráfkereséshez külön számolja a g költségfüggvényt is, és a visszamutató pointereket is ennek megfelel®en változtatja. Amikor az algoritmus egy célcsúcsot talál, akkor nem áll le, hanem további megoldásokat keres, és a talált
32.5. Az A∗ algoritmus hatékonyságának elemzése
1627
Példa, ahol SZGK 0 nem terjeszt ki egy az A∗ által biztosan kiterjesztett csúcsot (a nem jelzett heurisztikus értékek nullák, s startcsúcs, t célcsúcs). 32.3. ábra.
legolcsóbb megoldást jegyzi meg az odavezet® út C költségével együtt. Ezt a költséget vágó heurisztikaként is felhasználja: ha ugyanis nincs remény arra, hogy egy kiterjesztésre kiválasztott n csúcson keresztül egy minden eddiginél olcsóbb megoldást találjunk, mert maxk∈{s→n} g(k)+h(k) ≥ C , akkor n csúcs gyerekeit nem állítjuk el®, az n csúcs kikerül a NYÍLT halmazból. Az itt bemutatott SZGK 0 algoritmus megengedhet®. Szélességi stratégiája miatt biztos talál megoldást, ha van, ezután pedig a vágó heurisztika garantálja a terminálást. Mivel az optimális megoldás a vágó heurisztika által kijelölt mélységi korláton belül található (ezt biztosítja a megengedhet® h függvény felhasználása) ahol a keresés minden utat megvizsgál, így biztos megtalálja az optimális megoldást. Vegyük az SZGK 0 algoritmusnak a 32.3. ábrán látható feladatra azt a változatát, amelyik jobbról balra haladva terjeszti ki egy szint csúcsait. Kiterjeszti az s csúcsot, majd a k és m csúcsokat is, de az n-t, mint legutolsó gyerekcsúcsot még nem, hanem el®bb megtalálja a t célcsúcshoz vezet® 5 költség¶ utat. Ezután pedig mivel az n-hez vezet® eddig talált legolcsóbb (nyilvántartott) úton g(m) + h(m) = 6, és C = 5, nem kerül sor az n csúcs gyerekeinek el®állítására. Ugyanezen a feladaton ellenben az A∗ algoritmus mindenképpen (minden változata) kiterjeszti az n csúcsot közvetlenül az s csúcs kiterjesztése után. Az A∗ algoritmusnak tehát nincs olyan változata, amelyik nem rosszabb az SZGK 0 bármelyik változatánál, tehát az A∗ algoritmus nem uralkodik az SZGK 0 algoritmuson a megengedhet® feladatokra nézve. Ez azt is jelenti, hogy az A∗ nem uralkodik az összes megengedhet® útkeres® algoritmuson sem a megengedhet® feladatokra nézve. De vajon van-e az összes megengedhet® útkeres® algoritmuson uralkodó
1628
32. Heurisztikus gráfkeres® algoritmusok
másik algoritmus? Az SZGK 0 biztos nem ilyen, hiszen ennek mindegyik változata kiterjeszti az m csúcsot, amelyet A∗ algoritmus egyik változata sem. Tehát nem mondhatjuk, hogy az SZGK 0 nem rosszabb az A∗ -nál, ennél fogva nem is uralkodik rajta. Ez az érdekes kölcsönhatás, amely a fenti példában az A∗ és az SZGK 0 között bekövetkezett, nem véletlen. Ezt mutatja az alábbi lemma.
32.16. lemma.
Vegyünk egy olyan megengedhet® feladatot, ahol van olyan optimális megoldási út, amely mentén minden csúcsra (a cél csúcs és esetleg a startcsúcs kivételével) fenn áll a h < h∗ feltétel. Ha egy megengedhet® útkeres® algoritmus egy Y változata nem zárja le ennek a feladatnak egy olyan csúcsát, amelyet az A∗ biztosan lezár, akkor ugyanezen feladatnak kell lennie olyan csúcsának is, amelyet Y lezár, de az A∗ algoritmus egyetlen változata sem.
Bizonyítás.
Tegyük fel indirekt módon azt, hogy a lemma állításában szerepl® F = ((N, A, c), s, T ) megengedhet® feladatnak van egy olyan A∗ által biztosan kiterjesztett n csúcsa, amelyet egy megengedhet® útkeres® algoritmus Y változata nem zár le, és egyébként Y csak csúcsokat zár le, amelyet A∗ is lezár. Konstruálni fogunk egy másik olyan megengedhet® feladatot, amelyben az Y nem tud optimális megoldást találni, és ez ellentmond annak, hogy Y egy megengedhet® útkeres® algoritmus. Figyeljük meg az A∗ algoritmust az F feladat megoldása során, és jelöljük D-vel azon csúcsok kiértékel® függvényértékeinek maximumát, amelyeket az A∗ biztosan kiterjeszt; C -vel az F feladat optimális megoldási költségét; G-vel a termináláskor el®állt keres® gráfot; cG (m, k)-val a G-beli legolcsóbb m → k út költségét (ha nincs ilyen út, akkor ez végtelen). Nyilván fennáll, hogy D < C. Legyen F 0 = (G∪(n, t), c), s, T ∪t) olyan feladat, amelynek c súlyfüggvénye azonos az F feladat súlyfüggvényével attól eltekintve, hogy kiterjesztjük az új élre is: c(n, t) = (D + C)/2 − cG (s, n). (Az s → n út biztos létezik, és a c(n, t) költség pozitív, hiszen cG (s, n) ≤ D < C .) Kiterjesztjük az eredeti feladat heurisztikus függvényét is az új feladatra úgy, hogy az új célcsúcsban legyen nulla: h(t) = 0. Ett®l kezdve meg kell különböztetni az F és az F 0 feladatban c∗ függvényeit, és ennek megfelel®en a h∗ és g ∗ függvényeit is. Ennek érdekében használjuk az a c∗F 0 , h∗F 0 , gF∗ 0 jelöléseket. A c∗F 0 (m, k) = cG (m, k) kivéve azokat az eseteket, amikor a k speciálisan a t célcsúcs. Ilyenkor c∗F 0 (m, t) = c∗F 0 (m, n) + c(n, t). Mivel az új feladat s → t megoldási útjának költsége kisebb, mint az eredeti feladat optimális megoldási költsége:
c∗F 0 (s, t) = c∗F 0 (s, n)+c(n, t) = c∗F 0 (s, n)+(D+C)/2−cG (s, n) = (D+C)/2 < C,
32.5. Az A∗ algoritmus hatékonyságának elemzése
1629
ezért az új feladat egyetlen optimális megoldása az s →∗ t út lesz. A h heurisztikus függvény az F 0 feladaton is megengedhet®, azaz G minden u csúcsára h(u) ≤ h∗F 0 (u). Ugyanis azoknak az u csúcsoknak, amelyeket az F feladaton m¶ködve nem terjesztett ki az A∗ (azaz g(u)+h(u) ≥ C ), nincsenek utódai a G-ben. Ezért ha u nem célcsúcs, akkor h∗F 0 (u) = ∞; ha u célcsúcs, akkor h(u) = 0, tehát h(u) ≤ h∗F 0 (u) biztos teljesül. Mi a helyzet azokkal az u csúcsokkal, amelyeket az A∗ kiterjesztett (azaz g(u) + h(u) ≤ D < C )? Ha feltesszük, hogy az egyik ilyen u csúcsra a h(u) > h∗F 0 (u) fennáll, akkor a
g(u) + h(u) > g(u) + h∗F 0 (u) ≥ c∗F 0 (s, u) + c∗F 0 (u, T ) == (D + C)/2 > D, ellentmondáshoz jutunk. Feltételezésünk szerint az F feladat megoldásakor az Y algoritmus nem zárja le az n csúcsot, így az F 0 feladatnál is hasonlóan kell m¶ködnie. Ha viszont Y elkerüli az n csúcs kiterjesztését, akkor nem fogja megtalálni az s →∗ t optimális megoldást, amely ellentmond annak, hogy megengedhet® útkeres® algoritmus. A 32.3. ábra feladata éppen a lemmában vázolt feladat típusba tartozik. A lemma arra mutat rá, hogy nem is olyan könny¶ olyan algoritmust találni, amelyen az A∗ nem uralkodik, de az uralkodik A∗ -on. A lemma megmutatta, hogy melyek azok a megengedhet® feladatok, amelyekre nézve az A∗ algoritmus ugyan nem uralkodik minden megengedhet® útkeres® algoritmuson, de olyan algoritmus sincs, amely akárcsak egy ilyen feladaton jobb lenne az A∗ algoritmusnál. Ez a gondolatsor vezet el az alábbi tételhez.
32.17. tétel.
Nincs olyan megengedhet® útkeres® algoritmus, amelyik uralkodna az összes megengedhet® útkeres® algoritmuson a megengedhet® feladatokra nézve.
Bizonyítás.
Ha lenne ilyen uralkodó Y algoritmus, akkor ennek a 32.16. lemmában vázolt speciális megengedhet® feladatokra nézve is uralkodnia kell többek között az A∗ algoritmuson is. De éppen a 32.16. lemma miatt egyetlen ilyen speciális megengedhet® feladaton sem teheti meg, hogy olyan csúcsot ne zárjon le, amelyet A∗ lezár. Az Y tehát ugyanazokat a csúcsokat zárja le a speciális megengedhet® feladatokon is (így a 32.3. ábra feladatán is), mint az A∗ algoritmus. De az 32.3. ábra feladatán az SZGK 0 algoritmus nem zár le olyan csúcsot, amelyet az A∗ algoritmus minden változata is, és az Y is lezár. Ez pedig cáfolja, hogy Y uralkodna minden megengedhet® útkeres® algoritmuson, hiszen az SZGK 0 algoritmuson nem uralkodik. Megmutattuk, hogy az A∗ algoritmus nem talál legy®z®re a megengedhet® útkeres® algoritmusok között két speciális megengedhet® feladatokra nézve. Hiszen az A∗ uralkodik a monoton és célban nulla heurisztikájú feladatokra
1630
32. Heurisztikus gráfkeres® algoritmusok
nézve, és nincs nála jobb az olyan feladatokon sem, ahol van olyan optimális megoldási út, amely mentén minden csúcsra (a cél csúcs és esetleg a startcsúcs kivételével) fennáll a h < h∗ feltétel. És bár igaz, hogy A∗ nem uralkodik a megengedhet® útkeres® algoritmusokon az összes megengedhet® feladatra nézve, de erre más algoritmus sem képes. A teljes képhez hozzátartozik, hogy ismerünk olyan algoritmust, amely uralkodik, s®t szigorúan uralkodik az A∗ algoritmuson a megengedhet® feladatokra nézve. Ez a már említett A∗∗ algoritmus. A vizsgált két speciális megengedhet® feladatosztály feladatain az A∗∗ "csak" nem rosszabb az A∗ nál, de lehet e speciális feladatosztályokon kívül olyan megengedhet® útkeresési feladatot találni, ahol jobb. Ugyanakkor a 32.17. tétel értelmében ez az algoritmus sem uralkodik az összes megengedhet® útkeres® algoritmuson a megengedhet® útkeresési feladatokra nézve.
32.5.2. Futási id® Egy gráfkeresés futási ideje egyfel®l az iterációk számától (a kiterjesztések számától) függ, másfel®l egy-egy iterációs lépés végrehajtási idejét®l. Az utóbbi azonban csak a konkrét feladatok ismeretében becsülhet®, mert ez egyrészt a kiterjesztend® csúcs kiválasztásának, pontosabban az ehhez használt heurisztikus függvényérték kiszámításának idejét®l, másrészt egy csúcs átlagos gyerekszámától függ. A futási id® általános elemzésénél mindezek miatt csak az iterációk számát vizsgáljuk. Az iterációk (kiterjesztések) számát a zárt (kiterjesztett) csúcsok számának függvényében fogjuk megadni. Jelölje a továbbiakban k a termináláskor meglév® zárt csúcsok számát. Nyilvánvaló, hogy legalább k iterációra szükség van ahhoz, hogy k zárt csúcs létrejöhessen. A futási id®re adható alsó korlát tehát k . Ez éles korlát, hiszen ha az A∗ algoritmus speciálisan egy Ac algoritmus, akkor egy csúcsot legfeljebb egyszer terjeszt csak ki (32.11. tétel). Sajnos k zárt csúcs el®állítása a k -nál általában jóval több kiterjesztést igényel. Egy csúcs elvileg annyiszor terjeszt®dhet ki, ahány különböz® körmentes út vezet hozzá a startcsúcsból. Persze ehhez az is kell, hogy mind az élsúlyok, mind a heurisztikus függvényértékek olyanok legyenek, hogy a csúcsot el®ször a legdrágább út mentén találja meg a keresés és utána ki is terjessze, majd egy kicsivel olcsóbb út mentén és újra kiterjessze, és csak a legutoljára találja meg a legolcsóbb utat, amely után megint ki kell terjeszteni. Az 32.4. ábrán látható úgynevezett Martelli-féle gráfnak k + 1 darab csúcsa van. A csúcsokat megsorszámozzuk: 0-dik a startcsúcs, a k -dik a célcsúcs. A gráfban a lehet® legtöbb olyan élt vesszük fel, hogy a startcsúcsból egy közbees® csúcsba a lehet® legtöbb körmentes úton lehessen eljutni. A k −1-dik
32.5. Az A∗ algoritmus hatékonyságának elemzése
1631
csúcsból a célcsúcsba egyetlen él vezet:
N = {ni | i = 0 . . . k} , T = {nk } A = {(ni , nj ) | 0 ≤ i < j < k} ∪ {(nk−1 , nk )} c(ni , nj ) = 2k−2−i − 2k−1−j + j − i (0 ≤ i < j < k) h(ni ) = c(n0 , nk−1 ) − c(n0 , ni ) + k − 1 − i (0 < i < k), h(n0 ) = h(nk ) = 0 c(nk−1 , nk ) = h(n1 ) − k + 2
32.4. ábra.
Martelli gráfja.
Ebben a gráfban minden csúcs a lehet® legtöbbször terjeszt®dik ki: annyiszor, ahány különböz® út vezet hozzá: a startcsúcs egyszer, az i-edik csúcs 2i−1 -szer (1 ≤ i ≤ k ) terjeszt®dik ki. A kiterjesztések száma összesen:
1 + 20 + . . . + 2i−1 + . . . + 2k−2 = 1 + (2k−1 − 1)/(2 − 1) = 2k−1 Ez az éles fels® határ meglehet®sen elrettent®. Természetesen másik heurisztikus függvényt használva még egy ilyen gráfon is lényegesen kedvez®bb lehet a kiterjesztések számának aránya a zárt csúcsok számához képest. Nézzük meg például az azonosan nulla heurisztikát, azaz az EGK -t a fenti Martelli-féle gráfon. Ne felejtsük el azonban, hogy más heurisztika esetén a zárt csúcsok száma is változhat. Extrém esetben az is elképzelhet®, hogy h1 heurisztika mellett k1 zárt csúccsal terminál az A∗ algoritmus, és ehhez k1 kiterjesztést végez, míg h2 heurisztika mellett k2 zárt csúcs mellett 2k2 −1 kiterjesztést végez, de k2 jóval kisebb, mint k1 , ezért 2k2 −1 < k1 .
32. Heurisztikus gráfkeres® algoritmusok
1632
A futási id® csökkentése
Habár az A∗ algoritmus több mutató (eredményesség, memória igény) alapján egy jól használható heurisztikus gráfkeresésnek t¶nik, a futási idejére adott exponenciális fels® korlát nem teszi túl vonzóvá. Ezért érdemes megvizsgálni azt, hogy milyen alternatívái vannak a futási id® javításának. A javítások egyik irányát az jelöli ki, ha kiemeljük az A∗ algoritmus m¶ködésében azt a jelenséget, hogy ugyanaz a csúcs nagyon sokszor kerülhet kiterjesztésre. Ezt hatékonyan lehet csökkenti például úgy, hogy egy úgynevezett másodlagos kiértékel® függvényt vezetünk be az els®dleges f kiértékel® függvény mellé. Amikor vannak olyan nyílt csúcsaink, amelyek f szerinti értékei kisebbek, mint valamelyik korábbi kiterjesztésnél a kiterjesztett csúcs f értéke, akkor ezen nyílt csúcsok közül a másodlagos kiértékel® függvény segítségével választunk kiterjesztend® csúcsot. Ez az ötlet arra épít, hogy a g tulajdonképpen egy g + 0 alakú függvény, amelynek azonosan nulla heurisztikája monoton, és ez egy csúcs legfeljebb egyszeri kiterjesztését eredményezi. Ezt a tulajdonságot próbálja meg a B algoritmus legalább lokálisan érvényesíteni. B algoritmusnak azt a gráfkeres® algoritmust nevezzük, amelyet az A algoritmusból kapunk úgy, hogy egyrészt kiegészítjük azt egy F változóval, amelyre kezdetben az F := f (s) értékadást hajtjuk végre, másrészt lecseréljük az A algoritmus n := minf (NYÍLT) utasítását az alábbira:
if minf (NYÍLT) < F then else n := minf (NYÍLT) : F endif
n := ming (m ∈ NYÍLT | f (m) < F ) := f (n)
Meg lehet mutatni, hogy a B algoritmus majdnem minden tekintetben azonos tulajdonságú az ugyanolyan heurisztikát használó A∗ algoritmussal (megengedhet® heurisztika esetén optimális megoldást talál, ha van megoldás; ugyanazokat a csúcsokat zárja le, mint az A∗ algoritmus), egyedül a futási ideje más, legrosszabb esetben is csak polinomiális, k lezárt csúcs mellett az 1 2 2 k -tel arányos. Ugyanazon csúcs többszöri kiterjesztése a használt heurisztika nem monoton tulajdonságának következménye. Ezért a B 0 algoritmus úgy módosítja futás közben a megvizsgált csúcsok megengedhet® heurisztikus függvényértékeit, hogy a már vizsgált élek mentén teljesüljön a monoton tulajdonság. Ez a módszer tehát változtatja a heurisztikát, úgy is fogalmazhatunk, hogy m¶ködése közben megtanul egy jó heurisztikát. Ráadásul ezt úgy éri el, hogy sohasem csökkenti, hanem növeli a heurisztikus függvény egy-egy csúcsban felvett értékét. Ezáltal a heurisztika, miközben meg®rzi megenged-
32.5. Az A∗ algoritmus hatékonyságának elemzése
1633
het® tulajdonságát, egyre közelebbi alsó becslést ad a h∗ hátralev® optimális költségfüggvényre. (Ráadásul a B 0 algoritmus még egy másik módját is alkalmazza a heurisztika növelésének.) Ha ezáltal az algoritmus nem is lesz a korábbi deníciónk értelmében jobban informált, de egy fokozatosan er®söd® heurisztikához jut, amely a tapasztalatok szerint csökkenti a lezárt csúcsok számát. Megmutatható például, hogy a B 0 algoritmus nem zár le több csúcsot, mint a B algoritmus. Ennek megfelel®en a memória igény függvényében megadott futási id® sem romlik, s®t javul. Összehasonlítva például a Martelliféle gráfokon a B és B 0 algoritmust, látható, hogy amíg a B négyzetes futási idej¶, addig a B 0 csak lineáris. Habár konstruálhatók olyan gráfok is, amelyeken a B 0 is négyzetes futási idej¶ a termináláskor számolt zárt csúcsok számához képest, de még itt is legalább kétszer olyan gyorsak, mint a B algoritmus. A B 0 algoritmus ötletét használja fel a korábban már említett A∗∗ algoritmus is, amelyik kiértékel® függvénye egy csúcs kiértékelésénél nem az eredeti heurisztikus függvényt, hanem annak megnövelt értékét veszi gyelembe, anélkül, hogy módosítaná a csúcsokhoz rendelt heurisztikus függvényértékeket. A futási id® csökkentésének másik módját adják a mohó gráfkeresések, amelyek a lezárt csúcsok számát csökkentik. Ezek a gráfkeresések nem akkor terminálnak, amikor egy célcsúcsot kiválasztanak kiterjesztésre, hanem már akkor, amikor a célcsúcs megjelenik a NYÍLT halmazban. Ez nyilvánvalóan jelent®sen gyorsítja a futási id®t, és csökkenti a memória igényt. Igaz, hogy általában egy mohó A∗ algoritmus az alkalmazott heurisztika megengedhet®ségének ellenére sem talál feltétlenül optimális megoldást, de megmutatható, hogy ha a célcsúcsok szül®csúcsaiban a heurisztikus függvény értéke pontos becslést ad, azaz éppen a hátralev® él költségével azonos, akkor az algoritmus garantáltan optimális megoldást talál. Példa erre a 15-ös játék W vagy P heurisztikája, amelyek a célcsúcs el®tti csúcsokban 1 értéket vesznek fel.
Gyakorlatok
32.5-1.
Mutassuk meg, hogy az A∗∗ algoritmus megengedhet®. (Tipp: Próbáljuk meg a 32.5. és a 32.7. lemmák állításait az A∗∗ algoritmusra belátni.) 32.5-2. Hajtsuk végre a Martelli gráfra (32.4. ábra) az A∗ algoritmust, majd a B algoritmust. Írjuk le mindkét algoritmusnál az egymás után kiterjesztett csúcsokat (ugyanazt a csúcsot akár többször is) a kiterjesztésükkor számolt f kiértékel® függvényértékükkel. Hasonlítsuk össze a két algoritmusnál kapott sorozatot.
1634
32. Heurisztikus gráfkeres® algoritmusok
Feladatok 32-1 Csökken® kiértékel® függvény
Egy gráfkeres® algoritmus kiértékel® függvényét csökken®nek nevezzük akkor, ha egy nyílt csúcs függvény értéke csak akkor változik meg és akkor is csak csökkenhet, ha az eddiginél olcsóbb utat találunk hozzá. Szemléltessük a gráfkeres® algoritmusok m¶ködését egy olyan grakonnal, amelyik vízszintes tengelyén a kiterjesztett csúcsokat tüntetjük fel (ugyanazt a csúcsot akár többször is), függ®leges tengelyén pedig az éppen kiterjesztett csúcs aktuális kiértékel® függvényértékét jelöljük. Válasszunk ki a m¶ködési grakon függvény értékeinek sorozatából egy monoton növeked® részsorozatot úgy, hogy belevesszük e legels® (a startcsúcs kiterjesztésekor számolt) értéket, majd mindig a soron következ® nem kisebb értéket. Hívjuk ezeket az értékeket küszöbértékeknek, a hozzájuk tartozó csúcsot küszöbcsúcsnak, két szomszédos küszöb csúcs között végzett kiterjesztéseket ároknak. Bizonyítsuk be, hogy egy csökken® kiértékel® függvényt használó GK keres® gráfja minden küszöbcsúcs kiterjesztéskor korrekt. (Tipp: Mutassuk meg, hogy a küszöbcsúcsok kiterjesztésekor nem lehet zárt csúcs a NYÍLT halmazban.)
32-2 A∗ versus A∗∗ algoritmus
Lássuk be, hogy az A∗∗ algoritmus szigorúan uralkodik az A∗ algoritmus felett a megengedhet® feladatokra nézve. Ehhez egyrészt mutassuk meg, hogy minden megengedhet® feladathoz és az A∗ algoritmus bármelyik változatához van az A∗∗ algoritmusnak olyan változata, amelyik csak olyan csúcsokat zár le, amelyeket az A∗ változat is lezár; másrészt konstruáljunk olyan feladatot, ahol az A∗ algoritmus összes változatára lehet az A∗∗ algoritmusnak jobb változatát találni.
32-3 A∗∗ algoritmus memória igénye
Bizonyítsuk be, hogy nincs olyan megengedhet® útkeres® algoritmus, amelyik szigorúan uralná az A∗∗ algoritmust a megengedhet® feladatokra nézve. Ehhez elég lenne belátni azt, hogy ha lenne olyan Y megengedhet® algoritmus, amelyikhez egy megengedhet® feladaton az A∗∗ algoritmus bármelyik változatára találunk olyan csúcsot, amelyet az Y nem zár le, de az adott A∗∗ változat igen, akkor lehet olyan megengedhet® feladatot is találni, ahol legalább az egyik A∗∗ változat nem fog egy olyan csúcsot lezárni, amelyet az Y biztosan lezár.
32. fejezet megjegyzései
1635
Megjegyzések a fejezethez A heurisztikus keresés fogalmát el®ször Newell és Ernst [84] használta 1965ben egy olyan keresésre, amelynek kiértékel® függvénye a hátralev® út költségére adott becslést. Az A∗ algoritmust Hart, Nilsson és Raphael publikálta [52] 1968-ban. Nilsson foglalja össze az A∗ algoritmust érint® javításokat, módosításokat [87] 1971-ben, majd 1980-ban [86], ahol megjelenik az általános gráfkeres® algoritmus, annak nem informált és heurisztikus osztályozása, és az A, A∗ , Ac algoritmusok didaktikus összefoglalása. Pearl 1984-ben [93] írt könyvet a heurisztikus keresésekr®l, Pearl és Korf [94] pedig 1987-ben tekintette át a keresési technikákat. Magyar nyelven magyar szerz®k több olyan könyvet is írtak, amelyek a heurisztikus kereséseket foglalják össze: Fekete, Gregorics és Nagy 1990-ben megjelent könyve [38] és a Futó Iván szerkesztésében 1999-ben megjelent könyv [46], illetve magyarra lefordítva is lehet olvasni e témakörr®l Russell és Norvig [100] könyvében. A heurisztikus gráfkeresések memória igényével Bagchi és Mahanti [10] 1983-ban, majd Dechter és Pearl 1985-ben [29] foglalkozott behatóan. Utóbbiak jellemezték az A∗∗ algoritmust. Martelli 1977-ben [77] mutatott rá arra, hogy az A∗ algoritmus futási ideje legrosszabb esetben exponenciális, és kidolgozta a B algoritmust, melynek futási ideje legrosszabb esetben négyzetes. Mér® 1984-ben [76] dolgozta ki a B 0 algoritmust, amely mintául szolgált az A∗∗ algoritmushoz. Az IDA∗ algoritmust Korf publikálta [67] 1985-ben. A mohó A∗ algoritmushoz kapcsolódó eredményeiket Ásványi és Gregorics 1998-ban [106] tették közzé.
33. Összehasonlítás-alapú rangsorolás
Az informatika egyik gyakran el®forduló feladata különböz® objektumok rangsorolása. Ennek a témakörnek a kutatói gyakran foglalkoznak különböz® alkalmazásokkal, például a biológiában Landau, kémiában Hakimi, hálózatokkal Kim, Toroczkai, Miklós, Erd®s L. Péter és Székely A. László, Newman és Barabási, összehasonlítás-alapú döntéshozással, Bozóki Sándor, Fülöp János, Kéri Gerzson, Poesz Attila, Rónyai Lajos és sporttal kapcsolatban Iványi, Antal, Lucz Loránd, Pirzada Shariefuddin, Sótér Péter és Zhou Guofei. Népszer¶ módszer két (esetleg három) elem összehasonlítása minden lehetséges módon és bizonyos számú pont kiosztása az összehasonlított objektumok között. Ebben a fejezetben általános modellt javaslunk hasonló rangsorolási feladatokhoz és a modellhez kapcsolódva els® sorban a foksorozatok tesztelésével, helyreállításával és leszámlálásával foglalkozunk.
33.1. Bevezetés a szuperversenyekhez Legyenek n és m pozitív egészek, a = (a1 , . . . , am ), b = (b1 , . . . , bm ) és k = (k1 , . . . , km ) nemnegatív egészekb®l álló vektorok, ahol ai ≤ bi (i = 1, . . . , m) és 0 < k1 < · · · < km . Egy (a, b, k, m, n)-szuperverseny egy x × n méret¶ M mátrix, melynek oszlopai a versenyben részt vev® versenyz®knek felelnek meg (a rangsorolandó objektumokat reprezentálják), sorai pedig az objektumok összehasonlításainak. Az M mátrix megengedett elemei a {0, 1, . . . , bmax } ∪ {∗} halmazhoz tartoznak, ahol mij = ∗ azt jelenti, hogy a Pj játékos nem résztvev®je az i-edik sornak megfelel® összehasonlításnak, míg mij = k azt jelzi,hogy Pj az i-edik sornak megfelel® összehasonlításban (meccsen) k pontot kapott. A mátrix elemeire teljesül, hogy bmax = max1≤i≤n bi . Az M mátrix i-edik oszlopában lév® elemek összegét (a csillagokat nullaként vesszük számításba) di -vel jelöljük és a Pi játékos pontszámának nevezzük: x X di = mij (i = 1, . . . , x). (33.1) j=1
A d(d1 , . . . , dn ) sorozatot az adott verseny pontvektorának, míg a
33.1. Bevezetés a szuperversenyekhez
1637
pontszámok növekv®en rendezett sorozatát pontsorozatnak nevezzük és az s = (s1 , . . . , sn ) módon jelöljük. A szuperversenyek különböz® sportok pontszámait kombinálják. Például Magyarországon népszer¶ek a sakk-bridzs, sakk-tenisz és a tenisz-bridzs versenyek. Adott sportot jellemez a megengedett pontszámok halmaza. Például teniszben a megengedett eredmények halmaza Stenisz = {0 : 1}, sakkban Ssakk = {0 : 2, 1 : 1}, labdarúgásban Sfootball = {0 : 3, 1 : 1}, az ulti egyszer¶sített változatában pedig Sulti = {(0, 1, 1), (0, 0, 2). Különböz® lehetséges pontozások vannak egyéni teniszversenyre, például Setenisz = {(0, 2, 2, 2), (1, 1, 1, 3)}. Az Si sport egy meccsén résztvev® játékosok számát ki -vel, az egy meccsen kiosztható pontok számának minimumát ai -vel, maximumát bi -vel jelöljük. Ha egy szuperverseny egyetlen sport meccseib®l áll, akkor a a, b és k vektorok helyett az egyszer¶bb a, b és k jelöléseket használjuk. Ha a játékosok száma nem lényeges, vagy a szövegkörnyezet meghatározza, akkor az n paramétert elhagyjuk. Ha a kiosztott pontok tetszés szerint oszthatók két egész részre, akkor az adott sport teljes , egyébként hiányos . Ennek a deníciónak megfelel®en a a sakk teljes (2,2)-sport, míg a labdarúgás hiányos (2,3)-sport. n Mivel az n elemet tartalmazóhalmaz k -elem¶ részhalmazt tartalmaz, k n egy (a, b, k, n)-verseny k meccsb®l áll. Ha minden meccset lejátszanak, akkor a verseny befejezett, egyébként befejezetlen . Ebben a fejezetben csak befejezett versenyekkel foglalkozunk, és többnyire teljes versenyekkel (kivéve a labdarúgást). A 33.1. ábra egy teljes sakk-ulti-bridzs szuperverseny eredményeit tartalmazza. 4Ebben 4 a példában n = 4, a = b = (2, 2, 6), k = (2, 3, 4) és 4 x = 2 + 3 + 4 = 11, a pontvektor (7, 3, 8, 10) és a pontsorozat (3, 7, 8, 10). Ebben a fejezetben az el®írt pontsorozatokkal rendelkez® szuperversenyek különböz® típusai létezésének feltételeit és el®állítási módszereit vizsgáljuk. A következ® alfejezetben (33.2. alfejezet) bevezetés az (a, b)-versenyekhez, amelyet az (1, 1)-versenyek (33.3. alfejezet), az (a, a)-versenyek (33.5. alfejezet), majd végül az általános (a, b)-versenyek (33.4. alfejezet) létezését elemz® részek követnek. A ??. alfejezetben különbségsorozatokkal, a ??. alfejezetben pedig szuperversenyekkel foglalkozunk. A ??. alfejezetben speciális hiányos versenyeket, a labdarúgó versenyeket, végül a ??. alfejezetben szuperversenyeket elemzünk.
Gyakorlatok
33.1-1. 33.1-2.
Jellemezzük az ismert és lehetséges multiversenyeket. Becsüljük meg az adott típusú versenyek számát.
33. Összehasonlítás-alapú rangsorolás
1638
33.1. ábra.
meccs/játékos P1 -P2 P1 -P3 P1 -P4 P2 -P3 P2 -P4 P3 -P4
P1 1 0 0 * * ∗
P2 1 * * 0 0 *
P3 * 2 * 2 * 1
P4 * * 2 * 2 1
P1 -P2 -P3 P1 -P2 -P4 P1 -P3 -P4 P2 -P3 -P4
1 0 * 0 1
0 * 1 0 1
* 2 0 2
P1 -P2 -P3 -P4
1 1 1 * 3
Összpontszám
7
3
8
10
1
Egy sakk-ulti-bridzs verseny pontmátrixa n = 4 játékos esetén.
33.2. Bevezetés az (a, b)-versenyekhez Legyenek a, b (a ≤ b) és n (2 ≤ n) nemnegatív egészek és legyen T (a, b, n) olyan általánosított versenyek halmaza, amelyekben minden, különböz® játékosokból álló pár elemei legalább a és legfeljebb b éllel vannak összekötve. A T (a, b, n) halmaz elemeit (a, b, n)-versenyeknek nevezzük. A T ∈ T (a, b, n) verseny (gráf) kifokainak d = (d1 , d2 , . . . , dn ) sorozatát pontvektornak nevezzük. Ha d elemei nemcsökken® sorrendben vannak, akkor a sorozatot T pontsorozatának nevezzük. Nemnegatív egészek tetsz®leges q = (q1 , . . . , qn ) vektorát multigráfos vektornak (vagy pontvektornak) nevezzük, ha létezik olyan hurokmentes multigráf, melynek fokvektora q, d-t pedig digráfos vektornak (vagy pontvektornak ) nevezzük, ha létezik olyan hurokmentes multigráf, melynek kifokvektora d. Egy nemcsökken®en rendezett multigráfos vektort multigráfos sorozatnak, egy nemcsökken®en rendezett dimultigráfos vektort pedig dimultigráfos sorozatnak (vagy pontsorozatnak ) nevezzük. Ha van olyan egyszer¶ gráf, illetve egyszer¶ digráf, melynek foksorozata/kifoksorozata d, akkor d gráfos, illetve digráfos. A T versenyben a Pi játékostól a Pj játékoshoz men® élek számát mij -vel (1 ≤ i, j ≤ n) jelöljük, az M = [1. .n, 1. .n] mátrixot pedig a T verseny pontmátrixnak nevezzük. Ebben a fejezetben els® sorban irányított gráfokkal foglalkozunk és
33.3. El®írt pontsorozattal rendelkez® (1, 1)-versenyek létezése
1639
követjük Moon könyvének, valamint Reid cikkeinek terminológiáját követjük. Ha adott vonatkozásban a, b és n rögzítve vannak vagy nem lényegesek, akkor egyszer¶en versenyt mondunk (a, b, n)-versenyek helyett. Az els® kérdés: hogyan jellemezhetjük az (a, b)-versenyek pontsorozatait? Vagy, más szavakkal: nemnegatív egészek adott d sorozatához milyen feltételek teljesülése esetén létezik olyan (a, b)-verseny, melynek kifoksorozata q? A választ a 33.4. alfejezetben adjuk meg. Ha T egy (a, b)-verseny, melynek pontmátrixa M = [1. .n, 1. .n], akkor legyen E(T ), F (T ) és G(T ) deníciója a következ®: E(T ) = max1≤i,j≤n mij , F (T ) = max1≤i<j≤n (mij + mji ) és g(T ) = min1≤i<j≤n (mij + mji ). Jelölje ∆(q) az olyan versenyek halmaza, amelyeknek foksorozata d, és legyen e(D), f (D) és g(D) deníciója a következ®: e(D) = {min E(T ) | T ∈ ∆(q)}, f (q) = {min F (T ) | T ∈ ∆(q)} és g(D) = {max G(T ) | T ∈ ∆(q)}. A továbbiakban a következ® rövid jelöléseket is alkalmazzuk: E, F, G, e, f, g és ∆. Hulett, Will, Woeginger, Kapoor, Polimeni, és Wall, Tripathi et al. vizsgálták az el®írt foksorozattal rendelkez®, minimális csúcsszámú gráfok konstrukciójának módszereit. Hasonló a mini-max feladat , ahol a következ® kérdésekre keressük a választ: ha adott nemnegatív egészek d sorozata,
•
•
•
hogyan számítható e és hogyan konstruálható meg egy olyan T ∈ ∆ verseny, amelyre e jellemz®? A 33.4.3. alfejezetben képletet adunk e kiszámításához, majd a ??. alfejezetben egy algoritmust javaslunk, amely el®állít egy megfelel® versenyt; Hogyan számítható ki f és g ? A ??. alfejezetben jellemezzük az f és g értékeket, a ??. alfejezetben algoritmust javaslunk f és g gyors kiszámítására, a ??. alfejezetben pedig lineáris id® alatt számítjuk ki f -et és g -t. Hogyan konstruálhatunk olyan T ∈ ∆ versenyt, amelyre f és g jellemz®? A ??. alfejezetben algoritmust javaslunk a megfelel® verseny el®állítására.
33.3. El®írt pontsorozattal rendelkez® (1, 1)-versenyek létezése A legegyszer¶bb szuperverseny a klasszikus verseny (tournament ), jelölésünk szerint az (1, 1, n)-verseny. El®ször tekintsük Landau klasszikus tételét, amellyel az (1, 1)-versenyek pontsorozatait karakterizálta. Ez a tétel kés®bb meglehet®sen nagy gyelmet kapott: például közel egy tucat bizonyítása jelent meg. Reid 1966-os cikke ezek többségét ismerteti.
33. Összehasonlítás-alapú rangsorolás
1640
33.1. tétel.
(Landau, 1953) Nemnegatív egészek q = (q1 , . . . , qn ) sorozata akkor és csak akkor pontsorozata egy (1, 1, n)-versenynek, ha minden I ⊆ {1, . . . , n} részhalmazra teljesül X |I| qi ≥ , (33.2) 2 i∈I
továbbá az |I| = n esetben egyenl®ség áll fenn.
Bizonyítás.
Lásd például Thomassen 1981-es vagy Griggs és Reid 1999-es bizonyítását. Landau ezen tétele szép szükséges és elégséges feltételt tartalmaz, azonban kedvez®tlen esetben exponenciális id®t igényel az alkalmazása. Ha rendezetlen pontvektor helyett a nemnövekv®en rendezett q = (q1 , . . . , qn ) pontvektort vizsgáljuk, akkor q monotonitásának köszönhet®en a (33.2) Landau-egyenl®tlenségek segítségével a 33.1. tétel alábbi következményét írhatjuk fel.
33.2. következmény.
(Landau, 1953) Nemnegatív egészek q = (q1 , . . . , qn ) nemcsökken® sorozata akkor és csak akkor pontsorozata egy (1, 1, n)versenynek, ha k X k qi ≥ (33.3) 2 i=1
minden i = 1, . . . , n indexre, továbbá a k = n esetben egyenl®ség is teljesül.
Bizonyítás. Szükségesség. Ha nemnegatív egészek q sorozata egy T (1, 1, n)-verseny pontsorozata, akkor a sorozat els® k elemének összege egyrészt a {v1 , . . . , vk } csúcsok által indukált W részverseny minden meccsét, másrészt a W és a T −W játékosai közötti meccseket. Ezért az összeg legalább annyi, mint W éleinek száma, azaz k(k−1) . Továbbá, mivel az összeg T minden 2 élét pontosan egyszer veszi gyelembe, az n pontszám összege n(n−1) . 2 Elégségesség (Thomassen, 1981). Legyen n a legkisebb egész, amelyre van olyan, nemnegatív egészekb®l álló, s1 = [s1 , . . . , sk ] nemcsökken® sorozat, amely kielégíti a Landau-tétel feltételeit, de nincs hozzá (1, 1, n)-verseny, melynek pontsorozata q. Az ilyen sorozatok közül válasszunk ki egy olyat, amely a lexikograkusan legkisebb. El®ször azt az esetet tekintsük, amelyben adott k < n egészre k X k si = . (33.4) 2 i=1
n minimalitása miatt az s1 = [s1 , . . . , sk ] sorozat pontsorozata egy T1 (k)
33.3. El®írt pontsorozattal rendelkez® (1, 1)-versenyek létezése
1641
versenynek. Továbbá
m m+k X X m+k k m (sk+i − k) = si − mk ≥ − − mk = 2 2 2 i=1
(33.5)
i=1
minden 1 ≤ m ≤ n − k indexre, és az m = n − k esetben egyenl®ség áll fenn. Ezért n minimalitása miatt a s2 = [sk+1 − k, sk+2−k , . . . , sn − k] sorozat pontsorozata egy T2 versenynek. T1 és T2 diszjunkt unióját képezve és hozzáadva a T2 -b®l T1 -be vezet® éleket az s pontsorozatot kapjuk. Most tekintsük azt az esetet, amikor a (33.3) egyenl®tlenségek a k < n esetben mindig teljesülnek, különösen q1 > 0) fennállása esetén. Ekkor az s3 = [s1 − 1, . . . , sn−1 , sn + 1] sorozat kielégíti a (33.3) feltételeket és q1 , s3 pontsorozata egy T3 versenynek. Legyenek u és v olyan csúcsok, melyek fokszáma sn + 1, illetve s1 − 1. Mivel az u fokszám nagyobb, mint v , a 33.5. lemma szerint a T3 versenyben van olyan P út, amely u-ból v -be megy és a hossza ≤ 2. Ha P éleit megfordítjuk, akkor olyan versenyt kapunk, amelynek pontsorozata s, ami ellentmondás. A Landau-tétel a gráfos sorozatokra vonatkozó Erd®s-Gallai tétel versenyekre vonatkozó megfelel®je. A Havel-Hakimi tétel versenyekre vonatkozó megfelel®je a következ® tétel.
33.3. tétel.
(Reid, Beineke, 1979). Nemnegatív egészek (q1 , . . . , qn ) (n ≥ 2) nemcsökken® sorozata akkor és csak akkor pontsorozata egy (1, 1, n)versenynek, ha a nemcsökken®
(q1 , . . . , qqn , qqn +1 − 1, . . . , qn−1 − 1),
(33.6)
sorozat pontsorozata valamely (1, 1, n − 1)-versenynek.
Bizonyítás. Lásd Reid és Beineke 1979-ben megjelent cikkét.
Moon 1963-ban a Landau tétel következ®, (a, a)-versenyekre vonatkozó általánosítását bizonyította.
33.4. tétel.
Moon, 1963 Nemnegatív egészek q = (q1 , . . . , qn ) nemcsökken® sorozata akkor és csak akkor pontsorozata egy (a, a, n)-versenynek, ha k X i=1
k qi ≥ a , 2
minden i = 1, . . . , n indexre, és k = n esetén egyenl®ség teljesül.
(33.7)
33. Összehasonlítás-alapú rangsorolás
1642
Bizonyítás. Lásd Moon 1963-as vagy Kemnitz és Dul 1997-es bizonyítását. 1997-ben Kemnitz és Dul új bizonyítást adott a tételre. Kemnitz and Dul bizonyítása a következ® lemmán alapul, amely Thomassen egy 1981-es eredményének kiterjesztése (Kemnitz és Dul bizonyítását ismertetjük).
33.5. lemma.
(Thomassen,1981) Legyen u egy T (a, a, n)-verseny maximális fokszámú csúcsa. Ha v a T verseny u-tól különböz® csúcsa, akkor T tartalmaz egy u-ból b-be vezet®, legfeljebb kett® hosszúságú irányított utat. P utat.
Bizonyítás. Legyenek v1 , . . . , vl T azon csúcsai, amelyekbe vezet u-ból induló
él, azaz amelyekre (u, vi ) ∈ E(T ), i = 1, . . . , l. Ha v ∈ {v1 , . . . , vl }, akkor a P út hossza |P | = 1. Egyébként ha van olyan vi , 1 ≤ i ≤ l csúcs, amelyre (vi , v) ∈ E(T ), akkor |P | = 2. Ha minden 1 ≤ i ≤ l indexre teljesül, hogy (vi , v) ∈ / E(T ), akkor van k olyan index, hogy T -ben d+ (v) ≥ kl + k > kl ≥ d+ u, ami ellentmond annak, hogy u maximális fokszámú csúcs. A 33.4. tétel bizonyítása. A (33.7 feltétel szükségessége nyilvánvaló, mert bármely k csúcs között a k2 él van, és az n csúcs között összesen a n2 él van. A (33.7 feltétel elégségességének bizonyításához feltesszük, hogy az Sn = (s1 , . . . , sn ) csúcssorozat minimális ellenpélda a tétel állításával szemben, azaz benne n minimális. tegyük fel, hogy van olyan egész m, 1 ≤ m < n, amelyre m X k si = k . (33.8) 2 i=1
n minimalitása miatt (s − 1, . . . , sn ) egy T1 (1, 1, n)-verseny pontsorozata. Tekintsük az ri = sm+1 −km, i = 1, . . . , n−m el®írással deniált P Rn−m = (r − 1, r2 , . . . , rn−m ) sorozatot. Mivel a lemma feltétele szerint m+1 i=1 si ≥ m+1 k 2 , m+1 m X X m+1 m sm+1 = si − si ≥ k −k − km, 2 2 i=1
i=1
ahonnan következik ri ≥ 0. Mivel az Sn sorozat nemcsökken®, az Rn−m sorozat szintén nemnegatív egészek nemcsökken® sorozata. Minden l (1 ≤ l ≤ n − m − 1) indexre teljesül, hogy l l l+m m X X X X l+m m l ri = (sm+1 −km) = si − si −lam ≥ k −k −lam = k , 2 2 2 i=1 i=1 i=1 i=1 (33.9)
33.4. El®írt pontsorozattal rendelkez® (a, b)-versenyek ltezése
1643
továbbá az l = n − m esetben l+m X i=1
l+m si ≥ a , 2
m X i=1
m si = a . 2
(33.10)
Ezért az Rn−m sorozat kielégíti a (33.8) feltételt, és n minimalitása miatt Rn−m egy T2 (a, a, n − m)-verseny pontsorozata. Ekkor T1 és T2 diszjunkt uniója egy T (a, a, n)-verseny, melynek pontsorozata Sn , ami ellentmond annak, hogy az Sn sorozat ellenpélda. Most tekintsük azt az esetet, amikor a (33.8) feltételben szerepl® egyenl®tlenség minden 1 ≤ m < n értékre pontos. Ebb®l többek között következik, hogy s1 > 0. S n = (s − 1, s2 , s3 , . . . , sn−1 , sn ) egész számok nemcsökken® sorozata, amely kielégíti a (33.8) feltételt. Sn minimalitása miatt S n egy T3 (a, a, n)verseny pontsorozata. Legyen u a T3 verseny sn +1 fokszámú, v pedig a verseny egy S1 − 1 fokszámú sorozata. Mivel u T3 maximális fokszámú csúcsa, T3 a 33.5. lemma szerint tartalmaz u-ból v -be vezet®, legfeljebb 2 hossszúságú irányított utat. A P út éleit megfordítva a T (a, a, n)-versenyt kapjuk, melynek foksorozata Sn . Ez az ellentmondás teljessé teszi a bizonyítást.
33.4. El®írt pontsorozattal rendelkez® (a, b)-versenyek ltezése Ebben az alfejezetben megmutatjuk, hogy tetsz®leges, nemnegatív egészek tetsz®leges q sorozatához létezik olyan (a, b)-verseny, melynek foksorozata q.
33.4.1. Tetsz®leges pontsorozattal rendelkez® verseny létezése Mivel az mij pontszámok nem korlátosak, nemnegatív egész számok tetsz®leges q nemcsökken® sorozatához könny¶ olyan (0, qn , n)-versenyt el®állítani, amelynek pontsorozata éppen q úgy, hogy G-ben a maximális fokszám legfeljebb qn .
33.6. lemma. Ha n ≥ 2, akkor nemnegatív egészek tetsz®leges q = (q1 , . . . , qn ) nemcsökken® sorozatához létezik olyan D hurokmentes irányított multigráf, melynek kifokvektora q és legnagyobb kifoka legfeljebb qn . Bizonyítás.
Legyen mn1 = dn és mi,i+1 = qi , ha i = 1, 2, . . . , n − 1, a többi mij érték pedig legyen nulla. Tetsz®leges valós súlyokat megenged® élsúlyozott gráfokat alkalmazva könny¶ lenne kiterjeszteni az (a, b, n)-versenyek denícióját tetsz®leges valós
33. Összehasonlítás-alapú rangsorolás
1644
a és b értékekre. A Naiv-konstrukció algoritmus változtatás nélkül alkalmazható valós bemen® értékek esetén is. Megjegyezzük, hogy Ore [90, 91] 1956-ban megadta az el®írt kifokokkal és befokokkal rendelkez® (1, 1)-versenyek létezésének felszükséges és elégséges feltételét. Ford és Fulkerson 1962-ben [43, 11.1. tétel] a csúcsok fokszámára vonatkozó alsó és fels® korlátokat kielégít® verseny létezésére adtak szükséges és elégséges feltételt.
33.4.2. Naiv helyreállító algoritmus D rendezésére nincs szükség. Bemen® adatok. n: a játékosok (a gráf csúcsainak) száma (n ≥ 2); q = (q1 , . . . , qn ): nemnegatív egészek tetsz®leges nemcsökken® sorozata. Kimen® adatok. M = [1. .n, 1. .n]: az el®állított verseny pontmátrixa. Munkaváltozók. i, j : ciklusváltozók. Naiv-el®állítás(n, q) 01 for i = 1 to n 02 for j = 1 to n 03 mij = 0 04 mn1 = qn 05 for i = 1 to n − 1 06 mi,i+1 = qi 07 return M Az algoritmus futási ideje legjobb és legrosszabb esetben is Θ(n2 ). Mivel az M pontmátrixnak n2 eleme van, az algoritmus aszimptotikusan optimális.
33.4.3. e kiszámítása e kiszámítása nrm nehéz feladat. A továbbiakban feltesszük, hogy q nemnegatív egészek nemcsökken® sorozata, azaz 0 ≤ q1 ≤ q2 ≤ . . . ≤ qn . Legyen h = dqn /(n − 1)e. Mivel ∆(q) bármely véges q pontvektorra véges halmaz, ezért e(q) = min{E(T )|T ∈ ∆(q)} létezik.
33.7. lemma.
(Iványi [59]) Ha n ≥ 2, akkor tetsz®leges q = (q1 , . . . , qn ) sorozathoz létezik olyan T (0, b, n)-verseny, amelyre
E≤h
and b ≤ 2h,
(33.11)
továbbá e legkisebb fels® korlátja h , és b legkisebb fels®bb korlátja 2h.
Bizonyítás. Ha a játékosok pontszáma a lehet® legegyenletesebb, azaz max mij −
1≤j≤n
min
1≤j≤n, i6=j
mij ≤ 1
for i = 1, 2, . . . , n,
(33.12)
33.5. El®írt pontsorozattal rendelkez® (a, a)-versenyek létezése
1645
akkor E ≤ h, azaz a lemmában szerepl® korlát helyes. Mivel a Pn játékosnak qn pontot kell gy¶jtenie, a skatulyaelvb®l [12, 13, 31] következik E ≥ h, azaz a korlát nem javítható. Az E ≤ h egyenl®tlenségb®l következik max1≤i<j≤n mij + mji ≤ 2h. A D = (d1 , d2 , . . . , dn ) = (2n(n − 1), 2n(n − 1), . . . , 2n(n − 1)) pontsorozat bizonyítja, hogy a b ≤ 2h fels® korlát nem javítható.
33.8. következmény.
(Iványi [57]) Ha n ≥ 2, akkor bármely q = (q1 , . . . , qn ) sorozatra teljesül e(D) = dqn /(n − 1)e.
Bizonyítás. A 33.7. lemma szerint h = dqn /(n−1)e e legkisebb fels® korlátja.
33.5. El®írt pontsorozattal rendelkez® (a, a)-versenyek létezése
34. Ponthalmazok és királyok)
Ponthalmaz
35. Szavak bonyolultsága
35.1. Egyszer¶ bonyolultsági mértékek 35.1.1. Véges szavak Legyen A egy véges, nem üres halmaz, amelyet ábécének nevezünk. Elemei bet¶k vagy szimbólumok . Egy, nem feltétlenül különböz® bet¶kb®l képzett a1 a2 . . . an füzért nevezzünk szónak . Az u = a1 a2 . . . an szó hossza n, jelölése pedig |u|. Azt a szót, amely egyetlen bet¶t sem tartalmaz, üres szónak nevezzük. Ennek szokásos jelölése ε (néha λ). Az A fölötti (azaz az A bet¶ib®l képzett) véges szavak halmazát A∗ jelöli. Gyakran használjuk az alábbi jelöléseket: n o n o A+ = A∗ \{ε}, An = u ∈ A∗ |u| = n = a1 a2 . . . an | ai ∈ A, i = 1, . . . , n , azaz A+ az A fölötti véges és nem üres szavak halmaza, míg An az n hosszúságú szavak halmaza. Természetesen A0 = {ε}. Az A∗ és A+ megszámlálhatóan végtelen halmazok. [61] Az u = a1 a2 . . . am és v = b1 b2 . . . bn egyenl®, ha • m = n és • ai = bi , ha i = 1, 2, . . . , n . Értelmezzünk az A∗ halmazon egy összef¶zés (konkatenáció ) nev¶ bináris m¶veletet. Ha u = a1 a2 . . . an és v = b1 b2 . . . bm , akkor
w = uv = a1 a2 . . . an b1 b2 . . . bm ,
|w| = |u| + |v| .
Ez a bináris m¶velet asszociatív, de nem kommutatív. Semleges eleme az ε, mivel εu = uε = u. Az ezzel a m¶velettel ellátott A∗ halmaz monoid. Rekurzívan értelmezzük a szó hatványát:
• u0 = ε • un = un−1 u, ha n ≥ 1. Egy szó primitív , ha egyetlen szónak sem hatványa, azaz u primitív, ha
u = v n , v 6= ε
⇒
n=1.
Például u = abcab primitív szó, míg v = abcabc = (abc)2 nem.
35. Szavak bonyolultsága
1648
Az u = a1 a2 . . . an szó periodikus , ha létezik egy p érték 1 ≤ p < n úgy, hogy ai = ai+p , minden i = 1, 2, . . . , n − p , és p az u szó egy periódusa. A legkisebb ilyen p érték az u szó legkisebb periódusa . Az u = abcabca szó periodikus, és legkisebb periódusa p = 3. Ha (p, q) a p és q természetes számok legnagyobb közös osztóját jelöli, a következ® tétel nyilvánvaló.
35.1. tétel. periódusa.
Ha az u periodikus szónak p és q periódusai, akkor (p, q) szintén
Az u = a1 a2 . . . an szó tükörképe (vagy fordítottja ) uR = an an−1 . . . a1 . R Nyilvánvalóan uR = u. Ha u = uR , akkor az u szót palindrom szónak vagy röviden palindromnak hívjuk. indexpalindrom Az u szó részszója v -nek, ha léteznek a p és q szavak úgy, hogy v = puq . Ha pq 6= ε, akkor u valódi részszója v -nek. Ha p = ε, akkor u el®szelete (prexuma ) v -nek, és ha q = ε, akkor u végszelete (szuxuma ) v -nek. Az u szó összes n hosszúságú részszóinak halmazát Fn (u)-val jelöljük (a jelölés alapja a részszó angol és francia factor neve). F (u) az u szó összes, nem üres részszójának a halmaza, azaz
F (u) =
|u| [
Fn (u) .
n=1
Például, ha u = abaab, akkor F1 (u) = {a, b}, F2 (u) = {ab, ba, aa}, F3 (u) = {aba, baa, aab}, F4 (u) = {abaa, baab}, F5 (u) = {abaab}.
35.2. tétel. (FineWilf).
Ha az u és v szavak n, illetve m hosszúságúak, és léteznek a p és q természetes számok úgy, hogy az up és v q szavaknak van egy közös n + m − (n, m) hosszúságú el®szelete, akkor u és v ugyanazon szónak a hatványai. Az n + m − (n, m) érték éles. Ezt a következ® példa illusztrálja, ahol az u és v szavaknak van egy n + m − (n, m) − 1 hosszúságú közös el®szelete, és u és v nem hatványai ugyanannak a szónak.
u = abaab, v = aba,
n = |u| = 5, m = |v| = 3,
u2 = abaababaab , v 3 = abaabaaba .
A tétel szerint egy 7 hosszúságú közös el®szelet megléte biztosítja, hogy u és v egyazon szó hatványai. Látható, hogy itt u2 és v 3 szavaknak van egy 6 hosszúságú közös el®szelete (abaaba), de u és v nem hatványai egyazon szónak, tehát a 35.2. tételben foglalt hossza éles.
35.1. Egyszer¶ bonyolultsági mértékek
1649
35.1.2. Végtelen szavak A véges szavak mellett végtelen (pontosabban egyik irányba végtelen) szavakkal is foglalkozunk:
ahol u1 , u2 , . . . ∈ A .
u = u1 u2 . . . un . . . ,
Az A ábécé fölötti végtelen szavak halmazát Aω jelöli. Amikor együtt vizsgáljuk a véges és végtelen szavakat, hasznos a következ® jelölés:
A∞ = A∗ ∪ Aω . A részszó, el®szelet, végszelet fogalmak a végtelen szavak esetében is a véges esethez hasonlóan értelmezhet®k. A v ∈ A+ részszója az u ∈ Aω szónak, ha léteznek a p ∈ A∗ , q ∈ Aω szavak úgy, hogy u = pvq . Ha p 6= ε, akkor p el®szelete u-nak, míg q végszelete u-nak. Itt Fn (u) szintén az u összes n hosszúságú részszóját jelöli. Példák bináris (két bet¶b®l álló) ábécé fölötti végtelen szavakra: 1) A hatványszó deníciója:
p = 010011000111 . . . |0 .{z . . 0} |1 .{z . . 1} . . . = 0102 12 03 13 . . . 0n 1n . . . . n
n
Könny¶ észrevenni, hogy
F1 (p) = {0, 1}, F2 (p) = {01, 10, 00, 11}, F3 (p) = {010, 100, 001, 011, 110, 000, 111}, . . . 2) A Champernowne-szó úgy képezhet®, hogy sorba leírjuk a természetes számokat kettes számrendszerben, és összef¶zzük ®ket:
c=0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 . . . . (A szóközöket csak azért írtuk ki, hogy jobban lehessen látni a képzés módját.) Ekkor
F1 (p) = {0, 1}, F2 (p) = {00, 01, 10, 11}, F3 (p) = {000, 001, 010, 011, 100, 101, 110, 111}, . . . 3) A véges Fibonacci-szavakat rekurzívan képezhetjük a következ® módon:
f0 = 0, f1 = 01 fn = fn−1 fn−2 , ha n ≥ 2. Ezekb®l következik: f0 = 0, f1 = 01,
35. Szavak bonyolultsága
1650
f2 = 010, f3 = 01001, f4 = 01001010, f5 = 0100101001001, f6 = 010010100100101001010. A végtelen Fibonacci-szó a véges Fibonacci-szavak határértéke: f = lim fn . n→∞
A végtelen Fibonacci-szó részszói: F1 (f ) = {0, 1}, F2 (f ) = {01, 10, 00}, F3 (f ) = {010, 100, 001, 101}, F4 (f ) = {0100, 1001, 0010, 0101, 1010}, . . . . A Fibonacci név a Fibonacci-sorozatra utal, ugyanis a véges Fibonacciszavak hossza egyenl® a Fibonacci-sorozat számaival, azaz |fn | = Fn+2 , vagyis az n-edik Fibonacci-szó (fn ) hossza egyenl® az (n+2)-dik Fibonacci-számmal. A végtelen Fibonacci-szónak sok érdekes tulajdonsága van. Például a denícióból látható, hogy nem tartalmazhatja részszóként az 11-et. Jelölje h(u) az u szó 1-eseinek számát. A végtelen u szó kiegyensúlyozott, ha tetsz®leges, azonos hosszúságú x és y részszóira igaz, hogy |h(x) − h(y)| ≤ 1, azaz x, y ∈ Fn (u) ⇒ |h(x) − h(y)| ≤ 1 .
35.3. tétel.
Az f végtelen Fibonacci-szó kiegyensúlyozott.
35.4. tétel.
Fn (f )-nek n + 1 eleme van.
Ha az u szót önmagával végtelenszer összef¶zzük, az eredmény jelölése uω . A végtelen u szó periodikus, ha létezik v véges szó úgy, hogy u = v ω . Ez a véges szó periodicitásának általánosítása. A végtelen u szó végperiodikus, ha létezik a v és w szó úgy, hogy u = vwω . A végtelen Fibonacci-szó morzmusal is el®állítható. Legyen a következ® morzmus:
χ : A∗ → A∗ ,
∀u, v ∈ A∗ .
χ(uv) = χ(u)χ(v),
Ennek alapján, elegend® a χ függvényt csupán bet¶kre értelmezni. A morzmus végtelen szavakra is kiterjeszthet®:
χ : Aω → Aω ,
χ(uv) = χ(u)χ(v),
∀u ∈ A∗ , v ∈ Aω .
A véges fn Fibonacci-szó a következ® morzmussal állítható el®:
σ(0) = 01, σ(1) = 0 . Ebben az esetben érvényes a következ® tétel.
35.1. Egyszer¶ bonyolultsági mértékek
35.1. ábra.
35.5. tétel. Bizonyítás.
1651
A B(2, 3) De Bruijn-gráf.
fn+1 = σ(fn ) .
A bizonyítás indukcióval végezhet®. Nyilvánvaló, hogy f1 = σ(f0 ). Tételezzük fel, hogy fk = σ(fk−1 ), ha k ≤ n. Mivel
fn+1 = fn fn−1 , az indukciós feltétel szerint fn+1 = σ(fn−1 )σ(fn−2 ) = σ(fn−1 fn−2 ) = σ(fn ). Innen kapjuk, hogy:
35.6. tétel.
fn = σ n (0) .
A végtelen f Fibonacci-szó a σ morzmus xpontja.
f = σ(f ) .
35.1.3. Szógráfok Legyen V ⊆ Am az A ábécé fölötti m hosszúságú szavak egy halmaza, és E ⊆ AV ∩ VA (Itt AV = {av | a ∈ A, v ∈ V }). Értelmezünk egy irányított gráfot, amelynek a csúcsai V -b®l vannak, irányított élei pedig E -b®l. Mindig létezik irányított él az a1 a2 . . . am csúcsból a b1 b2 . . . bm csúcsba, ha a2 = b1 , a3 = b2 , . . . , am = bm−1 és a1 a2 . . . am bm ∈ E , azaz, ha az els® szó utolsó m − 1 bet¶je azonos a második szó els® m − 1 bet¶jével. Ennek az élnek a címkéje a1 a2 . . . am bm (vagy a1 b1 . . . bm ).
De Bruijn-gráfok
Ha V = Am és E = Am+1 , ahol A = {a1 , a2 , . . . an }, akkor a gráf neve De Bruijn-gráf, jelölése pedig B(n, m). A 35.1. és 35.2. ábrákon a B(2, 3) és B(3, 2) De Bruijn-gráf látható. Ha elhagyjuk az élek irányítását és a hurkokat, sok csúcs esetében érdekes
35. Szavak bonyolultsága
1652
35.2. ábra.
A B(3, 2) De Bruijn-gráf.
ábrákat kapunk. A 41.2. ábrán az els® két gráf négybet¶s ábécét használ és 3, illetve 4 hosszúságú szavakat (a csúcsok száma 64, illetve 256), a harmadik gráf pedig ötbet¶s ábécét és 3 hosszúságú szavakat (a csúcsok száma 125). Egy gráfban sétának nevezzük szomszédos (irányított gráfban azonos irányítású) élek egy sorozatát . Ha egy séta élei különböz®ek, akkor vonalról beszélünk, ha pedig a csúcsok is különböz®ek, akkor útról.) A De Bruijn-gráf x1 x2 . . . xm , x2 x3 . . . xm xm+1 , . . . , z1 z2 . . . zm sétájához hozzárendeljük az x1 x2 . . . zm−1 zm címkét, amely a séta szomszédos éleinek maximális átfedése. A 35.1. ábra B(2, 3) gráfjában a 001, 011, 111, 110 séta (amely egyben út is) címkéje 001110. A B(n, m) gráf egy Hamiltonútjához (amely a gráf minden csúcsát egyszer tartalmazza) rendelt címke egy (n, m) típusú De Bruijn-szó. Például, a 0001110100 és 0001011100 szavak (2, 3) típusú De Bruijn-szavak. Egy (n, m) típusú De Bruijn-szó az összes nbet¶s m hosszúságú szót tartalmazza. Egy irányított gráf összefügg® (jelen értelmezés szerint), ha bármelyik két csúcsa között van legalább egy irányított út. Egy irányított gráf Euler-gráf, ha van benne olyan zárt vonal, amely a gráf minden élét tartalmazza. Egy csúcs befoka (kifoka) a hozzá illeszked® befutó (®t elhagyó) élek száma. Egy összefügg® irányított gráf Euler-gráf, ha minden csúcsának befoka egyenl® a kifokával.
35.7. tétel. Bizonyítás.
A B(n, m) De Bruijn-gráf Euler-gráf. a) A gráf összefügg®, mivel bármely x1 x2 . . . xm és z1 z2 . . . zm
35.1. Egyszer¶ bonyolultsági mértékek
35.3. ábra.
1653
Nem irányított, hurokmentes De Bruijn-gráfok.
csúcspár között van irányított út. Az x1 x2 . . . xm csúcsot n él hagyja el, és ezek azokba a csúcsokba futnak be, amelyeknek els® m − 1 bet¶je x2 x3 . . . xm , és amelyeknek utolsó bet¶i mind különböznek. Tehát létezik az x1 x2 . . . xm , x2 x3 . . . xm z1 , . . . , xm z1 . . . zm−1 , z1 z2 . . . zm út. b) Az x1 x2 . . . xm csúcsba az yx1 . . . xm−1 csúcsokból futnak élek, ahol y ∈ A (A a gráf ábécéje, azaz V = Am ). Az x1 x2 . . . xm csúcsból az x2 x3 . . . xm y csúcsokba futnak élek, Ahol y ∈ A. Így a gráf Euler-gráf, mivel minden csúcs befoka egyenl® a kifokával. Ebb®l a következ® tétel könnyen bizonyítható.
35.8. tétel.
A B(n, m) gráf egy Euler-vonala (amely tehát tartalmazza a gráf összes élét) a B(n, m + 1) gráf egy Hamilton-útjának felel meg. Például, a B(2, 2) gráfban a 000, 001, 010, 101, 011, 111, 110, 100 élsorozat
35. Szavak bonyolultsága
1654
Euler-vonal. Ezek ugyanakkor a B(2, 3) gráfban csúcsok, és egy Hamilton-út csúcsai ebben a sorrendben.
De Bruijn-szavakat el®állító algoritmus Sok algoritmus létezik De Bruijn-szavak el®állítására. Ezek közül a Martinalgoritmust mutatjuk be, amely az els®k közül való. Legyen adva az A = {a1 , a2 , . . . , an } ábécé. Célunk (n, m) típusú, A ábécé fölötti De Bruijn-szavak el®állítása. Az algoritmust az a1 a1 . . . a1 szóval kezdjük, majd hozzátesszük a végére | {z } m-szer
azt a legnagyobb index¶ ak bet¶t, amelyre az így kapott szó m hosszúságú végszelete el®ször jelenik meg a szóban. Folytassuk ezt a m¶veletet mindaddig, amíg lehetséges. M. H. Martin bebizonyította, hogy amikor a m¶velet már nem folytatható, akkor a kapott szó nm + m − 1 hosszúságú, és éppen egy De Bruijn-szó. Az alábbi leírásban A az n-bet¶s ábécé, míg B = (b1 , b2 , . . .) az eredmény, azaz egy (n, m) típusú De Bruijn-szó.
Martin(A, n, m) 1 for i ← 1 to m 2 do bi ← a1 3 i←m 4 repeat 5 kész ← true 6 k←n 7 while k > 1 8 do if bi−m+2 bi−m+3 . . . bi ak 6⊂ b1 b2 . . . bi B nem részszó 9 then i ← i + 1 10 bi ← ak 11 kész ← false 12 exit while 13 else k ← k − 1 14 until kész 15 return B B B = (b1 , b2 , . . . , bi ), ahol i = nm + m − 1 Mivel a fenti algoritmus az nm + m − 1 hosszúságú De Bruijn-szó minden bet¶jét el®állítja, ahol n és m egymástól független és változó, bonyolultsága nyilván exponenciális. (Ha az m-et állandónak vesszük, akkor poliunomiális.) A repeat utasítást (nm − 1)-szer végezzük el, az while utasítást legfeljebb n-szer a repeat minden lépésére. A bi−m+2 bi−m+3 . . . bi ak 6⊂ b1 b2 . . . bi tesztelés legrosszabb esetben mnm lépést igényel. Így a lépések maximális
35.1. Egyszer¶ bonyolultsági mértékek
1655
száma mn2m+1 . A fenti algoritmus alapján kijelenthetjük a következ® tételt.
35.9. tétel. Az (n, m) típusú De Bruijn-szó a legrövidebb olyan szó, amely részszóként tartalmazza az összes n-bet¶s ábécé fölötti m hosszúságú szót. Az összes (n, m) típusú De Bruijn-szó el®állítására szolgál a következ® rekurzív algoritmus. Itt A szintén egy n-bet¶s ábécé, B pedig egy (n, m) típusú De Bruijn-szó. Az algoritmus minden i pozícióra (m + 1 ≤ i ≤ nm + m − 1) meghívjuk.
Minden-De-Bruijn(B, i, m) 1 2 3 4 5 6 7
for j ← 1 to n do bi ← aj if bi−m+1 bi−m+2 . . . bi 6⊂ b1 b2 . . . bi−1 B nem részszó then Minden-De-Bruijn(b, i + 1, m) else if hossz(B) = nm + m − 1 then print B B az eredmény De Bruijn-szó exit for Az eljárás hívása:
for i = 1 to m do bi ← a1
Minden-De-Bruijn (B, m + 1, m). Az algoritmus, természetesen, exponenciális. A következ®kben értelmezzük az ún. De Bruijn-fát. A w ∈ Am gyöker¶ T (n, w) De Bruijn-fa a következ® rekurzív módon értelmezett n-áris fa:
i. Az m hosszúságú, A = {a1 , a2 , . . . .an } ábécé fölötti w szó a T (n, w) fa gyökere (és egyben levele is). ii. Ha x1 x2 . . . xm a T (n, w) fa egy levele, akkor bármely x2 x3 . . . xm a1 , x2 x3 . . . xm a2 , . . . , x2 x3 . . . xm an alakú v szavak az x1 x2 . . . xm szó leszármazottjai, ha a gyökért®l az x1 x2 . . . xm csúcsig lev® úton v nem szerepel csúcsként. iii. A ii szabályt addig alkalmazzuk, ameddig lehetséges. A 35.4. ábrán a T (2, 010) De Bruijn-fa látható.
Rauzy-gráfok
Ha az u szó végtelen, és V = Fn (u), E = Fn+1 (u), akkor a megfelel® szógráf
35. Szavak bonyolultsága
1656
35.4. ábra.
35.5. ábra.
T (2, 010) De Bruijn-fa.
A végtelen Fibonacci-szó Rauzy-gráfjai.
neve Rauzy-gráf (vagy részszógráf ). A 35.5. ábrán a végtelen Fibonacci-szó Rauzy-gráfját láthatjuk n = 3 és n = 4 esetében. Amint láttuk, a végtelen Fibonacci-szó
f = 0100101001001010010100100101001001 . . . , és F1 (f ) = {0, 1}, F2 (f ) = {01, 10, 00}, F3 (f ) = {010, 100, 001, 101}, F4 (f ) = {0100, 1001, 0010, 0101, 1010}, F5 (f ) = {01001, 10010, 00101, 01010, 10100, 00100}. A p = 01001100011100001111 . . . |0 .{z . . 0} |1 .{z . . 1} . . . , hatványszó esetében n
n
F1 (p) = {0, 1}, F2 (p) = {01, 10, 00, 11}, F3 (p) = {010, 100, 000, 001, 011, 111, 110}, F4 (p) = {0100, 1001, 0011, 0110, 1100, 1000, 0000, 0001, 0111, 1110, 1111}. A megfelel® Rauzy-gráf a 35.6. ábrán látható. Ahogy a 35.5. és 35.6. ábrákon láthatjuk, vannak olyan n hosszúságú
35.1. Egyszer¶ bonyolultsági mértékek
35.6. ábra.
1657
A hatványszó Rauzy-gráfjai
részszók, amelyek csak egyféleképpen folytathatók, hogy n + 1 hosszúságú részszókat kapjunk (egy bet¶ hozzáadásával), míg mások kétféleképpen is folytathatók (kétféle bet¶ hozzáadásával). Ez utóbbiak a speciális részszók. A v ∈ Fn (u) részszó jobb oldali speciális részszó (röviden jobb speciális részszó), ha létezik legalább két olyan a ∈ A bet¶, hogy va ∈ Fn+1 (u). Hasonlóképpen v ∈ Fn (u) bal oldali speciális részszó (röviden bal speciális részszó), ha létezik legalább két olyan a ∈ A bet¶, hogy av ∈ Fn+1 (u). Egy részszó bispeciális, ha egyben bal és jobb oldali speciális részszó is. Például, a 35.5. és 35.6. ábrák speciális részszói a következ®k: bal speciális részszók: jobb speciális részszók: bispeciális részszók:
010, 0100 (35.5. ábra), 110, 000, 111, 1110, 0001, 1111, 0011 (35.6. ábra), 010, 0010 ( 35.5. ábra), 011, 000, 111, 0111, 1111, 0011 (35.6. ábra) 010 (35.5. ábra), 000, 111, 1111, 0011 (35.6. ábra).
35.1.4. Szavak bonyolultsága A szavak bonyolultsága a részszók bet¶inek változatosságát méri. Ilyen értelemben az aaaaa szó kisebb bonyolultságú, mint az abcab szó.
35. Szavak bonyolultsága
1658
A következ® szóbonyolultságokat értelmezzük. 1) Egy szó részszóbonyolultsága vagy egyszer¶en csak bonyolultsága minden n ∈ N értékhez hozzárendeli az illet® szó n hosszúságú különböz® részszóinak a számát. Egy adott u szó n hosszúságú különböz® részszóinak a számát fu (n)-nel jelöljük.
fu (n) = #Fn (u),
u ∈ A∞ .
Ha a szó véges, akkor fu (n) = 0 minden n > |u| értékre. 2) A maximális bonyolultságot csak véges szavakra értelmezzük.
C(u) = max{fu (n) | n ≥ 1, u ∈ A∗ } . Ha u végtelen szó, akkor
Cu− (n) = min C(ui ui+1 . . . ui+n−1 ) i
az alsó maximális bonyolultság , illetve
Cu+ (n) = max C(ui ui+1 . . . ui+n−1 ) i
a fels® maximális bonyolultság. 3) A globális maximális bonyolultságot az összes n hosszúságú szavak An halmazán értelmezzük:
G(n) = max{C(u) | u ∈ An } . 4) Egy véges szó teljes bonyolultsága a szó összes nemüres részszóinak a száma (gyakran az üres szót is beszámítják, ekkor a bonyolultság értéke 1-gyel nagyobb). |u| X K(u) = fu (i), u ∈ A∗ . i=1
Végtelen szavak esetében
Ku− (n) = min K(ui ui+1 . . . ui+n−1 ) i
az alsó teljes bonyolultság,, és
Ku+ (n) = max K(ui ui+1 . . . ui+n−1 ) i
fels® teljes bonyolultság.
35.1. Egyszer¶ bonyolultsági mértékek
1659
5) Az u = u1 u2 . . . uk felbontást faktorizálásnak nevezzük. Ha minden ui (esetleg az uk -t kivéve) az ui ui+1 . . . uk szó olyan legrövidebb el®szelete, amelyik el®ször jelenik meg az u szóban, akkor ezt a faktorizálást Lempel-Ziv faktorizálásnak nevezzük. Egy ilyen faktorizálás ui részszóinak a számát az u szó Lempel-Ziv faktorizálási bonyolultságának nevezzük Például, ha u = ababaaabb, akkor a Lempel-Ziv faktorizálása: u = a.b.abaa.abb, tehát az u Lempel-Ziv faktorizálási bonyolultsága lz(u) = 4. 6) Ha az u = u1 u2 . . . uk felbontásban minden ui lehet® leghosszabb palindrom, akkor palindrom faktorizálásról beszélünk, és az ui részszók száma a szó palindrom faktorizálási bonyolultsága. Ha u = aababbabbabb = aa.babbabbab.b, akkor az u palindrom faktorizálási bonyolultsága pal(u) = 3. 7) A Pw ablakbonyolultságot csak végtelen szavakra értelmezzük. Az adott u = u0 u1 u2 . . . un . . . szó ablakbonyolultsága Pw (u, n) = # ukn ukn+1 . . . u(k+1)n−1 k ≥ 0 . A jelölésben a w az ablak angol nevére (window) utal. Ez a bonyolultság az egymás utáni n hosszúságú különböz® részszók száma.
Részszóbonyolultság
Ahogy már láttuk, a részszóbonyolultság
fu (n) = #Fn (u),
∀u ∈ A∞ , n ∈ N .
fu (n) = 0, if n > |u|. Például, az u = abacab szó esetében: fu (1) = 3, fu (2) = 4, fu (3) = 4, fu (4) = 3, fu (5) = 2, fu (6) = 1 . A 35.4. tétel szerint a végtelen Fibonacci-szó esetében:
ff (n) = n + 1 . A p = 010011 . . . 0k 1k . . . hatványszó bonyolultsága:
fp (n) =
n(n + 1) +1 . 2
Ez könnyen bizonyítható, ha kiszámoljuk a fp (n + 1) − fp (n) különbséget, amely egyenl® az összes olyan n hosszúságú részszóval, amelyik kétféleképpen folytatható, hogy n+1 hosszúságú részszó legyen. Csak a 0k 1n−k és az 1k 0n−k alakú részszók folytathatók kétféleképpen. Az els® mindig folytatható 1-gyel, de 0-val csak ha k ≤ n − k . A második mindig folytatható 0-val, és 1-gyel
35. Szavak bonyolultsága
1660
ha k < n − k . Külön választva azokat az eseteket, amikor n páros, illetve páratlan, a következ®t kapjuk:
fp (n + 1) − fp (n) = n + 1 , és innen
fp (n) = n + fp (n − 1) = n + (n − 1) + fp (n − 2) = . . . n(n + 1) = n + (n − 1) + . . . + 2 + fp (1) = +1 . 2 A
c = u0 u1 . . . un . . . = 0 1 10 11 100 101 110 111 1000 . . . = 0110111001011101111000 . . . ,
Champernowne-szó részszóbonyolultsága fc (n) = 2n .
35.10. tétel.
Ha az u ∈ Aω végtelen szó esetében létezik olyan n ∈ N, amelyre fu (n) ≤ n, akkor az u szó végperiodikus.
Bizonyítás.
fu (1) ≥ 2, különben a szó csak egyféle bet¶t tartalmazhatna. Tehát, létezik olyan k ≤ n, amelyre fu (k) = fu (k + 1). De X fu (k + 1) − fu (k) = # a ∈ A | va ∈ Fk+1 (u) − 1 . v∈Fk (u)
Ebb®l következik, hogy minden v ∈ Fk (u) részszónak csak egy folytatása lehet, hogy va ∈ Fk+1 (u). Tehát, ha v = ui ui+1 . . . ui+k−1 = uj uj+1 . . . uj+k−1 , akkor ui+k = uj+k . Mivel Fk (u) véges halmaz, és u végtelen, következik, hogy létezik i és j (i < j ), amelyekre ui ui+1 . . . ui+k−1 = uj uj+1 . . . uj+k−1 , de ebben az esetben ui+k = uj+k . Ekkor az ui+1 ui+2 . . . ui+k = uj+1 uj+2 . . . uj+k egyenl®ségb®l következik, hogy: ui+k+1 = uj+k+1 , és ezért ui+l = uj+l igaz minden l ≥ 0 értékre. Tehát u végperiodikus.
35.11. deníció. n ≥ 1 értékre.
Az u ∈ Aω szó Sturm-típusú, ha fu (n) = n + 1, minden
A Sturm-típusú szavak a legkisebb bonyolultságú végtelen és nem periodikus szavak. A végtelen Fibonacci-szó Sturm-típusú. Mivel fu (1) = 2, a Sturmtípusú szavak kétbet¶sek. A 35.10. tételb®l következik, hogy minden végtelen és nem végperiodikus
35.1. Egyszer¶ bonyolultsági mértékek
1661
szónak a bonyolultsága legalább n + 1, azaz
u ∈ Aω , u nem végperiodikus ⇒ fu (n) ≥ n + 1 . Az egyenl®ség Sturm-típusú szavakra áll fenn. A végtelen szavak hasonló módon jellemezhet®k az alsó és fels® teljes bonyolultság segítségével is.
35.12. tétel.
Ha a végtelen u szó nem végperiodikus és n ≥ 1, akkor 2 jnk n + + Cu (n) ≥ + 1, Ku (n) ≥ +n . 2 4
Az egyenl®ség Sturm-típusú szavakra áll fenn. Jelölje {x} az x törtrészét, míg bxc az egészrészét. Nyilvánvaló, hogy x = bxc + {x}. Az R függvény önmagával való n-szeri összetételét jelöljük Rn -nel. Azaz Rn = R ◦ R ◦ . . . ◦ R (n-szer). A Sturm-típusú szavakat jellemezhetjük a következ®képpen is.
35.13. tétel.
Az u = u1 u2 . . . szó akkor és csakis akkor Sturm-típusú, ha létezik egy α irracionális szám és egy z valós szám úgy, hogy az R(x) = {x+α} függvényre fennálljon, hogy 0, ha Rn (z) ∈ (0, 1 − α) , un = 1, ha Rn (z) ∈ [1 − α, 1) , vagy
1, ha Rn (z) ∈ (0, 1 − α) , 0, ha Rn (z) ∈ [1 − α, 1) . √ A végtelen Fibonacci-szó esetében α = z = 21 ( 5 + 1). Sturm-típusú szavakat el®állíthatunk billiárd golyó pályája segítségével is. Egy négyzet alakú billiárd asztal szélét®l elindítunk irracionális szög alatt egy billiárd golyót, amelyr®l feltételezzük, hogy súrlódás nélkül mozog, visszaver®dik a széleken és végtelen pályát jár be. Amikor a golyó érinti valamelyik vízszintes szélt, akkor 0-t, amikor pedig valamelyik függ®leges szélt, akkor 1-et írunk kimenetként a szóba. Ez a módszer általánosítható (s+1)-bet¶s ábécére, amikor a billiárd golyó (s + 1)-dimenziós hiperkockában mozog. Ekkor a bonyolultság
un =
min(n,s)
fu (n, s + 1) =
X i=0
n!s! . (n − i)!i!(s − i)!
Ha s = 1, akkor fu (n, 2) = fu (n) = n + 1, ha pedig s = 2, akkor fu (n, 3) = n2 + n + 1 .
35. Szavak bonyolultsága
1662
u 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101011 01010101 11111111
fu (1) 2 2 2 2 2 2 2 2 2 1
fu (2) 4 3 3 4 4 3 3 4 2 1
fu (3) 5 3 4 5 5 5 4 4 2 1
35.7. ábra.
fu (4) 5 3 4 5 5 5 5 4 2 1
fu (5) 4 3 4 4 4 4 4 4 2 1
fu (6) 3 3 3 3 3 3 3 3 2 1
fu (7) 2 2 2 2 2 2 2 2 2 1
fu (8) 1 1 1 1 1 1 1 1 1 1
Bináris szavak bonyolultsága.
Maximális bonyolultság
Az u szó maximális bonyolultsága, amint azt már láttuk,
C(u) = max{fu (n) | n ≥ 1, u ∈ A∗ }. A 35.7. ábrán néhány bináris szó bonyolultságát adjuk meg a lehetséges hosszúságokra. Innen látható, például, hogy C(00100011) = 5, C(00100100) = 3 stb. Véges szavakra érvényes a következ® érdekes tétel.
35.14. tétel.
Ha w véges szó és fw (n) a bonyolultsága, akkor létezik az m1 és m2 egész szám úgy, hogy 1 ≤ m1 ≤ m2 ≤ |w| és • fw (n + 1) > fw (n), ha 1 ≤ n < m1 , • fw (n + 1) = fw (n), ha m1 ≤ n < m2 , • fw (n + 1) = fw (n) − 1, ha m2 ≤ n ≤ |w|. A 35.7. ábra szerint, például, ha w = 00100011, akkor m1 = 3, m2 = 4, w = 00101001, akkor m1 = 4, m2 = 4, w = 00101011, akkor m1 = 2, m2 = 5.
Globális maximális bonyolultság
A globális maximális bonyolultság
G(n) = max{C(u) | u ∈ An },
35.1. Egyszer¶ bonyolultsági mértékek
u 000 001 010 011 100 101 110 111 35.8. ábra.
i=1 1 2 2 2 2 2 2 1
1663
fu (i) i=2 1 2 2 2 2 2 2 1
i=3 1 1 1 1 1 1 1 1
Az összes 3 hosszúságú bináris szó bonyolultsága.
azaz a legnagyobb (maximális) bonyolultság egy adott ábécé fölötti összes n hosszúságú szó halmazán. A következ® problémák merülnek fel. • Mennyi azon szavak hossza, amelyekre a maximális bonyolultság egyenl® a globális maximális bonyolultsággal. • Hány ilyen szó létezik?
Példák. Ha A = {0, 1} az ábécé, a 35.8. és a 35.9. ábra tartalmazza az összes 3 és 4 hosszúságú szó bonyolultságát. A 3 hosszúságú szavak esetében (35.8. ábra) a globális maximális bonyolultság 2, és ezt az értéket az 1 és 2 hosszúságú szavak adják. Összesen 6 ilyen szó van. A 4 hosszúságú szavak esetében (35.9. ábra) a globális maximális bonyolultság 3, és ezt az értéket a 3 hosszúságú szavak adják. Összesen 8 ilyen szó van. A fenti problémák megoldására vezessük be a következ® jelöléseket: R(n) = {i ∈ {1, 2, . . . , n} | ∃u ∈ An : fu (i) = G(n)} , M (n) = #{u ∈ An : C(u) = G(n)} . A 35.10. ábrán a G(n), R(n) és M (n) értékei láthatók (1 ≤ n ≤ 20) bináris szavakra. A következ® lemma segítségével bebizonyítunk néhány, maximális bonyolultságra vonatkozó eredményt.
35.15. lemma.
[78] Minden k ∈ N∗ értékre, a legrövidebb szó, amely részszóként tartalmazza az összes (q k darab) k hosszúságú q -bet¶s ábécé fölötti szót, q k + k − 1 hosszúságú (ebben a szóban minden k hosszúságú szó egyetlen egyszer szerepel).
35. Szavak bonyolultsága
1664
u 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 35.9. ábra.
35.16. tétel.
i=1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
fu (i) i=2 i=3 1 1 2 2 3 2 3 2 3 2 2 2 3 2 2 2 2 2 3 2 2 2 3 2 3 2 3 2 2 2 1 1
i=4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Az összes 4 hosszúságú bináris szó bonyolultsága.
Ha #A = q és q k + k ≤ n ≤ q k+1 + k , akkor G(n) = n − k .
Bizonyítás. El®ször vizsgáljuk meg az n = qk+1 + k, k ≥ 1 esetet.
A 35.15. lemmából következik, hogy létezik olyan q k+1 + k hosszúságú w szó, amelyik tartalmazza az összes (k + 1) hosszúságú szót (ezek száma q k+1 ), tehát fw (k + 1) = q k+1 . Nyilvánvaló, hogy fw (l) = q l < fw (k + 1), ha l ∈ {1, 2, . . . , k} és fw (k + 1 + j) = q k+1 − j < fw (k + 1), ha j ∈ {1, 2, . . . q k+1 − 1}. Minden más q k+1 + k hosszúságú szó bonyolultsága kisebb vagy egyenl® C(w) = fw (k+1)-nél, tehát G(n) = q k+1 = n − k. Ha k ≥ 1, tekintsük az n = q k+1 + k − r esetet, ahol r ∈ {1, 2, . . . , q k+1 − k q }, ekkor tehát q k + k ≤ n < q k+1 + k . Ha a fenti q k+1 + k hosszúságú w szónak levágjuk az utolsó r bet¶jét, akkor az így kapott wn szó n = q k+1 +k−r hosszúságú, ahol r ∈ {1, 2, . . . , q k+1 − q k }. Erre a szóra fwn (k + 1) = q k+1 − r, és ez a maximális bonyolultsága. Valójában, nyilvánvaló, hogy fwn (k+1+j) = fwn (k + 1) − j < fwn (k + 1), ha j ∈ {1, 2, . . . , n − k − 1}. Ha l ∈ {1, 2, . . . , k}, akkor fwn (l) ≤ q l ≤ q k ≤ q k+1 − r = fwn (k + 1), tehát C(wn ) = fwn (k + 1) = q k+1 − r. Mivel lehetetlen, hogy egy n = q k+1 + k − r hosszúságú szónak, ahol r ∈ {1, 2, . . . , q k+1 − q k } a maximális bonyolultsága nagyobb legyen, mint
35.1. Egyszer¶ bonyolultsági mértékek n
G(n) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 35.10. ábra.
1665
R(n) 1 2 2 3 4 4 5 6 7 8 8 9 10 11 12 13 14 15 16 16
1, 2,
3,
4,
M (n) 1 1 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5
2 2 6 8 4 36 42 48 40 16 558 718 854 920 956 960 912 704 256 79006
G(n), R(n) és M (n) értékei.
q k+1 − r, következik, hogy G(n) = q k+1 − r = n − k .
35.17. tétel.
Ha #A = q és q k +k < n < q k+1 +k+1, akkor R(n) = {k+1}; ha n = q k + k , akkor R(n) = {k, k + 1}.
Bizonyítás.
A 35.16. tétel bizonyításának els® felében megmutattuk, hogy az n = + k (k ≥ 1) esetben létezik olyan n hosszúságú w szó, amelyre G(n) = fw (k + 1) = n − k . Ez azt jelenti, hogy k + 1 ∈ R(n). A w szóra, akárcsak minden más n hosszúságú w0 szóra fw0 (l) < fw (k +1), l 6= k + 1, a w speciális felépítése miatt, amely szó tartalmazza az összes k + 1 hosszúságú részszót a lehet® legkompaktabb módon. Ezért R(n) = {k + 1}. Akárcsak a 35.16. tétel bizonyításának második részében, legyen n = q k+1 + k − r, ahol r ∈ {1, 2, . . . q k+1 − q k }, és legyen a wn szó, amelyre G(n) = fwn (k + 1) = q k+1 − r. Ismét azt kapjuk, hogy k + 1 ∈ R(n). Ha l > k + 1, akkor nyilvánvaló, hogy wn bonyolultsága (akárcsak minden más
q k+1
35. Szavak bonyolultsága
1666
n hosszúságú szóé) szigorún kisebb, mint fwn (k + 1). Vizsgáljuk meg, hogy létezik-e olyan w szó, amelyre fw (k + 1) = n − k és fw (l) = n − k , ha l ≤ k . Tudjuk, hogy fw (l) ≤ q l ≤ q k ≤ q k+1 − r, tehát az fw (l) = n − k = q k+1 − r egyenl®ség csak akkor áll fenn, ha l = k és r = q k+1 − q k , azaz ha w = q k + k . Bebizonyítjuk, hogy ha n = q k + k , akkor R(n) = {k, k + 1}. Ha például a Martin-algoritmussal el®állított q k + k − 1 hosszúságú szóból indulunk ki, és ehhez hozzáadunk az A ábécéb®l egy tetsz®leges bet¶t, akkor olyan n = q k + k hosszúságú v szót kapunk, amely tartalmazza az összes q k darab k hosszúságú szót és az összes q k = n − k darab (k + 1) hosszúságú szót, tehát fv (k) = fv (k + 1) = G(n). A Martin (vagy más, hatékonyabb) algoritmus alapján könnyen el®állíthatunk olyan w szavakat, amelyekre C(w) = G(n).
35.18. tétel.
Ha #A = q és q k + k ≤ n ≤ q k+1 + k , akkor M (n) egyenl® a B(q, k + 1) De Bruijn-gráf összes különböz® n − k − 1 hosszúságú irányított útjainak számával.
Bizonyítás.
A 35.16. és 35.17. tételekb®l következik, hogy M (n), az olyan n hosszúságú szavak száma, amelyek bonyolultsága egyenl® a globális maximális bonyolultsággal, egyenl® azon w ∈ An szavak számával, amelyekre fw (k + 1) = n − k . Ez azt jelenti, hogy ezek a szavak (n − k) darab (k + 1) hosszúságú részszót tartalmaznak, amelyek mind különböz®ek. Ezek felsorolásában induljunk ki egy tetsz®leges (k + 1) hosszúságú szóból (amely a B(q, k + 1) De Bruijn-gráf egy csúcsa), adjunk hozzá bet¶ket A-ból úgy, hogy ne ismétl®djenek a már létez® (k + 1) hosszúságú részszók. Természetesen nem minden próbálkozás jár sikerrel, azaz nem mindig jutunk el egy n hosszúságú szóhoz, de amikor igen, akkor azok bizonyosan a B(q, k + 1) gráf egy, az adott csúccsal kezd®d® és (n − k − 1) hosszúságú útjának felelnek meg. Tehát minden olyan n hosszúságú szóhoz, amelyre fw (k + 1) = n − k , hozzárendelhet® egy és csakis egy olyan (n − k − 1) hosszúságú út, amely az els® (k + 1) bet¶nek megfelel® szóból indul ki, és fordítva, minden (n − k − 1) hosszúságú út egy n hosszúságú w szónak felel meg, amely n − k különböz® (k + 1) hosszúságú részszót tartalmaz. n o M (n) kifejezhet® úgy is, mint a T (q, w) w ∈ Ak+1 halmazban lév® De Bruijn-fák összes (n − k − 1)-edik szintjén lév® csúcsok száma.
35.19. tétel. Bizonyítás.
k−1
Ha n = 2k + k − 1, akkor M (n) = 22 k−1
.
A B(2, k) De Bruijn-gráfban 22 −k különböz® irányított Hamilton-kör van. Egy Hamilton-kör minden csúcsával kezdhet® egy De k−1 Bruijn-szó, amely maximális bonyolultságú. Tehát M (n) = 2k · 22 −k =
35.1. Egyszer¶ bonyolultsági mértékek
1667
k−1
22
, és ez bizonyítja a tételt. A tétel általánosítása q ≥ 2 bet¶j¶ ábécére:
35.20. tétel.
Ha n = q k + k − 1, akkor M (n) = (q!)q
k−1
.
Teljes bonyolultság
Egy szó teljes bonyolultsága az összes nemüres részszóinak a száma, azaz
K(u) =
|u| X
fu (i) .
i=1
Az an (n ≥ 1) triviális szó teljes bonyolultsága n. A szivárvány szó (minn(n + 1) . den bet¶je különböz®) teljes bonyolultsága 2 A következ® tétel egy adott teljes bonyolultságú szó létezését vizsgálja.
35.21. tétel.
Ha a C természetes szám különbözik 1, 2 és 4-t®l, akkor létezik olyan nemtriviális szó, amelynek a teljes bonyolultsága C.
Bizonyítás. A bizonyításhoz megadjuk a következ® k hosszúságú szavak teljes bonyolultságát.
K(ak−1 b) = 2k − 1 ha k ≥ 1 , K(abk−3 aa) = 4k − 8 ha k ≥ 4 , K(abcdk−3 ) = 4k − 6 ha k ≥ 3 . Ezek könnyen kiszámíthatók a teljes bonyolultság deníciója alapján. 1. Ha C páratlan, akkor felírható C = 2k − 1 alakban, egy adott k -ra. Ekkor k = (C + 1)/2, és az ak−1 b szó teljes bonyolultsága éppen C. 2. Ha C páros, akkor C = 2` alakú. 2.1. Ha ` = 2h, akkor 4k − 8 = C értékre 4k − 8 = 4h, és innen k = h + 2 adódik. Az abk−3 aa szó teljes bonyolultsága pedig C. 2.2. Ha ` = 2h + 1, akkor 4k − 6 = C értékre 4k − 6 = 4h + 2, innen pedig következik, hogy k = h+2. De ekkor az abcdk−3 szó teljes bonyolultsága C. A bizonyításban két bet¶nél többet csak a 2.2. eset vizsgálatánál használtunk. Felvet®dik a kérdés, hogy ebben az esetben is lehetséges lenne kétbet¶s szavakat találni az adott teljes bonyolultságra? A válasz erre is igen. Elegend® ezt csak 4h + 2 alakú számokra bizonyítani. Ha C = 4h + 2 és C ≥ 34, akkor igazak a következ®k:
K(abk−7 abbabb) = 8k − 46, k−7
K(ab
ababba) = 8k − 42,
ha k ≥ 10 , ha k ≥ 10 .
35. Szavak bonyolultsága
1668
Ha h = 2s, akkor 8k − 46 = 4h + 2 egyenl®ségb®l következik k = s + 6, és az abk−7 abbabb szó teljes bonyolultsága 4h + 2. Ha h = 2s + 1, akkor 8k − 42 = 4h + 2 egyenl®ségb®l következik k = s + 6, és az abk−7 ababba szó teljes bonyolultsága 4h + 2. Ha C < 34 akkor csak a 14, 26 és 30 számokra van kétbet¶s megoldás. Az ab4 a teljes bonyolultsága 14, az ab6 a szóé 26 és az ab5 aba szóé pedig 30. Egy fa felépítésével könnyen belátható, hogy 6, 10, 18 és 22 értékekre nincs olyan kétbet¶s szó, amelyre a teljes bonyolultság éppen ennyi lenne. Ennek alapján kijelenthetjük a következ® tételt.
35.22. tétel. Ha a C természetes szám különbözik az 1, 2, 4, 6, 10, 18 és 22 számoktól, akkor létezik olyan kétbet¶s, nemtriviális szó, amelynek teljes bonyolultsága C. Adott hosszúságú és adott teljes bonyolultságú szó nem mindig létezik, ezt kés®bb bizonyítjuk. Ezek után felmerül az a kérdés, hogy hány olyan adott n hosszúságú szó van, amelynek teljes bonyolultsága egy adott C érték. Kicsi n-re a feladat könnyen megoldható teljesen. Vizsgáljuk meg általános esetben. Legyen A egy n bet¶s ábécé, és tekintsük az összes A fölötti n bet¶s szót. A 35.11. ábrán adott hosszúságú és teljes bonyolultságú szavak el®fordulási száma látható. Ha #A = n, jelöljük φn (C)-vel az olyan n hosszúságú A fölötti szavak számát, amelyeknek teljes bonyolultsága C . Ekkor fennállnak a következ®k.
φn (C) = 0 ha C < n vagy C > φn (n) = n, φn (2n − 1) = 3n(n− 1), n(n + 1) n(n − 1)n! φn −1 = , 2 2 n(n + 1) φn = n! 2
n(n + 1) , 2
A 0 el®fordulású szavakra érvényesek a következ®k: Ha C = n + 1, n + 2, . . . , 2n − 2, akkor φn (C) = 0 . Ha C = 2n, 2n + 1, . . . , 3n − 5, akkor φn (C) = 0 . Ezek után a kérdés az, hogy létezik-e olyan érték, hogy attól kezdve n(n+1) 2 ig már minden értékre létezik legalább egy szó, amelynek a teljes bonyolultsága az adott szám. A válasz pozitív. Legyen bn ez a legkisebb ilyen szám, azaz amelyre
35.2. Általános bonyolultsági mértékek n=2 C φn (C) n=3 C φn (C) n=4 C φn (C) n=5 C φn (C) n=6 C φn (C)
C φn (C)
2 2
3 2
3 3
4 0
5 18
6 6
4 4
5 0
6 0
7 36
5 5
6 0
7 0
8 0
8 48 9 60
9 144 10 0
1669
10 24 11 200
12 400
13 1140
14 1200
15 120
6 6
7 0
8 0
9 0
10 0
11 90
12 0
13 0
14 300
15 990
16 270
17 5400
18 8280
19 19800
20 10800
21 720
35.11. ábra.
Adott bonyolultságú szavak el®fordulási száma.
n(n + 1) . 2 A bn szám létezik minden n-re (ez legrosszabb esetben n(n + 1)/2):
φn (C) 6= 0 minden C -re, ha bn ≤ C ≤
35.23. tétel.
Ha ` ≥ 2, 0 ≤ i ≤ `, n = bn =
`(` + 1) + 2 + i, akkor 2
`(`2 − 1) + 3` + 2 + i(` + 1). 2
35.2. Általános bonyolultsági mértékek Láttuk az el®z® szakaszban, hogy ha egy szó egy kezd®- és/vagy végszeletét elhagyjuk, részszót kapunk. Ha egy szó tetsz®leges bet¶it hagyjuk el, akkor egy ún. gyér részszót (az angol szakkifejezés: scattered subword) kapunk. Néha nevezik részsorozatnak is. Az olyan speciális gyér részszót, amelyben a szomszédos bet¶k az eredeti szóban legalább d1 és legfeljebb d2 távolságra vannak, (d1 , d2 )-részszónak hívjuk. Megadjuk a pontos értelmezését is.
35.24. deníció.
Legyenek n, d1 ≤ d2 , s pozitív egészek, és legyen u =
35. Szavak bonyolultsága
1670
35.12. ábra.
A (2, 4)-részszóknak megfelel® gráf, ha n = 6.
x1 x2 . . . xn ∈ An egy A fölötti szó. A v = xi1 xi2 . . . xis szó, ahol i 1 ≥ 1, d1 ≤ ij+1 − ij ≤ d2 , ha j = 1, 2, . . . , s − 1, is ≤ n, az u szó s hosszúságú (d1 , d2 )-részszója. Például az aabcade szó (2, 4)-részszói: a, ab, ac, aba, aa, acd, abd, aae, abae, ace, abe, ad, b, ba, bd, bae, be, c, cd, ce, ae, d, e.
35.25. deníció.
Az u szó különböz® (d1 , d2 )-részszóinak a száma az u szó (d1 , d2 )-bonyolultsága, amelyet Cu (d1 , d2 )-vel jelölünk.
Például, ha u = aabcade, akkor Cu (2, 4) = 23.
35.2.1. Szivárvány szavak A páronként különböz® bet¶kb®l álló szavakat szivárvány szavaknak hívjuk. A szivárvány szó (d1 , d2 )-bonyolultsága nem függ a szó bet¶it®l, csak annak hosszától, ezért jelölése C(n; d1 , d2 ). Az n hosszúságú szivárvány szó (d1 , d2 )-bonyolultságának kiszámítására tekintsük az a1 a2 . . . an szót, és rendeljük hozzá a G = (V, E) irányított gráfot, ahol V = a1 , a2 , . . . , an , E = (ai , aj ) | d1 ≤ j − i ≤ d2 , i = 1, 2, . . . , n, j = 1, 2, . . . , n . Az n = 6, d1 = 2 és d2 = 4 paramétereknek megfelel® gráf a 35.12. ábrán látható. A gráf A = aij i=1,n szomszédsági mátrixa a következ®: j=1,n
aij =
1, ha d1 ≤ j − i ≤ d2 , 0, különben,
ha i = 1, 2, . . . , n, j = 1, 2, . . . , n.
Mivel a gráfban nincs irányított kör, az Ak mátrix (ahol Ak = Ak−1 A, és
35.2. Általános bonyolultsági mértékek
1671
A1 = A) i-edik sorában és j -edik oszlopában lév® elem a gráf k hosszúságú azon irányított útjainak a számát jelenti, amelyek ai -vel kezd®dnek és aj vel végz®dnek. Ha A0 mátrix az identikus mátrix, azaz a f®átlón lév® elemei 1-esek, míg a többi elem 0, legyen az R = (rij ) mátrix a következ®: R = A0 + A + A2 + · · · + Ak , ahol Ak+1 = O ( a nullmátrix). A szivárvány szó (d1 , d2 )-bonyolultsága
C(n; d1 , d2 ) =
n X n X
rij .
i=1 j=1
Az R mátrixot könnyebben kiszámíthatjuk a jól ismert Warshall-algoritmus következ® változatával:
Warshall'(A, n) 1 W←A 2 for k ← 1 to n 3 do for i ← 1 to n 4 do for j ← 1 to n 5 do wij ← wij + wik wkj 6 return W A W mátrixból következik R = A0 + W. Az algoritmus id®bonyolultsága Θ(n3 ). Példaként tekintsük a 35.12. mátrixa: 0 0 0 A= 0 0 0 A Warshall-típusú algoritmus 0 0 1 1 2 0 0 0 1 1 0 0 0 0 1 W= 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ábrán látható gráfot. Ennek szomszédsági
0 0 0 0 0 0
1 0 0 0 0 0
1 1 0 0 0 0
1 1 1 0 0 0
0 1 1 1 0 0
alkalmazása után: 2 2 1 , R = 1 0
0
.
1 0 0 0 0 0
0 1 0 0 0 0
1 0 1 0 0 0
1 1 0 1 0 0
2 1 1 0 1 0
2 2 1 1 0 1
,
35. Szavak bonyolultsága
1672
n=6 HHd2 d1 H
1 2 3 4 5
1 21 -
2 46 12 -
3 58 17 9 -
35.13. ábra.
n=7 4 62 19 11 8 -
d2 1 5 H d1HH 63 1 28 20 2 12 3 9 4 7 5 6 -
2 79 16 -
3 110 25 12 -
4 122 30 15 10 -
5 126 32 17 12 9 -
6 127 33 18 13 10 8
6 és 7 hosszúságú szivárvány szavak (d1 , d2 )-bonyolultsága.
és ezért C(6; 2, 4) = 19, az R elemeinek összege. Ez a Warshall-típusú algoritmus a latin négyzet módszerével kombinálva jól használható az n (n ≥ 2) hosszúságú a1 a2 . . . an szivárvány szó (d1 , d2 )részszóinak a meghatározására. Jelöljük az A mátrix elemeit az Aij -vel, amelyek szóhalmazok. Kezdetben ez a mátrix a következ®:
Aij =
{ai aj }, ha d1 ≤ j − i ≤ d2 , ∅, különben,
ha i = 1, 2, . . . , n, j = 1, 2, . . . , n .
Ha X és Y szóhalmazok, akkor XY halmaz elemeit úgy kapjuk meg, hogy az X halmaz minden elemét összeillesztjük (konkatenáljuk) a Y halmaz minden elemével:
X Y = xy x ∈ X , y ∈ Y .
Ha az s = s1 s2 . . . sp els® bet¶jét elhagyjuk, jelöljük a kapott szót 0 s-sel, azaz 0 s = s s . . . s . Így 0 A jelölje azt a szóhalmazt, amelyet úgy kapunk A -ból, 2 3 p ij ij hogy minden elemének elhagyjuk az els® bet¶jét. Ebben az esetben 0 A az a mátrix, amelynek elemei 0 Aij . A fentebb értelmezett A mátrixszal kezdve, a következ® algoritmusunk kiszámítja az összes nemtriviális (legalább két bet¶b®l álló) (d1 , d2 )-részszókat
35.2. Általános bonyolultsági mértékek
1673
Warshall-Latin(A, n) 1 W←A 2 for k ← 1 to n 3 do for i ← 1 to n 4 do for j ← 1 to n 5 do if Wik 6= ∅ és Wkj 6= ∅ 6 then Wij ← Wij ∪ Wik 0 Wkj 7 return W A nemtriviális (d1 , d2 )-részszók halmaza
[
Wij . Az algoritmus
i,j∈{1,2,...,n}
id®bonyolultsága szintén Θ(n3 ). Ha n = 7, d1 = 2, d2 = 4, akkor az eredeti mátrix:
A=
∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅
∅ {ac} {ad} {ae} ∅ ∅ ∅ ∅ {bd} {be} {bf } ∅ ∅ ∅ ∅ {ce} {cf } {cg} ∅ ∅ ∅ ∅ {df } {dg} , ∅ ∅ ∅ ∅ ∅ {eg} ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅
és
W=
∅ ∅ ∅ ∅ ∅ ∅ ∅
∅ {ac} {ad} {ace, ae} {adf, acf } {aeg, aceg, adg, acg} ∅ ∅ {bd} {be} {bdf, bf } {beg, bdg} ∅ ∅ ∅ {ce} {cf } {ceg, cg} ∅ ∅ ∅ ∅ {df } {dg} ∅ ∅ ∅ ∅ ∅ {eg} ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅
.
Beleszámítva az egybet¶s (triviális) szavakat is, C(7; 2, 4) = 30.
A d1 = 1 eset
Ebben az esetben d2 helyett egyszer¶en csak d-t írunk. A szivárvány szó esetében ai,d -vel jelöljük az i pozícióban végz®d® (1, d)-részszók számát. Ha i = 1, 2, . . . , n, akkor
ai,d = 1 + ai−1,d + ai−2,d + . . . + ai−d,d .
(35.1)
35. Szavak bonyolultsága
1674
Az egyszer¶ség kedvéért, C(n; 1, d) helyett használjuk az N (n, d) jelölést. Ekkor a szivárvány szó (1, d)-bonyolultságát a következ® képlettel kaphatjuk meg: n X N (n, d) = ai,d . i=1
A (35.1) képlet miatt, d ≥ 2 esetében 1 1 1 ai,d + = ai−1,d + + · · · + ai−d,d + . d−1 d−1 d−1 Ha most a következ® jelölést használjuk:
bi,d = ai,d +
1 , d−1
and
ci,d = (d − 1)bi,d ,
akkor
ci,d = ci−1,d + ci−2,d + . . . + ci−d,d , és a ci,d számok Fibonacci-típusúak. Tetsz®leges d-re a1,d = 1 és ebb®l c1,d = d következik. A ci,d számokat a következ® rekurzív összefüggés adja:
cn,d = cn−1,d + cn−2,d + . . . + cn−d,d , ha n > 0, cn,d = 1, for n ≤ 0. Ezeket a számokat el®állíthatjuk a következ® generátorfüggvénnyel:
Fd (z) =
X
cn,d z n =
n≥0
=
1 + (d − 2)z − z 2 − · · · − z d 1 − 2z + z d+1
1 + (d − 3)z − (d − 1)z 2 + z d+1 . (1 − z)(1 − 2z + z d+1 )
Az N (n, d) (1, d)-bonyolultság kifejezhet® a következ®képpen: ! n X 1 N (n, d) = ci,d − n , ha d > 1 , d−1 i=1
és
N (n, 1) = vagy
N (n, d) = N (n − 1, d) +
n(n + 1) , 2
1 (cn,d − 1), d−1
ha d > 1, n > 1 .
Ha d = 2, akkor
F2 (z) =
1 − z2 1+z F (z) = = + F (z) , 3 2 1 − 2z + z 1−z−z z
35.2. Általános bonyolultsági mértékek n
d 1 2 3 4 5 6 7 8 9 10
1 1 3 6 10 15 21 28 36 45 55
2 1 3 7 14 26 46 79 133 221 364
3 1 3 7 15 30 58 110 206 383 709
35.14. ábra.
4 1 3 7 15 31 62 122 238 464 894
5 1 3 7 15 31 63 126 250 494 974
1675
6 1 3 7 15 31 63 127 254 506 1006
7 1 3 7 15 31 63 127 255 510 1018
8 1 3 7 15 31 63 127 255 511 1022
9 1 3 7 15 31 63 127 255 511 1023
10 1 3 7 15 31 63 127 255 511 1023
Az n hosszúságú szivárvány szavak (1, d)-bonyolultsága.
ahol F (z) az Fn Fibonacci-számok generátorfüggvénye (ahol F0 = 0, F1 = 1). Ekkor ebb®l következik, hogy
cn,2 = Fn+1 + Fn = Fn+2 , és
N (n, 2) =
n X
Fi+2 − n = Fn+4 − n − 3 .
i=1
A 35.14. ábra az N (n, d) értékeit tartalmazza, ha k ≤ 10 és d ≤ 10.
N (n, d) = 2n − 1,
ha d ≥ n − 1.
Az alábbi tétel megadja N (n, d) értékét az n ≥ 2d − 2 esetben.
35.26. tétel.
Ha n ≥ 2d − 2, akkor N (n, n − d) = 2n − (d − 2) · 2d−1 − 2.
A bizonyítás a következ® képleten alapszik:
N (n, n − d − 1) = N (n, n − d) − d · 2d−1 Az N (n, d) értéke úgy is megkapható, ha kiszámítjuk azon k hosszúságú, csak 0 és 1 bet¶kb®l álló olyan szavak számát, amelyekben nincs (d − 1)-nél több egymás melletti 0. Ezekben a szavakban az 1 jelenti egy bet¶ meglétét az eredeti szóból, míg 0 annak hiányát egy (1, d)-részszóban. Legyen bn,d azon n hosszúságú bináris szavak száma, amelyekben az els® és az utolsó bet¶ 1,
35. Szavak bonyolultsága
1676
és amelyben legfeljebb d − 1 szomszédos 0 van. Ekkor
bn,d = bn−1,d + bn−2,d + . . . + bn−d,d , ha k > 1 , b1,d = 1, bn,d = 0, ha n ≤ 0, mivel minden ilyen n − i (i = 1, 2, ..., d) hosszúságú szó csak egyféleképpen folytatható, hogy n hosszúságú szót kapjunk (0i−1 1-et hozzáadva jobbról). A bn,d -re a következ® képlet is megadható:
bn,d = 2bn−1,d − bn−1−d,d , mivel ha 1 vagy 0 bet¶t illesztünk az n − 1 hosszúságú szó egy bels® pozíciójába (pl. (n − 2)-be), akkor 2bn−1,d darab n hosszúságú szót kapunk, de ezek közül bn−1−d,d szó d szomszédos 0-t tartalmaz. A bn,d számok generátorfüggvénye
Bd (z) =
X
bn,d z n =
n≥0
z z(1 − z) = . 1 − z · · · − zd 1 − 2z + z d+1
Balról és jobbról nullákkal b®vítve a szót, kiszámíthatjuk N (k, d)-t mint ezen szavak számát.) Tehát
N (k, d) = bk,d + 2bk−1,d + 3bk−2,d + · · · + kb1,d . (i nulla (i+1)-szer illeszthet® be: egy sem balról, i pedig jobbról, egy 1 balról, i − 1 jobbról és így tovább). Innen az N (k, d) bonyolultság generátorfüggvénye megkapható mint a P n = következ® két generátorfüggvény szorzata: Bd (z) és A(z) = n≥0 nz 2 1/(1 − z) , tehát:
Nd (z) =
X n≥0
N (n, d)z n =
z . (1 − z)(1 − 2z + z d+1 )
A d2 = n − 1 eset
A következ®kben d1 helyett d-t írunk. Ebben az esetben a részszó szomszédos bet¶i az eredeti szóban legalább d távolságra vannak. Jelölje bn,d (i) azon (d, n − 1)-részszókat, amelyek az eredeti n hosszúságú szivárvány szó i-edik pozíciójában kezd®dnek. Az abcdef szó esetében látható, hogy b6,2 (1) = 8, b6,2 (2) = 5, b6,2 (3) = 3, b6,2 (4) = 2, b6,2 (5) = 1 és b6,2 (6) = 1. Azonnal következik a
bn,d (i) = 1 + bn,d (i+d) + bn,d (i+d+1) +· · ·+ bn,d (n) ,
(35.2)
35.2. Általános bonyolultsági mértékek HHd n H
1 2 3 4 5 6 7 8 9 10 11 12
1 1 3 7 15 31 63 127 255 511 1023 2047 4095
2 1 2 4 7 12 20 33 54 88 143 232 376
3 1 2 3 5 8 12 18 27 40 59 87 128
4 1 2 3 4 6 9 13 18 25 35 49 68
35.15. ábra.
5 1 2 3 4 5 7 10 14 19 25 33 44
1677
6 1 2 3 4 5 6 8 11 15 20 26 33
7 1 2 3 4 5 6 7 9 12 16 21 27
8 1 2 3 4 5 6 7 8 10 13 17 22
9 1 2 3 4 5 6 7 8 9 11 14 18
10 1 2 3 4 5 6 7 8 9 10 12 15
11 1 2 3 4 5 6 7 8 9 10 11 13
K(n, d) értéke.
képlet, ha n > d és 1 ≤ i ≤ n − d , és bn,d (1) = 1 ha n ≤ d . Az egyszer¶ség kedvéért jelöljük C(n; d, n)-t K(n, d)-vel. Az n hosszúságú szivárvány szó (d, n − 1)-bonyolultsága a következ® képlettel számítható ki: n X K(n, d) = bn,d (i) . (35.3) i=1
Ez a következ®képen is írható:
K(n, d) =
n X
bk,d (1) ,
(35.4)
k=1
a
K(n + 1, d) = K(n, d) + bn+1,d (1) alapján. Ha d = 1 akkor a K(n, 1) bonyolultság könnyen kiszámítható: K(n, 1) = 2n − 1. A (35.2) képlet alapján a bn,d (i) kiszámítható a következ® algoritmussal. A bn,d (k) (k = 1, 2, . . .) értékeket az algoritmus adott n-re és d-re a b = (b1 , b2 , . . .) tömbben ®rzi meg. Kezdetben ennek a tömbnek minden eleme −1. Az algoritmust adott n, d és i értékekre a következ®képpen hívjuk meg:
35. Szavak bonyolultsága
1678
for k ← 1 to n do bk ← −1
B(n, d, i)
A rekurzív algoritmus a következ®:
B(n, d, i) 1 p←1 2 for k ← i + d to n 3 do if bk = −1 4 then B(n, d, k) 5 p ← p + bk 6 bi ← p 7 return Ez az algoritmus lineáris. A B(8, 2, 1) meghívásra a következ® sorrendben kapjuk meg az elemeket: b7 = 1, b8 = 1, b5 = 3, b6 = 2, b3 = 8, b4 = 5 és b1 = 21.
35.27. lemma.
bn,2 (1) = Fn , ahol Fn az n-edik Fibonacci-szám.
Bizonyítás.
Tekintsük az a1 a2 . . . an szivárvány szót, és számítsuk ki az összes (2, n − 1)-részszót, amely a2 -vel kezd®dik. Ha a2 -t a1 -re cseréljük mindegyik olyan (2, n − 1)-részszóban, amelyik a2 -vel kezd®dik, szintén (2, n − 1)részszót kapunk. Ha hozzáadjuk a1 -et mindegyik olyan (2, n − 1)-részszó elejéhez, amelyik a3 -mal kezd®dik, szintén (2, n − 1)-részszót kapunk. Tehát
bn,2 (1) = bn−1,2 (1) + bn−2,2 (1) . Így bn,2 (1) Fibonacci-szám, és mivel b1,2 (1) = 1, azt kapjuk, hogy bn,2 (1) = Fn .
35.28. tétel.
K(n, 2) = Fn+2 − 1, ahol Fn az n-edik Fibonacci-szám.
Bizonyítás. A (35.4) képlet és a 35.27. lemma alapján: K(n, 2) = b1,2 (1) + b2,2 (1) + b3,2 (1) + b4,2 (1) + · · · + bn,2 (1) = F1 + F2 + · · · + Fn = Fn+2 − 1 .
35.2. Általános bonyolultsági mértékek
1679
Ha az Mn,d = bn,d (1) jelölést használjuk, akkor a
bn,d (1) = bn−1,d (1) + bn−d,d (1) képlet alapján egy általánosított sorozatot kapunk:
Mn,d = Mn−1,d + Mn−d,d ,
for n ≥ d ≥ 2 ,
(35.5)
M0,d = 0, M1,n = 1, . . . , Md−1,d = 1 . Legyen ez a sorozat d-közép sorozat . Mivel Mn,2 = Fn , a d-közép sorozat a Fibonacci-sorozat általánosításaként foghatjuk fel. A következ® lineáris algoritmus kiszámítja az Mn,d számot, használva az M0 , M1 , . . . , Md−1 tömböt a szükséges elemek meg®rzésére:
Közép(n, d) 1 M0 ← 0 2 for i ← 1 to d − 1 3 do Mi ← 1 4 for i ← d to n 5 do Mi mod d ← M(i−1) mod d + M(i−d) mod d 6 print Mi mod d 7 return Az Md (z) = pletet kapjuk:
X
Mn,d z n generátorfüggvényt használva, a következ® ké-
n≥0
Md (z) = Ezzel kiszámítható az sn,d =
n X
z . 1 − z − zd
(35.6)
Mi,d összeg, amely a z n+d együtthatója a
i=1
következ® függvény kifejtésében:
zd 1 zd z z · = + − . d d d 1−z 1−z−z 1−z 1−z−z 1−z−z Így sn.d = Mn+(d−1),d + Mn,d − 1 = Mn+d,d − 1. Tehát n X
Mi,d = Mn+d,d − 1 .
(35.7)
i=1
35.29. tétel. n-edik eleme.
K(n, d) = Mn+d,d − 1, ahol n > d és Mn,d a d-közép sorozat
35. Szavak bonyolultsága
1680
Bizonyítás.
A bizonyítás hasonló a 35.28. tétel bizonyításához, gyelembe véve a (35.7) képletet. X n − (d − 1)k , ha n ≥ 2, d ≥ 1 . 35.30. tétel. K(n, d) = k+1 k≥0
1 = 1 + z + z 2 + · · · generátorfügg1−z vényb®l. A (35.6) képletet gyelembe véve kapjuk: Md (z) = zG(z + z d ) = z + z(z + z d ) + z(z + z d )2 + · · · + z(z + z d )i + · · · . Ennek kifejtésében az általános tag i X i (d−1)k i+1 z , z k
Bizonyítás. Induljunk ki a G(z) =
k=1
és
z n+1
együtthatója
X n − (d − 1)k k
k≥0
.
A z n+d együtthatója
Mn+d,d =
X n + d − 1 − (d − 1)k k
k≥0
.
(35.8)
A 35.29. tételb®l K(n, d) = Mn+d,d − 1, és innen egyszer¶ számítással kapjuk, hogy X n − (d − 1)k K(n, d) = . k+1 k≥0
35.2.2. Tetsz®leges szavak A Warshall-Latin algoritmust használva a nem szivárvány szavak bonyolultsága is kiszámítható, ügyelve arra, hogy az ismétl®d® részszókat ki kell hagyni. Az aabbbaaa szó esetében, ha d1 = 2 és d2 = 4, az eredmény: ab, abb, aba, abba, abaa, aa, aaa, bb, ba, bba, baa. Ezekhez hozzávéve az a és b résszókat, az eredmény Caabbbaaa (2, 4) = 13.
35.3. Palindrombonyolultság A véges vagy végtelen w szóhoz rendelt palw palindrombonyolultság függvény minden n ∈ N értékhez hozzárendeli a w szó n hosszúságú palindrom részszóinak palw (n) számát. A véges w ∈ A∗ szó teljes palindrombonyolultsága egyenl® a w szó
35.3. Palindrombonyolultság
1681
összes nemüres palindrom részszóinak számával, azaz
P (w) =
|w| X
palw (n).
n=1
35.3.1. Véges szavak palindromjai
35.31. tétel.
P (w) ≤ |w|.
A w szó P (w) teljes palindrombonyolultságára fennáll, hogy
Bizonyítás.
A bizonyítást a w szó n hosszúságára vonatkozó indukcióval végezzük. Ha n = 1, akkor nyilvánvalóan P (w) = 1. Legyen n ≥ 2, és feltételezzük, hogy az állítás igaz minden (n − 1) hosszúságú szóra. Legyen w = a1 a2 . . . an egy n hosszúságú szó, és u = a1 a2 . . . an−1 az (n − 1) hosszúságú el®szelete. Az indukciós feltétel alapján P (u) ≤ n − 1. Ha an 6= aj , minden j ∈ {1, 2, . . . n − 1} értékre, akkor an a w egyetlen palindrom részszója, amelyik nem részszója u-nak is, tehát P (w) = P (u)+1 ≤ n. Ha létezik olyan j (1 ≤ j ≤ n − 1) index úgy, hogy an = aj , akkor P (w) > P (u) akkor és csakis akkor, ha w-nek vannak palindrom végszeletei. Feltételezzük, hogy létezik legalább két ilyen palindrom végszelet, ai ai+1 . . . an és ai+k ai+k+1 . . . an , 1 ≤ k ≤ n − i. Ebb®l következik, hogy
ai = an = ai+k ai+1 = an−1 = ai+k+1 ··· an−k = ai+k = an , tehát ai+k . . . an = ai . . . an−k . Ez utóbbi palindrom már u-ban is el®fordul, mivel k ≥ 1, tehát már beszámoltuk P (u)-ba. Így P (w) ≤ P (u) + 1 ≤ n. Ez az eredmény azt mutatja, hogy a nemüres palindromok száma nem lehet több, mint a szó hossza. A következ®kben megvizsgáljuk, hogy léteznek-e olyan szavak, amelyek szegények palindromokban. A következ® lemma olyan n ≥ 9 hosszúságú szavakat állít el®, amelyek pontosan 8 palindromot tartalmaznak. p q Jelölje w a q hosszúságú w szó törthatványát, amely a wp szó p hosszúságú el®szelete.
35.32. lemma. Bizonyítás.
n
Ha wn = (001011) 6 , n ≥ 9, akkor P (wn ) = 8.
A wn szóban a következ® részszók palindromok: 0, 1, 00, 11,
35. Szavak bonyolultsága
1682
010, 101, 0110, 1001. Mivel 010 és 101 a wn -ben balról egy 0, jobbról egy 1 között van, nem lehet úgy folytatni, hogy egy palindromot kapjunk. Hasonló a helyzet az 1001 és a 0110 szavakkal is, amelyek 1 és 0 között vannak, kivéve, amikor 1001 végszelet. Tehát wn -ben nincsenek más palindromok.
Megjegyzés. n
Ha u a 001011 egy cirkuláris permutációja és n ≥ 9, akkor P (u 6 ) szintén 8. Mivel 0 és 1 felcserélhet®k, minden n-re legalább 12 n hosszúságú szó van, amelynek a teljes palindrombonyolultsága 8. A következ®kben, a 35.31. tétel fels® korlátja mellett, a palindromok számára alsó korlátokat is adunk bináris szavak esetében. (Triviális esetben, amikor csupán egy bet¶t használunk, tetsz®leges w szóra P (w) = |w|.)
35.33. tétel.
Az n hosszúságú bináris w szóra P (w) = n, ha 1 ≤ n ≤ 7 , 7 ≤ P (w) ≤ 8, ha n = 8 , 8 ≤ P (w) ≤ n, ha n ≥ 9 .
Bizonyítás.
Ha n ≤ 8, a bizonyítást egy program segítségével könnyen elvégezhetjük. Innen kiderül, hogy ha n ≤ 7, minden szónak pontosan n a palindrombonyolultsága. Ha n = 8, akkor az összes 28 = 256 szóból csupán négynek 7 a bonyolultsága (00110100, 00101100, 11001011, 11010011), a többié 8. Ha n ≥ 9, akkor a 35.32. lemma szerint léteznek olyan vn szavak, amelyekre P (vn ) = 8. Csak azt kell még bizonyítani, hogy n ≤ 9 esetben legalább 8 palindrom van minden szóban. Ha megvizsgáljuk a 7 bonyolultságú 8 hosszúságú szavakat, megállapíthatjuk, hogy bárhova beszúrva egy újabb bet¶t, újabb palindrom fog megjelenni, tehát 9 hosszúságon mindig legalább 8 palindrom lesz. A maximális értéket az an , a ∈ A, n ∈ N. alakú szavakra kapjuk. A következ®kben arra szeretnénk választ kapni, hogy 8 és n között minden számhoz tudunk-e olyan, legalább 9 hosszúságú szót rendelni, amelynek palindrombonyolultsága éppen az a szám.
35.34. lemma.
Ha uk,` = 0k 10110` 1, ahol k ≥ 2 és 1 ≤ ` ≤ k − 1, akkor
P (uk,` ) = k + 6.
Bizonyítás. Az uk,` szó k hosszúságú el®szeletében mindig k palindrom van
(0, . . . , 0k ). Az ezekt®l különböz® palidromok a következ®k: 1, 11, 010, 101, 0110 és 10` 1 (ha ` ≥ 2), valamint 101101 (ha ` = 1). Ebb®l következik, hogy P (uk,` ) = k + 6.
35.35. lemma.
Ha vk,` = (0k 1011) akkor P (vk,` ) = k + 6.
k+`+5 k+4
,ahol k ≥ 2 és k ≤ ` ≤ n − k − 5,
35.3. Palindrombonyolultság
1683
Bizonyítás. Mivel ` ≥ k, az uk,j
szónak van egy 0k 10110k 1 alakú el®szelete, amelynek 0, . . . , 0k , 1, 11, 010, 101, 0110 és 10k 1 mind palindromjai, tehát P (vk,` ) ≥ k + 6. A 010 és 101 palindromok 0 és 1 között vannak, míg a 0110 és 10k 1 az 1 és 0 között (kivéve, amikor végszeletek) ` értékét®l függetlenül. Tehát vk,` nem tartalmaz más palindromokat, ezért P (vk,` ) = k + 6.
Megjegyzés. szóval.
Ha k = 2, akkor a v2,` szó azonos a 35.32. lemmabeli w`+7
Használjuk a következ® jelölést: P (An ) = P (w) | w ∈ An .
35.36. tétel.
Legyen A bináris ábécé. Ekkor ha 1 ≤ n ≤ 7 , n , 7, 8 , P (An ) = ha n = 8 , 8, . . . , n , ha n ≥ 9 .
Bizonyítás.
Figyelembe véve a 35.33. tételt, be kell bizonyítanunk, hogy minden adott n és i értékre, ahol 8 ≤ i ≤ n, létezik olyan n hosszúságú wn,i bináris szó, amelyre P (wn,i ) = i. Ha n és i adottak úgy, hogy 8 ≤ i ≤ n, akkor legyen k = i − 6 ≥ 2 és ` = n − k − 5. Ha ` ≤ k − 1, legyen wn,i = uk,` a (35.34. lemma alapján) vagy ha ` ≥ k, akkor wn,i = vk,` a (35.35. lemma alapján). Ekkor |wn,i | = n és P (wn,i ) = k + 6 = i.
Példa.
Legyen n = 25 és i = 15. Ekkor k = 15 − 6 = 9, ` = 26 − 15 = 25 11. Mivel ` > k − 1, használjuk a következ® szót: v9,11 = (09 1011) 13 = 09 101109 101, amelynek bonyolultsága 15. Hasonló eredményt kapunk, ha q ≥ 3 bet¶s ábécével dolgozunk.
35.37. tétel.
akkor
Bizonyítás.
Ha a w szó n hosszúságú egy adott q -bet¶s (q ≥ 3) ábécé felett, P (w) = n, ha n ∈ {1, 2} , 3 ≤ P (w) ≤ n, ha n ≥ 3 .
Ha n ∈ {1, 2}, a tétel könnyen belátható. Legyen adott n ≥ 3 és egy legalább 3 hosszúságú szó. Ha ez a szó triviális (ugyanazt a bet¶t tartalmazza n-szer), akkor a teljes palindrombonyolultsága n ≥ 3. Ha a szóban pontosan két bet¶ van, például a és b, akkor ezek palindromok, és legalább az egyik a következ® palindromok közül biztosan szerepel a szóban: aa, bb, aba vagy bab, tehát ismét P (w) ≥ 3. Ha szó tartalmaz egy harmadik bet¶t is, akkor nyilvánvalóan P (w) ≥ 3, hisz ez a harmadik bet¶ magában egy palindrom. Tehát a teljes palindrombonyolultság nem lehet kisebb 3-nál.
35. Szavak bonyolultsága
1684
35.38. tétel.
Legyen A egy q -bet¶s (q ≥ 3) ábécé. Ekkor n , n ha 1 ≤ n ≤ 2 , P (A ) = 3, . . . , n , ha n ≥ 3 .
Bizonyítás. A 35.38. tétel alapján elég bebizonyítani a tételt minden n és i
értékre, ha 3 ≤ i ≤ n, vagyis hogy mindig létezik egy n hosszúságú wn,i szó, n−i+3 amelyre P (wn,i ) = i. Legyen ez a szó wn,i = a1i−3 (a1 a2 a3 ) 3 , amelynek (i − 2) palindromja van az (i − 2) hosszúságú el®szeletében, és a2 és a3 szintén palindromok.
Teljes bonyolultság 35.3.2. Végtelen szavak palindromjai Sturm-típusú szavak A végtelen Sturm-típusú szó palindrom részszóinak a számát a következ® tétel adja meg.
35.39. tétel.
Ha u végtelen Sturm-típusú szó, akkor 1 ha n páros, palu (n) = 2 ha n páratlan.
Hatványszó A hatványszó amint már láttuk p = 01001100011100001111 . . . |0 .{z . . 0} 1 . . 1} . . . . | .{z n
35.40. tétel.
n
A p hatványszó palindrombonyolultsága jnk palp (n) = 2 +1+ε , 3
ahol
ε=
0, ha n osztható 3-mal , 1, különben .
Bizonyítás. Az alábbi eseteket vizsgáljuk: • n = 3k alakú. Palindrom részszók a következ®k: 0i 13k−2i 0i 1i 03k−2i 1i
ha i = 0, 1, . . . k , ha i = 0, 1, . . . k − 1,
így palp (3k) = 2k + 1 .
• n = 3k + 1 alakú. Palindrom részszók a következ®k: 0i 13k+1−2i 0i 1i 03k+1−2i 1i
ha i = 0, 1, . . . k , ha i = 0, 1, . . . k ,
így palp (3k + 1) = 2k + 2 .
35.3. Palindrombonyolultság
1685
• n = 3k + 2 alakú. Palindrom részszók a következ®k: 0i 13k+2−2i 0i 1i 03k+2−2i 1i
ha i = 0, 1, . . . k , ha i = 0, 1, . . . k ,
így palp (3k + 2) = 2k + 2 .
A hatványszó palindrom részszói a következ® tulajdonsággal rendelkeznek: • Azok a palindrom részszók, amelyek 0-t és 1-et is tartalmaznak, csak egyszer jelennek meg a hatványszóban. • Ha a következ® jelöléseket használjuk: Uiji = 0i 1j 0i és Viji = 1i 0j 1i , akkor a következ® felbontások egyértelm¶ek:
p = U111 U121 U232 U242 U353 U363 . . . Uk,2k−1,k Uk,2k,k . . . , p = 0V121 V232 V141 V353 V262 V474 V383 . . . Vk+1,2k+1,k+1 Vk,2k+2,k . . . .
Champernowne-szó
A Champernowne-szó a természetes számok bináris változatának egymás mellé illesztése. c = 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 . . . .
35.41. tétel.
A Champernowne-szó palindrombonyolultsága n
palc (n) = 2b 2 c+ε ,
ahol
ε=
0, ha n páros , 1, ha n páratlan .
Bizonyítás.
Egy n hosszúságú w palindromszó 0w0 és 1w1 formában folytatható, hogy (n + 2) hosszúságú palindromot kapjunk. A tétel a következ®kb®l bizonyítható: palc (1) = 2, palc (2) = 2, és ha n ≥ 1, akkor palc (2n + 1) = 2palc (2n − 1) , palc (2n + 2) = 2palc (2n) . A következ® algoritmus, amely használja a σ morzmust, el®állítja a Sturm-típusú szó összes palindromjait egy adott hosszúságig, amelyek az a bet¶vel kezd®dnek. Az algoritmus ötlete a következ®. Ha p a legkisebb szám, amelyre σ p (a) és σ p (b) is páratlan hosszúságú (ilyen p mindig létezik), ezen szavak azon konjugáltjait tekintjük, amelyek palindromok (ilyenek mindig léteznek), és deniáljuk a következ® morzmust: π(a) = konj σ p (a) ,
35. Szavak bonyolultsága
1686
π(b) = konj σ p (b) , ahol konj(u) az adja. u palindrom konjugáltját A π n (a) n≥0 és π n (b) n≥0 sorozatok el®állítják az összes páratlan hosszúságú palindromot, és π n (aa) n≥0 sorozat az összes páros hosszúságú palindromot. Ha α egy szó, akkor 0α0 az a szó, amelyiket úgy kapjuk, hogy töröljük α els® és utolsó bet¶jét. Általánosabban legyen m0α0m az a szó, amelyiket α-ból úgy kapjuk, hogy elhagyjuk annak els® m és utolsó m bet¶jét.
Sturm-palindromok(n) 1 2 3 4 5 6 7 8 9 10 11 12 13 14
if
n páros
then n ← n − 1
p p Legyen p a legkisebb érték, amelyre σ (a) éspσ (b) is páratlan hosszúságú. p Legyen π(a) = konj σ (a) és π(b) = konj σ (b) α←a while |α| < n do α ← π(α) m ← (|α| − n)/2 α ← m0α0m β←b while |β| < n do β ← π(β) m ← (|β| − n)/2 β ← m0β 0m
35.3. Palindrombonyolultság 15 repeat print α, β 16 α ←0α0 17 β ←0β 0 18 until α = ε és β = ε 19 γ ← aa 20 while |γ| < n + 1 21 do γ ← π(γ) 22 m ← (|γ| − n − 1)/2 23 γ ← m0γ 0m 24 repeat print γ 25 γ ←0γ 0 26 until γ = ε
1687
B kiírja a páratlan hosszúságú palindromokat
B kiírja a páros hosszúságú palindromokat
Mivel mindegyik behelyettesítés cn lépést igényel (ahol c konstans), az algoritmus lineáris. A Fibonacci-szó esetében a σ morzmus: σ(a) = ab, σ(b) = a, és, mivel σ(a) = ab, σ 2 (a) = aba, σ 3 (a) = abaab, |σ 3 (a)| = |abaab| = 5, σ(b) = a, σ ( b) = ab, σ 3 (b) = aba, |σ 3 (b)| = |aba| = 3, mindegyike páratlan szám, p egyenl® lesz 3-mal. Az abaab szó nem palindrom, és a π morzmus az ababa konjugáltat használja (az eredeti szó két bet¶vel való cirkuláris eltolása), amelyik palindrom. Ebben az esetben a π morzmus értelmezése: π(a) = ababa, π(b) = aba. Például, ha n = 14, a következ®ket kapjuk: π 2 (a) = ababa aba ababa aba ababa, és akkor α = aabaababaabaa, π 2 (b) = ababa aba ababa, és β = ababaabaababa, π 3 (aa) = ababaabaababaabaababaababaabaababaabaababa, és γ = baababaababaab.
35. Szavak bonyolultsága
1688
A páratlan hosszúságú palindromok:
A páros hosszúságú palindromok:
aabaababaabaa, abaababaaba, baababaab, aababaa, ababa, bab, a,
baababaababaab, aababaababaa, ababaababa, babaabab, abaaba, baab, aa.
ababaabaababa, babaabaabab, abaabaaba, baabaab, aabaa, aba, b,
Feladatok 35-1 Generátorfüggvény 1
Jelölje bn,d az olyan n hosszúságú 0-ból és 1-b®l álló szavak számát, amelyeknek els® és utolsó pozíciója 1, és egymás mellett legfeljebb (d − 1) 0 van. Bizonyítsuk be, hogy a bn,d számok generátorfüggvénye
Bd (z) =
X
bn,d z n =
n≥0
z(1 − z) . 1 − 2z + z d+1
(Útmutatás: lásd a 1676. oldalt.)
35-2 Generátorfüggvény 2
Bizonyítsuk be, hogy az N (n, d) számok (a n hosszúságú szivárvány szó összes (1, d)-részszóinak a száma) generátorfüggvénye
Nd (z) =
X
N (n, d)z n =
n≥0
z (1 − z)(1 − 2z + z d+1 )
(Útmutatás: lásd a 1676. oldalt)
35-3 Ablakbonyolultság
Számítsuk ki a Fibonacci-szó ablakbonyolultságát.
Megjegyzések a fejezethez Jegyzetek a fejezethez A szókombinatorika alapfogalmai és legfontosabb eredményei megtalálhatók a Lothaire-könyvekben [71, 72, 73] és a Foggkönyvben [42]. Lothaire és Fogg is egy-egy szerz®csoport gy¶jt®neve. Choffrut és Karhumäki [23] szerepel egy formális nyelvekr®l szóló könyvben egy szókombinatorika fejezettel. A különböz® bonyolultságok megtalálhatók a következ® dolgozatokban:
35. fejezet megjegyzései
1689
teljes bonyolultság: Iványi [56]; maximális és globális teljes bonyolultság: Anisiu, Blázsik, Kása [4]; (1, d)-bonyolultság: Iványi [56] (d-bonyolultság néven) és Kása [61]); (d, n−1)-bonyolultság (szuper-d-bonyolultság néven) Kása [63]; gyérbonyolultság Kása [62, 64]; faktorizálási bonyolultság Ilie [55]; ablakbonyolultság Cassaigne, Kaboré, Tapsoba [5, 22] és hasábbonyolultság [58]. A hatványszóval, az alsó/fels® maximális/teljes bonyolultsággal Ferenczi és Kása [40] foglalkozik. Ugyanebben a dolgozatban a szerz®k megadják a Sturm-típusú szavak egy jellemzését a fels® maximális és a fels® teljes bonyolultság segítségével (35.12. tétel). A véges szavak maximális bonyolultságával Anisiu, Blázsik és Kása [7] foglalkozott. Kása [61] sejtésként megfogalmazta a 35.23. tételt, amelyet aztán Levé és Séébold [68] bizonyítottak. A bonyolultság különböz® általánosításának vizsgálatával Iványi [56], Iványi és Kása [58], valamint Kása [61, 62, 63] foglalkoztak. A palindrombonyolultság eredményei véges szavakra M-C. Anisiu, V. Anisiu, Kása [6], végtelen szavakra pedig Droubay, Pirillo [32] cikkeib®l valók. A Sturm-típusú szavak palindromjai el®állítására szolgáló algoritmus szintén ebb®l a cikkb®l van. A szóbonyolultság különféle alkalmazási megtalálhatók Elzinga [34, 35] és Troyanskaya et al. [117] cikkeiben. Az érdekl®d® olvasó haszonnal forgathatja az egyéb, szóbonyolultsággal [8, 21, 39, 27, 104] és a palindromokkal [1, 9, 17, 19, 20, 26] foglalkozó dolgozatokat is.
36. Tökéletes tömbök
Tökéletes
VIII. PÁRHUZAMOS MÓDSZEREK
Ebben a részben Szirmay-Kalos László és Szécsi László Általános párhuzamos algoritmusok a grakus hardverhez, valamint Imre Sándor, Galambos Máté és Bacsárdi László Quantumalapú algoritmusok cím¶ fejezete van.
37. GPGPU: Számítások grakus processzorokon
A GPGPU angol bet¶szó a General-Purpose computing on Graphics Processing Units kifejezést takarja, vagyis általános célú számítások grakus feldolgozóegységeken történ® elvégzését jelenti. A grakus processzorok (GPUk ) er®sen párhuzamos, többszálú, sokmagos feldolgozóegységek, amelyek számítási teljesítménye sokkal nagyobb mint a hagyományos CPU-ké. Valaha ezeket az egységeket kizárólag a megjelenítés és a graka céljaira tervezték, és csak a grakus API-k segítségével voltak programozhatók. Mára azonban a GPU-k általános célú párhuzamos processzorokká váltak, amelyeket bármely programozó számára elérhet® felületeken keresztül és ismert nyelveken például C-ben lehet programozni. Gyakran egy alkalmazás GPU-ra történ® átültetésével nagyságrendi gyorsulást lehet elérni még az optimalizált CPU implementációhoz képest is. Ez a különbség a GPU-k hatalmas lebeg®pontos m¶veletvégz® teljesítményének, illetve az elérhet® nagy memória-sávszélességnek köszönhet®. Ezek a kedvez® tulajdonságok abból erednek, hogy a GPU-t m¶veletintenzív, er®sen párhuzamos számításokra tervezték, hiszen a grakus megjelenítéshez pontosan erre van szükség. Így több tranzisztort szenteltek az adatfeldolgozásnak a gyorsítótárak (cache) és a programvezérlés (ow control) rovására. Fejleszt®i szempontból ez azt jelenti, hogy a hardver késleltetéseket nincs ami elrejtse, így ezekkel közvetlenül kell számolni. Így hatékony GPU program írása nem képzelhet® el az architektúra ismerete nélkül. Azért is van értelme a GPGPU-ról, mint az informatika önálló területér®l beszélni, mert bár a GPU tekinthet® párhuzamos rendszernek, architektúrája mégsem tiszta megvalósítása a párhuzamos számítási modelleknek (A könyv külön fejezete foglalkozik a párhuzamos számításokkal). Ehelyett számos modell tulajdonságait ötvözi: cs®vezetéknek (pipeline), vektor-, illetve tömbprocesszornak (kiSingle-Instruction Multiple-Data, azaz SIMD gépnek) adatfolyamfeldolgozó processzornak, osztott memórián keresztül kommunikáló többprocesszoros rendszernek egyaránt használható, amelyben speciális rögzített funkciójú hardverelemek is jelen vannak. Így, ha erre a különleges architektúrára tervezünk algoritmust, azt számos különböz® modellhez köt®d® fogalom és módszer felhasználásával alkothatjuk meg. A grakus kártya a programozható feldolgozóegységek mellett többféle memóriát és gyorsítótárat tartalmaz, valamint bizonyos grakai feladatok vég-
1694
37. GPGPU: Számítások grakus processzorokon
rehajtására képes rögzített funkciójú egységeket is. A grakus kártyát befogadó (host) számítógép központi processzorán (CPU) futó program a harver m¶ködését annak alkalmazásprogramozói felületén (API) keresztül vezérli. A központi processzor programokat tölt fel a GPU egységekre illetve adatokkal látja el ®ket. Ezeket a programokat számos nyelven meg lehet írni és a forrásnyelvr®l gépi kódra fordítani. A Cg [88] és a HLSL [81] nyelveket kifejezetten grakára tervezték, de általános programozási nyelvekhez is léteznek a GPU programozáshoz kiterjesztések (például a CUDA C). A programozói környezet egyúttal meghatározza a programozási modellt, vagy másképpen a virtuális párhuzamos architektúrát, ami a programozható és a rögzített funkciójú elemeket, valamint azok kapcsolatait képezi le. Érdekes módon a különböz® programozási modellek jelent®sen eltér® virtuális párhuzamos architektúrákat láttatnak (37.1. ábra). A grakus API-k a GPU-t mint egy cs®vezetéket jelenítik meg, amelynek az elemei folyamprocesszorként dolgozzák fel az adatokat, mivel ez illeszkedik legtermészetesebben a legtöbb grakai feladathoz. A CUDA [89] és az OpenCL [65] viszont azon az értelmezésen alapul, hogy a GPU multiprocesszorok halmaza, ahol minden multiprocesszor egy skaláregységekb®l álló, széles SIMD feldolgozóegység, ami ugyanazt a m¶veletet egyszerre több adaton hajtja végre. Ma a multiprocesszorok száma egy rendszerben akár néhány száz is lehet, míg egyetlen multiprocesszor általában 8 vagy 16, az utasításdekóderen osztozó skaláregységet tartalmaz. A skalárprocesszorok teljes száma a multiprocesszorok számának és a SIMD skalárprocesszorok multiprocesszoronkénti számának szorzata, így könnyedén lehet ezernél is több. Ez a sok processzor mind ugyanazt a programot hajtja végre, de különböz® adatokon. A program egy végrehajtását szálnak (thread) nevezzük. Egy multiprocesszor egy szálblokkot (thread block) futtat, vagyis az azonos multiprocesszoron futó szálak halmaza a blokk. Minden processzor rendelkezik valamennyi gyors, lokális memóriával, amely csupán a multiprocesszoron futó, tehát azonos blokkban lév® szálak számára elérhet®. A globális memória sebessége a lokális memóriáénál sokkal alacsonyabb. A CPU vezérl® program a globális memóriába töltheti fel és innen töltheti le a bemen® és kimen® adatokat. Ezt a memóriát a multiprocesszorok többféle gyorsítótárazási és szinkronizációs stratégia igénybevételével is elérhetik. A CPU-val összevetve jóval kevesebb a gyorsítótárakra szánt tranzisztormennyiség, ezért összességében a gyorsítótár teljesítménye a CPU-étól elmarad. A programozó kreativitásán múlik, hogy a memóriaarchitektúrát milyen hatékonyan használja. A fenti architektúra kompakt adatokat feldolgozó, rövid, koherens számítások párhuzamos végrehajtását szolgálja legjobban. Így algoritmu-
37. GPGPU: Számítások grakus processzorokon
Grakus API programozási modell
1695
CUDA programozási modell
GPU programozási modellek: grakus árnyalók és az általános célú CUDA. A grakus árnyalókat a Shader Model 4 szabványnak megfelel®en ábrázoltuk, amelyben a programozható egységek piros színnel, a rögzített funkciójúak pedig zölddel jelennek meg. 37.1. ábra.
saink GPU-ra adaptálásának f® kihívása az, hogy ezeket sokezer szálra párhuzamosítsuk, illetve független és lehet®leg rövid számítási lépésekre bontsuk. Az ilyen számítási lépeseket megvalósító, GPU-n futó programokat gyakran kernelnek vagy árnyalónak nevezik. A kernel név a párhuzamos adatfeldolgozási vetületre utal, míg az árnyaló név egy alapvet® grakai feladat öröksége, amely a tárgyak felületére érkez® fény visszaver®dését szimulálja, vagyis az árnyal (shading). Bár a GPU-programozási nyelvek és vezérlésre használható API-k képességeikben és nyelvi elemeikben is egyre hasonlóbbak lettek, még mindig különválnak a grakai és az általános célú megoldások. A két megközelítés két különböz® programozói szemléletet takar. A grakus API-k a korábban nagyon er®sen korlátozott, de tisztán párhuzamos árnyalóprogramokból igyekeznek rugalmas számítóeszközöket faragni. A GPGPU keretrendszerek az általános programnyelvekhez tesznek hozzá a hagyományos kód párhuzamos futtatását lehet®vé tev® elemeket. A grakus megközelítés t¶nhetne túlhaladottnak, vagy mondhatnánk, hogy csak a grakához közeli területeken indokolt, de valójában a lényegének nincs köze a grakához. A lényeg ugyanis az a benne foglalt ismeret, hogy hogyan is m¶ködnek az olyan hatékony párhuzamos algoritmusok, mint amilyen az inkrementális képalko-
1696
37. GPGPU: Számítások grakus processzorokon
37.2. ábra.
Az inkrementális képalkotás folyamata.
tási cs®vezeték. Ezért tárgyaljuk el®ször ezt a cs®vezetéket és bemutatjuk, hogy a graka programozó szemével milyennek is látjuk a GPU-t. Ezzel nemcsak az egyes alkatrészek célját és m¶ködését tisztázzuk, hanem egyúttal egy érvényes, kipróbált és általános célra is használható GPU programozási megközelítést is adunk. Ezután térünk át a GPGPU megközelítésre, a magasabb absztrakciós szint kedvéért elhagyva minden grakával kapcsolatos fogalmat és lemondva a graka feladataihoz rendelt kötött m¶ködés¶ hardverelemekr®l.
37.1. A grakus cs®vezeték modellje A grakus cs®vezeték modellje a GPU hardvert azon az absztrakción keresztül szemléli, hogy az egy inkrementális képalkotást [113] (lásd a Számítógépes graka cím¶ fejezetet az els® kötetben) végrehajtó eszköz. Az inkrementális képalkotás célja, hogy lefényképezzen egy virtuális világot. Ehhez a világot leíró numerikus modellt lineáris primitívekké (pontokká, vonalakká, háromszögekké) alakítja és ezeket egy diszkrét kép képpontjaira bontja, más szóval raszterizálja. A folyamat számos algoritmikus lépésb®l áll, ezek csoportjai alkotják a cs®vezeték szakaszait (pipeline stages). Néhány szakaszt dedikált hardverkomponensek valósítanak meg, míg másokat a GPU-n futó programok. A részletek mell®zésével, tekintsük át a képalkotás folyamatát (37.2. ábra):
37.1. A grakus cs®vezeték modellje
1697
•
A virtuális világ modellpéldányok gy¶jteménye. A modelleket háromszöghálókkal közelítjük. Ez a folyamat a tesszelláció.
•
Az árnyalás végrehajtásához az objektumokat abba a térbe kell transzformálnunk, amelyben a kamera és a fényforrások is adottak. Ez lehet a világtér vagy a kameratér.
•
A háromszögek csúcspontjait a kamerabeállításoknak megfelel®en a képerny®re vetítjük. Azt, hogy a csúcspont hol látszik a képerny®n, a kamera transzformáció, a perspektív transzformáció és végül a nézetablak transzformáció végrehajtásával számítjuk ki. Kameratérben a kamera az origóban van és a −z tengely irányába néz. A szempozícióból induló, a képerny®nek megfeleltetett ablak pontjain áthaladó sugarak egy perspektív köteget alkotnak. A perspektív transzformáció szerepe, hogy ezt a perspektív köteget párhuzamos sugárköteggé alakítsa és ezzel a következ® lépésben szükséges perspektív vetítést párhuzamos vetítésre cserélje. A perspektív transzformáció után a csúcspontok normalizált eszköz-koordinátákban állnak el®. Ebben a térben a látható térfogatot a −1 ≤ x ≤ 1, −1 ≤ y ≤ 1, −1 ≤ z ≤ 1 egyenl®tlenségekkel meghatározott téglatest adja meg. A geometriai primitíveknek ezen a térfogaton kívül es® részeit a vágás m¶velete távolítja el. A normalizált eszköz-koordinátákat tovább transzformáljuk a képtérbe, a célkép felbontását és elhelyezkedését is gyelembe véve. Az x = −1, y = −1 normalizált eszköz-koordinátájú pontot a nézeti ablak bal alsó sarkának képerny®n elfoglalt helyére képezzük, az x = 1, y = 1 pontot pedig a jobb fels®ére. Eközben a z koordinátát a −1 ≤ z ≤ 1 tartományból a [0, 1] tartományba konvertáljuk.
•
A képtérben minden vetített háromszöget képpontok (pixelek) egy halmazára bontunk. Egy bels® pont kitöltésekor annak tulajdonságait köztük a z koordinátát, vagyis a mélységet a csúcspontok adataiból inkrementális lineáris interpolációval számoljuk. Minden képpont árnyalási színe ezekb®l az interpolált adatokból számolható, például a csúcspontokban számolt színek interpolált változata lehet a pixelszín. Emellett vagy ehelyett textúrának nevezett képeket is tapétázhatunk a háromszöghálókra. A textúraképek színrekordok kétdimenziós tömbjei, egy elemüket texelnek hívjuk. Azt, hogy a textúrát mi módon képezzük a háromszögek felületére, a csúcspontokhoz rendelt textúrakoordinátákkal adhatjuk meg.
•
Végül a képpont színeket a képerny®n megjelenített rasztertár (frame buer) írjuk. A rasztertár mellett egy mélységbuerre (depth buer, z-buer, depth-stencil texture) is szükség van. Ez tárolja a mélységinformációt, vagyis azon felületi pontok z koordinátáit, amelyek színét
1698
37. GPGPU: Számítások grakus processzorokon
a rasztertár pixelei tárolják. Amikor újabb háromszöget raszterizálunk egy pixelre, a szín- és mélységinformációt csak akkor írjuk felül, ha az új mélység a mélységbuerben tároltnál kisebb, vagyis az új háromszög ebben a képpontban közelebb van a néz®ponthoz. Ennek eredményeképpen egymást helyesen takaró háromszögek 3D képét kapjuk. A mélységbuer-algoritmus egyben példa arra az általánosabb m¶veletre, amikor a képpontban tárolt adatot valamilyen új adat és a korábban a képpontban tárolt adat függvényeként határozzuk meg. Az ilyen m¶veletek neve kompozitálás (merging).
37.1.1. A GPU mint az inkrementális képalkotás megvalósítása A grakus API által elénk tárt GPU architektúra a képalkotási cs®vezeték közvetlen megvalósítása (37.1. ábra, bal oldal). Ezt a cs®vezetéket a CPU a grakus API hívásain keresztül kongurálhajta, majd m¶ködését egy rajzoláshívás (draw call) révén indíthatja el. Az egymás utáni rajzoláshívások sorozatát, amelyek során a konguráció nem, csupán a bemenetek változnak, menetnek (pass) hívják. Egy rajzoláshívás csúcspontok sorozatát dolgozza fel. A csúcspontokhoz tartozó adatokat a csúcspontbuer (vertex buer) tárolja. A csúcspontok megadása modellezési térben, homogén koordinátákkal történik. Az (x, y, z) Descartes-koordinátájú pont az [xw, yw, zw, w] négyelem¶ homogén koordinátavektorral is megadható, ahol w egy tetsz®leges nemzérus skalár lehet (részletesebb magyarázatért lásd a számítógépes grakáról szóló fejezetet). Ennek a reprezentációnak a neve onnan származik, hogy a számnégyes minden elemének ugyanazzal a skalárral való szorzása nem módosítja a kijelölt háromdimenziós pontot. Az [X, Y, Z, w] homogén számnégyesb®l ugyanennek a pontnak a Descartes-koordinátáit a homogén osztás segítségével kaphatjuk meg: (X/w, Y /w, Z/w). A homogén koordinátáknak számos el®nyös tulajdonsága van a Descartes-koordinátákhoz képest. Homogén koordinátákkal még a párhuzamosok metszéspontja is kifejezhet® (egy ideális pont ), vagyis az euklideszi geometria párhuzamosok okozta szingularitása kiküszöbölhet®. A homogén lineáris transzformációk közé tartozik a perspektív vetítés, aminek nagyon fontos szerepe van a képalkotásban, de Descartes-koordinátákban nem lenne lineáris transzformáció. Ami igazán fontos, hogy az egyeneseket egyenesekbe, síkokat síkokba, háromszögeket háromszögekbe leképez® transzformációk halmaza megegyezik a homogén koordinátákon végzett lineáris m¶veletek halmazával. A csúcspontbuer beállítása után a koordinátáikkal és más attribútumaikkal például textúrakoordinátákkal vagy saját színnel leírt csúcspon-
37.1. A grakus cs®vezeték modellje
1699
tok megkezdik útjukat a grakus cs®vezetékben, a programozható árnyalóprocesszorok és a rögzített funkciójú elemek révén megvalósított feldolgozószakaszokon keresztül. Ezen szakaszokat egyesével ismertetjük.
Tesszelláció
Ha a csúcspontjaink nem közvetlenül a végs® háromszöghálót adják meg, hanem csupán egy parametrikus felület vezérl®pontjai, vagy a háromszögháló durvább verziójának csúcsai, akkor az els® lépés a végs® háromszögháló el®állítása, vagyis a . Mivel ennek a szakasznak a programozhatósága korlátozott és a GPGPU alkalmazhatósága nem különösebben jelent®s, nem tárgyaljuk tovább, inkább feltételezzük, hogy a csúcspontbuer a tesszellációt nem igényl® háromszögháló csúcsait tartalmazza.
A csúcspontárnyaló
Az objektumokat a vágás el®tt normalizált eszköz-koordinátákba kell transzformálni, ezt pedig egy homogén lineáris transzformációval érhetjük el. Ezen felül a GPU feladata lehet a megvilágítás számítása a háromszögháló csúcspontjaiban. Ezeket a m¶veleteket a csúcspont-árnyaló hajtja végre. Általánosabban tekintve, a csúcspont-árnyaló egység egyszerre egy csúcspont adatait kapja meg, módosíthatja ®ket új pozíció-, szín- és textúrakoordinátaértékek kiszámításával, és így egy megváltoztatott csúcspontot ad ki. A csúcspontok feldolgozása egymástól függetlenül, párhuzamosan történik.
A geometria-árnyaló
A geometria-árnyaló a csúcspontrekordok mellett a primitívekr®l is kap információt: például mely csúcsok alkotnak egy háromszöget a háromszöghálóban. Az árnyaló továbbíthatja a primitíveket, de új csúcspontokat, új primitíveket is létrehozhat. Lehet®ség van arra, hogy ezeket egy kimen® buerbe írjuk, amit kés®bbi menetek bemenetként használhatnak. A geometria-árnyaló tipikus felhasználási területe a procedurális modellezés, amely szabályok alapján összetett modellek alkot egyetlen pontból vagy háromszögb®l kiindulva [75]. A csúcspont-árnyalók kis, specializált egységekb®l általános adatfolyamfeldolgozó processzorokká fejl®dtek, mialatt megtartották az egy bemenet egy kimenet sémát. A geometria-árnyaló azonban a csúcspont-árnyaló kimen® rekordjain (a feldolgozott csúcspontokon) dolgozik és változó (de korlátos) mennyiség¶ hasonló rekordot ad ki.
Vágás
A során a hardver a primitíveknek csak a normalizált eszköz-koordinátákban (−1, −1, −1) és (1, 1, 1) átellenes csúcsokkal jellemezhet®, koordinátasíkokkal párhuzamos oldalú kockán belüli részét tartja meg. Egy pont akkor esik ezen
1700
37. GPGPU: Számítások grakus processzorokon
belülre, ha homogén koordinátái kielégítik a következ® egyenl®tlenségeket:
−w ≤ x ≤ w, −w ≤ y ≤ w, −w ≤ z ≤ w. A harmadik egyenl®tlenség speciálisan az OpenGL konvencióihoz igazodik. Akkor érvényes pl. a Cg nyelvben, ha OpenGL csúcspontárnyaló-prolra illeszked® gépi kódot fordítunk bel®le. Az utolsó egyenl®tlenségpár lehetne 0 ≤ z ≤ w is, ahogy a Direct3D feltételezi. Ez érvényes Cg-ben Direct3D prolok esetén, illetve a HLSL szabványban. A különbséget a fordítóprogramok elrejtik, mivel a csúcspontárnyaló kimenetét (a használt konvenció, vagyis a prol ismeretében) olyanra alakítják, amilyent a vágást végz® hardver vár. A vágást a GPU rögzített funkciójú hardvere hajtja végre, így m¶ködését nem lehet megváltoztatni. Azok a primitívek folytathatják útjukat a cs®vezeték további szakaszai felé, amelyek a vágási feltételeket teljesítik. Párhuzamos programozási szemszögb®l a vágó hardver egy adatfolyamsz¶r® . Ha el szeretnénk hagyni egy, a csúcspont- vagy geometria-árnyaló által feldolgozott adatelemet, a csúcspontok pozícióját úgy kell beállítanunk, hogy azok a vágási kockán kívül essenek. Így a vágó hardver törli az elemet a cs®vezetékb®l. A vágás után a m¶velete következik, vagyis a homogén koordinátákat Descartes-koordinátákká alakítjuk úgy, hogy az els® három homogén koordinátát a negyedikkel elosztjuk. A csúcspontokat ezután képtérbe transzformáljuk, ahol az els® két koordináta azt mondja meg, melyik képpontra esik a csúcspont.
Raszterizáció lineáris interpolációval
A cs®vezeték szíve a nem-programozható raszterizáló szakasz. Ez képes a lineáris primitíveket (háromszögeket, szakaszokat, pontokat) a képerny® képpontjaira illeszked® diszkrét pixelekké alakítani. Egyszer¶bben fogalmazva, háromszögeket képes rajzolni a csúcspontok képtérbeli koordinátái alapján. A cs®vezeték raszterizáló el®tti szakaszai ezeket a csúcspont-koordinátákat számolják ki, a kés®bbi szakaszok feladata pedig a képpont színek megállapítása lesz. Bár így a raszterizáció kapcsán a cs®vezeték minden szakaszának meg lehet fogalmazni az alapfeladatát, a GPGPU alkalmazások nem feltétlenül igénylik háromszögek rajzolását. A raszterizálót mégis lehet párhuzamos programozási szempontból is értelmezni, mégpedig adatfolyamsokszorozóként (stream expander), hiszen minden primitív számítás nyomán független pixelszámítások sokaságát indítja el. Ehhez csak a háromszögeket kell ügyesen megkonstruálni. A raszterizáció képtérben dolgozik, ahol a csúcspontok x, y koordinátái azon egész képpont-koordináták, ahova a képen a csúcsok vetülnek. A csúcspontokhoz további jellemz®k is tartozhatnak, mint például a képtérbeli z
37.2. GPGPU a grakus cs®vezeték modelljének felhasználásával
1701
koordináta, textúrakoordináták vagy színek. Egy háromszög raszterizációjakor mindazokat a képpontokat azonosítjuk, amelyek a háromszög vetített képén belülre esnek. Az egyes képpontok tulajdonságait lineáris interpolációval határozzuk meg.
A pixelárnyaló
A csúcspontokhoz rendelt értékekb®l interpolációval állnak el® a képpontok tulajdonságértékei, és ezek alapján kell meghatározni a pixel színét, illetve módosítható a hozzá tartozó mélységérték is. A szín meghatározásának klasszikus módja az, hogy az interpolált textúrakoordináta alapján kiolvassuk a textúramemóriát, a kapott eredményt pedig az interpolált színnel moduláljuk. Általában egy pixelárnyaló program a pixelhez tartozó interpolált értékeket kapja bementként, és kimenetként egy színt, illetve opcionálisan egy mélységet adhat ki. A csúcspontárnyalóhoz hasonlóan a pixelárnyaló is egy bemeneti rekordhoz egy kimeneti rekord ' típusú processzor. A pixelárnyaló a célképponthoz van kötve, a kimenetét sehova máshova nem tudja átirányítani.
Kompozitálás
A kiszámított képpontszínek nem közvetlenül kerülnek a képmemóriába, hanem a kompozitáló egység (output merger) felel®s az új értékek és a korábbi tartalom összeolvasztásáért. El®ször a mélységbuer alapján a mélységtesztet hajtjuk végre. Megjegyzend®, hogy amennyiben a pixelárnyaló a z értéket nem módosítja, ez a m¶velet el®rehozható a pixelárnyalás elé. Ez a korai z-teszt jobb teljesítményhez vezethet a felesleges pixelfeldolgozások elhagyása miatt. Végül a kompozitáló kombinálja például lineárisan, vagy minimumot, maximumot képezve a kiszámított képpont színt a már meglev® pixel színnel, és az eredménnyel felülírja a rasztertárban tárolt színt. Ez a keverés (blending), amivel például átlátszó felületek megjelenítése lehetséges (37.3. ábra). GPGPU céljaira a keverés f®leg akkor hasznos, ha egymást követ® számítások eredményeinek összegét, minimumát vagy maximumát keressük.
37.2. GPGPU a grakus cs®vezeték modelljének felhasználásával Az általános célú programozásban olyan fogalmakat szoktunk meg, mint például a bemen® és kimen® adat, valamint az ideiglenes és a kimen® adatokat el®állító, paraméterezhet® függvények. Ha a GPU-t a grakus API-n keresztül
1702
37. GPGPU: Számítások grakus processzorokon
Kever®egység, amely az új pixelszínt a számított és a korábban tárolt színek kombinálásával állítja el®. 37.3. ábra.
szeretnénk használni, akkor a programozói fogalmainkat meg kell feleltetni az inkrementális képalkotás fogalmainak, köztük a geometriai primitíveknek, csúcspont, geometria és képpont feldolgozásnak, raszterizációnak, textúrázásnak, kompozitálásnak és a kimeneti képnek. Számos különböz® lehet®ség van arra, hogy ezt a megfeleltetést megtegyük, melyek el®nyei és hátrányai a konkrét algoritmustól függenek. Itt néhány olyan általános megközelítést tárgyalunk, amelyek sikeresnek bizonyultak teljesítményigényes számítási alkalmazásokban. El®ször megvizsgáljuk, hogy miként rokoníthatók a programozási fogalmaink a GPU elemeihez.
37.2.1. A kimenet A GPU-k képeket rajzolnak, vagyis kétdimenziós képponttömböket állítanak el®. A rajzolási cél (render target) lehet a felhasználó felé megjelenített rasztertár, de lehet egy kimeneti textúra is (amely esetben a képpont (pixel) helyett textúraelemr®l, texelr®l szokás beszélni). A GPGPU esetében a kimenet jellemz®en egy textúra, amelyben a xpontos számábrázolású rasztertárral szemben lebeg®pontos értékek is tárolhatóak. Ennél is fontosabb, hogy a textúrák a kés®bbi számítási lépésekben bemenetként használhatóak, vagyis a korábbi kétdimenziós kimenti textúra akár kétdimenziós bemeneti textúraként, vagy többet összefogva háromdimenziós bementi textúraként is szerepelhet. Korábbi GPU-knál minden képponthoz legfeljebb öt lebeg®pontos számot tudtunk tárolni, mivel a színt a vörös, zöld, kék és átlátszatlanság értékek írták le, a mélységbuerben pedig egy skalár mélységérték, a z képtérbeli
37.2. GPGPU a grakus cs®vezeték modelljének felhasználásával
1703
koordináta szerepelhetett. Kés®bb a több rajzolási cél (multiple render targets) megjelenésével a képponthoz több, jellemz®en négy textúrában is tartozhatott érték, amivel a legnagyobb kimeneti rekord már tizenhét lebeg®pontos számot tudott tárgyalni. A Shader Model 5.0-ös GPU-k esetében ez a korlátozás is megkerülhet®, a képpontokhoz akár változó hosszúságú adatlistákat is ki tudunk írni. A geometriai elemek határozzák meg, hogy mely képpontokat veszi célba a rajzolási folyamat. Minden primitívet a képtérbe transzformálunk és a vetített képét raszterizáljuk, tehát azok lesznek a kimeneti képpontok, amelyek a vetületen belülre esnek. Ha több primitívet is átküldünk a cs®vezetéken, azok vetületei átlapolódhatnak, így egy képpontra több számítást is végzünk. A kompozitáló kombinálja ezeket az eredményeket, például csak a legkisebb képtérbeli mélység¶t tartja meg a mélységteszt révén, vagy összegzi a részeredményeket a keverés segítségével. A rajzolási célként kijelölt memóriát csak a pixelárnyaló írhatja a kompozitálási m¶veleten keresztül, miközben közvetlenül egyetlen árnyalóprocesszor sem olvashatja. Mivel különböz® pixelárnyaló szálak különböz® helyekre írnak a rajzolási célban, szinkronizációs probléma nem merülhet fel.
37.2.2. A bemenet A képszintézis bemenetei a geometriát leíró adatfolyam és a felületek színét kódoló textúrák. Mivel a háromszöghálónak általában nincs konkrét szerepe GPGPU alkalmazásokban, a geometriát leíró adatokat csupán vezérl®mechanizmusként használjuk arra, hogy elosszuk a számítási terhelést az árnyalóprocesszorok között. A valódi GPGPU bemenet a textúrákban tárolt adat lesz. A textúra texelek egy-, két- vagy háromdimenziós tömbje, ahol egy texel egy, kett® vagy négy skalár értéket tárol a vörös, zöld, kék és átlátszatlanság csatornákban. A számértékek különböz® formátumúak lehetnek, például el®jel nélküli bájt vagy 32 bites lebeg®pontos szám. GPGPU szempontból többnyire a 32 bites lebeg®pontos ábrázolás a legmegfelel®bb. Az egydimenziós lebeg®pontos textúra hasonló a lineáris CPU memóriához, ahol a szokásos adatszerkezeteket, tömböket, listákat, fákat ugyanúgy lehet tárolni. A kétfajta memória hasonlósága azonban két ponton megtörik. Az egyik tekintetben a textúra gyengébb, a másik tekintetben viszont er®sebb, mint a lineáris CPU memória. Nyilvánvaló korlátozás az, hogy a textúra párhuzamosan bár, de csak olvasható minden programozható árnyaló számára, kivéve a rajzolási céltextúrát, ami viszont csak a kompozitáló egység számára írható. A CPU memóriában megszokott olvasás-módosítás-írás ciklust árnyalóprogramban nem használhatjuk. A GPU-tervez®knek jó oka volt rá, hogy ne
1704
37. GPGPU: Számítások grakus processzorokon
tegyék lehet®vé az olvasás-módosítás-írási ciklusokat, és hogy a textúrákat párhuzamosan olvasható, illetve kizárólagosan írható szerepekbe korlátozzák, hiszen így az írást soha nem kell gyorsítótárazni és az olvasási gyorsítótárak soha nem válnak érvénytelenné. Másrészr®l viszont a textúramemória sokkal több címzési módot támogat, mint a lineáris memória, és ami még fontosabb, textúrasz¶r® hardveregységeken keresztül is olvasható. A sz¶r®kkel a textúra nemcsak elemek egy tömbje lehet, de egy-, két-, vagy háromdimenziós térbeli függvény végeselemes reprezentációja is (a 37.7. alfejezet fogja a végeselemes reprezentáció és textúrák közötti kapcsolatot b®vebben tárgyalni). Egydimenziós textúrákhoz lineáris sz¶rés alkalmazása azt jelenti, hogy ha az u textúra koordináta az U és U + 1 texelkoordináták közé mutat, akkor a hardver automatikusan lineárisan interpolál a két texel értéke között. Legyenek a texelek értékei T (U ) és T (U + 1). Az u helyen visszaadott sz¶rt érték ekkor
T (u) = (1 − u∗ )T (U ) + u∗ T (U + 1),
ahol
u∗ = u − U.
A kétdimenziós textúrákon bilineáris sz¶rést használhatunk, az interpolált (u, v) textúrakoordináta-párhoz legközelebb es® négy texelérték között. Legyenek ezek T (U, V ), T (U +1, V ), T (U +1, V +1) és T (U, V +1). Az (u, v)-re visszaadott sz¶rt érték ekkor
T (u, v) = T (U, V )u∗ v ∗ + T (U + 1, V )(1 − u∗ )v ∗ + T (U + 1, V + 1)(1 − u∗ )(1 − v ∗ ) + T (U, V + 1)u∗ (1 − v ∗ ), ahol u∗ = u − U és v ∗ = v − V . Háromdimenziós textúrákra alkalmazható trilineáris sz¶rés hasonlóképpen m¶ködik.
37.2.3. Függvények és paramétereik Ahogy a primitívek végighaladnak a cs®vezetéken, árnyalóprocesszorok és rögzített funkciójú elemek dolgozzák fel ®ket, hogy végül meghatározzák az egyes képpontokhoz tartozó értékeket. Az árnyalóprocesszorok programjai nem változnak egy rajzolási menetben, így azt mondhatjuk, hogy minden egyes képpontot ugyanaz a program számít ki. A képpontok színeinek különböz®sége az adatok különböz®ségén múlik. Így a GPU olyan hardver, ami rekordok egy tömbjét számolja ki. A GPU-n az adatok egy sor programozható vagy x algoritmust végrehajtó processzoron haladnak keresztül amíg a kimeneti képpontok el® nem állnak. Ez azt jelenti, hogy a GPU-t lehet adatfolyamfeldolgozónak (stream
37.3. A GPU mint vektorprocesszor
1705
processzor) is tekinteni. A primitíveket meghatározó csúcsok virtuális adatfolyamot alkotnak, amit els®ként a csúcspontárnyaló dolgoz fel. Az adatfolyam feldolgozás fogalomkészletét használva azt mondhatjuk, hogy a csúcspontárnyaló egy leképezés, mivel egy-egy csúcs adataira alkalmaz valamiféle függvényt és minden bemenetre egy módosított csúcspontadatot ad ki. Így a bemeneti és kimeneti adatfrekvencia azonos. A geometria-árnyaló megváltoztathatja a primitív típusát és a csúcspontok számát. Az adatfrekvencia csökkenhet, ekkor a m¶velet neve redukció vagy adatfolyamsz¶rés . Az adatfrekvencia növekedhet is, amikor adatfolyamsokszorozásról beszélünk. A vágás megtarthat vagy eldobhat primitíveket, de ha azok részben lógnak be a vágási térfogatba, akkor meg is változtathatja ®ket. Ha ez utóbbi esett®l eltekintünk, a vágás tekinthet® adatfolyamsz¶résnek . Ha a csúcsok koordinátáit a csúcspontárnyalóban úgy állítjuk be, hogy a vágási térfogaton kívülre essenek, ki tudjuk zárni a primitívet a további feldolgozási lépésekb®l. A raszterizálás a primitívet pixelekké bontja, így adatsokszorozóként m¶ködik. A pixelárnyaló a csúcspontárnyalóhoz hasonlóan ugyancsak leképezés. Végül a kompozitálás m¶ködhet kiválasztásként, például a mélységkoordináta alapján, vagy akár összegzésként is, ha a keverést használjuk. Az árnyalóprocesszorok a bemen® adataikat regisztereken keresztül kapják meg, amelyeket az el®z® szakasz egységei töltenek fel. Az ilyen bemenetek neve változó bemenet (varying input). Ezek mellett a CPU programból is beállíthatunk globális paramétereket. Ezeket egységes bemenetnek (uniform input) hívják, mivel az adatfolyam minden elemére azonosak és a cs®vezeték m¶ködése közben nem, csupán a rajzolási menetek között változtathatók.
37.3. A GPU mint vektorprocesszor Azt a párhuzamos gépet, amely a kimeneti értékeket ugyanazzal az algoritmussal, de egymástól függetlenül és köztes eredmények megosztása nélkül számítja, vektorprocesszornak vagy tömbprocesszornak nevezzük. Mivel a GPU hardverben a pixelárnyaló kapcsolható a kimeneti adatelemekhez, ezt az árnyalót használjuk a kimenet el®állítására. Természetesen egy adott processzoron futó programnak tudnia kell, hogy melyik adatelemet számítja, alapvet®en ebb®l adódik a számítás adatfügg®sége (nem lenne értelme a párhuzamosításnak, ha ugyanazt számolnánk ki egyszerre több példányban). A pixelárnyaló számára az adatelem indexe nem más, mint a képpontot kijelöl® koordináta pár. A legegyszer¶bb, de a gyakorlat számára a legfontosabb esetben a rajzolási cél minden képpontjára szeretnénk egy menetben eredményt kapni.
1706
37. GPGPU: Számítások grakus processzorokon
37.4. ábra.
A GPU mint vektorprocesszor.
Tehát olyan geometriai primitívet kell választanunk, ami a kép összes képpontjára leképz®dik, de mindegyikre csak egyszeresen, hogy elkerülhessük egy kimeneti adat többszöri felesleges kiszámítását. Ilyen geometriai primitív maga a nézeti ablak. Képtérben ez nem más, mint a nézetablak (viewport), vágási térben (normalizált eszköz-koordinátákban) pedig a [−1, −1, 0, 1], [1, −1, 0, 1], [1, 1, 0, 1], [−1, 1, 0, 1] homogén koordinátás csúcsokkal rendelkez®, x, y síkon elhelyezked® négyzet. Ezt a két háromszögprimitívb®l összeállítható téglalapot hívják teljes képerny®s téglalapnak vagy teljes nézeti téglalapnak (full-screen quad, full-viewport quad) (37.4. ábra). Tegyük fel, hogy szeretnénk kiszámítani az N elem¶ y kimeneti tömböt az M elem¶ x bemeneti tömbb®l, a p globális paraméter mellett az F függvény segítségével: yi = F (i, x, p), i = 1, . . . , N. Ahhoz, hogy a GPU-t erre a számításra rábírjuk, rendeljük a rajzolási célként beállított kimeneti textúrát az y tömbhöz. A textúra méretét a kimeneti tömb mérete alapján válasszuk meg úgy, hogy a nézetablaknak le kell fednie a teljes rajzolási célt. Egy H vízszintes és V függ®leges felbontással rendelkez® kétdimenziós tömb H × V elem tárolására alkalmas. Tehát H × V ≥ N betartása mellett elvileg bármilyen felbontást választhatunk. Azonban a GPU is rendelkezhet korlátozásokkal ezen a téren, például a felbontás legfeljebb 212 ×212 lehet, vagy ha ugyanezt a textúrát kés®bb bemenetként is szeretnénk használni, vagy bináris redukciót kívánunk végrehajtani rajta, akkor el®nyösebb lehet kett® hatvány felbontást választani. Ezt akár úgy is
37.3. A GPU mint vektorprocesszor
1707
elérhetjük, hogy tömbjeinket nem használt elemekkel egészítjük ki. A vektorfeldolgozás alapgondolatának megfelel®en a különböz® kimeneti értékek számítása egymástól függetlenül, köztes adatok megosztása nélkül zajlik. Mivel a GPU hardverben a pixelárnyaló végez a kimenet elemeihez kapcsolható független számításokat, ezt az árnyalót használjuk az F kiértékelésére. A paraméterek eléréséhez ismernünk kell az i indexet, vagyis hogy melyik kimeneti elemet számítjuk, és hozzá kell férnünk az x bemeneti tömbhöz. Ennek legegyszer¶bb módja, hogy a tömböt egy bemen® textúrában tároljuk (vagy akár több textúrában, ha az kényelmesebb), hiszen a pixelárnyaló olvashat textúrákból. A CPU feladata a céltextúra bekötése rajzolási célként, az egységes paraméterek beállítása, a nézetablak megadása és egy teljesnézetes téglalap cs®vezetékre küldése. Az egységes paramétereken jelölhetjük ki a bemen® textúrát és a p globális paraméter értékét. OpenGL API-t feltételezve a CPU programot C nyelven a következ®képpen írhatjuk meg: StartVectorOperation( ) { Az egységes p paraméter és a a bemeneti textúra arrayX azonosítójának beállítása
}
glViewport(0, 0, H, V); glBegin(GL_QUADS); glVertex4f(-1,-1, 0, glVertex4f(-1, 1, 0, glVertex4f( 1, 1, 0, glVertex4f( 1,-1, 0, glEnd( );
// Felbontás, azaz a kimeneti tömb mérete // A következ® pontok egy téglalap csúcsai 1); // normalizált eszköz-koordinátarendszerben 1); 1); 1);
Megjegyzend®, hogy a program közvetlenül normalizált eszköztérben, homogén koordináták használatával adja a glVertex4f függvény paramétereként a téglalap csúcsait. Így a cs®vezetékben ezeket már nem kell transzformálnunk. Az árnyalóprogramok a változó bemenetet erre szánt regisztereikben kapják meg és a kimenethez rendelt regiszterekbe írják. Minden ilyen regiszter oat4 típusú, tehát négy lebeg®pontos számot tárol. A regiszterek szerepüket jelöl® nevekkel azonosíthatók, a csúcspont pozíciója például a POSITION regiszterb®l olvasható ki. A csúcspont színét a COLOR, textúrakoordinátáit a TEXCOORD0..7 regiszterek tárolják. A csúcspontárnyaló feladata, hogy a csúcspont megkapott pozícióját normalizált eszköz-koordinátarendszerbe transzformálja. Mivel közvetlenül ebben a térben adtuk meg a csúcspontokat, a csúcspontárnyalónak csak át kell másolnia az értéket a bemeneti POSITION regiszterb®l a kimeneti POSITION regiszterbe. A kimeneti és bemeneti jelleget az in és out kulcsszavakkal jelezhetjük a regiszterekhez rendelt paraméterek el®tt. A bemeneti pont pozícióját a kimenetre másoló csúcspont árnyaló: void VertexShader( in float4 inputPos : POSITION, out float4 outputPos : POSITION )
1708 { }
37. GPGPU: Számítások grakus processzorokon
outputPos = inputPos; // változtatás nélküli másolás
A geometriaárnyalónak ugyanazt a téglalapot kell továbbadnia, amit maga kapott. Ez a viselkedés az alapértelmezett, ehhez nem kell programot megadnunk. A téglalap ezután a vágást végz® egységhez ér, ami megtartja a téglalapot, hiszen a vágási térfogaton belül van. Vágás után a homogén osztás a homogén koordinátákból a Descartes-koordinátákat állítja el®. Mivel mind a négy csúcs negyedik homogén koordinátáját 1 érték¶re állítottuk, az els® három koordináta nem változik. Osztás után a GPU a téglalap csúcsait képtérbe transzformálja, amelynek során a csúcsok x, y koordinátái a nézetablak sarkaira kerülnek, a z tartomány pedig a (−1, 1)-b®l a (0, 1) intervallumra képz®dik le, így a z = 0 értékb®l z = 0.5 érték lesz. Végül ezt a téglalapot töltik ki a pixelek, tehát a nézetablak összes képpontjára lefut a pixelárnyaló. A pixelárnyaló az igazi számítást végz® egység. A bemen® tömböt és a p globális paramétert egységes bemenetként kapja meg, a WPOS regiszter alapján pedig azonosítja, hogy mely képpontot számolja éppen: float FragmentShaderF( in float2 index : WPOS, // célpixel koordinátái uniform samplerRECT arrayX, // bemeneti tömb uniform float p // globális p paraméter ) : COLOR // a kimenet egy pixel szín, azaz tömbelem { float yi = F(index, arrayX, p); // F a kiértékelend® függvény return yi; }
Ebben a programban két bemeneti paramétert deklaráltunk egységes bemenetnek az uniform kulcsszó segítségével: a p paramétert és az arrayX textúraazonosítót. A textúra típusa samplerRECT , amivel azt is kijelöltük, hogy milyen címzéssel érhet® el a textúra. Ebben a címzési módban a texelközéppontok kétdimenziós egységhálón helyezkednek el. Megjegyzend®, hogy itt a korábbiaktól eltér® szintaxist alkalmaztunk az árnyaló kimenetének magadására. Ahelyett, hogy a regisztert az out kulcsszóval jelöltük volna meg, itt a kimenet maga a függvény visszatérési értéke, ami a COLOR regiszterbe kerül.
37.3.1. A SAXPY BLAS függvény megvalósítása Tekintsünk egy konkrét példát és valósítsuk meg a Basic Linear Algebra Subprograms (BLAS ) könyvtár (http://www.netlib.org/blas/) els® szint¶
funkcionalitását, ami a következ® általános formában felírható vektorfüggvényeket képes kiértékelni: y = px + y
ahol x és y vektorok és p skalárparaméter. Ezt a m¶veletet a BLAS könyvtárban SAXPY-nak hívják. Ezúttal a pixelárnyaló két textúrát fogad, az x
37.3. A GPU mint vektorprocesszor
1709
vektort és az y vektor eredetijét. Egy pixelárnyaló futtatás a kimeneti vektor egyetlen elemét számolja: float FragmentShaderSAXPY( in float2 index : WPOS, // célpixel koordinátái uniform samplerRECT arrayX, // x bemeneti vektor uniform samplerRECT arrayY, // az y vektor eredeti verziója uniform float p // globális p paraméter ) : COLOR // a kimenet egy pixel szín, azaz vektorelem { float yoldi = texRECT(arrayY, index); // yoldi = arrayY[index] float xi = texRECT(arrayX, index); // xi = arrayX[index] float yi = p * xi + yoldi; return yi; }
A CPU-stílusú programozás tömbindexelése helyett itt texRECT Cg függvényével olvasunk be egy elemet a tömböt reprezentáló textúrából. A texRECT függvény els® paramétere a kétdimenziós textúra azonosítója, amit a CPU-ról egységes paraméterként adunk át, a második pedig a kiválasztandó texelre mutató textúracím. A példában meggyelhet®, hogyan kezelhetjük azt a korlátot, hogy az árnyaló csak olvashat a textúrákból, de nem írhatja ®ket. A SAXPY m¶veletben az y vektor egyszerre szerepel bemenetként és kimenetként is. Ennek feloldására két textúrát rendelünk az y vektorhoz. Az egyik az eredeti vektor az arrayY textúrában, a másik pedig a rajzolási céltextúra. Az eredeti értéket olvassuk, így a kimenetet anélkül is el® tudjuk állítani, hogy a rajzolási céltextúrából kellene olvasnunk ami nem lenne lehetséges.
37.3.2. Képsz¶rés Másik fontos példa két textúrának, nevezetesen a kép- és a sz¶r®textúrának a diszkrét konvolúciója, ami sok képfeldolgozási algoritmusban használt alapm¶velet. M M X X ˜ L(X, Y)≈ L(X − i, Y − j)w(i, j), (37.1) i=−M j=−M
˜ ahol L(X, Y ) a sz¶rt érték az X, Y képpontban, L(X, Y ) az erdeti kép és w(x, y) a sz¶r®kernel , ami (2M + 1) × (2M + 1) képpontot fog át. Ezúttal a pixelárnyaló az Image textúrában tárolt kép és a Weight textúrában tárolt sz¶r®kernel alapján egy kimeneti képpont kiértékeléséért felel. Az M értéket, ami a sz¶r®kernel méretének a fele, egységes paraméterként kapja meg az árnyaló: float3 FragmentShaderConvolution( in float2 index : WPOS, // célpixel koordinátái uniform samplerRECT Image, // bemeneti kép uniform samplerRECT Weight, // sz¶r® kernel uniform float M // a sz¶r® kernel mérete ) : COLOR // a sz¶rt kép egyetlen pixele {
1710
37. GPGPU: Számítások grakus processzorokon
float3 filtered = float3(0, 0, 0);
}
for(int i = -M; i <= M; i++) for(int j = -M; j <= M; j++) { float2 kernelIndex = float2(i, j); float2 sourceIndex = index - kernelIndex; filtered += texRECT(Image, sourceIndex) * texRECT(Weight, kernelIndex); } } return filtered;
Bár a példánk lineáris, vagyis konvolúciós sz¶r® volt, nemlineáris sz¶r®ket, például mediánsz¶rést is megvalósíthatunk hasonlóan. A programban a két, illetve három lebeg®pontos számot tároló oat2 és oat3 típusú változókon alkalmaztunk aritmetikai operátorokat (*, +=, =). A Cg fordító, illetve a GPU ezeket a m¶veleteket a vektorelemekre, azaz a koordinátákra, egyenként és egymástól függetlenül végzi el. Megjegyezzük továbbá, hogy nem foglalkoztunk azzal a kérdéssel, hogy mi történik a kép szélein, hanem a textúrát mindig a célcím és a kernelcím különbségével megcímezve olvastuk ki. Egy ilyen, a határokat gyelmen kívül hagyó CPU implementáció nyilvánvalóan hibás lenne, hiszen túlindexelnénk a forrástömböt. Itt azonban a texRECT függvényt megvalósító textúraolvasó hardver önállóan megoldja ezt a problémát. A textúra inicializálásakor megadhatjuk, mi történjen, ha a textúrakoordináta kilóg az értelmezési tartományból. A választott opciótól függ®en vagy a legközelebbi érvényes texelt, vagy egy alapértelmezett értéket kapunk, vagy akár a címet értelmezzük periodikusan.
37.4. A vektorfeldolgozáson túl A példák szerint a GPU-t vektorprocesszorként egyszer¶ használni. Ha az algoritmusunk vektorfeldolgozásra alkalmas, akkor kézenfekv® ez a megközelítés. Ugyanakkor számos algoritmusra nem alkalmazható jól a vektorfeldolgozás elve, mégis lehetséges rájuk hatékony GPU implementációt adni. Ebben a szakaszban a vektorfeldolgozó keretrendszert algoritmusok szélesebb körére kiterjeszt® koncepciókat tekintjük át.
37.4.1. SIMD vagy MIMD A vektorprocesszorok általában SIMD (Single Instruction Multiple Data) gépek, vagyis egyszerre ugyanazt a gépi utasítást hajtják végre több adaton. Ez azt jelenti, hogy a vektorm¶veletek nem tartalmazhatnak adatfügg® feltételeket vagy dinamikus lépésszámú ciklusokat. SIMD párhuzamos program ágaiban csak egyetlen közös vezérlési szekvencia lehet.
37.4. A vektorfeldolgozáson túl
1711
Természetesen feltételes utasítások nélkül és konstans ciklushatárokkal programozni nagyon korlátozó. A legkorábbi GPU árnyalók ilyen SIMD processzorok voltak, és a programozó feladata volt az összes feltétel kiküszöbölése. A mai GPU-k és fordítók már maguktól megoldják ezt, így programozói szinten ugyanúgy használhatók a feltételes elágazások és dinamikus lépésszámú ciklusok, mintha az árnyalók a CPU-khoz hasonló MIMD (Multiple Instruction Multiple Data) processzorok lennének. A végrehajtás szintjén speciális vezérlési logika teszi lehet®vé, hogy az egyes skaláregységek végrehajtási szekvenciái eltérjenek: az egy multiprocesszorban lév® skalárprocesszorok továbbra is ugyanazt az utasítást hajtják végre az összes itt futó szálon, de nem minden egység dolgozik valójában, azaz nem változtathatja meg az adatait. A különböz® vezérlési szekvenciák m¶veleteit sorosítják, hogy végül mindegyik végrehajtódjon. Az a szál, amely nem a saját szekvenciáját futtatná, letiltott állapotba kerül. Így a sorosítás miatt nem dolgozó egységeknek felróhatóan a teljesítmény er®sen függ a végrehajtási szekvenciák hasonlóságától. Ez az ára annak, hogy a tranzisztorokat vezérlési logika helyett több feldolgozóegységre áldozza a GPU. A feltételes szerkezet minden ágának végrehajtását az eredmény írásának tiltásával megoldó trükk neve predikáció . Tegyük fel, hogy programunkban szerepel a következ® részlet: if (condition(i)) { F( ); } else { G( ); }
A bemen® adattól függ®en bizonyos processzorokon a condition(i) feltétel igaz, másokon hamis lesz, így vektorszámítógépünknek bizonyos processzorokon az F függvényt kellene végrehajtania, más processzorokon a G függvényt. Mivel a SIMD architektúra csak egy vezérlési utat enged meg, a párhuzamos rendszernek mindkét szekvenciát végre kell hajtania, úgy, hogy csak akkor engedélyezi az adatok átírását, amíg az érvényes fázisban van. Ezzel a módszerrel az eredeti program a következ®, feltételes elágazásokat nem tartalmazó algoritmussá alakítható: enableWrite = condition(i); // írásengedélyezés a feltétel alapján F( ); enableWrite = !enableWrite; // írásengedélyezés a negált feltétel alapján G( );
Mivel ebben a verzióban nincs feltételes végrehajtás, lefuttatható a SIMD gépen. A számítási id® azonban a két függvény számítási idejének összege lesz. Ezt a sz¶k keresztmetszetet úgy lehet kiküszöbölni, ha a számítást több menetre bontjuk és kihasználjuk a korai z-teszt lehet®ségét. A korai z-teszt összeveti a pixel z értékét a mélységbuer tartalmával, és ha az kisebb a tárolt
1712
37. GPGPU: Számítások grakus processzorokon
értéknél, a pixelre nem fut le a pixelárnyaló program, helyette a processzor másik adatelemet dolgoz fel. A korai z-teszt automatikusan bekapcsolódik olyan pixelárnyaló programok esetén, amelyekben nem módosítjuk a pixel z értékét (az összes eddig tárgyalt program ilyen volt). Ennek a képességnek a kihasználásához három menetre bontjuk a számítást. Az els® menetben csak a feltételt értékeljük ki és a mélységbuert ennek megfelel®en inicializáljuk. Idézzük fel, hogy ha a z értéket nem módosítjuk, a teljes nézetablakos téglalapunk normalizált eszközkoordinátarendszerben az x, y síkon, képtérben pedig a z = 0.5 síkon van. Tehát ahhoz, hogy a feltételnek megfelel® különbségtételt érjünk el, (0.5, 1) tartományban lev® értékeket állíthatunk be a feltétel teljesülése esetén, és (0, 0.5) tartományban lev®t, ha a feltétel hamis. Az els® menet pixelárnyalója csak a feltételt értékeli ki és írja a mélységbuerbe: float FragmentShaderCondition( in float2 index : WPOS, // célpixel koordinátái uniform samplerRECT Input, // bemeneti vektor ) : DEPTH // a kimenet a mélységbufferhez kötött { bool condition = ComputeCondition(texRECT(Input, index)); return (condition) ? 0.8 : 0.2; // 0.8 nagyobb, mint 0.5; 0.2 pedig kisebb }
Ezután még két menetet kell futtatnunk az F és a G kiszámítására. Az els® menetben a pixelárnyaló F -et számítja ki és a mélységellen®rzést azon pixelek átengedésére állítjuk be, amelyek z = 0.5 mélysége kisebb, mint a mélységbuerben lev® érték. Ebben a menetben így csak azok a pixelek értékel®dnek ki, amelyekhez a mélységbuerbe 0.8-at írtunk, vagyis ahol a feltétel igaz volt. Ezután a második menetben a pixelárnyaló G-t számítja ki, és a mélységtesztet a buerben lev®nél kisebb mélység¶ pixelek átengedésére állítjuk be. A 37.7.1. szakaszban a korai z-teszt segítségével változó lépésszámú ciklust valósítunk meg a pixelárnyalóban.
37.4.2. Redukció A vektorfeldolgozási megközelítésben a kimeneti tömb elemeit függetlenül számoljuk. A tömbnek elég nagynak kell lenni ahhoz, hogy minden árnyalóprocesszort ellásson munkával. Világos, hogy ha csak egy vagy néhány eleme van a tömbnek, akkor csak egy vagy néhány processzor dolgozhat egyszerre, vagyis elveszítjük a párhuzamos feldolgozás el®nyét. Számos algoritmus eredménye nem egy nagy tömb, hanem csak egyetlen, tömb alapján számolt érték. Ilyenkor az algoritmusnak csökkentenie, redukálnia kell a kimenet méretét. Ha ezt a redukciót egyetlen lépésben valósítjuk meg, egyetlen texelt kiértékelve, akkor nem használjuk ki optimálisan a
37.4. A vektorfeldolgozáson túl
37.5. ábra.
1713
Példa a párhuzamos redukcióra: bemen® tömb elemeinek összegzése.
párhuzamos architektúrát. Ezért a redukciót is érdemes párhuzamosan, több lépésben végezni. Ez akkor lehetséges, ha a tömbb®l az eredmény kiszámítására használt m¶velet asszociatív, ami a leggyakrabban el®forduló m¶veletekre, az összeg, a minimum, a maximum vagy az átlag képzésére igaz. Tegyük fel, hogy a tömböt egy kétdimenziós textúrában tároljuk. Egy számítási lépés abból áll, hogy textúra felbontását felére csökkentjük, vagyis négy szomszédos texelt egyetlen texelre cserélünk. A pixelárnyalók tehát mindig négy bementi texelt olvasnak be. Ha az eredeti tömb 2n × 2n felbontású, akkor n redukciós lépés szükséges a kimeneti 1 × 1 méret¶ eredmény el®állításához. A következ® példában a bemeneti tömb elemeinek összegét számoljuk ki (37.5. ábra). A CPU program minden iterációban felezi a felbontást és egy teljes nézetablakos téglalapot rajzol. Reduction( ) { Az arrayX bemeneti textúra azonosító beállítása for(N /= 2 ; N >= 1; N /= 2) { // log_2 N iteráció
37. GPGPU: Számítások grakus processzorokon
1714
glViewport(0, 0, N, N); glBegin(GL_QUADS); glVertex4f(-1,-1, 0, glVertex4f(-1, 1, 0, glVertex4f( 1, 1, 0, glVertex4f( 1,-1, 0, glEnd( ); }
}
// A kép méret beállítása, amely NxN pixeles // Egy teljes nézetablakos téglalap rajzolása 1); 1); 1); 1);
A célterület átmásolása az arrayX azonosítójú textúrába
A pixelárnyaló egyetlen redukált texelt számol ki négy texel összegzésével: float FragmentShaderSum( ) ( in float2 index : WPOS, // célpixel koordinátái uniform samplerRECT arrayX, // az x bemeneti tömb textúraazonosítója ) : COLOR // egy szín, amely a kimeneti tömb egy eleme { float sum = texRECT(arrayX, 2 * index); sum += texRECT(arrayX, 2 * index + float2(1, 0)); sum += texRECT(arrayX, 2 * index + float2(1, 1)); sum += texRECT(arrayX, 2 * index + float2(0, 1)); return sum; }
Megjegyezzük, hogy ha kihasználnánk a textúramemória bilineáris sz¶résének lehet®ségét, három textúraolvasást megspórolva egyetlen m¶velettel is kiolvashatnánk a négy texel értékének átlagát.
37.4.3. Szórás Vektorfeldolgozás esetén minden processzor egy kimeneti értékhez rendelt, vagyis minden processzornak tudnia kell, mely kimeneti elemet számolja, amit nem irányíthat máshova. Az ilyen statikus jelleg¶ összerendelés gy¶jt® jelleg¶ számításokhoz megfelel. A gy¶jtés sémában, a bemeneti halmaz választható dinamikusan, de el®re ismernünk kell, hogy hova akarjuk kiírni az eredményt: index = ComputeIndex( ); y = F(x[index]);
// A bemeneti tömb indexe
A gy¶jtéssel szemben vannak szórás jelleg¶ algoritmusok, ahol egy adott bemeneti érték valamely dinamikusan választott kimenethez járulhat hozzá. Egy egyszer¶ szórási jelleg¶ m¶velet: index = ComputeIndex( ); y[index] = F(x);
// A kimeneti tömb indexe
A vektorfeldolgozás általában nem alkalmas szórás (lásd 37.6. megvalósítására, hiszen a pixelárnyaló csak a hozzá rendelt képpontba írhat. Ha szórási típusú algoritmust szeretnénk megvalósítani a GPU-n, két lehet®ségünk van. Egyrészt átstrukturálhatjuk az algoritmust gy¶jt® típusúvá. Ahhoz, hogy szórási típusú algoritmusokat gy¶jtési típusúvá alakítsunk, máshogy kell tekintenünk a feladatra és megoldására. Integrálegyenletek és transzportproblémák esetén ez az adjungált probléma megoldását jelenti [110]. Másrészt, az index számítását el®bbre hozhatjuk a cs®vezetékben, és
37.4. A vektorfeldolgozáson túl
37.6. ábra.
1715
Szórás megvalósítása.
dinamikusan rendelhetjük az indexet a rajzolási célhoz a raszterizáló segítségével (37.6. ábra). Tekintsünk egy híres szórási típusú algoritmust, a hisztogram generálást. Tegyük fel, hogy egy M méret¶ x bemeneti tömb elemeire értékeljük ki az F függvényt, és kiszámoljuk azt az N elem¶ y kimeneti tömböt, ami az (F min, F max) tartomány N egyenl® részre osztásával kapott intervallumokba es® függvényértékeket tárolja. A hisztogram generálás nem párhuzamos megvalósítása a következ® lenne: Histogram( x ) { for(int i = 0; i < M; i++) { index = (int)((F(x[i]) - Fmin)/(Fmax - Fmin) * N); // intervallum index index = max(index, 0); index = min(index, N-1); y[index] = y[index] + 1; } }
Láthatjuk, hogy a fenti függvény nem el®re meghatározott helyeken ír a kimeneti tömbbe, ezért ez a függvény a csak kötött index¶ célhelyre írni képes pixelárnyalóval nem megvalósítható. A szórást úgy implementálhatjuk, hogy az indexet a csúcspontárnyalóban számoljuk ki, de a számláló növelésének feladatát a cs®vezeték többi részére hagyjuk. Az indexeket a raszterizáló hardver köti a kimeneti képpontokhoz. Az olvasás-módosítás-írás ciklusok problémáját megoldhatnánk úgy, hogy minden inkrementálási m¶velet után új menetet kezdünk és a jelenlegi célterületet a következ® menet bemeneti textúrájába másoljuk. Ez a megoldás azonban nagyon gyenge teljesítményt nyújtana és egyáltalán nem használná ki a párhuzamos hardvert. Sokkal szerencsésebb, ha a kompozitáló egység aritmetikai képességeit aknázzuk ki. A pixelárnyaló csak az inkremenst (vagyis az 1 értéket) állítja el®, mégpedig ott, ahol a hisztogramot növelni kell, és ezt az értéket adja tovább a kompozitáló egységnek. A kompozitáló hozzáadja az inkremenst a rajzolási cél tartalmához. A CPU program minden egyes bemen® adatelemre egy pontprimitívet generál. Ezen felül beállítja a kimen® tömböt rajzolási célnak és engedélyezi
1716
37. GPGPU: Számítások grakus processzorokon
a kompozitáló egység összeadási m¶veletét: CPUHistogram( ) { Egységes paraméterek beállítása: Fmin, Fmax, N glDisable(GL_DEPTH_TEST); // A mélységellen®rzés kikapcsolása glBlendFunc(GL_ONE, GL_ONE); // Kever® operátor: cél = forrás * 1 + cél * 1; glEnable(GL_BLEND); // Keverés engedélyezése
}
glViewport(0, 0, N, 1); // A célterület méretének beállítása: N pixel glBegin(GL_POINTS); // Minden egyes bemeneti elem egy pont primitív for(int i = 0; i < M; i++) { glVertex1f( x[i] ); // Egy pontprimitív feldolgozása } glEnd( );
A csúcspontok pozíciói itt még nem lényegesek, hiszen csak kés®bb derül ki, hova képezzük le a pontokat. Így a csúcspontok els® koordináját az x[i] bemen® elem átadására használjuk. A csúcspontárnyaló megkapja a csúcspont pozícióját, ami ekkor a bemen® elemet tartalmazza és megállapítja a pont pozícióját normalizált eszköztérben. Ehhez el®ször az F függvényt értékeli ki és megállapítja a függvényértéket tartalmazó intervallum indexét. Ezután ezt az indexet a [−1, 1] tartományba konvertálja, hiszen normalizált eszköztérben ezek a nézetablak szélei: void VertexShaderHistogram( in float inputPos : POSITION, out float4 outputPos : POSITION, uniform float Fmin, uniform float Fmax, uniform float N ) { float xi = inputPos; int index = (int)((F(xi) - Fmin)/(Fmax - Fmin) * N); // részintervallum index index = max(index, 0); index = min(index, N-1); float nindex = 2.0 * index / N - 1.0; // normalizált eszköz koordinátarendszer outputPos = float4(nindex, 0, 0, 1); // kimeneti koordináták beállítása }
A fenti példa nem optimalizált. Vegyük észre, hogy az index számítást és a normalizálást összevonhatnánk és így a kimen® tömb N méretére sem lenne szükségünk. A pixelárnyaló minden olyan képpontra le fog futni, amire pontprimitív vetül és egyszer¶en az 1 inkremens értéket adja ki: float FragmentShaderIncr( ) : COLOR // A kimenet egy pixel szín { return 1; // inkremens, amit a kever® ad a célterület pixeléhez }
37.4.4. Párhuzamosság vagy újrafelhasználás Az egymástól függetlenül futó párhuzamos processzorok az egyszálas megvalósításhoz képest a processzorok számával arányos gyorsulást nyújtanak. Az egyszálas, nem párhuzamos megvalósítás azonban kihasználhatja, ha különböz® kimeneti értékek számításában közös rész ismerhet® fel, amit értelem-
37.5. A GPGPU programozási modell: CUDA és OpenCL
1717
A hisztogram generálást felhasználó kausztika szimuláció. Az illumináció er®ssége a beérkez® fotonok számával arányos (Balambér Dávid képei). 37.7. ábra.
szer¶en csak egyszer kell kiszámítani. Így a részeredmény újrafelhasználásával a teljesítmény növelhet®. Mivel a független párhuzamos processzorok nem hasznosíthatják újra a más processzorok által el®állított adatokat, komparatív el®nyeik csökkennek. A GPU-k jelent®s adatfolyam-kezelési képességgel rendelkez® párhuzamos rendszerek, így ha az újrahasznosítható adat elég korán áll el®, a független párhuzamos feldolgozás és az újrahasznosítás el®nyeit egyaránt kiaknázhatják. A f® adatsokszorozónk a raszterizáló egység. Így bármi, ami a raszterizálás el®tt történik, a raszterizált primitív által lefedett képpontok szempontjából globális számításnak tekinthet®. Másik megoldás, hogy mivel egy menet eredményét a következ® menetekben bemeneti textúraként használhatjuk, az újrahasznosítandó adatokat textúrákba kell írni és a folyamatot több képalkotási fázisra kell bontani.
37.5. A GPGPU programozási modell: CUDA és OpenCL A CUDA (Compute Unied Device Architecture) és az interfészek kínálta programozási modell jelent®sen eltér a grakus cs®vezeték modelljét®l (37.1. ábra, jobb oldal). Ezek multiprocesszorok gy¶jteményeként láttatják a GPUt, ahol minden multiprocesszor több SIMD skalárprocesszort tartalmaz. A skalárprocesszorok saját regiszterekkel rendelkeznek és a multiprocesszoron belül osztott memórián keresztül kommunikálhatnak, gyorsítótárazott textúrákból beépített sz¶réssel olvashatnak, valamint írhatják és olvashatják a lassú globális memóriát. Ha kívánjuk, akár olvasás-módosítás-írás m¶veleteket is használhatunk. A globális memóriában textúrákat hozhatunk létre, amelyek a létrehozásuk után csak olvasásra érhet®k el. A grakus API modelljével szemben itt a globális memória írása nem kizárólagos, így versenyhelyzetet teremthet, viszont atomi m¶veletekkel
1718
37. GPGPU: Számítások grakus processzorokon
m¶ködtethet® szemaforokkal biztosíthatjuk az adatok foglaltságának jelzését. A vágás, raszterizáció, kompozitálás és más rögzített funkciójú elemek nem láthatóak és nem is használhatóak ebben a programozási modellben. A GPGPU programozási modellt a grakus API modelljéhez hasonlítva megállapíthatjuk, hogy tisztább és egyszer¶bb. A GPGPU modellben a párhuzamos processzorok egy szinten vannak és korlátlanul elérhetik a globális memóriát, míg a grakus modellben a processzorok és x funkciójú elemek cs®vezetéket alkotnak, és memória írás csak a cs®vezeték végén lehetséges. Amikor a GPGPU modellben programozunk, kevesebb korlátozással szembesülünk. Ugyanakkor óvatosnak kell lennünk, hiszen a grakus cs®vezeték modellje pontosan azokat a lehet®ségeket tiltja, amelyek használata amúgy sem ajánlott nagyteljesítmény¶ alkalmazásokban. A GPGPU programozás m¶vészete abban rejlik, hogy az eredeti algoritmust hatékonyan bontsuk párhuzamos szálakra úgy, hogy minimális mennyiség¶ adatkommunikációra és szinkronizációra legyen szükség, de a lehet® legtöbb processzort lássuk el munkával. A következ® szakaszokban egy alapvet® m¶veletet, a mátrix-vektor szorzást elemezzük ebb®l a szempontból.
37.6. Mátrix-vektor szorzás A számítási feladatok matematikai modelleken és ezek numerikus megoldásán alapulnak. A numerikus módszerek általában valamiféle linearizálásra épülnek, ami lineáris egyenletrendszerek megoldását igényl® algoritmusokhoz vezet, ahol az iteratív megoldás lépéseiben mátrix-vektor szorzatokat kell számolnunk. Így a mátrix-vektor szorzás olyan alapm¶velet, amit ha párhuzamos architektúrán hatékonyan tudunk implementálni, akkor egy nagyon jól használható általános épít®elemet kapunk. Deniálhatjuk úgy is a feladatot, hogy az y eredményvektort az A mátrixból, valamint az x és b vektorokból álló bemenet alapján kell számolnunk a következ®képpen:
y = Ax + b. Nevezzük ezt MV feladatnak! Legyen az A mátrix mérete N ×M ! Mivel minden bemen® vektorelem szerepel minden kimen® vektorelem számításában, a nem párhuzamos CPU-implementáció két egymásba ágyazott ciklust tartalmazna, ahol az egyik ciklus a bemenet, a másik a kimenet elemein iterálna végig. Ha úgy párhuzamosítjuk az algoritmust, hogy a kimenet elemeit párhuzamos szálakhoz rendeljük, akkor egy gy¶jt® típusú algoritmust kapunk, ahol egy szál az összes bemen® elem hozzájárulását összegy¶jti és a szál egyetlen kimeneti értékében akkumulálja. Ezzel szemben ha a párhuzamos szálakat a bemenet elemeihez rendelnénk, akkor a szál ennek a bemeneti
37.6. Mátrix-vektor szorzás
1719
elemnek minden kimen® elemhez tartozó hozzájárulását számolná ki, ami egy szórási m¶velet lenne. Gy¶jtés esetén a szálak csak a bemen® adatokon osztoznak, de kimenetük kizárólagos, így nincs szükség szinkronizációra. Szórás esetén több szál adhatja hozzá eredményét ugyanahhoz a kimeneti elemhez, így atomi összeadásokra van szükség, ami teljesítményromlással jár. Nem párhuzamos CPU-n a mátrix-vektor szorzás megvalósítása például a következ® lehet: void ScalarMV(int N, int M, float* y, const float* A, const float* x, const float* b) { for(int i=0; i
Az algoritmus párhuzamos gépre alkalmazásának els® lépése az egy szálra es® feladat meghatározása. A szórás és gy¶jtés lehet®ségei közül a gy¶jtést kell el®nyben részesítenünk, mivel automatikusan kiküszöböli az írási ütközések problémáját. Gy¶jt® típusú megoldás esetén egy szál az y vektor egy elemét számolja, így N szálat kell indítanunk. A GPU gyakorlatilag korlátlan számú szálat képes indítani. A szálak blokkokba vannak csoportosítva, egy blokk száljai ugyanazon a multiprocesszoron futnak. Így a következ® tervezési döntés az, hogy az N szálat hogyan osszuk blokkokba. Egy multiprocesszor tipikusan 32 szálat hajt végre párhuzamosan, így a blokkokban lev® szálak száma a 32 többszöröse kell legyen. Amikor a szálak a lassú memóriaelérés miatt várakozni kényszerülnek, a hardverid®zít® más szálakat próbál futtatni. Ezért hasznos több mint 32 szálat rendelni egy multiprocesszorhoz, hogy mindig legyenek futásra kész szálak. Ugyanakkor az egy blokkban lév® szálak számának növelése arra is vezethet, hogy túl kevés blokkunk marad, így a program csupán néhány multiprocesszoron fut. Ezeket gyelembe véve, rendeljünk 256 szálat egy blokkhoz és reméljük, hogy az N/256 meghaladja a multiprocesszorok számát és így teljesen kihasználjuk a párhuzamos hardvert. Apró problémát jelent, ha az N nem 256 egész számú többszöröse. A vektor maradék elemeit is processzorhoz kell rendelnünk, így a szálblokkok száma N/256 fels® egészrésze kell legyen. Így viszont lesznek olyan szálaink, amelyekhez nem rendelünk vektorelemeket. Ez nem jelent gondot, ha az extra szálak ezt felismerik és nem okoznak kárt például a kimeneti tömb túlindexelésével. A korábban tárgyalt vektorfeldolgozási esethez hasonlóan itt is minden szálnak tudnia kell, hogy melyik kimeneti elemet számítja. A CUDA könyvtár ezt az információt implicit bemeneti elemek formájában teszi elérhet®vé: a blockIdx a szálblokk indexe, a blockDim a blokkban lev® szálak száma, és a threadIdx a szál indexe a blokkon belül.
1720
37. GPGPU: Számítások grakus processzorokon
A kimeneti vektor egy elemét számító CUDA kernel program most nem különálló árnyalóprogramként, hanem a hagyományos CPU program speciális függvényeként jelenik meg: __global__ void cudaSimpleMV(int N, int M, float* y, float* A, float* x, float* b) { // A kiszámítandó elem indexének meghatározása a szál és blokk indexekb®l int i = blockIdx.x * blockDim.x + threadIdx.x; if(i < N) { // Ha az index túlcímez a tömbön, akkor ugord át. float yi = b[i]; for(int j=0; j<M; j++) yi += A[i * M + j] * x[j]; y[i] = yi; } }
A global kulcsszó azt jelzi a fordítónak, hogy ez a függvény nem a CPU-n, hanem a GPU-n fog futni, de a CPU-ról is hívható. A paramétereket hagyományos C szintaxissal adjuk át. Az egyetlen különlegesség az, hogy az implicit paramétereket használjuk a szál azonosítószámának, vagyis a kimeneti tömbelem indexének meghatározásához. A kerneleket a CPU programból indítjuk, megadva nemcsak a paramétereket, hanem a szálblokkok és a blokkon belüli szálak számát is: __host__ void run_cudaSimpleMV() { int threadsPerBlock = 256; // number of threads per block int blockNum = (N + threadsPerBlock - 1)/threadsPerBlock; // blokkok száma cudaSimpleMV<<
>>(N, M, y, A, x, b); }
A fordító a host kulcsszó alapján ismeri fel, hogy a függvény a CPU-n fut. A párhuzamos szálak indítása C függvényhíváshoz hasonlóan történik, kivéve a <<>> elemet, ami azt adja meg, hogy hány szálat kell indítani és hányat kell bel®lük egy multiprocesszorra elosztani.
37.6.1. A mátrixvektor szorzás további párhuzamosítása Eddig a mátrix sorait rendeltük párhuzamos szálakhoz, az Ai x skalárszorzatot a szálak sorosan számították. Amennyiben a mátrix sorainak száma kisebb, mint a párhuzamos skalárprocesszorok száma, akkor ekkora párhuzamosítás nem elégséges ahhoz, hogy minden feldolgozóegységet munkával lássunk el. A skalárszorzat számításának átfogalmazása jól ismert, de fogósabb párhuzamosítási probléma, mivel az összeadásokat nem lehet függetlenül végrehajtani és egyetlen skalárt kell kiírnunk a mátrix minden sorára. A szumma részei viszont számolhatók függetlenül, majd ezután a részösszegek összeadhatók. Ez a redukció klasszikus példája. Arra van szükség, hogy a részösszegeket számoló szálak a m¶veletet el®bb befejezzék, az eredményeiket olyan memóriába írják, ahol az azokat összeadó szál elérheti ®ket és az összeadás csak ezután történjen meg. Ezért a szálak közötti szinkronizációt és az azonos blokkban lév® szálak számára elérhet® osztott memóriát kell használnunk.
37.6. Mátrix-vektor szorzás
1721
Kezdetben tegyük fel, ideális körülményeket és hardvert feltételezve hogy egy sor feldolgozására lehet M darab szálunk és az osztott memória képes M darab lebeg®pontos érték tárolására! Legyen Q egy M elem¶, osztott memóriában tárolt vektor. Ekkor minden szál egy Qj = Aij xj elemet számolhat. Végül Q elemeit összegzéssel kell redukálnunk. Ehhez tegyük fel azt is, hogy M = 2k , azaz kett® hatvány! Így a redukciót k lépésben hajthatjuk végre, minden lépésben a szálak felét leállítva, míg minden túlél® szál összeadja Q saját maga által és egy leállított szál által számolt elemét. A végül utoljára maradt szál kiírja az értéket a globális memóriába. #define M THE_NUMBER_OF_MATRIX_COLUMNS __global__ void cudaReduceMV(int N, float* y, float* A, float* x, float* b) { int i = blockIdx.x; int j = threadIdx.x; __shared__ float Q[M]; // a multiprocesszor közös memóriájában legyen Q[j] = A[i * M + j] * x[j]; // a matrix-vektor szorzás párhuzamos része
}
for(int stride = M / 2; stride > 0; stride >>= 1) { // redukció __syncthreads(); // várj amíg a blokk többi szálja is ide ér if(j + stride < M) Q[j] += Q[j + stride]; } if(j == 0) y[i] = Q[0] + b[i]; // ha egyetlen elemre sikerült redukálni
__host__ void run_cudaReduceMV() { cudaReduceMV<<< N, M >>>(N, y, A, x, b); }
A gyakorlatban el®forduló mátrixméretekre (M > 104 ) sem az egyetlen multiprocesszoron futtatható szálak száma, sem az osztott memória mérete nem elég az összes elem párhuzamos feldolgozására. Következ® példánkban egyetlen, korlátozott méret¶ szálblokkot használunk egy nagy mátrix feldolgozására. Egyrészt a kimeneti vektort T méret¶ szegmensekre osztjuk. Az egy szegmensen belüli elemeket párhuzamosan értékeljük ki, majd a szálak a következ® szegmenssel folytatják a munkát. Másrészt minden skalárszorzat számításnál az Ai és x vektorokat Z hosszú szegmensekre osztjuk. Minden párhuzamosan feldolgozott sorra egy Z hosszú, közös Qt vektort tartunk fent. Ai és x szegmenseinek elemenkénti szorzatát párhuzamosan számíthatjuk, majd hozzáadhatjuk Qt -hez. Mivel T darab sort egyenként Z darab szál dolgoz fel, a blokk T × Z szálból fog állni. Egyetlen szál szemszögéb®l nézve ez azt jelenti, hogy az y vektoron T lépéshosszal kell végigmennie és y minden elemére Ai -n és x-en Z lépéshosszal kell végigiterálnia. Továbbá y minden elemére Qt értékét a korábbiakhoz hasonlóan redukcióval össze kell adnia. A teljes nagy mátrixokon m¶köd® kernel tehát: __global__ void cudaLargeMV(int N, int M, float* y, float* A, float* x, float* b) { __shared__ float Q[T * Z]; // a multiprocesszor közös memóriájában legyen int t = threadIdx.x / Z;
37. GPGPU: Számítások grakus processzorokon
1722 int z = threadIdx.x % Z;
for(int i = t; i < N; i += T) { Q[t * Z + z] = 0; for(int j = z; j < M; j += Z) Q[t * Z + z] += A[i * M + j] * x[j];
}
}
for(int stride = Z / 2; stride > 0; stride >>= 1) { __syncthreads(); if(z + stride < Z) Q[t * Z + z] += Q[t * Z + z + stride]; } if(z == 0) y[i] = Q[t * Z + 0] + b[i];
__host__ void run_cudaLargeMV() { cudaReduceMV<<< 1, T*Z >>>(N, M, y, A, x, b); }
Ezt könnyen kiterjeszthetjük több szálblokk használatára, ha a küls® hurkot a mátrix sorainak részhalmazára korlátozzuk a blockIdx paraméter alapján. A fenti algoritmus kézenfekv®en használja az osztott memóriát és lehet®vé teszi a blokkméret megválasztásával a szálak memória elérésének a hardver szószélességéhez igazítását. Azonban az x vektor minden elemét minden sor számításához egyszer be kell olvasnunk. Ezen tudunk javítani, ha az x értékeit az osztott memóriába olvassuk és az egy blokkban lév® szálakat a mátrix több során m¶ködtetjük. Ez azonban azt jelenti, hogy kevesebb osztott memóriát tudunk az összegzés párhuzamosítására használni. A kompromisszum vizsgálata túlmutat ezen fejezet keretein, de megemlítjük, hogy a [45] cikk a 64 × 8-as blokkméretet javasolta. Ilyen stratégia használata esetén további el®nyt jelent az A mátrix textúraként való elérése, mivel az adatolvasás kétdimenziós lokalitást fog mutatni, ami a textúra-gyorsítótár szempontjából ideális. A számítási alkalmazások széles köre vezethet® vissza olyan mátrix-vektor szorzásra, ahol a mátrixok hatalmasak, de ritkák, azaz nagyon nagy részben zérus elemeket tartalmaznak. Ritka mátrixok esetén a fentebb bemutatott mátrix-vektor szorzási algoritmusok nem hatékonyak, mivel a zérus elemekkel való szorzást is explicit módon számolják. A ritka mátrixok reprezentációit és az azokon m¶köd® MV algoritmusokat a [14] publikáció tárgyalja.
37.7. Esettanulmány: Számítógépes áramlásdinamika A zikában vagy mérnöki területen felmerül® problémákat általában parciális dierenciál- vagy integrálegyenletekkel írhatjuk le matematikailag. Mivel a zikai rendszereknek id®beli és térbeli kiterjedése is van, a deriváltakat vagy integrálokat az id®- és tértartományban egyaránt ki kell értékelni. Térben és id®ben kiterjedt adatok reprezentációjához olyan függvényeket kell használ-
37.7. Esettanulmány: Számítógépes áramlásdinamika
1723
nunk, amelyeknek a térbeli pozíció és az id® a szabad változója. Általános függvények tárolásához végtelen mennyiség¶ adatra lenne szükség, így numerikus módszerekben ezeket csupán véges számú értékkel közelítjük. Szemléletesen ezek az értékek gyakran elképzelhet®k úgy is, mint diszkrét pontokban és id®pillanatokban vett függvényérték minták. A mögöttes elméleti keretet a végeselem módszer adja. Ha egy f (~r) függvényt véges mennyiség¶ adattal szeretnénk reprezentálni, a következ® véges sorral közelíthetjük:
f (~r) ≈ f˜(~r) =
N X
fi Bi (~r)
i=1
ahol B1 (~r), . . . , BN (~r) el®re deniált bázisfüggvények és f1 , . . . , fN az f˜-et leíró együtthatók. Különösen egyszer¶ végeselemes reprezentáció a szakaszonként lineáris séma, amely a tartományban gyakran szabályosan elhelyezett ~r1 , . . . , ~rN mintapontokkal dolgozik. Ezekben a pontokban a függvény kiértékelésével kaphatóak az fi = f (~ri ) komponensek és az ~ri pontok közötti lineáris interpolációval kapjuk a közelít® függvényt. Ha a rendszer dinamikus, akkor f megoldásának id®függ®nek kell lennie, így különböz® id®pillanatokban a végeselemes reprezentáció eltér. Alapvet®en két lehet®ségünk van erre. A mintapontokat rögzíthetjük statikusan és csak az fi együtthatók változhatnak id®ben. Ezt a modellt eulerinek nevezik. Másrészt azt is megengedhetjük, hogy a mintapontok a rendszer mozgásával együtt elmozduljanak, így az ~ri mintapontok is id®függ®vé válnak. Ez a lagrange-i megközelítés, amelyben gyakran nevezik a mintapontokat részecskéknek . Az euleri és lagrange-i diszkretizálási sémákra szemléletes példát a meteorológiai adatok (pl. széler®sség, h®mérséklet) mérése alapján adhatunk. A földi állomások az adatokat rögzített helyeken mérik. A meteorológiai ballonok viszont hasonló adatokat éppen a leveg® áramlását követve változó pozícióból szolgáltatnak. Ebben a szakaszban egy GPU-alapú tudományos számítás megvalósításáról szóló esettanulmányt tárgyalunk. A kiválasztott feladat a számítógépes áramlásdinamika. A füst, a felh®képz®dés, a t¶z, robbanások és sok más természeti jelenség mutat áramlásszer¶ viselkedést. Így érthet®, hogy jó és gyors áramlásszámításra van szükség a mérnöki és animációs területeken egyaránt. Az áramlás matematikai modelljét a NavierStokes-egyenlet adja. El®ször bemutatjuk ezt a parciális dierenciálegyenletet, azután a GPU-alapú euleri és lagrange-i megoldások fejlesztésének lehet®ségeit tárgyaljuk. Egy állandó s¶r¶ség¶ és h®mérséklet¶ közeget a ~v = (vx , vy , vz ) sebesség-
1724
37. GPGPU: Számítások grakus processzorokon
és p nyomásmez®vel írhatunk le. A sebesség és nyomás térben és id®ben egyaránt változik: ~v = ~v (~r, t), p = p(~r, t). Koncentráljunk a közeg egy egységnyi térfogatú elemére, az ~r helyen és t id®ben. A korábbi, t − dt id®pillanatban ez az elem ~r − ~v dt helyen volt, és a dinamika alaptörvényének megfelel®en a sebessége az F ered® er® és az egységnyi térfogatú közeg ρ tömegének hányadosával egyenl® gyorsulásnak megfelel®en változott.
~v (~r, t) = ~v (~r − ~v dt, t − dt) +
F~ dt. ρ
Az egységnyi térfogatú elem ρ tömege a közeg s¶r¶sége. A sebességet leíró tagokat bal oldalra áthozva és az egyenletet dt-vel elosztva kifejezhetjük a sebesség teljes deriváltját:
~v (~r, t) − ~v (~r − ~v dt, t − dt) F~ = . dt ρ Az ered® er® különböz® tényez®kb®l adódik össze. Ébredhet er® a nyomáskülönbség miatt: ∂p ∂p ∂p ~ ~ Fpressure = −∇p = − , , , ∂x ∂y ∂z
~ a nyomásmez® gradiense. A negatív el®jel azt jelzi, hogy a nyomásahol ∇p különbség az alacsonyabb nyomású régió felé gyorsítja a közeget. Itt a nabla operátort használtuk, ami Descartes-koordinátákban a következ® formában írható fel: ∂ ∂ ∂ ~ ∇= , , . ∂x ∂y ∂z A súrlódás csillapítja a közeg mozgását. Ez a csillapítás a közeg ν viszkozitásától függ. Az er®sen viszkózus folyadékok szirupként tapadnak egybe,
míg az alacsony viszkozitásúak szabadon folynak. A teljes csillapítási er®t dif~ 2 Laplacefúziós tagként fejezzük ki, mivel a súrlódási er® a sebességmez® a ∇ operátorral kifejezett második deriváltjával arányos: 2 ∂ ~v ∂ 2~v ∂ 2~v 2 ~ ~ Fviscosity = ν ∇ ~v = ν + + . ∂x2 ∂y 2 ∂z 2 Végül egy F~external küls® er® is gyorsíthatja a közeget. A Föld felszínén feltéve, hogy a z a függ®leges tengely ez tipikusan a föld tömegvonzásából származó küls® gyorsulás (0, 0, −g), ahol g = 9.8 [m/s2 ]. Az er®k összeadásával megkapjuk a térfogat elem sebességére vonatkozó
37.7. Esettanulmány: Számítógépes áramlásdinamika
1725
NavierStokes-egyenletet : ρ
~v (~r, t) − ~v (~r − ~v dt, t − dt) ~ + ν∇ ~ 2~v + F~external . = −∇p dt
Valójában ez az egyenlet nem más, mint a dinamika alaptörvényének áramló közegre alkalmazása, ezért hívják ezt az egyenletet lendületmegmaradási egyenletnek is. A zárt zikai rendszerek nem csupán a lendületet, hanem a tömeget is meg®rzik, így ezt is be kell építenünk áramlási modellünkbe. Egyszer¶en fogalmazva a tömeg megmaradása annyit jelent, hogy ami egy térfogatba befolyik, annak onnan ki is kell folynia, vagyis a tömegáram divergenciája zérus. Amennyiben a közeg összenyomhatatlan, akkor a s¶r¶sége állandó. Így a tömegáram a sebességmez®vel arányos. Összenyomhatatlan közegekre tehát a tömegmegmaradás miatt a sebességmez® divergenciamentes :
~ · ~v = ∂vx + ∂vy + ∂vz = 0. ∇ ∂x ∂y ∂z
(37.2)
37.7.1. Az áramlásdinamika euleri megoldása Az euleri megközelítés a sebesség- és nyomásmez® változását rögzített szabályos rácspontokban követi. A rács lehet®séget ad arra, hogy a térbeli deriváltakat egyszer¶en véges dierenciákkal közelítsük. Ha a rácspontok ∆x, ∆y és ∆z távolságokra helyezkednek el a koordinátatengelyek mentén és a p skalármez®, valamint a ~v vektormez® értékei az (i, j, k) rácspontban pi,j,k és ~v i,j,k , akkor a gradiens-, divergencia- és Laplace-operátorokat a következ®képpen közelíthetjük: i+1,j,k i−1,j,k pi,j+1,k − pi,j−1,k pi,j,k+1 − pi,j,k−1 p − p ~ ≈ ∇p , , , (37.3) 2∆x 2∆y 2∆x i+1,j,k − vxi−1,j,k vyi,j+1,k − vyi,j−1,k vzi,j,k+1 − vzi,j,k−1 ~ · ~v ≈ vx ∇ + + , 2∆x 2∆y 2∆z
(37.4)
i+1,j,k − 2pi,j,k + pi−1,j,k pi,j+1,k − 2pi,j,k + pi,j−1,k ~ 2p ≈ p ∇ + + (∆x)2 (∆y)2
pi,j,k+1 − 2pi,j,k + pi,j,k−1 . (∆z)2
(37.5)
A NavierStokes-egyenlet és a divergenciamentesség követelménye a diszkretizálás után minden rácspontban és minden id®pillanatban négy ismeretlen skalárváltozóra fogalmaz meg követelményeket, amelyek a sebesség három komponense és a nyomás: (vx , vy , vz , p). A numerikus megoldásban az aktuális
37. GPGPU: Számítások grakus processzorokon
1726
mez®ket az id® ∆t-vel való léptetésével számoljuk:
~v (~r, t) = ~v (~r − ~v ∆t, t − ∆t) +
∆t ~ ∆t ~ ν∆t ~ 2 ∇ ~v + Fexternal − ∇p. ρ ρ ρ
A sebességmez®t több lépésben módosítjuk, ahol minden lépés ezen egyenlet jobb oldalán lev® egyik tagnak felel meg. Tekintsük ezeket egyenként!
Advekció
Az új sebességmez®t úgy inicializáljuk az ~r pontban, hogy az el®z® mez®t ~r − ~v ∆t-ben kiolvassuk, mivel az ~r-be érkez® közegelem ott volt az el®z® mintavételi id®pontban [105]. Ez a lépés az advekciót szimulálja, vagyis azt a jelenséget, hogy az áramlás magával viszi a sebességmez®t:
w ~ 1 (~r) = ~v (~r − ~v ∆t, t − ∆t).
Diúzió
A diúzió a sebességmez®nek a közeg bels® súrlódásából, viszkozitásából fakadó csillapítása. Megtehetnénk, hogy a diúziós tagot hozzáadjuk az eddig számolt sebességmez®höz:
w ~2 = w ~1 +
ν∆t ~ 2 ∇ w ~ 1. ρ
Ez az el®relépéses Euler-integrálás azonban numerikusan instabil. Az instabilitás oka, hogy az el®relépéses módszerek jelenlegi értékek alapján jósolják a jöv®t és minden szimulációs lépés hozzátesz a hibához, ami minden határon túl növekedhet (részletesebben lásd a tudományos számításokról szóló fejezetben). Az el®relépéses integrátorokkal szemben a visszalépéses módszerrel garantálható a stabilitás. A visszafele néz® megközelítés stabil, mivel a jöv® jóslása közben egyben a múltat is korrigálja. Így az összes hiba véges értékhez konvergál és korlátok közt marad. A mi esetünkben a visszalépéses módszer azt jelenti, hogy a Laplace-operátort a jöv®beli, még ismeretlen sebességmez®re alkalmazzuk, nem pedig az aktuális sebességmez®re:
w ~2 = w ~1 +
ν∆t ~ 2 ∇ w ~ 2. ρ
(37.6)
A számítás ezen lépcs®jében a w ~ 1 advektált mez® a rácspontokban ismert, i,j,k viszont a diúzió utáni w ~2 sebességek ismeretlenek. A (37.5) egyenletet felhasználva megállapíthatjuk, hogy az ismeretlen w ~ 2 vektormez®re a Laplaceoperátort alkalmazva az (i, j, k) rácspontbeli értékre a saját és a szomszédok w ~ 2 értékeinek lineáris kombinációját kapjuk. Így a (37.6). egyenlet egy ritka
37.7. Esettanulmány: Számítógépes áramlásdinamika
1727
lineáris egyenletrendszer:
w2 = w1 + A · w2
(37.7)
ahol a w1 vektor az advekcióval nyert ismert sebességek vektora, w2 az ismeretlen sebességek vektora, végül az A · w2 mátrix-vektor szorzat pedig a (ν∆t/ρ)∇2 w ~ 2 (~r) deriváltnak a diszkrét formája. Az ilyen rendszerek kiváló alanyai a Jakobi-iterációnak (lásd a tudományos számításokról szóló fejezetben). Kezdetben a w2 vektort zérus értékkel töltjük fel és iteratívan kiértékeljük a (37.7) egyenlet jobb oldalát, az eggyel korábbi lépés eredményét mindig a jobb oldalon szerepl® w2 vektorba másolva. Így az egyenletrendszer megoldását ritka mátrix-vektor szorzások sorozatára vezetjük. Figyeljük meg, hogy az A mátrixot nem kell tárolnunk. Amikor a w2 sebességmez® egy rácspontbeli értékére van szükség, a szomszédok megkeresésével a (37.5) egyenlet egyszer¶ képlete megadja az eredményt. Egy rácspont értékének a saját és szomszédos korábbi értékek alapján történ® módosítását képsz¶résnek hívjuk. Így tehát a Jakobi-iteráció egy lépése képsz¶rési m¶velettel egyenérték¶. A képsz¶rés GPU megvalósítását a 37.3.2. szakaszban tárgyaltuk.
A küls® er®tér
A küls® er® minden rácspontban gyorsítja a sebességmez®t:
w ~3 = w ~2 +
∆t ~ Fexternal . ρ
Vetítés
Az eddigiekben a w ~ 3 új sebességmez®t az ismeretlen nyomásmez® gyelembe vétele nélkül számítottuk. A vetítési lépésben kiszámoljuk az ismeretlen p nyomásmez®t és neki megfelel® módon módosítjuk a sebességmez®t:
~v (t) = w ~3 −
∆t ~ ∇p. ρ
A nyomásmez®t a sebességmez® divergenciamentességének követelményéb®l nyerjük. Alkalmazzuk az egyenlet mindkét oldalára a divergencia-operátort. Ezután a bal oldal zérus lesz, mivel divergenciamentes vektormez®t keresünk, ~ · ~v = 0: amire ∇ ∆t ~ ∆t ~ 2 ~ ·w ~ 0=∇· w ~3 − ∇p = ∇ ~3 − ∇ p. ρ ρ Feltételezve, hogy a w ~ 3 vektormez® értékei szabályos rácson adottak, a rácspontokban az ismeretlen nyomás meghatározásával és a divergencia és a
37. GPGPU: Számítások grakus processzorokon
1728
37.8. ábra.
Az euleri módszer egy id®lépése a sebességmez® textúráját frissíti.
Laplace-operátor a (37.4) és (37.5) egyenleteknek megfelel® véges dierenciás kiértékelésével ismét ritka lineáris egyenletrendszert kapunk a diszkrét nyomásértékekre. Ezt az egyenletrendszert is Jakobi-iterációval oldjuk meg. A diúziós lépéshez hasonlóan a vetítésbeli Jakobi-iteráció is egyszer¶ képfeldolgozási m¶velet.
Euleri szimuláció a GPU-n
A diszkretizált sebesség- és nyomásmez®ket kényelmesen tárolhatjuk háromdimenziós textúrákban, ahol a diszkrét változókat szabályos rácson elhelyezked® térfogatelemek (voxelek ) középpontjaihoz rendeljük [50]. Minden lépésben ezen adathalmazok tartalmát számoljuk újra (37.8. ábra). Az advekció számításánál nagy el®nyt jelent, hogy a mez®ket textúrában tároljuk. Az ~ri voxelközéppontban úgy kapjuk az advektált mez®t, hogy az ~ri − ~vi ∆t pozícióból kiolvassuk a mez® értékét. Az így számolt pozíció nem feltétlenül esik voxel középpontra, hanem rácspontok között helyezkedik el. A végeselemes megközelítésnek megfelel®en az itteni érték a mez® végeselemes rekonstrukciójából nyerhet®. Ha szakaszonként lineáris bázisfüggvényeket feltételezünk, akkor a textúrasz¶r® hardver ezt a feladatot további számítási költség nélkül megoldja (37.9. ábra). A vektor- és skalármez®k háromdimenziós textúrában tárolásának hátránya, hogy a textúrákat a GPU csak olvasni tudja, akár a grakus API-t, akár a GPGPU megközelítést használjuk. Grakus API esetén a módosított mez®t a rajzolási célba, GPGPU esetben pedig a globális memóriába kell írni. Ezután a következ® szimulációs lépésben a korábbi rajzolási célt vagy globális memóriaterületet bemen® textúrának kell deklarálni. Az írási ütközések elkerülésére gy¶jt® megközelítést alkalmazunk és minden kimeneti értéket tartalmazó rácsponthoz rendelünk egy számot. Ha a GPU-k textúrákon keresztül olvassák a globális adatokat, akkor a szál által kiírt új érték azután válik láthatóvá, hogy a menet vagy a kernelek futása véget ért és az eddigi kimenetet innent®l bemen® textúrának nyilvánítjuk. Ezért egyetlen id®lépcs® számítását elemi módosító lépésekre kell bontanunk mindenhol, ahol egy rácspont korábban számolt értékét fel kívánjuk használni. Ez
37.7. Esettanulmány: Számítógépes áramlásdinamika
Advekció
1729
Jacobi-iteráció
ábra. A szimulációs lépések mint háromdimenziós textúrák módosításai. Az advekció számítása kiaknázza a textúrasz¶r® hardvert. A súrlódás és vetítés lineáris egyenleteit Jacobiiterációval oldjuk meg, ahol egy texelt (illetve három dimenzióban voxelt) a szomszédai súlyozott átlagával módosítunk, ami szemléletesen egy képsz¶rési lépésnek felel meg.
37.9.
azt jelenti, hogy szükség van egy advekciós menetre, Jakobi-iterációs menetek sorozatára a diúziós lépésben, egy küls® er®t számító menetre és egy második Jakobi-iterációs menetsorozatra a vetítési lépésben. A GPGPU keretrendszerben egy szál ugyan olvashatja a más szálak által el®állított adatokat, de ekkor szinkronizálni kell, hogy biztosak lehessünk abban, hogy az olvasott érték már érvényes, nem pedig az írás el®tti értéket olvassuk. Ilyenkor a szinkronizációs pontok töltik be ugyanazt az ellen®rz® szerepet, amit esetünkben a menetek, illetve kernelek szétválasztása. A grakus API esetében van még egy korlátozás. A rajzolási cél csak kétdimenziós lehet, így vagy kiterítjük a háromdimenziós voxeltömb rétegeit egy hatalmas kétdimenziós textúrába, vagy egy lépésben csak egy réteget frissítünk. A 37.10. ábra kiterített háromdimenziós textúrát ábrázol. Miután a textúrákat beállítottuk, az egész térfogatra végrehajtható egy szimulációs lépés a teljes kiterített rácsot lefed® téglalap rajzolásával. A grakus API-t használó megközelítésnek nemcsak hátrányai, de el®nye is van a GPGPU módszerhez képest, mégpedig a lineáris egyenletrendszerek Jakobi-iterációval történ® megoldásakor. Minden rácsponton egy pixelárnyaló fut, amely a rácsponthoz rendelt texel értékét számítja. Az olyan rácspontokban, ahol a szomszédok hatása elhanyagolható, kevesebb iterációs lépésre lenne szükség, mint ahol a szomszédok jelent®sek. Egy kvázi-SIMD gépen, amilyen a GPU, célszer¶tlen a processzorokra eltér® mennyiség¶ számítási munkát bízni. A korai z-teszt kihasználásával azonban ezt a problémát megkerülhetjük és javíthatjuk a teljesítményt [114]. A mélységértéket a környezet
1730
37. GPGPU: Számítások grakus processzorokon
Kiterített háromdimenziós sebességmez® (bal oldali kép) és a megjelenített s¶r¶ségmez® (jobb oldali kép). 37.10. ábra.
legnagyobb elemével és az iterációs számmal arányosan állítjuk be. Ily módon az iteráció során a GPU kevesebb pixelt dolgoz fel, miközben a fontos területekre koncentrálhat. Méréseink szerint ez az optimalizáció a teljes szimulációs id®t körülbelül 40%-kal csökkenti ). Ha szeretnénk az áramlást megjeleníteni, feltételezhetjük, hogy az áramlás egy skalár indikátormez®t is magával sodor. Ez úgy m¶ködik, mintha némi festéket vagy konfettit öntenénk az áramló közegbe. Az indikátormez®t lebeg®pontos voxeltömbben tároljuk. Az advekciós képletet a D indikátorváltozóra alkalmazva ezt a mez®t is frissíthetjük a ∆t id®lépcs® szimulációja során:
D(~r, t) = D(~r − ~v ∆t, t − ∆t). Egy pont színét és átlátszóságát az indikátorváltozó értékéb®l egy, a felhasználó által szabályozható átviteli függvény segítségével számolhatjuk. A kapott indikátormez®t a háromdimenziós textúrát szeletenként rajzoló módszerrel jeleníthetjük meg. Ez félig átlátszó, a nézeti irányra mer®leges sokszögeket rajzol hátulról el®re, a keverés bekapcsolásával (37.11. ábra). A háromdimenziós textúra színe és átlátszósága az indikátorváltozó függvénye.
37.7.2. A dierenciálegyenletek lagrange-i megoldása A lagrange-i megközelítésben a teret részecskék segítségével diszkretizáljuk,
vagyis csak véges számú áramló folyadékelemet követünk. Jelöljük a ré-
37.7. Esettanulmány: Számítógépes áramlásdinamika
37.11. ábra.
1731
Euleri folyadékszimulációval készült animáció képkockái.
szecskék számát N -nel, az i-edik diszkrét közegelem pozícióját és sebességét ~ri -vel és ~vi -vel! Feltesszük, hogy minden részecske ugyanolyan m tömeg¶ közegelemet reprezentál. Mivel a s¶r¶ség térben változik, minden részecskéhez eltér® ∆Vi = m/ρi térfogat tartozik. A lendületmegmaradás egyenlete ebben az esetben a következ® formájú:
d~ri = ~vi , dt d~vi ~ ~ 2~v (~ri ) + F~external (~ri ) ∆Vi . = −∇p(~ri ) + ν ∇ (37.8) dt Ha a szimuláció során részecskék nem vesznek el, a tömeg automatikusan megmarad, de mivel ez a tömeg kis térfogaton összpontosulhat, a szimulált közeg nem lesz összenyomhatatlan. Lagrange-i szimulációban általában összenyomható gázt feltételezünk. A diszkrét pontokban ismert rendszer tetsz®leges pontban érvényes jellemz®it interpolációval nyerhetjük. Tegyük fel, hogy egy A jellemz® a részecskepozíciókban ismert, vagyis A1 , . . . , AN adott. Egy tetsz®leges ~r pozícióban az A jellemz®t a részecskék hozzájárulásainak súlyozott összegeként számoljuk: N X A(~r) = Ai ∆Vi W (|~r − ~ri |). m
i=1
ahol ∆Vi az ~ri pontban lev® részecske által elfoglalt térfogat, W (d) egy simító kernel , más néven radiális bázisfüggvény , amely a részecske pozíciója és a vizsgált pont közötti d távolságtól függ. Más szemszögb®l nézve a simító kernel azt fejezi ki, hogy milyen gyorsan enyészik el a részecske hatása a távolsággal. A simító kernel normalizált, ha a simítás a jellemz® összértékét meg®rzi, ami akkor igaz, ha a kernel a teljes tértartományon integrálva 1-et
37. GPGPU: Számítások grakus processzorokon
1732
ad. A lehetséges kernelek egy példája a h legnagyobb sugarú kúpos kernel :
W (d) =
15 (h − d)3 , ha 0 ≤ d ≤ h és zérus egyébként. πh6
Normalizált kernelekre az ~rj pontban érvényes részecskes¶r¶ség következ®képpen becsülhet®: N X ρj = ρ(~rj ) = mW (|~rj − ~ri |). i=1
Mivel minden részecske ugyanolyan m tömeg¶, a j index¶ részecskéhez tartozó térfogat: m 1 ∆Vj = . = PN ρj rj − ~ri |) i=1 W (|~ Az ideális gáztörvény szerint állandó h®mérsékleten a nyomás fordítottan arányos a térfogattal, így a j index¶ részecskénél a nyomás:
pj =
k , ∆Vj
ahol a k konstans a h®mérséklett®l függ. A nyomás egy tetsz®leges ~r pontban:
p(~r) =
N X
pi ∆Vi W (|~r − ~ri |).
i=1
A nyomáskülönbségek miatti gyorsuláshoz szükséges a nyomásmez® gradiensének számítása. Mivel az ~r térbeli változó csak a simító kernelben szerepel, a gradiens a simítókernel gradienséb®l számítható:
~ r) = ∇p(~
N X
~ (|~r − ~ri |). pi ∆Vi ∇W
i=1
Így els® közelítésben a j index¶ részecskére a nyomásból származó er®:
~ rj ) = − F~pressure,j = −∇p(~
N X
~ (|~rj − ~ri |). pi ∆Vi ∇W
i=1
Ezzel viszont van egy kis gond. A közelít® sémánk nem garantálhatja a zikai szabályok teljesítését, így az er®k szimmetriáját és következésképpen a lendületmegmaradását sem. Gondoskodnunk kell arról, hogy az i. részecskére a j . részecske miatt ható er® mindig egyenl® legyen a j . részecskére az i. részecske miatt ható er®vel. A szimmetrikus viszonyt a nyomásból származó
37.7. Esettanulmány: Számítógépes áramlásdinamika
1733
er® következ® módosításával biztosíthatjuk:
F~pressure,j = −
N X pi + pj i=1
2
~ (|~rj − ~ri |). ∆Vi ∇W
A viszkozitási taghoz a vektormez®re a Laplace-operátort kell alkalmazni, amit a Laplace-operátornak a simító kernelre való végrehajtásával számíthatunk:
~ 2~v = ν F~viscosity,j = ν ∇
N X
~ 2 W (|~rj − ~ri |). ~vi ∆Vi ∇
i=1
A nyomásból ered® er®höz hasonlóan itt is inkább egy szimmetrikus változatot használunk, hogy az er®k szimmetrikusak maradjanak:
F~viscosity,j = ν
N X ~ 2 W (|~rj − ~ri |). (~vi − ~vj )∆Vi ∇ i=1
A küls® er®ket közvetlenül alkalmazhatjuk a részecskékre. A részecske test ütközéseket a részecske sebességnek a test felületére mer®leges komponensének tükrözésével kezelhetjük. Miután minden er®t kiszámolunk és a (37.8) egyenlet id® szerinti deriváltjait véges dierenciákkal közelítjük a következ®képpen kaphatjuk meg a részecskék új pozícióit és sebességeit:
~ri (t + ∆t) = ~ri (t) + ~vi (t)∆t, ~vi (t + ∆t) = ~vi (t) + (F~pressure,i + F~viscosity,i + F~external,i )∆Vi ∆t/m. Vegyük észre, hogy ez is egy rossz stabilitási tulajdonságokkal rendelkez® el®relépéses euleri integrálási séma. Ehelyett stabil alternatívát, például Verlet-integrálást is használhatunk [33]. A lagrange-i megközelítés véges számú részecskét követ, ahol a részecskékre ható er®k a többi részecske pozíciójától és tulajdonságaitól függenek. Így egy N részecskéb®l álló rendszer id®léptetéséhez elég O(N 2 ) kölcsönhatást megvizsgálni. Az ilyen jelleg¶ feladatokat többtest problémának hívják.
Lagrange-i megoldás a GPU-n
GPGPU keretrendszerben a részecskék tulajdonságait egydimenziós tömbként tárolhatjuk a globális memóriában, vagy egydimenziós textúrából olvashatjuk ki ®ket. Grakus API esetén csak textúrával reprezentálhatjuk a részecskejellemz®ket. Az adatok textúrából olvasásának csak a jobb gyorsítótárazás miatt van el®nye, mivel a textúrasz¶r® hardver itt nem hasznos. Egy gy¶jt®típusú módszer minden vezérelt részecskéhez rendelne egy szálat és a szál
1734
37. GPGPU: Számítások grakus processzorokon
Tömbökben vagy textúrákban tárolt adatstruktúrák. A részecske pozíció és sebesség egydimenziós oat3 típusú textúrába kerül. A számított s¶r¶séghez és nyomáshoz egydimenziós oat2 típusú textúrát használunk. Végül, egy kétdimenziós textúra azonosítja minden részecskéhez a hozzá közel lév® és ezért hatással bíró további részecskéket.
37.12. ábra.
A lagrange-i megoldás egy id®lépése, amely a pirossal (feketével) színezett részecskét a sárga (fehér) szomszédai szerint mozgatja. 37.13. ábra.
a többi részecske hatását számolná. Mivel a simító függvény csak egy korlátos tartományban nem zérus, csak a simító függvény maximális sugaránál közelebbi részecskéknek lehet hatása. Érdemes ezeket a közeli, úgynevezett szomszédos részecskéket csak egyszer azonosítani és a globális memória kétdimenziós textúrájában eltárolni, majd a kés®bbi kernelekben a szomszédsági információt újabb számítások nélkül felhasználni. A GPGPU megközelítésben három egydimenziós tömbre van szükségünk a részecskék pozíciójának, sebességének, s¶r¶ségének és nyomásának reprezentációjára, valamint egy kétdimenziós tömbre a szomszédos részecskék tárolásához (37.12. ábra). A grakus megközelítésben ezek egy- vagy kétdimenziós textúrák. Minden részecskére futtathatunk egy kernelt, vagy egy pixelárnyalót. Minden olyan lépésnél, ahol a részecskéknek valamely korábban számított tulajdonságát szeretnénk felhasználni, a részecske feldolgozását menetekre vagy kernelekre kell osztani. Az els® menet a részecskék szomszédainak azonosítása, vagyis a simítókernel sugarán belüli többi részecske megtalálása. Ennek a lépésnek a kimenete egy olyan kétdimenziós tömb, ahol az oszlopok a részecske indexével címezhet®k és az oszlop elemei a közeli részecskék indexei és távolságai. A második menet a s¶r¶séget és nyomást számítja ki, a közeli részecs-
37.7. Esettanulmány: Számítógépes áramlásdinamika
1735
Lagrange-i megoldóval készült animációk a részecskéket gömbökkel megjelenítve (fels® kép) és izofelület megkeresésével (alsó kép) [53]. 37.14. ábra.
kék száma és távolságai alapján. Ezután minden részecske nyomása minden szál számára elérhet® lesz. A harmadik menet az er®ket számolja a közeli részecskék nyomása és sebessége alapján. Végül minden részecske megkapja az újonnan kiszámolt sebességét és új pozíciójára mozog (37.14. ábra). A részecskepozíciók ismeretében a rendszert többféleképpen megjeleníthetjük. Rajzolhatunk például pontot, vagy apró gömböt minden részecskéhez (37.14. ábra fels® képe). Egy másik megoldás a részecskéket a képerny®re keni az euleri megoldásban látott rajzolási stílushoz hasonló eredménnyel (37.11. ábra). Végül az áramló közeg felszínét is megkereshetjük és a felületen a geometriai optika törvényeit követve fényvisszaver®dést és törést számolhatunk (37.14. ábra alsó képe). A közeg felszíne a s¶r¶ségmez® szintfelülete, amely az alábbi implicit egyenlet megoldásaként deniálható:
ρ(~r) = ρiso . Ezt az egyenletet a virtuális kamerából látható pontokra sugármasírozás [112] (ray marching) segítségével oldhatjuk meg. A szem pozíciójából a képponton keresztül haladó sugár mentén kis lépéseket teszünk. Minden ~rs mintapontban ellen®rizzük, hogy a ρ(~rs ) s¶r¶ség meghaladja-e a megadott ρiso értéket. Az els® olyan lépésben, amikor ez megtörténik, megtaláltuk a sugár-szintfelület metszéspontot. A sugarakat innen a visszaver®dési és törési irányokban folytathatjuk. Ezen irányok számításához a szintfelület
1736
37. GPGPU: Számítások grakus processzorokon
normálvektorára is szükség van, amit a s¶r¶ségmez® gradienseként számolhatunk.
Megjegyzések a fejezethez A GPU-k x transzformációs és multitextúrázó hardverei egy jó évtizeddel ezel®tt váltak programozható csúcspont- és pixelárnyalókká. A GPU-k nagy lebeg®pontos számítási teljesítménye gyorsan megteremtette az igényt arra, hogy ne csak az inkrementális képalkotásra, de más algoritmusokra is használni lehessen ®ket. Az els® GPGPU algoritmusok még kapcsolódtak a grakához, mint például a sugárkövetés , vagy a természeti jelenségek szimulációja. A GPGPU számítások korai éveir®l kiváló összefoglaló található a [92]-ban. A számítógépes graka kutatói azóta is lelkesen dolgoznak az új hardverrel, hiszen annak általános célú képességei lehet®vé tették az inkrementális képalkotástól alapvet®en különböz® algoritmusok megvalósítását. A legfontosabb irányok a zikai alapú fényterjedés szimulációja, amit globális illuminációnak [111] hívnak, valamint a merev testek mozgásának és ütközéseinek zikai szimulációja és az áramlásszámítás, amelyek valós idej¶ rendszerekben és játékokban valószer¶ szimulációt tettek lehet®vé. A GPU Gems könyvsorozat [41, 95, 85] és ShaderX (ma már GPU Pro [36]) sorozat hasonló eljárások terjedelmes gy¶jteményét alkotják. A CUDA és OpenCL platformok megjelenése óta a magas teljesítményigény¶ számítások minden területén megjelentek GPU alapú megoldások. A GPGPU.org weboldal és NVIDIA weboldala [89, 88] cikkek és programok tárházai, egyben a GPU alapú megközelítés minden területen meglev® elfogadottságának bizonyítékai. Sikeres GPU alkalmazások születtek a következ®, sok számítást igényl® területeken, a teljesség igénye nélkül: mindenfajta zikai jelenség szimulációja, dierenciálegyenletek megoldása, tomográás rekonstrukció, számítógépes látás, adatbáziskeresés, adattömörítés, lineáris algebra, jelfeldolgozás, molekuladinamika és molekuladokkolás, pénzügyi informatika, víruskeresés, végeselemes módszerek, Monte-Carlo módszerek, számítógépek szimulációja (CNN, neurális hálózatok, kvantumszámítógépek), mintaillesztés, DNS-szekvenciálás, kriptográa, digitális holográa, kvantumkémia stb. Ha skálázható rendszert szeretnénk, amit nem határol be egyetlen GPU kártya memóriájának mérete, GPU klasztert is építhetünk. Egyetlen PC-be akár 4 GPU-t is szerelhetünk, és az összekapcsolható PC-k száma korlátlan [118]. Az ilyen rendszerekben azonban már a kommunikáció lesz a sz¶k keresztmetszet, mert a jelenlegi kommunikációs csatornák nem versenyezhetnek a GPU-k számítási teljesítményével.
38. Quantumalapú algoritmusok
Quantum
IX. GYAKORLATI MÓDSZEREK
39. Koniktushelyzetek kezelése
A gyakorlati élet minden területén találkozunk olyan helyzetekkel, amikor egymásnak ellentmondó szempontokat kell egyidej¶leg gyelembe vennünk. A probléma sokkal komolyabbá válik akkor, amikor több döntéshozó, érdekcsoport közös megegyezése kell ahhoz, hogy a megoldás kialakuljon. A koniktus helyzetek matematikai szempontból három csoportba oszthatók: 1. Egyetlen döntéshozónak kell döntenie több, ellentmondó szempont együttes gyelembevételével 2. Több döntéshozónak kell egy közös megoldást találnia, amikor mindegyik döntéshozó csak egy kritériumot vesz gyelembe 3. Több döntéshozó keres közös megoldást, de mindegyik döntéshozó egyszerre több kritériumot vesz gyelembe Az els® esetben a probléma többcélú optimalizációs probléma, mikor a különféle szempontok jelentik a célfüggvényeket. A második eset tipikus játékelméleti probléma, amikor a döntéshozók a játékosok, és a kritériumok jelentik a kizet®-függvényeket. A harmadik eset, mint Pareto-játékok szerepel az irodalomban, amikor az egyes játékosok optimum helyett csak Paretooptimális megoldások megtalálására törekednek. Ebben a fejezetben ennek a nagyon fontos, összetett témakörnek az alapjait fogjuk tárgyalni.
39.1. Többcélú programozás alapjai Tegyük fel, hogy egyetlen döntéshozó kívánja a legjobb döntési alternatívát megtalálni több, általában ellentmondó kritérium alapján. A kritériumok általában döntési célokat reprezentálnak. Ezeket általában verbálisan fogalmazzák meg el®ször, mint például tiszta leveg®, olcsó üzemeltetés stb. A matematikai modell megfogalmazása el®tt ezeket a célokat el®ször kvantikálható mutatókkal kell leírni. Gyakran el®fordul, hogy egy-egy kritériumot egyszerre több mutató jellemez, ilyen például a leveg® min®sége, hiszen sokféle szennyezés egyidej¶ jelenléte befolyásolja annak min®ségét. Matematikailag általában
39. Koniktushelyzetek kezelése
1740
feltesszük, hogy az egyes mutatók (ezeket célfüggvényeknek fogjuk hívni a továbbiakban) nagyobb értéke kedvez®bb értéket jelent, így az összes célfüggvényt egyidej¶leg kívánjuk maximalizálni. Ha valamelyik célfüggvényt eredetileg minimalizálni akarjuk, akkor nyugodtan beszorozhatjuk annak értékét (−1)-gyel, és az így nyert új célfüggvény már maximum jelleg¶vé válik. Ha valamelyik célfüggvény esetében valamilyen optimális érték elérése a cél, akkor az attól való eltérés (−1)-szeresét maximalizálhatjuk. Ha X jelöli a lehetséges döntési alternatívák halmazát, és fi : X → R jelöli az i-edik célfüggvényt (i = 1, 2, . . . , I), akkor a feladat matematikailag a következ®képpen fogalmazható meg:
fi (x) → max
(i = 1, 2, . . . , I) ,
(39.1)
feltéve, hogy x ∈ X . Egyetlen célfüggvény optimalizálása esetén optimális megoldást keresünk. Optimális megoldások eleget tesznek a következ® feltételeknek: (i) Optimális megoldás mindig jobb, mint bármely nem optimális megoldás. (ii) Nincs olyan lehetséges megoldás, amely kedvez®bb célfüggvényeket biztosítana, mint egy optimális megoldás. (iii) Ha egyszerre több optimális megoldás létezik, akkor azok ekvivalensek olyan szempontból, hogy azonos célfüggvényekkel rendelkeznek. Ezek a tulajdonságok azonnal adódnak abból az egyszer¶ tényb®l, hogy
a következménytér,
H = {u|u = f (x) adott x ∈ X mellett}
(39.2)
a valós számegyenes részhalmaza, amely teljesen rendezett. Több célfüggvény esetén a
H = {u = (u1 , . . . , uI )|ui = fi (x), i = 1, 2, . . . , I adott x ∈ X mellett} (39.3) következménytér az I -dimenziós euklideszi tér részhalmaza, amely csak félig rendezett halmaz. Egy másik bonyodalom származik abból is, hogy általában nem létezik olyan döntési alternatíva, amely az összes célfüggvényt egyszerre maximalizálja. Jelölje fi? = max{fi (x)|x ∈ X} (39.4) az i-edik célfüggvény egyedi maximumát, akkor az
f ? = (f1? , . . . , fI? )
39.1. Többcélú programozás alapjai
1741
pontot ideális pontnak nevezzük. Ha f ? ∈ H , akkor létezik olyan x? döntés, amelyre fi (x? ) = fi? , i = 1, 2, . . . , I esetén. Ilyen speciális esetekben x? kielégíti az el®z®ekben tárgyalt (i)-(iii) feltételeket. Ha azonban f ? ∈ / H , akkor a helyzet ennél sokkal bonyolultabb. Optimális megoldások helyett ilyenkor un. Pareto-optimális megoldásokat keresünk.
39.1. deníció.
Egy x ∈ X alternatívát Pareto-optimálisnak nevezünk, ha nincs olyan x ∈ X , amelyre fi (x) ≥ fi (x) i = 1, 2, . . . , I esetén és legalább egy i esetén szigorú egyenl®tlenség áll fenn. Egy többcélú optimalizációs probléma nem feltétlenül rendelkezik Paretooptimális megoldással, mint azt a
H = {(f1 , f2 )|f1 + f2 < 1} halmaz esete mutatja. Minthogy H nyílt halmaz, tetsz®leges (f1 , f2 ) ∈ H és elég kis pozitív 1 és 2 mellett (f1 + 1 , f2 + 2 ) ∈ H .
39.2. tétel.
Ha X korlátos, zárt egy véges dimenziós euklideszi térben és az összes célfüggvény folytonos, akkor létezik Pareto-optimális megoldás. A következ® két példa egy diszkrét és egy folytonos problémát mutat be. 39.1.
példa.
Tegyük fel, hogy egy szennyvíztisztító állomás tervezésénél két al-
ternatíva közül kell választani. Az els® alternatíva költsége két milliárd Ft, és napi kapacitása 1500
m3 .
A másik alternatíva drágább, 3 milliárd Ft napi 2000
pacitással. Ebben az esetben
X = {1, 2}, f1 = −költség, f2 =
m3
ka-
kapacitás. Az alábbi
táblázat foglalja össze az adatokat:
Alternatíva 1 2 39.1. ábra.
f1 −2 −3
f2 1500 2000
Szennyvíztisztító állomás tervezése.
−2 > −3 (−3, 2000).
Mindkét alternatíva Pareto-optimális, hiszen következménytér két pontból áll:
39.2.
(−2, 1500)
és
2000 > 1500.
A
H
példa. Három technológiai variáns optimális kombinációját használják egy
szennyvíztisztító állomáson. Az els® variáns 3,2,1 egyik fajta szennyezésb®l, és 1,3,2 Jelölje
és
x1 , x2
és
1 − x1 − x2
3
mg/m
mg/m3
szennyezést távolít el az
mennyiséget a másik fajta szennyezésb®l.
a három technológia változat százalékos összetételét. A
39. Koniktushelyzetek kezelése
1742 korlátozó feltételek:
≥ 0
x1 , x2
≤ 1,
x1 + x2 az eltávolított szennyezés mennyisége:
3x1 + 2x2 + (1 − x1 − x2 )
=
x1 + 3x2 + 2(1 − x1 − x2 )
= −x1 + x2 + 2 .
2x1 + x2 + 1
Minthogy a harmadik tag konstans, a következ® két célfüggvényes optimum-feladatot kapjuk:
2x1 + x2 , −x1 + x2 −→ max feltéve, hogy
≥ 0
x1 , x2
≤ 1.
x1 + x2 A
H
következménytér a következ®képpen határozható meg. Az
egyenletekb®l
x1 =
f1
=
2x1 + x2
f2
=
−x1 + x2
f1 − f2 3
és
x2 =
f1 − 2f2 , 3
és a korlátozó feltételekb®l a következ® feltételek adódnak az
x1 ≥ 0
⇐⇒
f1 − f2 ≥ 0
x2 ≥ 0
⇐⇒
f1 + 2f2 ≥ 0
x1 + x2 ≤ 1
⇐⇒
2f1 + f2 ≤ 3 .
A 39.2. és 39.3. ábrán az A
H
X
és
H
halmazt ábrázoljuk.
halmaz képe alapján világos, hogy az
(1, 1)
egyenes szakasz pontjai a Pareto-optimális pontok. A
H -beli
f1 és f2 célfüggvényekre:
(2, −1) pontokat összeköt® (2, −1) pont egyik lehetséges
és
pontnál sem jobb, mert az els® célfüggvényben a lehet® legrosszabb síkokat
szolgáltatja. A szakasz pontjai sem ekvivalensek egymással, az haladva a
(2, 1)
(1, 1)
pontból lefelé
pont irányába az els® célfüggvény növekszik, a második pedig ál-
landóan csökken. Így az optimális megoldásoknál látott (ii) és (iii) tulajdonság nem marad érvényben a többcélú esetben.
Az el®z® példában láttuk, hogy különböz® Pareto-optimális megoldások különböz® célfüggvény értékeket adnak, így alapvet® fontosságú annak eldöntése, hogy egy-egy konkrét esetben melyiküket válasszuk. Erre a kérdésre ad választ a többcélú programozás módszertana. A legtöbb módszer alapja az, hogy valamilyen valós érték¶ érték-függvénnyel helyettesíti a célfüggvé nyeket, azaz a célfüggvények által generált preferenciát egyetlen valós érték¶ függvénnyel helyettesíti. Ebben az alfejezetben a leggyakrabban alkalmazott többcélú programozási módszerekkel foglalkozunk.
39.1. Többcélú programozás alapjai
39.2. ábra.
39.3. ábra.
1743
Az X halmaz képe.
A H halmaz képe.
39.1.1. Hasznossági függvények alkalmazása Természetes módszert jelent a következ®. Minden egyes célfüggvényhez hozzárendelünk egy-egy hasznossági függvényt. Legyen ui (fi (x)) az iedik célfüggvény hasznossági függvénye. Az ui függvény konstrukciója a
39. Koniktushelyzetek kezelése
1744
hasznossági függvények elméletében megszokott módon történhet, például a döntéshozó szubjektíven deniálhatja az ui értékeket adott fi értékek mellett, majd az így adódó pontokra folytonos függvényt illeszthetünk. Additíven független hasznossági függvény esetén additív, hasznosságban független hasznossági függvény esetében pedig vagy additív vagy multiplikatív összevont hasznossági függvényalakot kaphatunk. Azaz, az összevont hasznossági függvény alakja vagy
u(f ) =
I X
(39.5)
ki ui (fi )
i=1
vagy
ku(f ) + 1 =
I Y
(39.6)
kki ui (fi ) + 1 .
i=1
Ilyen esetekben a többcélú optimalizációs feladat egyetlen célfüggvény¶vé írható át: u(f ) −→ max (39.7) feltéve, hogy x ∈ X , és ily módon u(f ) jelenti az "értékfüggvényt". 39.3.
példa.
Tekintsük ismét az el®z® példában szerepl® döntési problémát. Az
[0, 2],
els® célfüggvény értékkészlete
a második célfüggvényé pedig
[−1, 1].
Lineáris
hasznossági függvényeket feltételezve
u1 (f1 ) =
1 (f1 ) 2
és
u2 (f2 ) =
1 (f2 ) + 1 . 2
Tegyük fel továbbá, hogy a döntéshozó megadta az
u(0, −1) = 0, u(2, 1) = 1,
és az
u(0, 1) =
1 4
értékeket. Lineáris összevont hasznossági függvényt feltételezve
u(f1 , f2 ) = k1 u1 (f1 ) + k2 u2 (f2 ) , és az adott értékek alapján
A harmadik egyenletb®l
u(f1 , f2 ) =
k2 =
0
=
k1 0 + k2 0
1 1 4
=
k1 1 + k2 1
=
k1 0 + k2 1 .
1 4 , a másodikból pedig
k1 =
3 4 , úgyhogy
3 1 31 11 5 4 1 u1 (f1 )+ u2 (f2 ) = (2x1 +x2 )+ (−x1 +x2 +1) = x1 + x2 + . 4 4 42 42 8 8 8
39.1. Többcélú programozás alapjai
1745
Tehát a következ® egyetlen célfüggvénnyel rendelkez® feladatot oldjuk meg:
5 4 x1 + x2 −→ max 8 8 feltéve, hogy
x1 , x2 x1 + x2
≥ 0 ≤ 1.
Könnyen látható, hogy az optimális megoldás:
x1 = 1, x2 = 0,
vagyis az els® tech-
nológiát kell csak alkalmazni.
Tegyük fel, hogy n a célfüggvények száma és a döntéshozó megad N vek(l) (l) tort: (f1 , . . . , fn ) és a hozzátartozó u(l) összevont hasznossági függvényértékeket. Ekkor a k1 , . . . , kn együtthatókat a (l)
k1 u1 (f1 ) + · · · + kn un (fn(l) ) = u(l)
(l = 1, 2, . . . , N )
egyenletrendszer megoldásával kaphatjuk. Mindig feltesszük, hogy N ≥ n, így legalább annyi egyenletünk van mint az ismeretlenek száma. Ha az egyenletrendszer ellentmondást tartalmaz, akkor a legkisebb négyzetek módszerével a legjobban illeszked® megoldást határozzuk meg. Tegyük fel, hogy (1) u u11 · · · u1n u21 · · · u2n u(2) U= . .. és u = .. . .. . .
uN 1 · · · uN n
u(N )
A formális algoritmus ekkor a következ®:
Hasznossági-függvény-módszer(u) 1 for i ← 1 to N 2 do for j ← 1 to n 3 do uij ← uj (fj(i) ) 4 k ← (UT U)−1 UT u a megoldásvektor 5 return k
39.1.2. Súlyozásos módszer Ennek a módszernek az alkalmazásakor az értékfüggvényt az eredeti célfüggvények lineáris kombinációjaként választjuk, vagyis a I X i=1
αi fi (x) −→ max
(x ∈ X)
(39.8)
39. Koniktushelyzetek kezelése
1746
feladatot oldjuk meg. Ha az egyes célfüggvényeket különböz® dimenzióban mérjük, akkor az összevont célfüggvény nem értelmezhet®, ugyanis különböz® mértékegység¶ tagokat adunk össze. Ilyenkor a célfüggvényeket normalizálni szoktuk. Legyen mi és Mi az fi célfüggvény minimuma és maximuma az X halmazon. A normált i-edik célfüggvény ekkor az
fi (x) =
fi (x) − mi Mi − mi
képlettel adódik, és a (39.8) problémában fi helyett fi szerepel: I X
αi fi (x) −→ max
(x ∈ X)
(39.9)
i=1
Kimutatható, hogyha az összes αi súly pozitív, (39.9) optimális megoldásai Pareto-optimálisak az eredeti feladatot nézve. 39.4.
példa.
Tekintsük ismét a 39.2. példa esetét. A 39.3. ábrából látjuk, hogy
m1 = 0, M1 = 2, m2 = −1,
és
M2 = 1.
f1 (x1 , x2 ) = és
f2 (x1 , x2 ) =
Tehát a normált célfüggvények:
2x1 + x2 − 0 1 = x1 + x2 2−0 2
−x1 + x2 + 1 1 1 1 = − x1 + x2 + . 1+1 2 2 2
Tegyük fel hogy a célfüggvények egyformán fontosak, így azonos súlyokat választunk:
α1 = α2 =
Könnyen
1 2 , így az összevont célfüggvény:
1 1 1 1 1 1 1 1 1 (x1 + x2 ) + (− x1 + x2 + ) = x1 + x2 + . 2 2 2 2 2 2 4 2 4 látható, hogy az X halmazon az optimális megoldás: x1 = 0, x2 = 1 ,
azaz csak a második technológia variánst kell alkalmazni.
Tegyük fel, hogy α = (α1 , α2 , . . . , αI ). A formális algoritmus ekkor a következ®:
Súlyozásos-módszer(α) 1 for i ← 1 to I 2 do mi ← (fi (x) −→ min) 3 M ← (fi (x) −→ max) P i 4 k ← ( Ii=1 αi fi −→ max) 5 return k
39.1. Többcélú programozás alapjai
1747
39.1.3. Távolságfügg® módszerek Amennyiben normáljuk a célfüggvényeket, az egyedi normált célfüggvények legkedvez®bb értéke 1 és legkedvez®tlenebb értéke 0. Az 1 = (1, 1, . . . , 1) pont tehát az ideális pont és a 0 = (0, 0, . . . , 0) pont a legrosszabb hozamvektor. Távolságfügg® módszerek esetén vagy az 1 vektorhoz kívánunk legközelebb jutni, vagy a 0 ponttól legtávolabb, így vagy a
%(f (x), 1) −→ min
(x ∈ X)
(39.10)
%(f (x), 0) −→ max
(x ∈ X)
(39.11)
vagy a
feladatot oldjuk meg, ahol % valamilyen RI -beli távolságfüggvényt jelent. A gyakorlati alkalmazásokban a következ® távolságfüggvények szerepelnek leggyakrabban: I X %1 (a, b) = αi |ai − bi | (39.12) i=1 I X
%2 (a, b) =
! 12 (39.13)
αi |ai − bi |2
i=1
(39.14)
%∞ (a, b) = max{αi |ai − bi |} i
%g (a, b) =
I Y
(39.15)
|ai − bi |αi .
i=1
A %1 , %1 , %∞ távolságok a közismert Minkowski-féle metrikák p = 1, 2, ∞ esetben. A %g geometriai távolság nem elégíti ki a távolságfüggvények szokásos feltételeit, azonban mégis gyakran alkalmazzuk a gyakorlatban. Mint azt mi is látni fogjuk a kés®bbiekben, a klasszikus Nash-féle koniktus-feloldási algoritmus is a geometriai távolságot használja. Könnyen kimutathatjuk, hogy a %1 távolságra épül® módszerek ekvivalensek a súlyozási módszerrel. Vegyük észre el®ször, hogy
%1 (f (x), 1) =
I X
αi |fi (x) − 1| =
i=1
I X
αi |1 − fi (x)| =
i=1
I X
αi −
i=1
I X
αi fi (x) ,
i=1
(39.16) ahol az els® tag konstans, a második tag pedig a súlyozásos módszer célfüggvénye. Hasonlóan,
%1 (f (x), 0) =
I X i=1
αi |fi (x) − 0| =
I X i=1
αi (fi (x) − 0) =
I X i=1
αi fi (x)
(39.17)
39. Koniktushelyzetek kezelése
1748
39.4. ábra.
Távolság minimalizálás.
39.5. ábra.
Távolság maximalizálás.
mely a súlyozásos módszer célfüggvénye. A módszert a 39.4. és 39.5. ábra mutatja. 39.5.
példa.
Tekintsük
ismét
az
el®z®
példa
problémáját.
A
normalizált
következményeket a 39.6. ábra mutatja. A két koordináta:
f1 = Az
α1 = α2 =
1 2 és a
%2
f1 2
és
f2 =
f2 + 1 . 2
távolság választásával az ideális ponthoz legközelebbi
39.1. Többcélú programozás alapjai
39.6. ábra.
H -beli
1749
A normált H halmaz képe.
pont
f1 =
3 4 , f2 = . 5 5
Így
f1 = 2f1 = 2x1 + x2 =
6 5
és
f2 = 2f1 − 1 = −x1 + x2 =
3 , 5
vagyis az optimális döntés:
x1 =
1 4 , x2 = , 1 − x1 − x2 = 0 . 5 5
Tehát csak az els® két technológiát kell alkalmazni 20% és 80% arányban.
1 2 ) és a %2 távolságot, viszont keressük meg az ideálisan legrosszabb ponttól a legtávolabbi H -beli pontot. A 39.5. Válasszunk újra egyforma súlyokat (α1
= α2 =
ábrából látjuk, hogy a megoldás
f1 =
f1 , f2 = 1 , 2
így
f1 = 2f1 = 1, f2 = 2f2 − 1 = 1 . Tehát az optimális döntés:
x1 = 0
és
x2 = 1
A formális algoritmus a következ®:
39. Koniktushelyzetek kezelése
1750
Távolságfügg®-módszer(%, f ) 1 for i ← 1 to I 2 do mi ← (fi (x) −→ min) 3 Mi ← (fi (x) −→ max) 4 fi (x) ← (fi (x) − mi )/(Mi − mi ) 5 k ← (%(f (x), 1) −→ min) vagy k ← (%(f (x), 0) −→ max) 6 return k
39.1.4. Irányfügg® módszerek Tegyük fel, hogy rendelkezésünkre áll egy olyan f∗ pont a H halmazon, amelyen javítani szeretnénk. Az f∗ a jelenlegi helyzetet jelenti, amelyen a döntéshozó javítani kíván, vagy tervezési szinten a lehet® legrosszabb pontot választhatjuk kiinduló pontnak. Feltesszük továbbá, hogy a döntéshozó megad egy javítási irányvektort, amelyet v jelöl. A feladat ezután az, hogy f∗ -b®l kiindulva a v irányvektor mentén a lehet® legtávolabb jussunk el a H halmazon. Matematikailag tehát a
t −→ max
(f∗ + tv ∈ H)
(39.18)
optimumfeladatot oldjuk meg, és a hozzátartozó döntést az
f (x) = f∗ + tv
(39.19)
egyenlet megoldása adja az optimális t érték mellett. A módszert grakusan az 39.7. ábra ábrázolja. 39.6.
példa. Tekintsük ismét a 39.2. példa problémáját és tegyük fel, hogy
f∗ = (0, −1),
ami a lehet® legrosszabb célfüggvényértékeket tartalmazza komponen-
seiben. Ha egyenl® mértékben kívánunk a célfüggvényeken javítani, akkor a
v = (1, 1)
választással kell élnünk. A grakus megoldást a 39.8. ábra mutatja, amely szerint
f1 =
4 3
és
f2 =
1 , 3
így a megfelel® döntési változó értékek a következ®k:
x1 =
1 3
és
x2 =
2 . 3
A módszernek egy nagyon ritkán alkalmazott változata az, amikor a nem lehetséges ideális pontból szisztematikusan (azaz egy adott irány mentén) csökkentjük a célfüggvényértékeket egészen addig, amíg lehetséges megoldás
39.1. Többcélú programozás alapjai
39.7. ábra.
39.8. ábra.
1751
Irányfügg® módszerek.
A 39.6 példa grakus megoldása.
adódik. Ha f ∗ jelöli azt az ideális pontot, akkor a (39.18) optimumfeladat a következ®képpen módosul:
t −→ min és a megfelel® döntést az
(f ∗ − tv ∈ H)
(39.20)
f = f ∗ − tv
(39.21)
egyenlet megoldásából nyerhetjük. f ∗ = (2, 1)
és v = (1, 1), azaz azonos mértékben kívánjuk a célfüggvényeket csökkenteni. A 39.9. ábrán
39.7.
példa. Visszatérve az el®z® példára tegyük fel, hogy
mutatjuk a probléma grakus megoldását, ahol könnyen látható, hogy ugyanaz a
39. Koniktushelyzetek kezelése
1752
39.9. ábra.
A 39.7 példa grakus megoldása.
megoldás adódik, mint az el®z® példa esetében.
A módszer alkalmazását a (39.18) vagy a (39.20) optimumfeladat megoldása jelenti, és a megfelel® optimális döntést a (39.19) vagy a (39.21) egyenlet megoldása adja.
Gyakorlatok
39.1-1.
Határozzuk meg a H következményteret a következ® gyakorlathoz:
x1 + x2 −→ max
x1 − x2 −→ max
feltéve, hogy
x1 , x2 ≥ 0 3x1 + x2 ≤ 3 x1 + 3x2 ≤ 3 .
39.1-2. Tegyük fel, hogy a döntéshozó hasznossági függvényei: u1 (f1 ) = f1 és u2 (f2 ) = 21 f2 . Tegyük fel továbbá, hogy a döntéshozó megadta az u(0, 0) = 0, u(1, 0) = u(0, 1) = 12 értékeket is. Határozzuk meg a lineáris összevont hasznossági függvény alakját. 39.1-3. Oldjuk meg az 39.1-1. gyakorlatot a súlyozásos módszerrel a célfüggvények normalizálása nélkül. Válasszuk az α1 = α2 = 12 súlyokat. 39.1-4. Ismételjük meg az el®z® gyakorlatot, de normalizáljuk a célfüggvényeket. 39.1-5. Oldjuk meg az 39.1-1. gyakorlatot normalizált célfüggvényekkel, α1 = α2 = 12 súlyokkal és (i) %1 távolság minimalizálásával (ii) %2 távolság minimalizálásával (iii) %∞ távolság minimalizálásával
39.1-6.
Ismételjük meg az el®z® gyakorlatot, de távolság minimalizálás helyett maximalizáljuk a távolságot a 0 vektortól.
39.2. Egyensúlypontok módszere
1753
39.1-7.
Oldjuk meg az 39.1-1 gyakorlatot irányfügg® módszerrel az f∗ = (0, −1) és v = (1, 1) választással. 39.1-8. Ismételjük meg az el®z® gyakorlatot az f∗ = ( 32 , 1) és v = (1, 1) választással.
39.2. Egyensúlypontok módszere Ebben az alfejezetben feltesszük, hogy I döntéshozó érdekelt egy közös x ∈ X döntési alternatíva kiválasztásában. Jelölje fi : X 7→ R az i-edik döntéshozó célfüggvényét, amelyet a játékelméleti irodalomban kizet®függvénynek is nevezünk. A döntéshozók egymáshoz való viszonyától függ®en nem-kooperatív és kooperatív játékról beszélünk. Az els® esetben az egyes döntéshozók csak saját hasznukkal tör®dnek, a másodikban pedig valamiféle megállapodásra törekednek, amikor mindegyikük jobban jár, mint a nem-kooperatív esetben. Ebben az alfejezetben a nem-kooperatív esetet tárgyaljuk, a kooperatív eset a következ® alfejezet témája lesz majd. Jelölje i = 1, 2, . . . , I és x ∈ X esetén Hi (x) azon döntési alternatívák halmazát, amelyekbe az i-edik döntéshozó közvetlenül áttérhet x-b®l a többiek segítsége nélkül. Nyilvánvalóan Hi (x) ⊆ X .
39.3. deníció.
Egy x∗ ∈ X alternatíva egyensúlypontot jelent, ha tetsz®leges i és x ∈ Hi (x∗ ) mellett fi (x) ≤ fi (x∗ ) .
(39.22)
Ez a deníció úgy is megfogalmazható, hogy x∗ stabilis abból a szempontból, hogy egyik döntéshozó sem tudja a döntési alternatívát x∗ -ból egyedül megváltoztatni úgy, hogy célfüggvényérték javuljon. Nem-kooperatív játékok esetén az egyensúlypontok jelentik a játék megoldását. Tetsz®leges x ∈ X és i döntéshozó esetén az
Li (x) = {z|z ∈ Hi (x) és minden y ∈ Hi (x) esetén fi (z) ≥ fi (y)} (39.23) halmazt, amelyet az i-edik döntéshozónak az x alternatívára adott legjobb válaszai halmazának is nevezzük. Világos, hogy Li (x) elemei jelentik azokat az alternatívákat amelyekre x-b®l áttérhet az i-edik döntéshozó és az összes ilyen lehet®ség közül a legkedvez®bb célfüggvényt biztosít számára. A (39.22) egyenl®tlenségb®l az is világos, hogy x∗ egyensúlypont akkor és csak akkor, ha i = 1, 2, . . . , I esetén x∗ ∈ Li (x∗ ), azaz x∗ közös xpontja az Li ponthalmaz leképezéseknek. Az egyensúlypontok létezése tehát visszavezethet® pont-halmaz leképezések közös xpontjának létezésére, így ez a probléma a
39. Koniktushelyzetek kezelése
1754
i=2 1 i=1 2 39.10. ábra.
1 (1, 2) (2, 4)
2 (2, 1) (0, 5)
Játék egyensúlypont nélkül.
szokásos módszerekkel tárgyalható. Igen gyakori az az eset, amikor az egyes döntéshozók egyéni döntéseib®l áll össze a kollektív döntés. Jelölje Xi az i-edik döntéshozó lehetséges alternatíváinak a halmazát, xi ∈ Xi a konkrét alternatívákat, és legyen fi (x1 , . . . , xI ) az i-edik döntéshozó célfüggvénye. Azaz a kollektív döntés x = (x1 , . . . , xI ) ∈ X1 × X2 × · · · × XI = X . Ebben az esetben
Hi (x1 , . . . , xI ) = {(x1 , . . . , xi−1 , zi , xi+1 , . . . , xI )|zi ∈ Xi }
és a (39.22) egyensúlypont deníció a következ®képpen módosul:
fi (x∗1 , . . . , x∗i−1 , xi , x∗i+1 , . . . , x∗I ) ≤ fi (x∗i , . . . , x∗I ) .
(39.24)
A játékelméleti irodalomban az egyensúlypontot Nash-féle egyensúlypontnak is nevezzük. Egyensúlypontok létezése nem garantált általában, ennek illusztrálására tekintsük az I = 2 esetet, amikor mindkét döntéshozó 2 alternatíva között választhat: X1 = {1, 2} és X2 = {1, 2}. A célfüggvényértékeket a 39.10. ábra mutatja, ahol a zárójelbeli els® szám az els®, a második szám pedig a második döntéshozó célfüggvényértékét mutatja. Amennyiben létezik is egyensúlypont, annak egyértelm¶sége nem garantált, amit a konstans célfüggvények esete igazol, amikor minden döntési alternatíva egyensúlypontot jelent. Amennyiben az X1 , . . . , XI halmazok végesek, az egyensúlypont könnyen megtalálható a teljes leszámolás módszerével, amikor az összes döntési vektor x = (x1 , . . . , xI ) esetén leellen®rizzük, hogy az xi komponens kicserélhet®-e úgy, hogy az fi célfüggvény növekedjék. Ha igen, x nem egyensúlypont. Ha egyetlen komponens sem cserélhet® ki ily módon, akkor x egyensúlypont. Az algoritmus formális leírására tegyük fel, hogy X1 = {1, 2, . . . , ni }.
39.2. Egyensúlypontok módszere
1755
Egyensúlypont-keresés 1 2
for i1 ← 1 to n1 do for i2 ← 1 to n2 ..
3 4 5 6 7 8
.
do for iI ← 1 to nI do kulcs ← 0 for k ← 1 to n do for j ← 1 to nk do if fk (i1 , . . . , ik−1 , j, ik+1 , . . . , iI ) > f (i1 , . . . , iI )
9 10 11
if
then kulcs
← 1 és ugorjunk a 10. sorra
kulcs = 0 then (i1 , . . . , iI ) egyensúlypont
Egyensúlypont létezését garantálja a következ® tétel.
39.4. tétel.
Tegyük fel, hogy i = 1, 2, . . . , I esetén
(i) Xi konvex, korlátos és zárt egy véges dimenziós euklideszi térben (ii) fi folytonos az X halmazon (iii) rögzített x1 , . . . , xi−1 , xi+1 , . . . , xI mellett fi konkáv xi -ben. Ekkor legalább egy egysúlypont létezik. Az egyensúlypontok meghatározása általában azon az észrevételen alapul, hogy minden i esetére x∗i az
fi (x∗1 , . . . , x∗i−1 , xi , x∗i+1 , . . . , x∗I ) −→ max
(xi ∈ Xi )
(39.25)
optimumfeladat megoldása. Az optimális megoldás szükséges feltételeit (például a Kuhn-Tucker feltételeket) felírva egy egyenl®ség-egyenl®tlenségrendszert kaphatunk, amely megoldásai között szerepelnek az egyensúlypontok. Ennek a módszernek az illusztrálására tegyük fel, hogy
Xi = {xi |gi (xi ) ≥ 0} ahol xi véges dimenziós vektor és gi vektor érték¶ függvény. Ily módon (39.25) a következ®képpen írható át:
fi (x∗1 , . . . , x∗i−1 , xi , x∗i+1 , . . . , x∗I ) −→ max
(gi (xi ) ≥ 0) .
(39.26)
39. Koniktushelyzetek kezelése
1756
A Kuhn-Tucker szükséges feltételek ebben az esetben a következ®k:
ui gi (xi ) ∇i fi (x) + uTi ∇i gi (xi ) uTi gi (xi )
≥ ≥ = =
0 0 0T 0,
(39.27)
ahol ∇i az xi szerinti gradiensképzést jelöli, és ui olyan vektor, amely hossza megegyezik gi hosszával. Ha a (39.27) feltételeket i = 1, 2, . . . , I esetére felírjuk, egy egyenlet-egyenl®tlenség-rendszert kapunk, amely megoldására vannak számítógépes módszerek. Könnyen látható, hogy (39.27) átírható egy nemlineáris optimalizálási feladattá is: PI T i=1 ui gi (xi ) −→ min ui ≥ 0 (39.28) gi (xi ) ≥ 0 ∇i fi (x) + uTi ∇i gi (xi ) = 0T . Ha az optimális célfüggvényérték pozitív, akkor a (39.27) rendszernek nincs megoldása, és ha az optimális célfüggvényérték zérus, akkor bármely optimális megoldás egyben megoldja a (39.27) rendszert is, így az optimális megoldások között kell keresnünk az egyensúlypontokat. A KuhnTucker féle feltételek elégségességér®l tudjuk, hogyha fi konkáv xi -ben minden i esetén, akkor a KuhnTucker feltételek elégségesek is, így (39.27) bármely megoldása egyensúlypontot szolgáltat. Az algoritmus formálisan a következ®:
KuhnTucker-egyensúlypont 1 for i ← 1 to I 2 do gi ← ∇i fi 3 Ji ← ∇i gi (xi ) 4 (x1 , . . . , xI ) ← a (39.28) optimumfeladat megoldása PI T 5 if i=1 ui gi (xi ) > 0 6 then return "nincs egyensúlypont" 7 else return (x1 , . . . , xI ) 39.8.
példa.
Tegyük fel, hogy
I
termel®üzem gyárt valamilyen víztisztító beren-
PIxi az i-edik termel® által el®állított ci (xi ) a költségfüggvényét, és p( j=1 xj ) az eladási árat, amely a teljes piacra bocsátott mennyiségt®l függ. Legyen továbbá Li az i-edik termel® kapacitása. A lehetséges Xi döntési halmaz tehát a [0, Li ] zárt intervallum, amely az dezést, amelyet háztartásokba adnak el. Jelölje mennyiséget,
xi Li − xi
≥ 0 ≥ 0
(39.29)
39.2. Egyensúlypontok módszere
1757
feltételekkel írható le, így
gi (xi ) =
Az
i-edik
xi Li − xi
.
termel® célfüggvénye annak protja:
fi (x1 , . . . , xn ) = xi p(x1 + · · · + xn ) − ci (xi ) . Minthogy
gi (xi )
kétdimenziós,
ui
(39.30)
is kételem¶ vektor, és a (39.28) optimumfeladat a
következ® alakú:
(1) i=1 (ui xi
PI
(2)
+ ui (Li − xi )) −→ (1) (2) ui , ui ≥ xi ≥ Li − xi ≥ PI PI (1) (2) 1 0 0 p( j=1 xj ) + xi p ( j=1 xj ) − ci (xi ) + (ui , ui ) −1 = Vezessük be az
(2)
βi = ui PI
(1)
αi = ui
(2)
− ui
min 0 0 0 0.
(39.31)
új változót, és a könnyebb jelölés érdekében legyen
, akkor az utolsó feltétel gyelembevételével a következ® problémát nyerjük:
PI
i=1 (−xi (p(
j=1
xj ) + xi p0 (
PI
j=1
Vegyük észre, hogy optimum esetén
xj ) − c0i (xi )) + βi Li ) −→ βi ≥ xi ≥ xi ≤
βi = 0 ,
min 0 0 Li .
(39.32)
így a célfüggvény utolsó tagját el is
hagyhatjuk. Tekintsük az
I = 3, ci (xi ) = ix3i + xi , Li = 1, p(s) = 2 − 2s − s3
speciális esetet.
A (39.32) feladat most a következ®képpen egyszer¶södik:
P3
i=1
xi (2 − 2s − s2 − 2xi − 2xi s − 3ix2i − 1) −→ xi ≥ xi ≤ x1 + x2 + x3 =
max 0 1 s.
(39.33)
Egy egyszer¶ számítógépes program felhasználásával az optimális megoldás:
x∗1 = 0.1077, x∗2 = 0.0986, x∗3 = 0.0919 , és egyben ez az egyensúlypont is.
Gyakorlatok
39.2-1.
Legyen I = 2, X1 = X2 = [0, 1], f1 (x1 , x2 ) = x1 + x2 − x21 , f2 (x1 , x2 ) = x1 + x2 − x22 . Írjuk fel a (39.27) feltételrendszert és oldjuk is meg. 39.2-2. Az el®z® gyakorlathoz írjuk fel a (39.28) optimum feladatot és oldjuk is meg.
39. Koniktushelyzetek kezelése
1758
39.2-3.
Legyen most is I = 2. X1 = X2 = [−1, 1], f1 (x1 , x2 ) = −(x1 + 2 x2 1 + 2x2 , f2 (x1 , x2 ) = −(x1 + x2 ) + 2x1 + x2 . Ismételjük meg a 39.2-1. gyakorlatot. 39.2-4. Ismételjük meg a 39.2-2. gyakorlatot az el®z® gyakorlatbeli problémához.
)2 + x
39.3. Kooperatív játékok módszerei Az el®z® alfejezethez hasonlóan jelölje ismét I a döntéshozók számát, Xi az i-edik döntéshozó döntési halmazát és xi ∈ Xi a konkrét döntési alternatívákat. Jelölje továbbá fi (x1 , . . . , xI ) az i-edik döntéshozó célfüggvényét. Legyen S a döntéshozók valamilyen részhalmaza, amelyet játékelméletben általában koalíciónak is szoktak nevezni. Tetsz®leges S ⊆ {1, 2, . . . , I} mellett vezessük be a
v(S) = max min
xi ∈Xi xj ∈Xj
X
fk (x1 , . . . , xI )
(i ∈ S, j ∈ / S)
(39.34)
k∈S
függvényt, amelyet az 1, 2, . . . , I halmaz összes részhalmazán deniált karakterisztikus függvénynek is nevezünk, ha a (39.34) deníciót kiegészítjük a v(∅) = 0 és a
v({1, 2, . . . , I}) = max
xi ∈Xi
I X
fk (x1 , . . . , xI )
(1 ≤ i ≤ I)
k=1
két széls®séges esettel. Tegyük ismét fel, hogy az Xi halmazok végesek: Xi = {1, 2, . . . , ni } , i = 1, 2, . . . , I esetén. Legyen S egy koalíció. A v(S) érték a következ® algoritmussal adódik. Itt |S| jelöli S elemeinek számát és k1 , k2 , . . . , k|S| az elemeket, és l1 , l2 , . . . , lI−|S| az S -be nem tartozó elemeket.
39.3. Kooperatív játékok módszerei
1759
Karakterisztikus-függvény(S ) 1 v(S) ← −M , ahol M egy nagyon nagy pozitív szám 2 for i1 ← 1 to nk1 .. . 3
do for i|S| ← 1 to nk|S| do for j1 ← 1 to nl1
4 5
6 7 8 9 10 11 12 13 14
..
.
do for jI−|S| ← 1 to nlI−|S| do Z ← M , ahol M egy nagy pozitív szám P|S| V ← t=1 fit (i1 , . . . , i|S| , j1 , . . . , jI−|S| ) if V < Z then Z ← V
if
Z > v(S)
then v(S) ← Z
return v(S)
39.9.
példa.
Térjünk vissza az el®z® példában tárgyalt döntési problémához, és
1, 2, 3
PI
PI i=1 xi ) = 10 − i=1 xi és ci (xi ) = xi + 1 , i = esetén. Minthogy a költségfüggvények azonosak, a célfüggvények is azonosak: I = 3, Li = 3, p(
tegyük fel, hogy
fi (x1 , x2 , x3 ) = xi (10 − x1 − x2 − x3 ) − (xi + 1) . A következ®kben meghatározzuk a karakterisztikus függvényt. Legyen el®ször
{i},
S =
ekkor
v(S) = max min{xi (10 − x1 − x2 − x3 ) − (xi + 1)} xi
Minthogy a függvény szigorúan csökken az
xj = 3
(j 6= i) .
xj
xj (i 6= j)
változókban, minimális értéke
esetén adódik, így
v(S) = max xi (4 − xi ) − (xi + 1) = max (−x2i + 3xi − 1) = 0≤xi ≤3
i
ami egyszer¶ dierenciálással könnyen látható. Hasonlóan az
5 , 4
S = {i, j}
esetben
v(S) = max min {(xi + xj )(10 − x1 − x2 − x3 ) − (xi + 1) − (xj + 1)} . i,j k6=i,j
Hasonlóan az el®z® esethez a minimum az
v(S) =
max
xk = 3
esetben adódik, úgyhogy
{(xi + xj )(7 − xi − xj ) − (xi + xj + 2)} = max {x(7 − x) − (x + 2)} =
0≤xi ,xj ≤3
0≤x≤6
= max {−x2 + 6x − 2} = 7 0≤x≤6
39. Koniktushelyzetek kezelése
1760 ahol bevezettük az új
v(S) =
x = xi + xj
változót. Az
S = {1, 2, 3}
esetben
{(x1 +x2 +x3 )(10−x1 −x2 −x3 )−(x1 +1)−(x2 +1)−(x3 +1)} =
max
0≤x1 ,x2 ,x3 ≤3
= max {x(10 − x) − (x + 3)} = max {−x2 + 9x − 3)} = 17.25 , 0≤x≤9
0≤x≤9
ahol most bevezettük az
x = x1 + x2 + x3
változót.
A (39.34) deníció úgy is értelmezhet®, hogy a v(S) karakterisztikus függvény-érték az S koalíció garantált együttes célfüggvényértékét adja meg függetlenül attól, hogy a többiek mit csinálnak. Kooperatív játékok elméletének és gyakorlatának az a központi kérdése, hogy az együttesen maximálisan elérhet® v({1, 2, . . . , I}) együttes hasznon az egyes döntéshozók hogyan osztozzanak meg. Egy (φ1 , φ2 , . . . , φI ) elosztást imputációnak szoktak nevezni, ha φi ≥ v({i}) (39.35)
i = 1, 2, . . . , I esetén és I X
φi = v({1, 2, . . . , I}) .
(39.36)
i=1
A (39.35)(39.36) egyenl®tlenségrendszernek általában végtelen sok imputáció tesz eleget, így további feltételeket kell kikötnünk annak érdekében, hogy az imputáció-halmaz egy speciális elemét kiválaszthassuk. Hasonló helyzettel találkozhatunk a többcélú programozás tárgyalásánál is, amikor egy-egy speciális Pareto-optimális megoldást keresünk meg a konkrét módszerek alkalmazásával. 39.10.
példa.
Az el®z® esetben egy
(φ1 , φ2 , φ3 )
vektor akkor imputáció, ha
φ1 , φ2 , φ3
≥
1.25
φ1 + φ2 , φ1 + φ3 , φ2 + φ3
≥
7
φ1 + φ2 + φ3
=
17.2 .
A legnépszer¶bb megoldási koncepció a Shapley-érték, amely a következ®képpen adható meg:
φi =
X S⊆{1,2,...,I}
(s − 1)!(I − s)! (v(S) − v(S − {i})) , I!
(39.37)
ahol s jelöli az S koalíció elemeinek a számát. Tegyük fel, hogy a döntéshozók teljesen kooperálnak, azaz az {1,2,. . . ,I}
39.3. Kooperatív játékok módszerei
1761
koalíciót hozzák létre, és az egyes döntéshozók véletlen sorrendben csatlakoznak a koalícióhoz. A v(S) − v(S − {i}) különbség az i-edik döntéshozónak az S koalícióhoz való hozzájárulását mutatja, a (39.37) kifejezés pedig ugyanennek a döntéshozónak az átlagos hozzájárulását. Kimutatható, hogy (φ1 , φ2 , . . . , φI ) egy imputáció. A Shapley-értékek számítása a következ® algoritmussal történhet:
Shapley-érték 1 2 3 4
for ∀S ⊆ {1, . . . , I} do v(S) ← Karakterisztikus-Függvény(S ) for i ← 1 to I do alkalmazzuk (39.37) -et φi kiszámítására
39.11. példa. Az el®z® példában kiszámítottuk a karakterisztikus függvény értékét.
φ1 = φ2 = φ3 kell legyen a Shapley-érték esetén. Minthogy φ1 +φ2 +φ3 = v({1, 2, 3}) = 17.25, φ1 = φ2 = φ3 = 5.75. Ugyanezt az értéket kapjuk a (39.37) képlettel is. Tekintsük a φ1 értéket. Ha i ∈ / S , akkor v(S) = v(S − {i}), így az összeg megfelel® tagjai zérus érték¶ek. A nemzérus tagok az S = {1}, S = {1, 2}, S = {1, 3} és S = {1, 2, 3} koalíciók esetében adódnak, így
A szimmetria miatt
φ1 =
0!2! 5 1!1! 5 1!1! 5 2!0! 69 ( − 0) + (7 − ) + (7 − ) + ( − 7) = 3! 4 3! 4 3! 4 3! 4 1 10 23 23 82 138 ( + + + )= = 5.75 . 6 4 4 3 4 24
Egy alternatív megoldási koncepció a megoldás stabilitását követeli meg. Azt mondjuk, hogy egy vektor φ = (φ1 , . . . , φI ) majorálja a ψ = (ψ1 , . . . , ψI ) vektort az S koalícióban, ha X X φi > ψi , i∈S
i∈S
azaz az S koalíció érdeke a φ kizetési vektorról áttérni a ψ kizetési vektorra, vagy ψ instabil az S koalícióra nézve. A NeumannMorgenstern megoldás imputációk olyan V halmaza, amelyre (i) Nincs olyan φ, ψ ∈ V , hogy φ majorálja ψ -t valamilyen koalícióban (bels® stabilitás) (ii) Ha ψ ∈ / V , akkor van olyan φ ∈ V , hogy φ majorálja ψ -t legalább egy koalícióban (küls® stabilitás).
39. Koniktushelyzetek kezelése
1762
Ennek a koncepciónak az a f® nehézsége, hogy nincs általános egzisztencia tétel nem üres V halmaz létezésére, és nem ismert általános módszer a V halmaz konstrukciójára.
Gyakorlatok
39.3-1.
Legyen I = 3, X1 = X2 = X3 = [0, 1], fi (x1 , x2 , x3 ) = x1 + x2 + x3 − (i = 1, 2, 3). Határozzuk meg a v(S) karakterisztikus függvényt. 39.3-2. Az el®z® gyakorlatban adott játék esetére írjuk fel a (39.35), (39.36) feltételrendszert. 39.3-3. Határozzuk meg a ψi Shapley-értékeket a 39.3-1. gyakorlatban megadott játék esetére.
x2i
39.4. Csoportos döntéshozatal Az els® alfejezetekben feltettük, hogy a célfüggvényeket numerikus értékek írják le. Ezek a numerikus értékek preferenciákat is jelentenek, hiszen az iedik döntéshozó az x alternatívát preferálja z -vel szemben, ha fi (x) > fi (z). Ebben az alfejezetben olyan módszerekkel fogunk foglalkozni, amelyek nem igénylik célfüggvények ismeretét, csak az egyes döntéshozók preferenciáit. Jelölje I ismét a döntéshozók számát, X a döntési alternatívák halmazát. Ha az i-edik döntéshozó az x alternatívát jobbnak tartja, mint az y alternatívát, akkor azt x i y jelöli, ha x-et jobbnak vagy azonosan jónak tartja, mint az y alternatívát, akkor ezt x i y jelöli. Feltesszük, hogy (i) Tetsz®leges x, y ∈ X esetén x i y vagy y i x (vagy mindkett®) (ii) x i y és y i z esetén x i z . Az (i) feltétel megköveteli, hogy a i félig rendezés teljes legyen, a (ii) feltétel pedig azt, hogy tranzitív legyen.
39.5. deníció.
Egy csoportos döntéshozatali leképezés tetsz®leges (1 , 2 , . . . , I ) egyéni félig rendezéseket egyetlen félig rendezéssé s¶rít, amelyet a csoport közös preferencia-struktúrájának is nevezünk.
Néhány egyszer¶ példán illusztráljuk a csoportos döntéshozatali leképezés fogalmát.
39.4. Csoportos döntéshozatal 39.12.
példa.
Legyen
x, y ∈ X
1763 tetsz®leges, és az összes
1, 0, αi = −1, Legyen
βi , β2 , . . . , βI
ha ha ha
i
esetén legyen
x i y, x ∼i y, x ≺i y.
adott pozitív konstans, és
α=
I X
βi αi .
i=1 A csoportos döntéshozatali leképezést a következ® jelenti:
A
xy
⇐⇒
α>0
x∼y x≺y
⇐⇒ ⇐⇒
α=0 α<0.
többségi szavazati szabály ennek az a speciális esete, amikor
β1 = β2 = · · · =
βI = 1.
39.13.
példa.
Egy
i0
diktátornak hívunk, ha a csoportos dön-
döntéshozót
téshozatalban az ® akarata érvényesül:
xy
⇐⇒
x i0 y
x∼y
⇐⇒
x ∼i0 y
x≺y
⇐⇒
x ≺i0 y .
Ezt a fajta csoportos preferenciát diktatúrának is hívjuk.
39.14.
példa.
A
Borda-mérték esetén feltesszük, hogy
összes döntéshozó valamennyi ját. Például
ci (x) = 1,
ha
x
x∈X
esetén egy
a legjobb,
α véges halmaz és az ci (x) mértékkel fejezi ki preferenciá-
ci (x) = 2,
ha x a második legkedvez®bb alter-
natíva az i-edik döntéshozó számára, és így tovább,
ci (x) = I , ha x a legrosszabbnak
feltüntetett. Ekkor
xy x∼y x≺y
⇐⇒ ⇐⇒ ⇐⇒
I X i=1 I X i=1 I X i=1
ci (x) > ci (x) = ci (x) <
I X i=1 I X i=1 I X
ci (y) ci (y) ci (y) .
i=1
Egy csoportos döntéshozatali leképezést Paretonak vagy Paretoleképezésnek hívunk, ha valamilyen x, y ∈ X és x i y (i = 1, 2, . . . , I)
39. Koniktushelyzetek kezelése
1764
esetén szükségképpen x y . Azaz, ha az összes döntéshozó x-et preferálja y nal szemben, akkor ez ugyanígy kell legyen a csoport közös preferenciájában is. Egy csoportos döntéshozatali leképezésr®l azt mondjuk, hogy eleget tesz a páronkénti függetlenségi feltételnek, ha tetsz®leges két (1 , . . . , I ) és (01 , . . . , 0I ) preferencia-struktúra kielégíti a következ®ket. Legyen x, y ∈ X olyan, hogy tetsz®leges i mellett x i y akkor és csak akkor teljesül, ha x 0i y , és y i x akkor és csak akkor teljesül, ha y 0i x. Ekkor a csoport közös preferenciájában is x y akkor és csak akkor, ha x 0 y , és y x akkor és csak akkor, ha y 0 x. 39.15. példa. Könnyen látható, hogy a Borda-mérték Pareto, azonban nem elégíti
ki a páronkénti függetlenségi feltételt. Az els® állítás nyilvánvaló, a másodikat pedig egy egyszer¶ példával illusztrálhatjuk. Legyen
I = 2, α = {x, y, z}.
tegyük fel, hogy
x 1 z 1 y y 2 x 2 z és
x 01 y 01 z y 02 z 02 x
.
c(x) = 1 + 2 = 3, c(y) = 3 + 1 = 4, így y x. Azonban c0 (x) = 1 + 3 = 4, c (y) = 2+1 = 3, következésképpen x y . Mint látjuk az egyes döntéshozók x és y
Ekkor
0
közötti preferencia rendezése ugyanaz a két esetben, de a csoport közös preferenciája különböz®.
Jelölje RI az I -elem¶ teljes és tranzitív (1 , . . . , I ) félig rendezések halmazát egy legalább három elem¶ X halmazon, és legyen a csoport együttes preferenciája, amely Pareto és eleget tesz a páronkénti függetlenségi feltételnek. Ekkor szükségképpen diktatórikus. Ez az Arrow-tól származó eredmény mutatja, hogy nincs olyan csoportos döntéshozatali leképezés, amely eleget tenne a fenti két természetes és alapvet® követelménynek. 39.16.
példa.
x, y ∈ X x i y . A
azaz
A
páronkénti összehasonlítás módszere a következ®. Legyen
tetsz®leges, és jelöljük
P (x, y)-nal
azon döntéshozók számát, amelyekre
csoport együttes preferenciája ezek után a következ®:
xy
xy
⇐⇒
P (x, y) > P (y, x)
x∼y
⇐⇒
P (x, y) = P (y, x)
x≺y
⇐⇒
P (x, y) < P (y, x) ,
akkor és csak akkor, ha több döntéshozó tartja
x-et
jobbnak, mint az
alternatívát a kett®jük összehasonlításában. Tegyük fel ismét, hogy
X
y
három elemb®l
39.4. Csoportos döntéshozatal Döntéshozók 1 2 .. . I
1 a11 a21 .. .
aI1
x = {x, y, z}
Alternatívák 2 ... a12 ... a22 ... .. . ... aI2
N a1N a2N .. .
aIN
Súlyok
α1 α2 .. . αI
Csoportos döntéshozatali táblázat.
39.11. ábra.
áll,
1765
és az egyéni preferenciák
I=3
esetén
x 1 y 1 z z 2 x 2 y y 3 z 3 x
.
x y , mert P (x, y) = 2 és P (y, x) = 1. Hasonlóan y z , mert P (y, z) = 2 és P (z, y) = 1, valamint z x, hiszen P (z, x) = 2 és P (x, z) = 1. Tehát x y z x, ami ellentmond a tranzitivitási követelménynek.
Az együttes preferenciában tehát
Az eddigiekben tárgyalt módszerek nem vették gyelembe azt a fontos körülményt, hogy a döntéshozók nem feltétlenül azonos pozíciókban vannak, azaz különböz® fontosságúak is lehetnek. Ezt a fontosságot súlyokkal tudjuk például jellemezni. Ebben az általánosabb esetben a csoportos döntéshozatali módszereket kell®képpen módosítanunk kell. Tegyük fel, hogy X véges halmaz, jelölje N az alternatívák számát. Az összes döntéshozó preferenciáját az 1-t®l N -ig terjed® számokkal jelöljük, ahol 1 a legkedvez®bb, N pedig a legkedvez®tlenebb alternatívához van rendelve. Elképzelhet®, hogy két alternatíva egyformán fontos, akkor törtszámot is használhatunk. Például, ha 2. és 3. fontossági sorrendjét nem tudjuk megkülönböztetni, akkor 2.5-et rendelünk mindkét alternatívához. Általában a meg nem különböztethet® sorszámok átlagértékét rendeljük mindegyikükhöz. Ily módon a csoportos döntéshozatal problémája egy táblázatban adható meg, amely sorai a döntéshozóknak, oszlopai pedig a döntési alternatíváknak felel meg. A táblázat minden sora az 1, 2, . . . , N számok valamilyen permutációja, esetleg néhány elemet átlagértékekkel helyettesítünk azonosan preferált esetekben. A 39.11. ábra mutatja az így adódó döntési táblázatot, ahol az utolsó oszlopban feltüntettük a döntéshozók súlyait is. A többségi szavazati szabályt ebben az általánosabb esetben a következ®képpen fogalmazhatjuk meg. Az összes j alternatívához határozzuk meg el®ször azoknak a döntéshozóknak az együttes súlyát, akiknek a j -edik alternatíva a legjobb lehet®ség, majd válasszuk ki azt az alternatívát a közösen
39. Koniktushelyzetek kezelése
1766
elfogadott legjobbnak, amelyik esetén ez az összeg a legnagyobb. Ha célunk az összes alternatíva rangsorolása, és nemcsak a legjobb kiválasztása, akkor ezen összeg szerinti csökken® sorrendet kell tekintenünk az alternatívák rangsorolásához, ahol a legnagyobb összeg választja ki a legjobbat, és a legkisebb összeg adja a legkedvez®tlenebb alternatívát. Matematikailag legyen
1, ha aij = 1, 0 különben
f (aij ) =
(39.38)
és
Aj =
I X
f (aij )αi
(39.39)
i=1
j = 1, 2, . . . , I esetén. A j0 -adik alternatíva a csoport által tekintett legjobb, ha Aj0 = max{Aj } . j
(39.40)
A formális algoritmus a következ®:
Többségi-szavazati-szabály(A) 1 A1 ← 0, A2 ← 0, . . . , AN ← 0, max ← 0 2 for i ← 1 to N 3 do for j ← 1 to I 4 do if aji = 1 5 then Ai ← Ai + αj 6 if Ai > max 7 then max ← Ai 8 ind ← i 9 return ind A Borda-mérték alkalmazásakor legyen
Bj =
I X
aij αi ,
(39.41)
i=1
és a j0 alternatíva a csoportos döntés eredménye, ha
Bj0 = min{Bj } . j
A Borda-mérték a következ® algoritmussal írható le:
(39.42)
39.4. Csoportos döntéshozatal
1767
Borda-mérték-módszer(A, α) 1 B1 ← 0, B2 ← 0, . . . , BN ← 0, max ← 0 2 for j ← 1 to N 3 do for i ← 1 to I 4 do Bj ← Bj + aij αi 5 if Bj > max 6 then max ← Bj 7 ind ← j 8 return ind A páronkénti összehasonlítás módszerének alkalmazásakor legyen tetsz®leges j, j 0 ∈ X esetén
P (j, j 0 ) =
X
αi
(39.43)
{i|aij
mely megadja mindazoknak a döntéshozóknak az együttes súlyát, akik a j edik alternatívát tartják jobbnak, mint a j 0 -dik alternatívát. Az együttes döntésben
j j 0 ⇐⇒ P (j, j 0 ) > P (j 0 , j) .
Számos esetben az így nyert együttes félig rendezés nem ad egyértelm¶en legjobb alternatívát. Ilyen esetekben
S ∗ = {j|j ∈ X és nincs olyan j 0 ∈ X, amelyre j 0 j}
nem-dominált alternatíva-halmazon további analízis (például egy másik módszer alkalmazása) szükséges. Az algoritmussal egy {0, 1} elem¶ mátrixot konstruálunk, ahol ajl = 1 akkor és csak akkor, ha a j alternatíva összeségében jobb, mint az l alternatíva. Döntetlen esetben ajl = 21 lesz.
39. Koniktushelyzetek kezelése
1768
Bizottsági Tagok 1 2 3 4 5 6
Alternatívák 2 3 2 3 4 1 2 3 1 3 4 1 2 4
1 1 2 1 2 3 1
39.12. ábra.
4 4 3 4 4 2 3
Súlyok
0.3 0.2 0.2 0.1 0.1 0.1
A 39.17 példa adatbázisa.
Páronkénti-összehasonlítás(A) 1 2 3 4 5 6 7 8 9 10 11 12 13 14
for j ← 1 to N − 1 do for l ← j to N do z ← 0 for i ← 1 to I do if aij > ail then z ← z + 1 if z > N2 then ajl ← 1 if z = N2 then ajl ← 12 if z < N2 then ajl ← 0 return A
39.17.
alj ← ajl
példa. Egy vegyileg szennyezett terület tisztítására négy javaslat érkezett
a környezetvédelmi hatósághoz. Egy hat emberb®l álló bizottságnak kell a legjobb javaslatot kiválasztani és ezután a hatóság szerz®dést köthet annak konkrét megvalósítására. A 39.12. táblázat tartalmazza az egyes bizottsági tagok relatív súlyát és az egyéni preferenciákat. A
többségi szavazati szabály alkalmazásakor
A1
=
0.3 + 0.2 + 0.1 = 0.6
A2
=
0.2 + 0.1 = 0.3
A3
=
0.1
A4
=
0,
így az els® alternatíva adódik a legjobbnak.
39.4. Csoportos döntéshozatal A
1769
Borda-mérték alkalmazásakor
B1
=
0.3 + 0.4 + 0.2 + 0.2 + 0.3 + 0.1 = 1.5
B2
=
0.9 + 0.2 + 0.6 + 0.3 + 0.1 + 0.4 = 2.5
B3
=
0.6 + 0.8 + 0.4 + 0.1 + 0.4 + 0.2 = 2.5
B4
=
1.2 + 0.6 + 0.8 + 0.4 + 0.2 + 0.3 = 3.5 .
Az els® alternatíva adódik ismét a legjobbnak, de ez a módszer egyformán jónak mutatja a második és harmadik alternatívát. Vegyük észre, hogy az el®z® módszer esetében a második alternatíva jobbnak adódott, mint a harmadik. A
Tehát
páronkénti összehasonlítás módszere esetében
P (1, 2)
=
0.3 + 0.2 + 0.1 + 0.1 = 0.7
P (2, 1)
=
0.2 + 0.1 = 0.3
P (1, 3)
=
0.3 + 0.2 + 0.2 + 0.1 + 0.1 = 0.9
P (3, 1)
=
0.1
P (1, 4)
=
0.3 + 0.2 + 0.2 + 0.1 + 0.1 = 0.9
P (4, 1)
=
0.1
P (2, 3)
=
0.2 + 0.1 + 0.1 = 0.4
P (3, 2)
=
0.3 + 0.2 + 0.1 = 0.6
P (2, 4)
=
0.3 + 0.2 + 0.2 + 0.1 + 0.1 = 0.9
P (4, 2)
=
0.1
P (3, 4)
=
0.3 + 0.2 + 0.1 + 0.1 = 0.7
P (4, 3)
=
0.2 + 0.1 = 0.3 .
1 2, 1 3, 1 4, 3 2, 2 4
és
3 4.
Ezeket a preferenciákat a 39.13.
ábrán ábrázoljuk. Az els® alternatívát jobbnak találtuk, mint az összes többit, ezért ez a nyilvánvaló választás.
A fenti példában mindhárom módszer ugyanazt az eredményt szolgáltatta. Számos gyakorlati esetben azonban különböz® eredmény is adódhat, ilyenkor a döntéshozóknak kell kiválasztaniuk valamilyen egyéb kritériumok alapján a közösen elfogadott megoldást.
Gyakorlatok
39.4-1.
Tekintsük a következ® csoportos döntéshozatali táblázatot: Alkalmazzuk a többségi szavazati szabályt. 39.4-2. Alkalmazzuk a Borda-mértéket az el®z® gyakorlatra. 39.4-3. Alkalmazzuk a páronkénti összehasonlítás módszerét a 39.4-1. gyakorlatra. 39.4-4. Tekintsük most a következ® csoportos döntéshozatali táblázatot:
39. Koniktushelyzetek kezelése
1770
39.13. ábra.
Döntéshozók
1 2 3 4
A 39.17 példa referencia gráfja.
Alternatívák 2 3 4 5 2 3 2 5 4 3 1 4 1 2 3
1 1 1 5 4
Súlyok
5 4 3 2 5
3 2 2 1
39.14. ábra.
Döntéshozók
1 2 3 4 39.15. ábra.
Alternatívák 1 2 3 1 2 3 3 2 1 2 1 3 1 3 2
Súlyok
1 1 1 1
Csoportos döntéshozatali táblázat
Ismételjük meg a 39.4-1. gyakorlatot erre a problémára. 39.4-5. Alkalmazzuk a Borda-mértéket az el®z® gyakorlatra. 39.4-6. Alkalmazzuk a páronkénti összehasonlítás módszerét a 39.4-4. gyakorlatra.
39.5. Pareto-játékok alkalmazása Jelölje ismét I a döntéshozók számát és tegyük most fel, hogy a döntéshozók külön-külön több célfüggvénnyel rendelkeznek. Az ilyen típusú problémák
39.5. Pareto-játékok alkalmazása
1771
kezelésére többféle lehet®ség kínálkozik. (A) Többcélú programozás alkalmazásakor jelölje αi az i-edik döntéshozó súlyát, és legyenek βi1 , βi2 , . . . , βic(i) ugyanezen döntéshozó célfüggvényének a súlyai. IttPc(i) jelöli az i-edik döntéshozó célfüggvényeinek I a számát. Így egy i=1 c(i) célfüggvénnyel rendelkez® optimalizációs problémát kaphatunk, ahol az összes döntéshozó valamennyi célfüggvénye jelenti a feladat célfüggvényeit, és az egyes célfüggvények súlyai az αi βij sorozatok. Az így adódó probléma megoldására az 39.1. alfejezet bármely módszerét választhatjuk. (B) Egy másik módszercsaládot nyerhetünk a következ®képpen. Mindegyik döntéshozó esetére határozzunk meg egy hasznossági függvényt (a 39.1.1. szakaszban leírtak szerint), amely egyetlen függvénybe s¶ríti a döntéshozó preferenciáját. Ezzel a módszerrel elérjük, hogy minden döntéshozó egyetlen (új) célfüggvénnyel rendelkezik csak, így az el®z® alfejezetek bármelyik megoldási koncepcióját és módszerét közvetlenül alkalmazni tudjuk. (C) Egy harmadik megoldási módszert kaphatunk oly módon, hogy az egyes döntéshozók esetén hasznossági függvények konstrukciója helyett csak a döntéshozók alternatív halmazon deniált félig rendezését határozzuk meg valamilyen módszerrel. Ezután pedig a 39.4. alfejezet bármelyik módszerét közvetlenül alkalmazni tudjuk.
39.18.
példa. Módosítsuk az el®z® példát a következ®képpen. tegyük fel ismét,
hogy négy alternatívából választunk, azonban tegyük fel most, hogy háromtagú a bizottság és mindegyik bizottsági tag két célfüggvénnyel rendelkezik. Az els® célfüggvényt a javasolt megoldás technikai színvonala jelenti egy szubjektív skálán. A második célfüggvény pedig a pontos megvalósítás valószín¶ségét jelenti, ez utóbbit szubjektív alapon külön-külön becslik meg a döntéshozók a javaslattev® cég korábbi megbízásai alapján. Az adatokat a 39.16. táblázat mutatja, ahol feltesszük, hogy az els® célfüggvény egy 0-tól 100-ig terjed® szubjektív skálán becsült, így a normalizált célfüggvényértékeket 100-al való osztással kapjuk meg. A súlyozásos módszert alkalmazva külön-külön az egyes döntéshozók esetére a következ® összevont célfüggvényértékek adódnak: 1. Döntéshozó Els® alternatíva: Második alternatíva: Harmadik alternatíva: Negyedik alternatíva:
0.9(0.5) + 0.9(0.5) = 0.9 0.75(0.5) + 0.8(0.5) = 0.775 0.8(0.5) + 0.7(0.5) = 0.75 0.85(0.5) + 0.8(0.5) = 0.825
39. Koniktushelyzetek kezelése
1772
Döntéshozó
Célfüggvény 1 2 1 2 1 2
1 2 3
Alternatívák 1 2 3 4 90 75 80 85 0.9 0.8 0.7 0.8 85 80 70 90 0.8 0.9 0.8 0.85 80 90 75 70 0.85 0.8 0.9 0.8
39.16. ábra.
Célfüggvény súlya 0.5 0.5 0.6 0.4 0.7 0.3
A 39.18 példa adatbázisa.
2. Döntéshozó Els® alternatíva: Második alternatíva: Harmadik alternatíva: Negyedik alternatíva:
0.85(0.6) + 0.8(0.4) = 0.83 0.8(0.6) + 0.9(0.4) = 0.84 0.7(0.6) + 0.8(0.4) = 0.74 0.9(0.6) + 0.85(0.4) = 0.88
3. Döntéshozó Els® alternatíva: Második alternatíva: Harmadik alternatíva: Negyedik alternatíva:
0.8(0.7) + 0.85(0.3) = 0.815 0.9(0.7) + 0.8(0.3) = 0.87 0.75(0.7) + 0.9(0.3) = 0.795 0.7(0.7) + 0.8(0.3) = 0.73
Az egyedi preferenciák tehát a következ®k:
1 1 4 1 2 1 3, 4 2 2 2 1 2 3,
és
2 3 1 3 3 3 4 .
Például a Borda-mértéket alkalmazva
B1 B2
= 1(0.4) + 3(0.3) + 2(0.3) = 1.9 = 3(0.4) + 2(0.3) + 1(0.3) = 2.1
B3
=
4(0.4) + 4(0.3) + 3(0.3) = 3.7
B4
=
2(0.4) + 1(0.3) + 4(0.3) = 2.3
adódik, így a négy alternatíva csoport-rendezése
1243.
Gyakorlatok
39.5-1.
Tekintsük a következ® táblázatot:
Döntéshozó súlya 0.4 0.3 0.3
39.6. Axiomatikus módszerek
Döntéshozó 1 2 3
Célfüggvény 1 2 1 2 1 2 3
1773
Alternatívák 1 2 3 0.6 0.8 0.7 0.9 0.7 0.6 0.5 0.3 0.4 0.6 0.8 0.7 0.4 0.5 0.6 0.7 0.6 0.6 0.5 0.8 0.6
Célfüggvény súlya 0.6 0.4 0.5 0.5 0.4 0.4 0.2
Döntéshozó súlya 0.5 0.25 0.25
39.17. ábra.
Tegyük fel, hogy a célfüggvények már normalizáltak. Alkalmazzuk az (A) módszert a gyakorlat megoldására. 39.5-2. Az el®z® gyakorlat esetére alkalmazzuk a (B) módszert, ahol az egyes döntéshozók hasznossági függvényeit a súlyozásos módszerrel kapjuk meg, és a csoportos döntéshozatalt pedig a Borda-mérték adja meg. 39.5-3. A 39.5-2. gyakorlatban alkalmazzuk a páronkénti összehasonlítás módszerét a Borda-mérték helyett.
39.6. Axiomatikus módszerek Az egyszer¶ség érdekében tegyük fel, hogy I = 2, azaz két döntéshozó közötti koniktust kívánunk feloldani. Feltesszük, hogy a H következménytér konvex, korlátos, és zárt R2 -ben, és adott egy olyan f∗ = (f1∗ , f2∗ ) pont, amely a döntéshozók célfüggvényértékeit adja meg abban az estben, ha nem tudnak megállapodni. Feltesszük, hogy létezik olyan f ∈ H , amelyre f > f∗ . A (H, f∗ ) pár matematikailag jellemzi a koniktust. A megoldás nyilvánvalóan mind H -tól és mind f∗ -tól kell függjön, így ezeknek valamilyen függvénye: φ(H, f∗ ). A különféle megoldási koncepciók esetén megköveteljük, hogy a megoldásfüggvény eleget tegyen bizonyos követelményeknek, amelyeket axiómaként kezelünk. Ezek az axiómák a megoldás korrektségét követelik meg, különböz® axiómák más-más módon jellemzik ezt a korrektséget. A klasszikus Nash-féle megoldás esetén a következ®ket tesszük fel: (i) φ(H, f∗ ) ∈ H (lehetségesség) (ii) φ(H, f∗ ) ≥ f∗ (racionalitás) (iii) φ(H, f∗ ) Pareto-megoldás H -ban (Pareto-optimalitás)
39. Koniktushelyzetek kezelése
1774
(iv) Ha H1 ⊆ H és φ(H, f∗ ) ∈ H1 , akkor szükségképpen φ(H1 , f∗ ) = φ(H, f∗ ) (kedvez®tlen alternatíváktól való függetlenség) (v) Legyen T : R2 7→ R2 olyan lineáris transzformáció, amelyre T (f1 , f2 ) = (α1 f1 + β1 , α2 f2 + β2 ) pozitív α1 és α2 esetén. Ekkor φ(T (H), T (f∗ )) = T (φ(H, f∗ )) (növekv® lineáris transzformációtól való függetlenség) (vi) Ha H és f∗ szimmetrikusak, azaz f1∗ = f2∗ és (f1 , f2 ) ∈ H ⇐⇒ (f2 , f1 ) ∈ H , akkor φ(H, f∗ ) komponensei is azonosak legyenek (szimmetria). Az (i) feltétel a megoldás lehetségességét követeli meg. A (ii) feltétel azt írja el®, hogy egy racionális döntéshozó sem egyezik bele olyan megoldásba amely rosszabb, mint amit megegyezés nélkül amúgy is elérne. A (iii) feltétel alapján nincs jobb, mint a megegyezéssel elért megoldás. A (iv) követelmény szerint ha a megegyezés után bizonyos alternatívák elvesztik lehetségességüket, de a megoldás lehetséges marad, akkor a lesz¶kített következménytér mellett is ugyanaz a megoldás marad. Ha bármely célfüggvény dimenzióját megváltoztatjuk, a megoldás nem változhat. Ezt a követelményt fogalmazza meg (v), és az utolsó feltétel azt jelenti, hogy ha két döntéshozó teljesen azonos helyzetben van a koniktus megfogalmazásában, akkor a megoldás esetén is azonosan kell kezeljük ®ket. A következ®, Nash-tól származó eredmény alapvet® fontosságú.
39.6. tétel.
Az (i)-(vi) feltételeket pontosan egy megoldás függvény elégíti ki, és φ(H, f∗ ) az (f1 − f1∗ )(f2 − f2∗ ) −→ max f1 ≥ f1∗ f2 ≥ f2∗
((f1 , f2 ) ∈ H) (39.44)
optimumfeladat egyértelm¶ megoldásaként kapható meg. 39.19.
példa.
Tekintsük
ismét
következményteret és tegyük fel, hogy
a
??.
ábrán
korábban
(f1∗ , f2∗ ) = (0, −1),
bemutatott
azaz a legrosszabb
értékeket tartalmazza komponenseiben. Ekkor a (39.44) feladat a következ® alakú:
f1 (f2 + 1)
−→
max
f2
≤
f1
f2
≤
f2
≥
3 − 2f1 1 − f1 . 2
Könnyen látható, hogy az optimális megoldás
f1 = f2 = 1.
39.6. Axiomatikus módszerek
1775
Vegyük észre, hogy a (39.44) probléma egy távolságfügg® módszer, amikor a geometriai távolságot maximalizáljuk az (f1∗ , f2∗ ) ponttól. Az algoritmus a (39.44) optimumfeladat megoldását jelenti. A (vi) feltétel megköveteli, hogy a két döntéshozó azonosan legyen kezelve. Számos gyakorlati esetben azonban ez nem valós követelmény, ha valamelyik döntéshozó er®sebb helyzetben van, mint a másik.
39.7. tétel.
Az (i)-(v) követelményeknek végtelen sok megoldás függvény tesz eleget, de valamennyi megoldás függvényben található olyan 0 ≤ α ≤ 1, hogy a megoldás az (f1 − f1∗ )α (f2 − f2∗ )1−α −→ max f1 ≥ f1∗ f2 ≥ f2∗
((f1 , f2 ) ∈ H) (39.45)
optimumfeladat egyértelm¶ megoldásaként kapható meg. Vegyük észre, hogy az α = 12 esetben a (39.45) probléma a (39.44) feladatra redukálódik. Az algoritmus a (39.45) optimumfeladat megoldását jelenti. Számos szerz® kritizálta Nash eredeti axiómáit, és az axiómarendszer bizonyos módosításai mellett újabb és újabb megoldási koncepciókat és módszereket vezettek be. A konkrét axiómák ismertetése nélkül magukat a módszereket ismertetjük az irodalomban legfontosabbnak tartott esetekben. A KalaiSmorodinsky-megoldás esetén el®ször az ideális pontot határozzuk meg, amely koordinátái:
fi∗ = max{fi |(f1 , f2 ) ∈ H, (f1 , f2 ) ≥ f∗ } , majd az f∗ -ból az ideális pontba vezet® félegyenes H -val való utolsó közös pontját fogadjuk el, mint a megoldást. A 39.18. ábra mutatja a módszert. Vegyük észre, hogy a módszer egy irányfügg® módszer, ahol a félegyenes mutatja a növekedési irányt és f∗ a választott kiindulópont. Az algoritmus a következ® optimumfeladat megoldását igényli:
t −→ max feltéve, hogy
39.20.
f∗ + t(f ∗ − f∗ ) ∈ H .
példa. Az el®z® példa esetén
(1, 1)
és
f ∗ = (2, 1). A 39.19. ábrán utolsó H -beli pontja a félegyenes
f∗ = (0, −1)
és
f∗ -ból f -ba vezet® félegyenes (2, −1) pontokat összeköt® szakasz metszéspontja.
láthatjuk, hogy az és az
∗
39. Koniktushelyzetek kezelése
1776
39.18. ábra.
KalaiSmorodinsky-megoldás.
39.19. ábra.
A 39.20 példa megoldása.
A félegyenes egyenlete
f2 = f1 − 1 míg az összeköt® szakasz egyenlete
f2 = −2f1 + 3 , így a metszéspont:
f1 = 43 , f2 =
1 3.
Az egyenl® veszteség módszerénél feltesszük, hogy az ideális pontból kiindulva a két döntéshozó azonos sebességgel csökkenti a célfüggvényértékeit egészen addig, míg lehetséges megoldás nem adódik. Ez a koncepció ekvivalens a t −→ min ((f1∗ − t, f2∗ − t) ∈ H) (39.46) optimumfeladat megoldásával. Jelölje t∗ a minimális t értéket, ekkor az (f1∗ − t∗ , f2∗ − t∗ ) pont jelenti a koniktus megoldását. Az algoritmust a (39.46) optimumfeladat megoldása jelenti. 39.21.
◦
45
példa. Az el®z® példa esetében
f ∗ = (2, 1),
így ebb®l a pontból kiindulva a
-os egyenes mentén haladva az els® lehetséges megoldás ismét az
f1 = 43 , f2 =
1 3
pont.
A monoton terület módszere esetében az (f1 , f2 ) megoldást a következ®képpen kapjuk. Az (f1∗ , f2∗ ) és (f1 , f2 ) pontokat összeköt® lineáris
39. Megjegyzések a fejezethez
1777
39.20. ábra.
A monoton terület módszere.
szakasz a H halmazt két részre bontja, ha (f1 , f2 ) egy Pareto-optimális megoldás. Ennek a koncepciónak az alkalmazása esetén megköveteljük, hogy a két terület azonos legyen. A 39.20. ábra mutatja a koncepciót. A két terület a következ®képpen adódik: Z f1 1 (g(t) − f2∗ )dt − (f1 − f1∗ )(g(f1 ) − f2∗ ) 2 f1∗ és
1 (f1 − f1∗ )(g(f1 ) − f2∗ ) + 2
Z
f1∗
(g(t) − f2∗ )dt
f1
ahol feltesszük, hogy f2 = g(f1 ) írja le a Pareto-optimális megoldások görbéjét. Ily módon egy egyszer¶ egyenletet kapunk az ismeretlen f1 érték meghatározására. Az algoritmust a következ® nemlineáris, egyváltozós egyenlet megoldása jelenti: Z f1 Z f1∗ (g(t) − f2∗ )dt − (g(t) − f2∗ )dt − (f1 − f1∗ )(g(f1 ) − f2∗ ) = 0 . f1∗
f1
Bármely közismert módszer (intervallum-felezés, húrmódszer, szel®módszer, Newton módszer stb.) alkalmazható a feladat megoldására.
Gyakorlatok
39.6-1.
Tegyük fel, hogy H = {(f1 , f2 )|f1 , f2 ≥ 0, f1 + 2f2 ≤ 4}. Legyen f1∗ = f2∗ = 0. Alkalmazzuk a (39.44) optimumfeladatot. 39.6-2. Az el®z® gyakorlatban tegyük fel, hogy a két döntéshozó nem azonosan fontos. α = 13 , 1 − α = 32 . Oldjuk meg a (39.45) optimumfeladatot. 39.6-3. Alkalmazzuk a KalaiSmorodinsky-megoldást a 39.6-1. gyakorlatra.
39.6-4.
Alkalmazzuk az egyenl® veszteség módszerét a 39.6-1. gyakorlatra.
39.6-5.
Alkalmazzuk a monoton terület módszerét a 39.6-1. gyakorlatra.
Feladatok
39. Koniktushelyzetek kezelése
1778
39-1 Távolságfügg® módszerek
Bizonyítsuk be, hogy a távolságfügg® módszerek a %1 távolsággal mindig Pareto-optimális megoldást szolgáltatnak. Igaz ugyanez, ha a %∞ távolságot alkalmazzuk?
39-2 irányfügg® módszerek
Mutassuk meg egy egyszer¶ példával, hogy irányfügg® módszerek olyan eredményt is adhatnak, melyek nem Pareto-optimálisak.
39-3 Több egyensúly
A 39.4. tétel feltételein kívül tegyük még fel, hogy az összes fi függvény szigorúan konkáv xi -ben. Adjunk meg olyan példát, amelyben több egyensúlypont is létezik.
39-4 Shapley-egyensúly
Bizonyítsuk be, hogy a Shapley-értékek imputációt adnak és kielégítik a (39.35)(39.36) feltételeket.
39-5 Csoportos döntéshozatali táblázat
Adjunk meg olyan csoportos döntéshozatali táblázatot, ahol a páronkénti összehasonlítás módszere nem elégíti ki a tranzitivitás követelményét. Azaz van olyan i, j, k alternatíva, amelyekre i j , j k , de k i.
39-6 Borda-mérték alkalmazása
Konstruáljunk olyan feladatot, ahol a Borda-mérték alkalmazása azonosan jónak min®síti az összes alternatívát.
39-7 KalaiSmorodinsky-megoldá
Mutassuk meg, hogyha a KalaiSmorodinsky-megoldást alkalmazzuk nem konvex H esetére, akkor a megoldás nem feltétlenül Pareto-optimális.
39-8 Egyenl® veszteség módszer
Mutassuk meg, hogy nem konvex H esetén sem az egyenl® veszteség, sem a monoton terület módszere nem garantál Pareto-optimális megoldást.
39-9 Pareto-optimalitás
Bizonyítsuk be, hogy a (39.9) feladat megoldása pozitív α1 , α2 , . . . , αI értékek mellett mindig Pareto-optimális megoldást ad.
Megjegyzések a fejezethez A többcélú programozás iránt érdekl®d® Olvasó további részleteket és módszereket találhat a témával kapcsolatban a [108] könyvben. Az egyensúlypontok módszerér®l valamint a kooperatív játékok megoldási koncepcióiról és módszereir®l b®vebben a [44] monográában olvashatnak. A [115] monográa további módszereket és képleteket tartalmaz a csoportos döntéshozás
39. fejezet megjegyzései
1779
módszertanából. A Nasht®l származó 39.6. tétel részletesebben [83]-ben található meg. A tételben szerepl® feltételek gyengítésével kapcsolatban [51]-ben olvashatnak. A KalaiSmorodinsky-megoldás, az egyenl® veszteség-, valamint a monoton terület módszere részletesen rendre [60]-ben, [24]-ben és [2]-ben található meg. Megjegyezzük végül, hogy a [116] összefoglaló dolgozat tárgyalja ezeknek és újabb módszereknek az axiomatikus bevezetését és tulajdonságait. A fejezetben szerepl® eredmények részletesebben megtalálhatók Molnár Sándor és Szidarovszky Ferenc [82] jegyzetében, valamint Szidarovszky és Domoszlai angol nyelv¶ fejezetében [109].
40. A Szemantikus Web lekérdez® nyelvei
A Szemantikus Web lényege, hogy az Interneten fellelhet® információkat a számítógépek is értelmezni tudják, ezáltal a Weben szétszórva tárolt adatok könnyebben összekapcsolhatóvá, hatékonyabban kereshet®vé válnak. Az összekapcsolt adatokból következtetések útján új információk nyerhet®k ki. A Szemantikus Web ehhez nyújt egy szabványosított adatmodellt és hozzá tartozó lekérdez®nyelvet. Az RDF (Resource Description Framework) adatmodell lényege, hogy a rendelkezésünkre álló információt alany-állítmány-tárgy formában megfogalmazott állítások halmazaként adjuk meg. Az ilyen állítások felfoghatók irányított élekként is, amelyek az alannyal címkézett csúcsból vezetnek a tárggyal címkézett csúcsba, az állítmánynak megfelel® élcímkével. Az RDF adatok lekérdezésére szolgáló SPARQL lekérdez®nyelv ezért az adatokban való keresést gráfminta-illesztési feladatra vezeti vissza. Ahhoz, hogy a gépi feldolgozás kivitelezhet®vé váljon, szükséges, hogy az azonos fogalmak ugyanazt jelentsék, ugyanaz az azonosító tartozzon hozzájuk a különböz® adatbázisokban. Erre a problémára adnak megoldást a szókészletek és az ontológiák. A szókészletek tartalmazzák a fogalmakat azonosító IRI-k (Internationalized Resource Identier) megfeleltetését a valós világ fogalmaival, míg az ontológiák a szókészleteket, valamint a deniált fogalmak közötti kapcsolatokat, szabályokat, megszorításokat. Számos elméleti és kísérleti eredményeket tartalmazó adatbázis érhet® el az Interneten különböz® tudományterületekr®l, például számítástudomány, biológia, kémia. A LOD (Linked Open Data) felh® az ilyen publikus adathalmazokat kapcsolja össze egy nagy összefügg® gy¶jteménnyé. A LOD felh® olyan szemantikus formátumú (RDF-ként tárolt) adathalmazokat tartalmaz, melyek legalább ezer sorból állnak, és legalább ötven ponton kapcsolódnak más LOD felh®beli adathalmazhoz. Ezek a megkötések lehet®vé teszik az információkinyerést a különböz® tudományterületeken felhalmozódott tudásbázisokból.
40.1. Szemantikus adatok 40.1.1. RDF reprezentáció Tekintsünk három diszjunkt halmazt, a B -t (üres csúcsok, melyekhez nem tartozik IRI), az L-et (literálok), és az I -t (IRI-k), illetve a BLI , BI és
40.1. Szemantikus adatok
1781
LI rövidítést, amelyet a B , L és az I uniójának jelölésére használunk. A BLI rövidítést más néven RDF termnek is nevezzük. A megszokott konvenció szerint idéz®jeleket használunk a literálok jelölésére (például: János, 25) és az _: prexet az üres csúcsokhoz. Egy (v1 , v2 , v3 ) ∈ BI × I × BLI RDF hármas összekapcsolja a v1 alanyt a v2 tárggyal a v3 állítmányon keresztül. Egy RDF adatbázis (más néven RDF dokumentum) ilyen hármasok véges halmaza.
40.1.2. SPARQL lekérdez® nyelv
Szintaxis
Legyen V a BLI -beli különböz® változók halmaza. A változókat egy vezet® kérd®jellel különböztetjük meg, például ?X vagy ?nev . Els®ként a sz¶r®feltételek absztrakt szintaxisát adjuk meg.
40.1. deníció.
Legyen ?X, ?Y ∈ V és c, d ∈ LI , ekkor a sz¶r®feltételeket rekurzívan a következ®képp deniáljuk. A ?X = c, ?X =?Y , c = d, bound(?X), isIRI(?X), isLiteral(?X), valamint isBlank(?X) atomi sz¶r®feltételek. Ezt követ®en, ha R1 , R2 sz¶r®feltételek, akkor ¬R1 , R1 ∧ R2 és R1 ∨ R2 is sz¶r®feltételek. A vars(R) jelöli az R sz¶r®kifejezésben el®forduló változók halmazát. A következ®ekben bemutatjuk a kifejezések egy absztrakt szintaxisát.
40.2. deníció. rekurzív módon:
Egy SPARQL kifejezés a következ®ek szerint épül fel
1. a t ∈ IV × IV × LIV hármas egy kifejezés, 2. ha Q1 , Q2 kifejezések, és R egy sz¶r®feltétel, akkor Q1 Filter R, Q1 Union Q2 , Q1 Opt Q2 , valamint Q1 And Q2 is kifejezés. A hivatalos W3C ajánlás négy különböz® lekérdezéstípust ad meg, ezek a Select, Ask, Construct és a Describe lekérdezések. A továbbiakban csak a Select és Ask lekérdezésekkel foglalkozunk. A Select lekérdezések megadják a lekérdezés feltételének megfelel® változóhelyettesítések halmazát, míg az Ask lekérdezések logikai lekérdezések, amelyek akkor és csak akkor térnek vissza igaz értékkel, ha létezik egy vagy több eredmény, egyébként hamis eredményt adnak vissza. A jelölések egyszer¶sítése érdekében eltekintünk a kapcsos zárójelek alkalmazásától a Select operátorban megjelen® változók halmazánál, például Select?X,?Y (Q)-t írunk Select{?X,?Y } (Q) helyett.
1782
40.3. deníció.
40. A Szemantikus Web lekérdez® nyelvei
Legyen Q egy SPARQL kifejezés, és legyen S ⊂ V változók véges halmaza. Egy SPARQL lekérdezés egy SelectS (Q) formájú kifejezés. Egy SPARQL lekérdezés egy Ask(Q) formájú kifejezés.
Select Ask
Szemantika
Kétféle alternatív szemantikát vezetünk be a SPARQL kiértékeléshez, a halmaz és a multihalmaz szemantikát. A halmaz alapú szemantikát a szakirodalom cikkeiben található elméleti vizsgálatokban használják, míg a multihalmaz szemantika a hivatalos W3C ajánlásokat követi. A halmaz alapú SPARQL szemantika. A SPARQL kiértékelési folyamat középpontjában az úgynevezett leképezés áll, amely kifejezi a változók dokumentumra való leképezését a kiértékelés során. Formálisan egy µ : V → BLI leképezés egy parciális függvény, amely a V -beli változók részhalmazáról képez az RDF termekre. M-el jelöljük az összes leképezés univerzumát. A µ leképezés értelmezési tartománya a dom(µ), amely a V -nek egy olyan részhalmaza, amelyen µ értelmezett. Két leképezés, µ1 , µ2 kompatibilisek, jelölés szerint µ1 ∼ µ2 , ha megegyeznek az összes közös változón, azaz µ1 (?X) = µ2 (?X) minden ?X ∈ dom(µ1 ) ∩ dom(µ2 ). Felüldeniáljuk a vars függvényt (amelyet korábban a sz¶r®feltételeknél vezettünk be), és jelöljük ezután vars(t)-vel (ahol t egy RDF hármas) az összes, t hármasban szerepl® változót. Továbbá, jelölje µ(t) az összes olyan hármast, amelyet úgy kapunk, hogy az összes t-beli ?X ∈ dom(µ) ∩ vars(t) változót lecseréljük µ(?X)-re. példa. Tekintsünk három leképezést, µ1 := {?X 7→ a}, µ2 := {?X 7→ b, ?Y 7→ c} és µ3 := {?X 7→ a, ?Z 7→ d}. Könny¶ látni, hogy dom(µ1 ) = {?X}, dom(µ2 ) = {?X, ?Y } és dom(µ3 ) = {?X, ?Z}. Továbbá meggyelhet®, hogy µ1 ∼ µ3 , de µ1 és µ2 , illetve µ2 és µ3 nem kompatibilisek, azaz µ1 µ2 és µ2 µ3 . Legyen t1 := (e, ?X, ?Y ), ekkor var(t1 ) = {?X, ?Y }, és µ2 (t1 ) = (e, b, c). 40.1.
A következ®ekben deniáljuk a sz¶r®feltételek szemantikáját.
40.4. deníció.
Adott µ leképezés, R, R1 , R2 sz¶r®feltételek, ?X, ?Y változók, illetve c, d ∈ LI esetén µ kielégíti R-t, jelölés szerint µ |= R akkor és csak akkor, ha a következ® feltételek valamelyike teljesül R-re: • bound(?X) formában van, és ?X ∈ dom(µ). •
c = d formában van, és c megegyezik d-vel.
•
?X = c formában van, ?X ∈ dom(µ) és µ(?X) = c.
•
?X =?Y formában van, {?X, ?Y } ⊆ dom(µ) és µ(?X) = µ(?Y ) fennáll.
•
¬R1 formában van, és nem igaz, hogy µ |= R1 .
•
R1 ∨ R2 formában van, és µ |= R1 vagy µ |= R2 .
40.1. Szemantikus adatok
1783
•
R1 ∧ R2 formában van, µ |= R1 és µ |= R2 .
•
isIRI(?X), isLiteral(?X) vagy isBlank(?X) formában van, és az ?X típusa ennek megfelel®en IRI, literál vagy üres csúcs.
Egy SPARQL kifejezés vagy lekérdezés D dokumentum feletti megoldása leképezések halmazával írható le, ahol minden egyes leképezés egy lehetséges választ reprezentál. A SPARQL lekérdezés szemantikájának deniálásához a leképezéshalmazok kompakt algebráját hívjuk segítségül.
40.5. deníció. Legyenek Ω, Ωl , Ωr leképezéshalmazok, R jelölje a sz¶r®feltételt és S ⊂ V legyen a változók véges halmaza. Deniáljuk az összekapcsolás (./), unió (∪), különbség (\), baloldali küls® összekapcsolás ( ./), projekció (π ) és szelekció (σ ) algebrai operátorokat a következ®képp: • Ωl ./ Ωr := {µl ∪ µr | µl ∈ Ωl , µr ∈ Ωr : µl ∼ µr } •
Ωl ∪ Ωr := {µ | µ ∈ Ωl vagy µ ∈ Ωr }
•
Ωl \ Ωr := {µl ∈ Ωl | ∀µr ∈ Ωr : µl µr }
•
Ωl ./ Ωr := (Ωl ./ Ωr ) ∪ (Ωl \ Ωr )
•
πS (Ω) := {µ1 | ∃µ2 : µ1 ∪ µ2 ∈ Ω ∧ dom(µ1 ) ⊆ S ∧ dom(µ2 ) ∩ S = ∅}
•
σR (Ω) := {µ ∈ Ω | µ |= R}
A továbbiakban ezekre az algebrai operátorokra mint SPARQL halmazalgebrára hivatkozunk. A SPARQL Select és Ask lekérdezések kiértékelésére egy szemantikát vezetünk be, és deniáljuk a [[.]]D függvényt, amely átfordítja azt halmazalgebrává.
40.6. deníció. (SPARQL halmazszemantika). Legyen D egy RDF dokumentum, t egy hármas, Q, Q1 , Q2 SPARQL kifejezések, R egy sz¶r®feltétel és S ⊂ V a változók halmaza. Ekkor: • [[t]]D := {µ | dom(µ) = vars(t) and µ(t) ∈ D} •
[[Q1 And Q2 ]]D := [[Q1 ]]D ./ [[Q2 ]]D
•
[[Q1 Opt Q2 ]]D := [[Q1 ]]D ./ [[Q2 ]]D
•
[[Q1 Union Q2 ]]D := [[Q1 ]]D ∪ [[Q2 ]]D
•
[[Q Filter R]]D := σR ([[Q]]D )
•
[[SelectS (Q)]]D := πS ([[Q]]D )
•
[[Ask(Q)]]D := ¬(∅ = [[Q]]D )
40. A Szemantikus Web lekérdez® nyelvei
1784 40.2.
példa.
Tekintsük a következ® SPARQL
Select lekérdezést:
Q1 := Select?SZ,?E (((?SZ, kor, ?K) Opt (?SZ, email, ?E)) Filter (?K =00 2600 )) A lekérdezés kigy¶jti az összes 26 éves személyt (?SZ ), és opcionálisan (amennyiben létezik) a hozzájuk tartozó e-mail címeket (?E ). Tegyük fel továbbá, hogy az adatbázisunk a következ®:
D := {(SZ1, kor,00 2600 ), (SZ2, kor,00 2500 ), (SZ3, kor,00 2600 ), (SZ3, email,00 [email protected] )}. Könny¶ belátni, hogy [[Q1 ]]D = {{?SZ 7→ SZ1}, {?SZ [email protected] }}.
7→ SZ3, ?E 7→00
Halmazszemantikáról a multihalmaz szemantikára. A továbbiakban áttekintjük a kapcsolódó multihalmaz szemantikát, amit úgy kapunk, hogy a leképezések halmaza helyett a leképezések multihalmazát vesszük. A multihalmaz szemantika így abban különbözik, hogy egy leképezés többször is el®fordulhat a kiértékelés során. Formálisan, a multihalmaz szemantikát leképezések multihalmazával reprezentáljuk, amely mindegyik leképezéshez multiplicitást rendel. 40.7. deníció. Egy multihalmaz egy (Ω, m) páros, ahol az Ω egy leképezéshalmaz és m : M → N0 egy totális függvény, m(µ+ ) ≥ 1 minden µ+ ∈ Ω-ra és m(µ− ) = 0 minden µ− ∈ / Ω esetén. Legyen adott µ+ ∈ Ω, + + ekkor az m(µ ) a µ multiplicitása Ω-ban, valamint azt mondjuk, hogy µ+ m(µ+ )-szor fordul el® Ω-ban. A multihalmaz szemantikát könnyen formalizálhatjuk a 40.5. denícióban leírt algebrai operátorok adaptálásával úgy, hogy multihalmazokkal dolgozunk, és gyelembe vesszük a halmaz elemeinek multiplicitását. Tekintsük példaként a következ® unió operátort multihalmazok felett: (Ωl , ml ) ∪ (Ωr , mr ), melynek eredménye (Ωl ∪Ωr , m), ahol m(µ) = ml (µ)+mr (µ) minden µ ∈ Mre. Ezt az algebrát SPARQL multihalmaz-algebrának nevezzük. A multihalmaz szemantika pontos deníciója közvetlenül megkapható a 40.6. deníció els® szabályának (t hármas esete) módosításával úgy, hogy multihalmazzal tér vissza halmaz helyett. A [[.]]+ D függvényt használjuk azon leképezések multihalmazának jelölésére, amelyek során a SPARQL kifejezést vagy lekérdezést multihalmaz szemantikával értékeltük ki. példa. Legyen Q := (?X, c, c) Union (c, c, ?X), a dokumentum pedig D := {(c, c, c)}, valamint µ := {?X 7→ c}. Ekkor [[Q]]+ D = ({µ}, m), ahol m(µ) := 2, és m(µ0 ) := 0 minden µ0 ∈ M \ {µ} esetén.
40.3.
40.2. A SPARQL lekérdez®nyelv bonyolultsági kérdései
1785
40.2. A SPARQL lekérdez®nyelv bonyolultsági kérdései A következ® alfejezetben a SPARQL különböz® résznyelveihez tartozó kiértékelési problémák bonyolultságával foglalkozunk. Kiderül, hogy a kérdés gyakorlati szempontból hamar kezelhetetlenné, NP-teljessé válik. Az opcionalitást lehet®vé tev® Opt m¶velet bevezetése ráadásul tovább növeli a komplexitást általában PSPACE-teljessé téve a problémát. Az opcionalitás megjelenésének tehát megvan a maga ára, ráadásul a bevezetés mögött meghúzódó intuitív elképzelés sem minden esetben teljesül maradéktalanul. Azt várnánk ugyanis, hogy opcionális részkérdések alkalmazásával úgy szerezhetünk plusz információkat, hogy azokat az adatokat nem kell kihagynunk a megoldásból, ahol ez a többlet nem áll rendelkezésre. Az alfejezet második felében két szintaktikai megszorítás kerül bevezetésre, amelyek egyrészt polinom id®ben ellen®rizhet®ek a lekérdezés méretében, másrészt biztosítják a fenti intuíció teljesülését. Az ily módon kapott ún. jól tervezett lekérdezések kiértékelési bonyolultsága szintén érdekes probléma, ráadásul az SQL lekérdezések optimalizációjánál alkalmazható egyszer¶ átírási technikák megfelel®i m¶ködnek ebben a környezetben is, míg általános esetben ezek nem bizonyulnak használhatónak. Amikor a kiértékelési kérdés bonyolultságáról beszélünk, formálisan a következ® problémát szeretnénk megoldani: INPUT: D RDF gráf, P SPARQL lekérdezés és µ leképezés OUTPUT: µ ∈ [[P ]]D Azaz, adott D RDF gráf, P SPARQL lekérdezés és µ leképezés esetén arra vagyunk kíváncsiak, hogy a µ leképezés eleme-e a D fölött végrehajtott P lekérdezés eredményhalmazának. Vegyük észre, hogy itt maga a lekérdezés is eleme a bemenetnek, a probléma ezen változatára a lekérdez®nyelv összetett kiértékelési bonyolultságaként szoktak hivatkozni, szemben a kiértékelés adatbonyolultságával , ahol a lekérdezés nem része a bemenetnek. Mindazonáltal a fejezetben egy adatbonyolultságra vonatkozó eredménnyel is találkozunk majd.
40.2.1.
And és Filter m¶veletek
Amikor az iménti kiértékelési bonyolultságra vonatkozó feladatban a P lekérdezés csupán And és Filter m¶veleteket tartalmaz, a probléma relatíve egyszer¶. El®ször meg kell nézni, hogy a P -ben szerepl® t hármasokra teljesüle, hogy ha a t-beli változók helyére behelyettesítjük azok µ által adott értékeit, akkor a D-ben szerepl® RDF hármast kapunk-e. Ha valamelyik hármasra ez
40. A Szemantikus Web lekérdez® nyelvei
1786
a feltétel nem áll fenn, akkor µ egész biztosan nincs benne a P lekérdezés D fölött vett eredményhalmazában. Ellenkez® esetben P kifejezésfáján alulról felfelé haladva meg kell néznünk, hogy a változók µ szerint vett helyettesítései mellett a Filter sz¶rések feltételei teljesülnek-e. Ha igen, µ eleme az el®bbi eredményhalmaznak, különben pedig nem. A következ® tétel bizonyítható a fenti gondolatmenet formális leírásával, ami az elmondottak alapján már semmiféle nehézséget nem rejt magában:
40.8. tétel. A csak And és Filter m¶veleteket tartalmazó SPARQL lekérdezések összetett kiértékelési bonyolultsága O(|P ||D|), ahol a korábbi jelölések alkalmazásával P a SPARQL lekérdezést, D pedig azt az RDF adathalmazt jelöli, amely fölött P -t kiértékeljük. 40.2.2.
And, Filter és Union m¶veletek
Hasonlóan az ítéletlogika kielégíthet®ségi problémájához, ahol a diszjunkció megjelenésének köszönhet®en a feladat NP-teljessé válik, az Union m¶velet a SPARQL esetén is NP-teljessé teszi az összetett kiértékelési kérdést.
40.9. tétel.
Ha a SPARQL lekérdezésekben csak az And és Union m¶veleteket engedjük meg, akkor az összetett kiértékelés probléma NP-teljessé válik.
Bizonyítás.
Csak az NP-nehézséget bizonyítjuk. A kérdésünket a halmazlefedési feladatra vezetjük vissza, amely közismerten NP-teljes. Itt adott
U = {u1 , . . . , un } alaphalmaz, S1 , . . . , Sk U feletti részhalmazok és l pozitív egész esetén arra vagyunk kíváncsiak, ki lehet-e választani legfeljebb l darabot S1 , . . . , Sk halmazok közül úgy, hogy ezek uniója U -val legyen azonos. A visszavezetéshez a D = {(c, c, c)} egyetlen RDF hármasból álló gráfot használjuk. Az Si = {u1 , . . . , um } halmazt a
PSi := (c, c, ?U1 ) And . . . And ((c, c, ?Um )) lekérdezés reprezentálja. PSi D fölött nyilvánvalóan azt a leképezést eredményezi, amelyik mindegyik ?Uj változóhoz a c-t rendeli (1 ≤ j ≤ m). Az Si részhalmazok S halmazát, S = {S1 , . . . , Sk }, a
Ps := PS1 Union . . . Union PSk lekérdezés szimulálja. Ennek D fölött vett eredményébe értelemszer¶en azok a leképezések tartoznak, amelyek valamelyik PSi D feletti eredményhalmazába
40.2. A SPARQL lekérdez®nyelv bonyolultsági kérdései
1787
beletartoznak. Mindennek ismeretében, ha megvizsgáljuk a
P = PS And . . . And PS lekérdezést, ahol PS pontosan l alkalommal jelenik meg, akkor könnyen látható, hogy fenti halmazlefedési feladat akkor és csak akkor ad igaz eredményt, ha a µ := {?U1 → c, . . . , ?Un → c, } leképezés eleme a P D fölött vett kiértékelésének. Annak bizonyítását, hogy a kizárólag And és Union m¶veleteket tartalmazó SPARQL lekérdezések esetén az összetett kiértékelési bonyolultság NPben van, feladatként adjuk fel, hasonlóan az alábbi állítások bizonyításához.
40.10. tétel.
(i) A kizárólag Union és Filter m¶veleteket tartalmazó SPARQL lekérdezések esetén az összetett kiértékelési probléma polinom id®ben megoldható. (ii) Emellett az And, Union és Filter m¶veletek estén az iménti probléma NP-teljes marad, azaz a Filter m¶velet bevezetése nem növeli már a bonyolultságot.
Bizonyítás. Megtalálható a [97] cikkben. 40.2.3. Az
Opt m¶velet
Intuitíve, adott D RDF adathalmaz P := (P1 Opt P2 ) lekérdezés esetén egy µ leképezés akkor és csak akkor tartozik a P D fölött vett eredményhalmazába, (i) ha µ a P1 And P2 D fölött vett eredményhalmazának eleme, jelöléssel µ ∈ [[P1 And P2 ]]D , vagy (ii) ha µ eleme a P1 D fölötti eredményhalmazának, µ ∈ [[P1 ]]D , ugyanakkor nem kompatibilis egyetlen olyan µ0 leképezéssel sem, amely P2 D fölött vett eredményhalmazához tartozik, µ0 ∈ [[P2 ]]D . A témakörben járatosak azonnal érzékelhetik, hogy a deníció a kvantorok alternálásának lehet®ségét rejti magában, hiszen az (i) feltétel tulajdonképpen egy egzisztenciális kvantort tartalmaz, míg a (ii) feltétel egy univerzálisat. A változók alternálásának lehet®sége pedig azért érdekes, mert a ∃x1 ∀x2 . . . Qn xn φ zárt formula igazságértékének eldöntése PSPACE-teljes feladat, ahol φ olyan ítéletlogikai formula, melyben csak az x1 , . . . xn logikai változók fordulnak el®, emellett Qn az egzisztenciális kvantort jelöli, ha n páratlan, és az univerzális kvantort különben. Így az a sejtésünk támadhat, hogy az Opt m¶velet bevezetése tovább növeli a kiértékelési feladat bonyolultságát és PSPACE nehézzé teszi. A [97] cikkben bebizonyították a feltételezés helyességét, pontosabban a következ® lemmát:
40.11. lemma.
Azon SPARQL lekérdezések esetében, melyek kizárólag az
Opt m¶veletet tartalmazzák, az összetett kiértékelési feladat bonyolultsága
PSPACE-nehéz.
1788
Eval(µ: lekérdezés, P case:
40. A Szemantikus Web lekérdez® nyelvei SPARQL lekérdezés, D RDF gráf)
P a t hármas: if a µ értelmezési tartománya a t-beli változók halmaza és µ(t) D-nek eleme then return true return f alse P P1 Filter R alakú: if Eval(µ, P1 , D)= true és µ eleget tesz R feltételeinek then return true return f alse P P1 Union R alakú: if Eval(µ, P1 , D)= true vagy Eval(µ, P2 , D)= true then return true return f alse P P1 And R alakú: for each µ1 , µ2 leképezésre, ahol µi Pi változóihoz D értékeit rendeli hozzá (i = 1, 2) if Eval(µ1 , P1 , D)= true és Eval(µ2 , P2 , D)= true és µ = µ1 ∪ µ2 then return true return f alse P P1 Opt R alakú: if Eval(µ, P1 And P2 , D)= true then return true if Eval(µ, P1 D)= true then for each µ0 leképezésre, amely P2 változóihoz D elemeit rendeli if Eval(µ0 , P2 D)= true és µ kompatibilis µ0 -vel then return f alse return true return f alse
40.1. ábra. Az And, Union, Opt és Filter m¶veleteket tartalmazó SPARQL lekérdezéseket kiértékel® algoritmus.
A másik oldalról viszont a PSPACE-beliség, azaz annak megmutatása, hogy az el®z® lemmában szerepl® lekérdezések kiértékelése polinom tárat használó Turing-géppel megoldható, már-már triviális. S®t, ennél er®sebb állítás is bizonyítható.
40.12. lemma.
Az And, Union, Opt és Filter m¶veleteket tartalmazó SPARQL lekérdezések összetett kiértékelési feladata polinom tárban megoldható.
40.2. A SPARQL lekérdez®nyelv bonyolultsági kérdései
1789
Bizonyítás. Könny¶ belátni hiszen csak a m¶veletek denícióit kell alkal-
mazni a megfelel® részeknél , hogy a 40.1. ábrán szerepl® algoritmus valóban a kiértékelési problémát válaszolja meg azon P SPARQL lekérdezések esetében, melyek And, Union, Opt és Filter m¶veleteket tartalmazhatnak. Más szavakkal eldönti, hogy a további bemenetként adott D RDF gráf és µ leképezés esetén µ ∈ [[P ]]D teljesül-e. Emellett, mivel P változóinak halmaza O(log |P |), és D O(log |D|) nagyságú tárban már elfér, egy olyan leképezés, amely P változóihoz D elemeit rendeli, eltárolható O(|P | log |P | log |D|) nagyságú helyen, hiszen egy változó és a neki megfelel® érték elfér O(log |P | log |D|) nagyságú tárterületen, az ilyen párosok száma pedig P változóinak darabszámával egyezik meg. Így az Eval algoritmus egyszeri meghívásának eredménye polinom méret¶ tárhelyen biztosan kiszámítható. Az viszont ismételten nyilvánvalóan igaz, hogy az Eval algoritmus legfeljebb |P | alkalommal hívhatja meg önmagát. Összességében tehát a teljes algoritmus eredménye polinom tárhelyen kiszámítható.
40.13. következmény. Az And, Union, Opt és Filter m¶veleteket tartalmazó SPARQL lekérdezések kiértékelési feladatának adatbonyolultsága LOG-SPACE-beli. Bizonyítás. Emlékezzünk vissza, hogy a kiértékelési feladat esetén a kiértéke-
lend® SPARQL lekérdezés méretét konstansnak tekintjük. A 40.12. lemma bizonyításánál beláttuk, hogy P , D, µ bemenetekkel az Eval algoritmus O(|P |2 log(|P |) log(|D|)) tárhelyen megvalósítható, ahol P egy SPARQL lekérdezés And, Union, Opt és Filter m¶veletekkel , D egy RDF gráfot, míg µ egy leképezést jelöl. Ha P méretét konstansnak vesszük, az iménti képlet szerint az algoritmus O(log(|D|)) helyen végrehajtható. A 40.11. és a 40.12. lemmákból pedig egyszer¶en adódik a következ® tétel.
40.14. tétel.
Bármely olyan SPARQL nyelvcsalád esetében, melynél az
Opt m¶velet mellett az And, Union, Filter m¶veletek közül néhány használata megengedett, az összetett kiértékelési probléma PSPACE-teljes.
Bizonyítás. Megtalálható a [97] cikkben. 40.2.4. Az unió-normálforma A P1 és P2 SPARQL lekérdezéseket akkor nevezzük ekvivalensnek , ha minden D RDF gráf és µ leképezés mellett µ ∈ [[P1 ]]D akkor és csak akkor teljesül, ha µ ∈ [[P2 ]]D is teljesül. Nem nehéz belátni, a részletek leírása viszont hosszadalmas, hogy minden And, Filter, Union, Opt m¶veleteket használó SPARQL lekérdezés átalakítható olyan lekérdezéssé, ami olyan
40. A Szemantikus Web lekérdez® nyelvei
1790
SPARQL lekérdezések uniójából áll, melyekben már nem szerepel a Union m¶velet. Formálisan:
40.15. tétel.
Legyen P tetsz®leges SPARQL lekérdezés, amely And, Filter, Union, Opt m¶veleteket tartalmazhat. Ekkor létezik P -vel ekvivalens P 0 = P1 Union . . . Union Pk
lekérdezés, ahol Pi olyan SPARQL lekérdezés, melyben már nem szerepel a Union m¶velet (1 ≤ i ≤ k). P 0 -t P unió normálformájának nevezzük.
Bizonyítás. Megtalálható a [97] cikkben. 40.16. tétel.
Ha egy And, Union és Filter m¶veleteket tartalmazó P lekérdezés unió normálformában van, azaz unió normálformája megegyezik P -vel, akkor az összetett kiértékelési feladat O(|P ||D|) id®ben megoldható.
Bizonyítás. Az állítás a 40.8. tétel egyszer¶ következménye.
A tétel azt sugallja, hogy az unió normálforma akár exponenciális méret¶vé is duzzadhat az eredeti mérethez képest, hiszen a 40.10. tétel értelmében az összetett kiértékelési probléma az And, Union és Filter m¶veleteket tartalmazó SPARQL lekérdezéseknél általános esetben NP-teljes, míg unió normálformájú lekérdezés esetén polinom id®ben megválaszolható a lekérdezés méretében.
40.2.5. Jól tervezett SPARQL lekérdezések Az Opt (optional) m¶velet segítségével a SPARQL nyelv megalkotói azt a lehet®séget akarták megteremteni, hogy ha egy információ elérhet®, kerüljön bele a végeredménybe, ugyanakkor annak hiánya ne jelentse azon adatok elhagyását, ahol nem rendelkezünk az iménti többlet információval. Ez az intuíció azonban bizonyos, speciális lekérdezések esetén nem teljesül. 40.4.
példa.
Vegyük ugyanis a következ® példát:
P = ((?X, ahol
D
cím, Tüskevár)
Opt ((?Y, cím, Vuk) Opt (?X, kiadó, ?Z))),
egy könyvek adatait tartalmazó RDF gráf (ebben a szakaszban a literálok a
jobb olvashatóság kedvéért nincsenek idéz®jelek közé téve): (K1 , cím, Harmonia Caelestis), (K4 , kiadó, Európa) (K2 , cím, Tüskevár),
(K1 , szerz®, Esterházy Péter)
(K3 , cím, Bádogdob),
(K4 , szerz®, Bodon Ádám)
(K4 , cím, Sinistra körzet),
(K3 , ár, 3500)
(K2 , kiadó, Móra),
(K4 , ár, 2600)
40.2. A SPARQL lekérdez®nyelv bonyolultsági kérdései Itt
[[P ]]D = {(?X → K2 )},
annak ellenére, hogy a
K2
1791
azonosítójú könyv esetén
ismerjük a kiadót is. A (?X, kiadó, ?Z) opcionális rész azonban a (?Y, cím, Vuk) hármashoz tartozik, aminek viszont üres halmaz az eredménye a az ((?Y, cím, Vuk)
D
fölött, ily módon
Opt (?X, kiadó, ?Z)) részkérdés eredménye is üres halmaz. Más
szavakkal: a plusz információt szolgáltató kérdésrészlet (?X, kiadó, ?Z) nem a (?X, cím, Tüskevár) hármas után következett közvetlen, aminek eredményéhez a további adatokat szolgáltathatta volna, s így a várt eredményt.
közbeékel®d® hármas el tudta
rontani a
A példa mögött egy általánosabb jelenség húzódik meg, a problémát az okozhatja, ha a P lekérdezés egy P 0 = (P1 Opt P2 ) részkérdésénél az ?X változó a P2 -ben és P 0 -n kívül is el®fordul, P1 -ben azonban nem. A jól tervezettséget az ilyen mintázatok lehet®ségeinek megszüntetése jelenti majd. Ám emellett egy másik hibalehet®ségre is oda kell gyelni. Egy Q SPARQL lekérdezést biztonságosnak nevezünk, ha minden (P Filter R) részkérdésére teljesül, hogy az R feltételben csak olyan változók fordulnak el®, amelyek P -ben is megjelennek.
40.17. deníció.
Egy And, Opt, Filter m¶veteket tartalmazó, azaz unió mentes P SPARQL lekérdezés jól tervezett, ha (i) P biztonságos, (ii) P minden P 0 = (P1 Opt P2 ) részkérdése esetében, ha egy változó szerepel P2 -ben és P 0 -n kívül is, akkor P1 -ben is el® kell fordulnia.
Könnyen belátható, hogy a jól tervezettség ellen®rzése a lekérdezés méretéhez képest polinom id®ben megoldható. A következ® meggyelés szintén a jól tervezettség, mint tulaj donság bevezetésének jogosságát indokolja. Intuitíve ugyanis, ha a P 0 SPARQL lekérdezés a P lekérdezésb®l néhány opcionális részkérdés törlésével keletkezik, akkor azt várnánk, hogy a P 0 tetsz®leges D RDF gráf fölötti vett eredménye nem tartalmaz több adatot, mint a P végeredménye ugyanezen D RDF gráf fölött. Másképpen fogalmazva az opcionális részek csak b®víthetik a megoldást. Ez azonban általában nem teljesül. Vegyük például a következ® egyszer¶ adatgráfot:
D := {(1, a, 1), (2, a, 2), (3, a, 3)} és a
P := ((?X, a, 1) Opt ((?Y, a, 2) Opt (?X, a, 3)))
lekérdezést. Itt a P D fölötti kiértékelése egyetlen leképezést tartalmaz: [[P ]]D = {(?X → 1)}. Ugyanakkor, a P 0 = ((?X, a, 1) Opt ((?Y, a, 2)) lekérdezés esetén, melyet az (?X, a, 3) opcionális rész törlésével kapunk P b®l, [[P 0 ]]D = {(?X → 1, ?Y → 2)},
1792
40. A Szemantikus Web lekérdez® nyelvei
azaz ha P 0 -höz hozzávesszük az imént kidobott opcionális részt, információt veszítünk, ahelyett, hogy n®ne az ismeretünk. A jól tervezett lekérdezések esetében az iménti anomáliával egészen biztosan nem találkozhatunk. Formálisan: azt mondjuk, hogy P 0 lekérdezés P SPARQL lekérdezés redukáltja, ha P -b®l megkaphatjuk a (P1 Opt P2 ) részkérdés P1 -gyel történ® helyettesítésével. Például a
P 0 = t1 And (t2 Opt t3 ) lekérdezés a P 0 = t1 And (t2 Opt (t3 Opt t4 )) lekérdezés redukáltja. A reláció reexív, tranzitív lezártját E jelöli. Ennek értelmében például P E (t1 And t2 ) teljesül.
40.18. tétel.
Legyen P jól tervezett SPARQL lekérdezés. Ekkor tetsz®leges SPARQL lekérdezésre, ahol P E P 0 fennáll, [[P 0 ]]D ⊆ [[P ]]D is teljesül, azaz az opcionális részek hozzáadása csak b®vítheti az eredményt.
P0
Bizonyítás. Megtalálható a [97] cikkben.
A jól tervezett SPARQL lekérdezések kiértékelési problémájának bonyolultságáról a következ® mondható el.
40.19. tétel.
(i) Az And és Opt m¶veleteket tartalmazó, jól tervezett SPARQL lekérdezések összetett kiértékelési problémája coNP-teljes. (ii) A Filter m¶velet alkalmazási lehet®sége nem növeli a bonyolultságot.
40.20. következmény.
A P = P1 Union . . . Union Pk unió formában lév® SPARQL lekérdezések esetében, ahol minden Pi jól tervezett (1 ≤ i ≤ k), az összetett kiértékelési probléma coNP-teljes. Más szavakkal, a jól tervezettség csökkenti a kiértékelési probléma bony olultságát. A tulajdonság további el®nye, hogy nagymérték¶ optimalizációt is lehet®vé tesz. Az SQL lekérdezések esetében tudniillik jelent®s id®t lehet megtakarítani, ha a sz¶r® feltételeket minél hamarabb végrehajtjuk. Például az Autó(id, márka, ár) és Tulaj(id, autó_id, név, kor) táblák esetében a
SELECT név FROM Autó a, Tulaj WHERE a.id = autó_id AND ár > 2000000;
40.2. A SPARQL lekérdez®nyelv bonyolultsági kérdései
1793
lekérdezést, ami a 2 millió forintnál drágább kocsik tulajdonosának nevét adja meg, úgy érdemes végrehajtani, hogy el®ször az Autó táblából elhagyjuk a 2 milliónál olcsóbb vagy pontosan ennyibe kerül® autókat és csupán a maradékot kapcsoljuk össze a Tulaj táblával ahelyett, hogy rögtön az Autó és Tulaj tábla összekapcsolásával kezdenénk. Hasonló optimalizálási lehet®ség a jól tervezett SPARQL lekérdezések esetében is adódik.
40.21. tétel.
Legyenek P1 , P2 és P3 SPARQL lekérdezések és R egy beépített feltétel. Tekintsük az alábbi átírási szabályokat: 1. ((P1 Opt P2 ) Filter R) → ((P1 Filter R) OptP2 ), 2. ((P1 And (P2 Opt P3 ) → ((P1 And P2 ) OptP3 ), 3. ((P1 Opt P2 ) And P3 ) → ((P1 And P3 ) OptP2 ). Ekkor P jól tervezett SPARQL lekérdezések esetében, ha P 0 -t az iménti szabályok alkalmazásával kapjuk P -b®l, akkor P 0 a P -vel ekvivalens SPARQL lekérdezés, ráadásul jól tervezett. A bizonyítás ismételten csak nem nehéz, de hosszadalmas. Kivéve a 3. szabály esetében, hiszen az a 2. szabályból megkapható az And m¶velet kommutativitásának felhasználásával. Az átírási szabályok hasznát könny¶ belátni. A (P1 Opt P2 ) tetsz®leges D RDF gráf fölötti kiértékelésekor a P1 D fölötti kiértékelésekor kapott leképezések száma biztosan nem csökken. Ugyanakkor az And és Filter m¶veletek alkalmazása csökkentheti az eredmény méretét. Ebb®l az következik, hogy ezeket a m¶veleteket érdemes minél hamarabb végrehajtani, a 40.21. tétel szabályai pedig pontosan ezt teszik lehet®vé. Érdemes észrevenni, hogy az iménti szabályok általános esetben ismételten csak nem teljesülnek. Tekintsük ugyanis újfent a
D := {(1, a, 1), (2, a, 2), (3, a, 3)} RDF gráfot és a
P := ((?X, a, 1) And ((?Y, a, 2) Opt (?X, a, 3))) lekérdezést. Itt P a D fölött az üres halmazt eredményezi. A 2. szabály alkalmazásával kapott
P 0 := (((?X, a, 1) And (?Y, a, 2)) Opt (?X, a, 3))
1794
40. A Szemantikus Web lekérdez® nyelvei
lekérdezés esetén az eredmény a (?X → 1, ?Y → 2) leképezést tartalmazó halmaz, ami nyilvánvalóan különbözik az üres halmaztól.
Gyakorlatok
40.2-1.
Lássuk be a 40.10. tétel (i) állítását, miszerint a Union és Filter m¶veleteket tartalmazó SPARQL lekérdezéseknél az összetett kiértékelési
probléma polinom id®ben megoldható. 40.2-2. Adjunk meg egy olyan algoritmust, ami a bemenetként kapott And, Union, Opt, Filter m¶veleteket tartalmazó tetsz®leges SPARQL lekérdezést unió-normálformára hozza. 40.2-3. Ellen®rizzük, hogy a 40.21. tétel állításai multihalmaz szemantika mellett teljesülnek-e. 40.2-4. Adjunk meg egy RDF gráfot és két olyan SPARQL lekérdezést, amelyekre rendre nem teljesülnek a 40.21. tétel (1) és (3) átírási szabályai.
40.3. A SPARQL optimalizálása A SPARQL az adatbázisok világában jól ismert SQL-hez hasonlóan deklaratív nyelv: a lekérdezések (adott szemantika mellett) pontosan meghatározzák, hogy az adott dokumentumon kiértékelve milyen eredményt kell kapnunk. A kiértékelés módja, a végrehajtás lépései azonban nincsenek a lekérdezésben meghatározva: ezek el®állítása az adatbázismotor feladata. Egy lekérdezést általában többféleképpen is meg lehet fogalmazni (a jelentés változtatása nélkül), és minden megfogalmazáshoz is többféle kiértékelés tartozhat, akár nagyságrendben eltér® hatékonysággal. Az optimalizálás feladata, hogy a bemenetként kapott lekérdezéshez találjon egy olyan átfogalmazást és/vagy kiértékelési stratégiát, amellyel a feladat minél hatékonyabban oldható meg. A lekérdezés-optimalizálás nem egzakt feladat, nem cél minden esetben a létez® legjobb alternatíva megtalálása, hiszen ez bizonyos esetekben költségesebb is lehet, mint maga a lekérdezés végrehajtása. A jelen alfejezetben tárgyalt eredmények a [103] cikkb®l származnak. Ennek keretében az optimalizálás két fajtájával foglalkozunk: a 40.3.1. szakasz az algebrai optimalizálásról szól, melynek során a halmaz (vagy multihalmaz) szemantika algebrai operátorainak bizonyos tulajdonságait használjuk ki arra, hogy az operátorok átrendezésével, cseréjével, vagy elhagyásával hatékonyabban kiértékelhet® kifejezést kapjunk. A 40.3.2. szakasz pedig a szemantikus optimalizálásról szól, ahol az adathalmazra (dokumentumra) vonatkozó többlet ismeretet használunk ki a végrehajtás költségeinek javítására.
40.3. A SPARQL optimalizálása
1795
40.3.1. Algebrai optimalizálás Az algebrai optimalizálás során egy SPARQL algebrai kifejezéshez keresünk olyan kifejezéseket, amelyeket kiértékelve az eredetivel egyez® eredményt kapunk, azért, hogy ezek közül kiválaszthassuk azt, amelyik várhatóan a leggyorsabban végrehajtható.
40.22. deníció.
Legyen A1 és A2 két halmaz (vagy multihalmaz) algebrai kifejezés. Azt mondjuk, hogy A1 és A2 kifejezések ekvivalensek (jelölés: A1 ≡ A2 ), ha minden D dokumentumon ugyanazt az eredményt adják.
Az optimalizálandó kifejezéssel ekvivalens kifejezéseket ún. átírási szabályok egymás utáni alkalmazásával keressük. Egy átírási szabály két kifejezés (a szabály bal és jobb oldala) közötti ekvivalenciát mond ki. Mivel az ekvivalencia szimmetrikus, a szabályok bal és jobb oldala felcserélhet®, azaz mindkét irányban alkalmazhatóak. A szabályokban szerepl® kifejezések általában egyszer¶ felépítés¶ek, így elég általánosak ahhoz, hogy sok helyzetben alkalmazhatóak legyenek. A halmaz- és multihalmaz szemantika esetén más-más átírási szabályok léteznek. A továbbiakban a halmazszemantika átírási szabályairól beszélünk, azonban a kés®bbiekben látni fogjuk, hogy a legtöbb szabály (esetleg kis módosítással) átvihet® a multihalmaz szemantikára is. A szabályok tárgyalása el®tt szükséges még két függvény bevezetése, amelyek a kifejezésekben szerepl® változókat osztályozzák statikusan aszerint, hogy tetsz®leges dokumentumon vett eredményben kapnak-e minden esetben értéket, vagy sem. Ezt statikusan csak közelít®leg vizsgáljuk: bevezetünk egy alsó- és egy fels® korlátot a mindig kötött változók halmazára. Az alsó korlátot a cV ars (certain variables) függvény adja.
40.23. deníció. Legyen A egy SPARQL halmazalgebrai kifejezés. Ekkor a cV ars(A) értéke az alábbi rekurzív módon számítható ki: •
Ha A = [[t]]D , akkor cV ars(A) = vars(t).
•
Ha A = A1 ./ A2 , akkor cV ars(A) = cV ars(A1 ) ∪ cV ars(A2 ).
•
Ha A = A1 ∪ A2 , akkor cV ars(A) = cV ars(A1 ) ∩ cV ars(A2 ).
•
Ha A = A1 \ A2 , akkor cV ars(A) = cV ars(A1 ).
•
Ha A = πS (A1 ), akkor cV ars(A) = cV ars(A1 ) ∩ S .
•
Ha A = σR (A1 ), akkor cV ars(A) = cV ars(A1 ).
Megjegyzés: a fenti denícióban az A = A1 ./ A2 eset nincs követlenül feltüntetve, ugyanis ez a 40.5. deníció alapján átírható az ./, ∪, és \ operátorokat használó kifejezéssé.
1796
40. A Szemantikus Web lekérdez® nyelvei
A cV ars(A) alsó korlát jellegét az adja, hogy az ebben szerepl® változók az eredmény minden leképezésében biztosan kötöttek. Ezt fogalmazza meg az alábbi állítás.
40.24. állítás.
Legyen A egy halmazalgebrai kifejezés és jelölje ΩA a leképezések halmazát, amiket az A kifejezés D dokumentumon való kiértékelésével kaptunk. Ekkor ha ?X ∈ cV ars(A), akkor ∀µ ∈ ΩA : ?X ∈ dom(µ). Hasonlóan bevezethetünk a kötött változókra egy fels® korlátot is, ezt a pV ars (possible variables) függvény adja meg.
40.25. deníció.
Legyen A egy SPARQL halmazalgebrai kifejezés. Ekkor a pV ars(A) értéke az alábbi rekurzív módon számítható ki: • Ha A = [[t]]D , akkor pV ars(A) = vars(t). •
Ha A = A1 ./ A2 , akkor pV ars(A) = pV ars(A1 ) ∪ pV ars(A2 ).
•
Ha A = A1 ∪ A2 , akkor pV ars(A) = pV ars(A1 ) ∪ pV ars(A2 ).
•
Ha A = A1 \ A2 , akkor pV ars(A) = pV ars(A1 ).
•
Ha A = πS (A1 ), akkor pV ars(A) = pV ars(A1 ) ∩ S .
•
Ha A = σR (A1 ), akkor pV ars(A) = pV ars(A1 ).
Megjegyzés: a pV ars deníciója nagyon hasonló a cV ars deníciójához, az egyetlen különbség az, hogy A1 ∪ A2 esetnél a jobb oldalon ∩ helyett ∪ szerepel. Hasonlóan az el®bbiekhez, itt is egy állítással igazoljuk a fels® korlát jelleget.
40.26. állítás.
Legyen A egy halmazalgebrai kifejezés, és jelölje ΩA a leképezések halmazát, amelyeket az A kifejezés D dokumentumon való kiértékelésével kaptunk. Ekkor, ha ∀µ ∈ ΩA : ?X ∈ dom(µ), akkor ?X ∈ pV ars(A). A szükséges fogalmak ismertetése után most nézzük az átírási szabályokat, a legegyszer¶bbekkel kezdve.
40.27. tétel.
Legyenek A, A1 , A2 és A3 tetsz®leges halmazalgebrai kifejezések. Ekkor az alábbi átírási ekvivalencia szabályok érvényesek. A∪A≡A
(40.1)
A\A≡∅
(40.2)
40.3. A SPARQL optimalizálása
1797
(A1 ∪ A2 ) ∪ A3 ≡ A1 ∪ (A2 ∪ A3 )
(40.3)
(A1 ./ A2 ) ./ A3 ≡ A1 ./ (A2 ./ A3 )
(40.4)
A1 ∪ A2 ≡ A2 ∪ A1
(40.5)
A1 ./ A2 ≡ A2 ./ A1
(40.6)
(A1 ∪ A2 ) ./ A3 ≡ (A1 ./ A3 ) ∪ (A2 ./ A3 )
(40.7)
A1 ./ (A2 ∪ A3 ) ≡ (A1 ./ A2 ) ∪ (A1 ./ A3 )
(40.8)
(A1 ∪ A2 ) \ A3 ≡ (A1 \ A3 ) ∪ (A2 \ A3 )
(40.9)
(A1 ∪ A2 ) ./ A3 ≡ (A1 ./ A3 ) ∪ (A2 ./ A3 )
(40.10)
(A1 \ A2 ) \ A3 ≡ (A1 \ A3 ) \ A2
(40.11)
(A1 \ A2 ) \ A3 ≡ A1 \ (A2 ∪ A3 )
(40.12)
A1 \ A2 ≡ A1 \ (A1 ./ A2 )
(40.13)
Bizonyítás. Megtalálható a [103] cikkben.
A fenti ekvivalenciák tekinthet®ek a SPARQL halmazalgebra alaptörvényeinek is, mivel az operátorok alapvet® tulajdonságait (kommutativitás, asszociativitás, disztributivitás) fejezik ki. A következ® csoportba a projekció átírásával kapcsolatos szabályok tartoznak.
40.28. tétel.
Legyenek A, A1 és A2 tetsz®leges halmazalgebra kifejezések, S , S1 , S2 ⊂ V változók halmazai, és legyen R egy sz¶r®feltétel. Továbbá legyen S 00 = pV ars(A1 ) ∩ pV ars(A2 ), valamint S 0 = S ∪ S 00 . Ekkor az alábbi átírási szabályok teljesülnek. πpV ars(A)∪S (A) ≡ A
(40.14)
πS (A) ≡ πS∩pV ars(A) (A)
(40.15)
πS (σR (A)) ≡ πS (σR (πS∪vars(R) (A)))
(40.16)
πS1 (πS2 (A)) ≡ πS1 ∩S2 (A)
(40.17)
πS (A1 ∪ A2 ) ≡ πS (A1 ) ∪ πS (A2 )
(40.18)
πS (A1 ./ A2 ) ≡ πS (πS 0 (A1 ) ./ πS 0 (A2 ))
(40.19)
πS (A1 \ A2 ) ≡ πS (πS 0 (A1 ) \ πS 00 (A2 ))
(40.20)
πS (A1 ./ A2 ) ≡ πS (πS 0 (A1 ) ./ πS 0 (A2 ))
(40.21)
1798
40. A Szemantikus Web lekérdez® nyelvei
Bizonyítás. Megtalálható a [103] cikkben.
A projekcióra vonatkozó szabályok jelent®ségét az adja, hogy egy jó adatbázismotor az optimalizálás során feltehet®en olyan kifejezéseket részesítene el®nyben, amelyekben a projekció minél hamarabb történik meg, így már a végrehajtás korai szakaszában csökken az adatmennyiség. A fenti szabályok szemléletes jelentése a következ®. A 40.14. és a 40.15. szabály azt fejezi ki, hogy a projekció szempontjából érdekes változók a pV ars(A) halmazból kerülnek ki. Az el®bbi szabály szerint lényegében nem projektáltunk semmit, ha a projekcióban minden pV ars(A)-beli változót megtartunk, míg az utóbbi szabály szerint a projekcióból a pV ars(A)-n kívül es® változókat el is hagyhatjuk. A 40.16. szabály szerint sz¶rések esetén beiktathatunk egy el®zetes projekciót, ha a sz¶rés után amúgy is ez következne, mindössze arra kell gyelnünk, hogy a sz¶r®feltétel változóit meghagyjuk. A 40.17. szabály az ismételt projekció átírását teszi lehet®vé egyetlen projekcióvá. A 40.18 40.21. szabályok a projekció és a bináris operátorok kapcsolatáról szólnak. Ezek alapján a projekciók bevihet®k az operandusokra egy esetleg b®vebb változóhalmazra való vetítésként. A változóhalmaz b®vítésére azért van szükség, hogy a bináris m¶veletek értelmesek maradjanak, azaz ne tüntessük el olyan változók értékeit, amelyek ezáltal megváltoztatnák az összekapcsolás, vagy kivonás eredményét. A sz¶rések átírását a következ® csoportba tartozó szabályok teszik lehet®vé.
40.29. tétel.
Legyenek A, A1 és A2 tetsz®leges halmazalgebra kifejezések, R, R1 , R2 pedig sz¶r®feltételek. Ekkor az alábbi átírási szabályok teljesülnek. σR1 ∧R2 (A) ≡ σR1 (σR2 (A))
(40.22)
σR1 ∨R2 (A) ≡ σR1 (A) ∪ σR2 (A)
(40.23)
σR1 (σR2 (A)) ≡ σR2 (σR1 (A))
(40.24)
σbound(?X) (A) ≡ A, ha ?X ∈ cV ars(A)
(40.25)
σbound(?X) (A) ≡ ∅, ha ?X ∈ / pV ars(A)
(40.26)
σ¬bound(?X) (A) ≡ ∅, ha ?X ∈ cV ars(A)
(40.27)
σ¬bound(?X) (A) ≡ A, ha ?X ∈ / pV ars(A)
(40.28)
σR (A1 ∪ A2 ) ≡ σR (A1 ) ∪ σR (A2 )
(40.29)
σR (A1 \ A2 ) ≡ σR (A1 ) \ A2
(40.30)
Ha minden ?X ∈ vars(R)-re: ?X ∈ cV ars(A1 )∨?X ∈ / pV ars(A2 ), akkor:
40.3. A SPARQL optimalizálása
1799
σR (A1 ./ A2 ) ≡ σR (A1 ) ./ A2
(40.31)
σR (A1 ./ A2 ) ≡ σR (A1 ) ./ A2
(40.32)
Bizonyítás. Megtalálható a [103] cikkben.
A sz¶résekre vonatkozó szabályok motivációja hasonló a projekciónál említetthez: ha a sz¶rések felbontásával és átrendezésével elérhetjük, hogy azok a kifejezésben beljebbre kerüljenek, akkor már a végrehajtás korai fázisában csökken az adatmennyiség, amivel a továbbiakban dolgoznunk kell. A 40.22 40.24. szabályok a sz¶r®feltételek felbontását és átrendezését teszik lehet®vé. A 40.2540.28. szabályok a változók kötöttségére vonatkozó sz¶rések elhagyhatóságát fogalmazzák meg azokban az esetekben, amikor a kérdéses változóról statikusan is eldönthetjük a kötöttséget. A 40.2940.32. szabályok a sz¶rés és a bináris operátorok kapcsolatát mutatják meg. Ezek szerint a sz¶rés is bevihet® az operandusokra, csupán az összekapcsolásoknál kell ügyelni arra, hogy a sz¶r®feltétel értelmes maradjon csak az egyik operandusra értve is, és ez ne befolyásolja az összekapcsolás eredményét. Végezetül nézzünk két olyan szabályt, amely bizonyos atomi sz¶rések elhagyhatóságát mutatja meg. Ezek lényege, hogy a sz¶rés által megkövetelt egyenl®ség teljesülését a sz¶rés elhagyása után úgy fejezzük ki, hogy az egyenl®ségnek megfelel® helyettesítéseket elvégezzük az algebrai kifejezés törzsében. Ehhez nézzük el®ször a behelyettesítés fogalmát.
40.30. deníció.
Legyen A egy halmazalgebrai kifejezés, amely csak az ∪ és ./ operátorok, valamint a [[t]]D formájú hármasok használatával épül ?Y fel, továbbá legyenek ?X, ?Y ∈ cV ars(A) változók. Ekkor A ?X azt a kifejezést jelöli, amit úgy kapunk A-ból, hogy az ?X minden el®fordulását ?Y -al c egy c konstans behelyettesítését ?X helyettesítjük. Hasonlóan, jelölje A ?X helyére A-ban. A sz¶r®feltételek behelyettesíthet®ségét az alábbi tétel mondja ki.
40.31. tétel.
Legyen A egy a 40.30. deníció feltételeit teljesít® halmazalgebrai kifejezés, és legyenek ?X, ?Y ∈ cV ars(A) változók. Ekkor az alábbi átírási szabályok teljesülnek. ?Y ) πS\{?X} (σ?X=?Y (A)) ≡ πS\{?X} (A ?X
(40.33)
c πS\{?X} (σ?X=c (A)) ≡ πS\{?X} (A ?X )
(40.34)
Bizonyítás. Megtalálható a [103] cikkben.
1800
40. A Szemantikus Web lekérdez® nyelvei
A szabályok megfogalmazásában látható, hogy a behelyettesítés csak akkor végezhet® el, ha a behelyettesítéssel eltüntetett változó a következ® lépésben egy projekció miatt amúgy is elt¶nt volna. Ellenkez® esetben a változó eltüntetésével a kifejezés többi része értelmetlenné válhat. Ez a gyakorlatban nem jelent túl szigorú megkötést, mivel a 40.28. tétel átírási szabályaival gyakran a nem szigorúan ilyen alakú kifejezéseket is a megfelel® alakra tudjuk hozni. Az eddigiek során a halmazszemantikához tartozó algebrai kifejezések átírásáról volt szó. A következ®ekben megmutatjuk, hogyan vihet®ek át az átírási szabályok a multihalmaz szemantikára. El®ször ki kell terjesztenünk a cV ars és pV ars függvényeket a multihalmaz-algebrai kifejezésekre is. Ehhez mindössze annyit kell tennünk, hogy a rekurzív deníciókban az alapesetet (A = [[t]]D ) kicseréljük a multihalmaz szemantikánál használt megfelel®jére (A = [[t]]+ D ), míg minden más változatlanul marad. Ezek után kimondhatjuk, hogy a fent bevezetett átírási szabályok közül majdnem mindegyik átvihet® multihalmaz szemantikára is.
40.32. tétel.
A 40.27., 40.28., 40.29. és 40.31. tételekben tárgyalt átírási szabályok a 40.1. és 40.23. szabály kivételével mind teljesülnek a multihalmaz szemantikában is.
Bizonyítás. Megtalálható a [103] cikkben.
A fenti elméleti eredmények már biztos alapot nyújtanak egy SPARQL lekérdezés-optimalizáló motor elkészítéséhez. Egy ilyen motor fejlesztése azonban többet igényel az átírási szabályok beépítésén kívül (például költségbecslés, optimalizálási stratégia, heurisztikák stb.), erre most nem térünk ki.
40.3.2. Szemantikus optimalizálás Az algebrai optimalizálás során csak a kifejezéseket alkotó operátorok általános tulajdonságait használtuk ki arra, hogy hatékonyabban kiértékelhet® formára hozzuk a lekérdezéseket. A szemantikus optimalizálásnál ezzel szemben szükségünk van az adathalmazra vonatkozó többletinformációkra, megszorítások formájában. Ezek birtokában a lekérdezésen olyan átalakításokat tudunk végrehajtani, amelyek általános esetben nem tekinthet®k ekvivalens átalakításnak, azonban a megszorításoknak eleget tev® adathalmaz felett nem változtatják meg a lekérdezés jelentését. A szemantikus optimalizálás tárgyalásakor er®sen építünk a relációs adatbázisok körében ismert alapfogalmakra, mint a konjunktív lekérdezések, megszorítások, és a chase algoritmus. A következ®kben ezek rövid összefoglalása, és a szemantikus adatbázisok világára történ® átfogalmazása következik.
40.3. A SPARQL optimalizálása
1801
40.33. deníció.
Egy konjunktív lekérdezés egy q : ans(¯ x) ← ϕ(¯ x, y¯) alakú kifejezés, ahol ϕ relációs atomok konjunkciója, és x ¯ minden változója el®fordul ϕ-ben is. A q konjunktív lekérdezés szemantikája I adatbázispéldányon: q(I) = {¯ a | I |= ∃¯ y ϕ(¯ a, y¯)}. A szemantikus adatbázisoknál az adathalmazunkat egyetlen speciális ternáris relációként fogjuk fel, ezt T -vel jelöljük. A SPARQL-ben a csak And operátort és esetleg egy küls® projekciót tartalmazó kifejezések felelnek meg a konjunktív lekérdezéseknek (projekciót nem tartalmazó kifejezés esetén odaképzelhetünk egy pV ars-ra történ® projekciót a jelentés megváltoztatása nélkül). Jelölje ezen kifejezések osztályát Aπ . A SPARQL kifejezések és a konjunktív lekérdezések közötti kapcsolatot az alábbi deníció teremti meg.
40.34. deníció. kifejezés:
Legyen S ⊂ V , és Q ∈ Aπ az alábbi alakú SPARQL
Q = SelectS ((s1 , p1 , o1 ) And . . . And (sn , pn , on ))
Ekkor cq(Q) jelölje a Q-nak megfelel® konjunktív lekérdezést, amely az alábbi alakú: q : ans(¯ s) ← T (s1 , p1 , o1 ), . . . , T (sn , pn , on ), ahol s¯ pontosan az S -beli változókat tartalmazza. Az ellenkez® irányú fordítást jelölje cq −1 (q) = Q, amely csak akkor van deniálva, ha Q érvényes SPARQL lekérdezés, azaz minden i-re (si , pi , oi ) ∈ U V × U V × LU V . A szemantikus optimalizálásnál kihasznált többlet információ az adathalmazra vonatkozó megszorítások formájában jelenik meg. Ezen megszorítások forrása többféle is lehet: lehetnek a felhasználó által megadottak, egy ontológiában rögzítettek vagy az adathalmaz alapján automatikusan kivontak. A megszorítások általában tetsz®leges els®rend¶ logikai mondatok lehetnek. Speciális esetként megkülönböztethetünk sor-generáló függ®ségeket, és egyenl®ség-generáló függ®ségeket, melyek alakja rendre ∀¯ x(ϕ(¯ x) → ∃¯ y ψ(¯ x, y¯)) és ∀¯ x(ϕ(¯ x) → xi = xj ). A chase algoritmus a relációs adatbázisoknál jól ismert módszer a szemantikus optimalizációra. Bemenetként egy q konjunktív lekérdezést, és sor- valamint egyenl®ség-generáló függ®ségek egy Σ halmazát kapja. A q lekérdezés törzsét adatbázis-el®fordulásként értelmezve iteratívan megjavítja a függ®ségeket sért® törzset (ez jelentheti sor hozzáadását, vagy változók egybeolvasztását). Végül kimenetként olyan lekérdezést kapunk (jelölje ezt q Σ ), amelynek törzse már kielégíti a függ®ségeket, és amely ekvivalens q -val minden olyan adathalmazon, ami eleget tesz Σ-nak, azaz q ≡Σ q Σ .
1802
40. A Szemantikus Web lekérdez® nyelvei
A SPARQL lekérdezések szemantikus optimalizálásához a chase módszeren alapuló C&B (chase and backchase) algoritmust használjuk. A C&B algoritmus bemenetként kap egy q konjunktív lekérdezést, valamint függ®ségek egy Σ halmazát, kimenetként pedig q -val (a Σ-nak eleget tev® adathalmazokon) ekvivalens, minimális lekérdezéseket ad. Az algoritmus két fázisa a chase és a backchase névre hallgat. Els®ként a chase fázisban lefuttatjuk a chase algoritmust q -ra, így kapunk egy másik u konjunktív lekérdezést, amely feltehet®en nagyobb, mint q (hiszen a sor-generáló függ®ségek kielégítése miatt sorokat adtunk hozzá). A backchase fázisban u-ból kiindulva keressük a minimális megfelel®jét úgy, hogy u-ból sorokat elhagyva alkérdéseket képzünk, és az alkérdéseket chase-elve ellen®rizzük, hogy ekvivalensek maradtak-e u-val (és így q -val is) Σ felett. Így megkaphatjuk a q -val ekvivalens, és (sorok számát tekintve) minimális konjunktív lekérdezések halmazát, amit cbΣ (q)-val jelölünk. Megjegyzés: a chase algoritmus nem minden esetben terminál, a C&B algoritmus pedig pontosan akkor terminál, ha a mögöttes chase algoritmus is. A fogalmak tisztázása után készen állunk a csak And operátort és projekciót tartalmazó SPARQL résznyelv szemantikus optimalizálásának ismertetésére. Az optimalizálás menete a következ®: a lekérdezést a cq függvény segítségével átírjuk konjunktív lekérdezéssé, ezen lefuttatjuk a C&B algoritmust, majd az eredményként kapott minimális lekérdezések visszaírásával megkapjuk az optimalizált SPARQL lekérdezéseket. A m¶velet helyességét az alábbi tétel mondja ki.
40.35. tétel.
Legyen Q egy Aπ osztálybeli SPARQL lekérdezés, és legyen Σ sor- és egyenl®ség-generáló függ®ségek egy halmaza. Ekkor ha cbΣ (cq(Q)) létezik, továbbá q ∈ cbΣ (cq(Q)) és cq −1 (q) is létezik, akkor cq −1 (q) ≡Σ Q.
Bizonyítás. Megtalálható a [103] cikkben.
Feladatok 40-1 Összetett kiértékelési probléma
A 40.9. tétellel kapcsolatban bizonyítsuk be, hogy az And és Union m¶veleteket tartalmazó SPARQL lekérdezések esetében az összetett kiértékelési probléma NP-beli.
40-2 Jól tervezettség eldönthet®sége
M utassuk meg, hogy tetsz®leges P SPARQL lekérdezés jól tervezettsége And, Union, Opt, Filter m¶veletekkel eldönthet® O(|P |2 ) id®ben.
40. fejezet megjegyzései
1803
40-3 Jól tervezettség bonyolultsága
P róbáljuk meg bebizonyítani, hogy jól tervezett SPARQL lekérdezések esetén az összetett kiértékelési probléma coNP-teljes (40.19. tétel).
Megjegyzések a fejezethez A Szemantikus Web vízióját és alapötleteit Tim Berners-Lee, James Hendler és Ora Lassila 2001-es cikke [16] foglalja össze. Az RDF adatmodell [66] 2004 óta, a SPARQL lekérdez® nyelv [99] pedig 2008 óta hivatalos W3C ajánlás, azaz szabványosított Web-technológia. A módszertan és az eszközök népszer¶ségét a LOD-felh®be [18] tartozó számos publikusan is elérhet® szemantikus adathalmaz mutatja. A fogalmak formális tárgyalásához bevezetett halmazszemantika a [97] és [3] cikkekben található elméleti vizsgálatokon alapszik, míg a multihalmaz szemantika a [99] és [96] cikkekben található hivatalos W3C ajánlásokat követi. A Select és Ask lekérdezések kiértékeléséhez használt kompozíciós szemantika bevezetése követi a [98] cikkben találhatóakat. A SPARQL bonyolultsági kérdéseivel foglalkozó 40.2. alfejezet a [98] és [103] cikkekre épít; az optimalizálásról szóló 40.3. alfejezet pedig a [103] cikk eredményeit tárgyalja. A szemantikus optimalizálásnál használt alapfogalmakról b®vebben a következ® cikkekb®l érdemes tájékozódni: chase algoritmus [11], függ®ségek (megszorítások) [15], C&B algoritmus [30].
41. Szemantikus web alkalmazásai
A Szemantikus Web célja, hogy összekapcsolja és a számítógépek által értelmezhet®vé tegye az Interneten elérhet® adatokat. Ehhez biztosít egy olyan adatmodellt (az RDF-et), amely lehet®vé teszi az adatok leírását és integrálását. A ??. fejezetben láthattuk, hogyan épül fel formálisan az adatmodell, illetve hogyan lehet az RDF-ben reprezentált adatokat lekérdezni SPARQL segítségével. Ebben a fejezetben megvizsgáljuk, miként lehet elosztott módon kiértékelni azokat a SPARQL lekérdezéseket, melyek WHERE záradékukban csak hármas mintákat tartalmaznak. Erre azért van szükség, mert a leírás mélységét®l függ®en egy-egy adathalmaz igen nagy méret¶ lehet. Például, ha egy több millió felhasználóból álló közösségi hálót akarunk RDF-ben reprezentálni, akkor ehhez legalább annyi hármast kell felhasználni, ahány él van a hálóban. A közösségi hálózatok reprezentálására két megoldást is megnézünk a 41.2. alfejezetben, ahol továbbá azt is megvizsgáljuk, hogyan lehet transzformációkat végezni a közösségi hálókon az RDF reprezentációjukat felhasználva. Emellett egy olyan SPARQL kiegészítést mutatunk be, ami lehet®vé teszi a felhasználói csoportok kiválasztását, elemzését. Végül megnézzük, hogyan lehet speciálisan a közösségi hálókat lekérdezni a MapReduce módszerrel.
41.1. A SPARQL kiértékelése MapReduce módszerrel A Szemantikus Web adathalmazai sokszor nagy méret¶ek. Minél pontosabban akarjuk leírni az adatokat, annál több hármasra van szükségünk. A jelenlegi keretrendszerek nehezen tudják kezelni a nagy méret¶ gy¶jteményeket. Emiatt vált fontossá annak a vizsgálata, hogyan tudnánk gyorsan megválaszolni a SPARQL lekérdezéseket nagy adathalmazokon. Erre egy kézenfekv® megoldás a feldolgozás párhuzamosítása, elosztása több gépen. A Google által kifejlesztett MapReduce egy módszer arra, hogy bizonyos feladatokat több, klaszterbe szervezett gépen párhuzamosan oldjunk meg. Ehhez a feladatokat két fázisra kell osztani: a Map kulcs-érték párokká alakítja a bemenetet és továbbítja a Reduce fázisnak, a Reduce feldolgozza az azonos kulcshoz tartozó értékeket és el®állítja a végeredményt. A Hadoop egy ingyenesen elérhet® implementációja a MapReduce technikának, melyben a fent említett két fázist
41.1. A SPARQL kiértékelése MapReduce módszerrel
1805
együtt egy jobnak nevezzük. Ebben az alfejezetben azt vizsgáljuk, hogyan lehet felhasználni a SPARQL lekérdezések kiértékeléséhez a Hadoop jobokat.
41.1.1. Adatok tárolása A Hadoop job bemenete fájloknak egy halmaza, ezért lehet®ség van arra, hogy az adatokat szétvágva több kisebb fájlba szervezzük. Ha az összes adatot egy fájlban tároljuk, akkor a rendszer minden alkalommal végigolvassa a teljes adathalmazt. Ennél hatékonyabb megoldás, ha több kisebb fájlunk van, mert ekkor nem feltétlenül szükséges végigolvasni a teljes adathalmazt, csak a szükséges részeit. Az adatok hatékony particionálásával több cikk foglalkozik, ezek közül kett®t mutatunk be. Az els® megközelítésben az állítmányuk szerint osztjuk szét a hármasokat, ezt állítmányalapú vágásnak nevezik. Mivel egy RDF adathalmaz jellemz®en nem tartalmaz sokféle állítmányt, így az adatok nem aprózódnak el, azonban lekérdezésnél elegend® a lekérdezésben szerepl® állítmányok fájljait feldolgozni. Ez a módszer éppen ezért akkor használható hatékonyan, ha az állítmány helyén nem szerepelnek változók. A másik megközelítés az els®nek egy nomítása, ahol a hármasokat tovább bontjuk a tárgy alapján, ezért ezt állítmány-tárgy alapú vágásnak. Többféle felosztás létezik, az egyik legegyszer¶bb, ha a tárgy típusa alapján vágunk, tehát az IRI és a literál típusú értékek külön fájlokba kerülnek.
Bemeneti fájl kiválasztása
A szükséges fájlok meghatározásához meg kell vizsgálnunk a felhasználó által írt lekérdezést. A WHERE záradékban található hármasok alapján választjuk ki a megfelel® fájlokat. Ha valamely hármasban az állítmány egy változó, akkor minden fájlt kiválasztunk és befejez®dik a futás. Ha nincs olyan hármas, amelyben az állítmány egy változó, akkor a tárgyban szerepl® elemeket vizsgáljuk tovább. Ha valamely tárgyban változó szerepel, akkor minden olyan fájlt kiválasztunk, amely az adott állítmányhoz tartozik. Azonban, ha a tárgy nem változó, akkor a tárgy típusa tovább sz¶kíti a szükséges fájlok halmazát, amennyiben a második megközelítés alapján osztottuk el az adatainkat.
41.1.2.
GenerateBestPlan algoritmus
A következ® részben bemutatunk egy algoritmust, ami el®állítja a lekérdezési terveket egy adott lekérdezéshez. Miel®tt rátérnénk a lekérdezés kiértékelésének költségszámítására, bevezetjük a fontosabb deníciókat, melyekre a kés®bbiekben hivatkozni fogunk. A deníciók megértéséhez nézzük az alábbi lekérdezést. 41.1. példa. Az alábbi SPARQL lekérdezés a IRI-
41. Szemantikus web alkalmazásai
1806
vel reprezentált egyetem tanszékeit és azok vezet®it adja eredményül. Az rdf:type megmondja egy er®forrásról, hogy mely osztályba tartozik. 1 SELECT ?X, ?Y WHERE { 2
?X rdf:type ub:Chair .
3
?Y rdf:type ub:Department .
4
?X ub:worksFor ?Y .
5
?Y ub:subOrganizationOf
6 }
41.1. deníció. (Hármas-minta, TP)
A hármas-minta alany, állítmány és tárgy elemek olyan rendezett hármasa, amelyek a SPARQL lekérdezés WHERE záradékában szerepelnek. Az elemek lehetnek változók vagy konstansok. A példában a 2., 3., 4., és 5. sorok egy-egy TP-t tartalmaznak.
41.2. deníció. (MapReduce join, MRJ)
A MapReduce join kett® vagy több hármas minta egy változón keresztül történ® összekapcsolása. A 2. és a 4. sorban szerepl® TP-k az ?X változón, a 3. és az 5. sorban szerepl®k az ?Y változón keresztül vannak összekapcsolva, ezek tehát MRJ-k. Ugyanígy a 3. és a 4., valamint a 4. és az 5. sorban szerepl®k. Továbbá a 3., 4. és 5. sor TP-i egy három tagú MRJ-t alkotnak.
41.3. deníció. (Konfliktusos MapReduce join, CMRJ)
Két MapReduce joint koniktusosnak nevezünk, ha van közös változójuk, de az összekapcsolási feltételben különböz® változók szerepelnek.
41.4. deníció. (Nem-konfliktusos MapReduce join, NCMRJ)
Ha nincs közös változójuk, vagy a közös változó szerepel az összekapcsolási feltételben, akkor nem-koniktusos MapReduce joinokról beszélünk. Ez alapján a 2. és 4. illetve a 4. és 5. sorban szerepl® TP-kb®l képzett MapReduce joinok koniktusosak, hiszen a 2. és 4. az ?X-en keresztül, míg a 4. és 5. az ?Y-on keresztül kapcsolódik, de az ?Y egy közös változó. Ha ugyancsak a 2. és 4. sort nézzük, de most a 3. és 5. sorral, akkor nem-koniktusos MapReduce joint kapunk, hiszen nincs közös változójuk.
41.5. deníció. (job, JB)
Azt a folyamatot, amelyben egy vagy több MapReduce join található, jobnak nevezzük. A job bemenetként fájlokat kap és kimenetként fájlokat készít.
41.1. A SPARQL kiértékelése MapReduce módszerrel
1807
A jobokat tovább csoportosíthatjuk aszerint, hogy a bennük szerepl® MapReduce joinoknak vannak-e közös hármas-mintáik. Ez alapján megkülönböztetünk megvalósítható és nem-megvalósítható jobokat. A közös hármasminták gondot okoznak, mert ilyen esetben nem egyértelm¶, hogy a Map fázis során milyen kulcsot rendeljünk egy adott hármashoz.
41.6. deníció. (Megvalósítható job, FJ)
Egy jobot megvalósíthatónak nevezünk, ha nincs egynél több MapReduce joinban szerepl® hármas-mintája.
41.7. deníció. (Nem-megvalósítható job, IFJ)
Egy jobot nem-megvalósíthatónak nevezünk, ha van olyan hármas-mintája, amely több MapReduce joinban szerepel. Egy lekérdezés megválaszolásához több Hadoop job egymás utáni végrehajtása szükséges. A jobok sorozatát a lekérdezési terv határozza meg. A lekérdezési terveket szintén csoportosíthatjuk megvalósíthatóság szempontjából, a következ® denícióknak megfelel®en.
41.8. deníció. (Lekérdezés Terv, QP)
Egy SPARQL lekérdezéshez tartozó lekérdezési terv Hadoop jobok olyan sorozata, amely helyesen megválaszolja a SPARQL lekérdezést.
41.9. deníció. (Megvalósítható Lekérdezési Terv, FQP)
Egy lekérdezési tervet megvalósíthatónak nevezünk, ha minden benne szerepl® job megvalósítható.
41.10. deníció. (Nem-megvalósítható Lekérdezési Terv, IQP)
A nem-megvalósítható lekérdezési terv olyan lekérdezési terv, amelyben van legalább egy olyan job, amely nem-megvalósítható. Ahhoz, hogy egy lekérdezéshez el®állítsuk az összes lehetséges megvalósítható lekérdezési tervet, olyan jobokat kell képezni, melyek megvalósíthatóak és meg kell határozni azok sorrendjét. Ehhez a következ®, hármas mintákból képzett gráfok nyújtanak segítséget.
41.11. deníció. (Hármas-minta Gráf, TPG)
A hármas-minta gráf GT P = (VT P , ET P ) egy irányítatlan élcímkézett gráf, amelynek csúcsai a lekérdezésben szerepl® hármas-minták. Két csúcs között pontosan akkor vezet él, ha van közös változójuk, és ekkor az adott él a közös változók halmazával címkézett. Azaz egy (u, v, c) ∈ ET P él esetén u, v ∈ VT P csúcsok és c = var(u) ∩ var(v) él, ahol a var a TP-ben szerepl® változók halmaza.
1808
41. Szemantikus web alkalmazásai
Ez a hármas-minta gráf lesz az alapja a join gráfnak, amely alapján össze tudjuk állítani a megfelel® jobokat.
41.12. deníció. (join Gráf, JG)
A GT P hármas-minta gráfból készített GJ = (VJ , EJ ) join gráf egy irányítatlan élcímkézett gráf, amelynek minden v ∈ VJ csúcsa egy (uT P , vT P , cT P ) ∈ ET P élt reprezentál, és az uJ , vJ ∈ VJ csúcsok között pontosan akkor vezet él, ha a megfelel® élek a GT P gráfban szomszédosak, és az élcímkékben szerepl® változóhalmazok diszjunktak. A jobok összeállításánál a célunk olyan MapReduce joinok összeválogatása, melyek páronként nem-koniktusosak. Továbbá a lekérdezési tervekben szerepl® jobok függhetnek egymástól, az ilyen jobok futtatása sorban történik. A helyes sorrend a join gráf színezésével állítható el® a következ® módon. Az alábbi algoritmus el®állítja a lehetséges színezéseket és a hozzájuk tartozó lekérdezési terveket. A lekérdezési terveknek különböz® szempontok alapján lehet értékelni a hatékonyságát, majd kiválasztani közülük a leghatékonyabbat. Ilyen szempontok lehetnek például a jobok száma, a jobok bemenetének vagy kimenetének a mérete.
Input. Query q. Output. plan
GenerateBestPlan 1 2 3 4 5 6
plans = CreateEmptyPriorityQueue() tpg = CreateTriplePatternGraph(q) jg = CreatejoinGraph(tpg) jobs = {} ColorGraph1(tpg,jg,0,jobs) return getHeadFromPriorityQueue(plans)
A színezés pontonként történik a ColorGraph1 meghívásával, amely kezdetben megvizsgálja, hogy van-e az adott csúcsnak fehér szín¶ szomszédja, ha nincs, akkor a fehérrel meghívja a ColorGraph2 metódust, mely a tényleges színezést végzi. Majd a szomszédok színét®l függetlenül ugyanarra a csúcsra meghívja a ColorGraph2-t fekete színnel is.
Input. TPG tpg, JG jg, int i, Set jobs. Output.
ColorGraph1
1 if !neighborHasColor(jg, i, WHITE) then 2 ColorGraph2(tpg, jg, i, WHITE, jobs) 3 ColorGraph2(tpg, jg, i, BLACK, jobs)
41.1. A SPARQL kiértékelése MapReduce módszerrel
1809
A ColorGraph2 algoritmus végzi a tényleges színezést. Az algoritmus meg®rzi az adott csúcs régi színét, majd ellen®rzi, hogy ez lesz-e az utolsó színezés, ugyanis legfeljebb annyi jobunk lehet, ahány csúcsa van a join gráfnak. Ha nem, akkor rekurzívan meghívjuk a ColorGraph1 algoritmust, különben elkészítjük a jobot. Ezután ellen®rizzük, hogy a készül® job szerepele már a jobok halmazában. Ha nem, akkor hozzávesszük. Ezután megnézzük, hogy az összes join elvégezhet®-e az eltárolt jobok segítségével, ha igen, akkor elkészítjük a lekérdezési tervet, különben újraépítjük a gráfokat a megfelel® TP-k összevonása után és rekurzívan meghívjuk a ColorGraph1-et. Az algoritmus végén visszaállítjuk a csúcs eredeti színét. Erre azért van szükség, hogy egy visszalépéses kereséssel az összes lekérdezési tervet el® tudjuk állítani.
Input. TPG tpg, JG jg, int i, Color color, Set jobs. Output.
ColorGraph2
1 v = Vj[i] 2 prev_color = color[v] 3 color[v] = color 4 if i < |vertices[jg]-1| then 5 ColorGraph1(tpg,jg,i+1, jobs) 6 else 7 job = createjob(vertices[jg]) 8 if !detectDuplicatejob(job, tpg) then 9 jobs = jobs ∪ job 10 if |joins[job]| == |vertices[jg]| then 11 enqueuePlan(plans, createNewPlan(jobs)) 12 else 13 tpg_new = mergejoinedTriplePatterns(tpg, job) 14 jg_new = CreatejoinGraph(tpg_new) 15 ColorGraph1(tpg_new, jg_new, 0, jobs) 16 jobs = jobs\{job} 17 color[v] = prev_color
41.13. tétel. vet.
Bizonyítás.
A GenerateBestPlan nem állít el® megvalósíthatatlan ter-
Tegyük fel, hogy az algoritmus el®állít megvalósíthatatlan tervet. A nem-megvalósítható lekérdezési terv deníciójából adódik, hogy ekkor
41. Szemantikus web alkalmazásai
1810
lennie kell legalább egy megvalósíthatatlan jobnak, ahol a hármasok úgy vannak kiválasztva, hogy azok közül legalább egy több joinban is szerepel. Legyen v ∈ VT P egy csúcs a GT P -ben, amely több joinban is szerepel. Az e1 , e2 ∈ ET P élek legyenek a v -ben szomszédosak úgy, hogy az élcímkén szerepl® változók halmaza diszjunkt. Az e1 , e2 éleknek feleljenek meg a v1 , v2 ∈ VJ csúcsok a GJ -ben. Ahhoz, hogy ez a két csúcs egyszerre fusson le egy adott jobban, mindkett®nek fehérnek kell lennie, ami a színezés miatt nem lehetséges. Ugyanis ha egy csúcsnak van fehér szomszédja, akkor azt már nem színezhetjük fehérre.
41.14. tétel. GenerateBestPlan lekérdezést.
el®állítja az összes megvalósítható
Bizonyítás. Tegyük fel, hogy az algoritmus nem állít el® egy megvalósítható
lekérdezési tervet. Ez más megfogalmazásban annyit jelent, hogy nem állít el® legalább egy megvalósítható jobot, azaz valamely érvényes színezés¶ join gráfot. Legyen C = {c1 , c2 , . . . , cn } egy ilyen színezés, ahol ci ∈ {BLACK, W HIT E} a megfelel® vi ∈ VJ csúcs színe, és n = |VJ |. Tegyük fel, hogy {vi1 , vi2 , . . . , vik } csúcsok színe fehér egy megvalósítható lekérdezési tervben, ahol k ≤ n. Ahhoz, hogy az algoritmus ne generálja ezt a tervet, léteznie kell egy (vim , vin ) párnak, amely között van egy él, amely meggátolja, hogy mindkét csúcs egyszerre fehér legyen. De ha a C érvényes színezésben ez a két csúcs fehér, akkor a GT P -ben nem lehet a megfelel® éleknek olyan közös csúcsuk, melyek változó listája nem diszjunkt. Vagyis a GJ -ben nem lehet köztük él, ami ellentmondás.
41.2. Alkalmazás közösségi hálók elemzésére A Web 2.0 megjelenésével interaktívvá váltak a weblapok. Ekkortól számítva a felhasználók már nem csupán böngészik, hanem ®k maguk is hozzájárulnak egy-egy oldal tartalmához. Például leírják a véleményüket az oldalon bemutatott termékr®l, kommenteket f¶znek a hírekhez, címkéket rendelnek a tartalomhoz ami segíti azok kategorizálását. S®t, mára egyre több olyan szolgáltatás érhet® el, amely csak egy keretrendszert ad a felhasználóknak, amivel saját tartalmakat hozhatnak létre, tölthetnek fel, videót, fotót, receptet, személyes bejegyzéseket vagy bármi mást. Emellett megjelentek az úgynevezett közösségi oldalak (például Facebook, Twitter, LinkedIn), ahol a felhasználók ismerkedhetnek, megoszthatják egymással az információkat, tartalmakat, kapcsolatokat alakíthatnak ki. Ezek a kapcsolatok egy nagy közösségi hálót alkotnak.
41.2. Alkalmazás közösségi hálók elemzésére
1811
Az ipar és a kutatók is felismerték, hogy mennyire értékesek az ilyen, interaktív oldalakon a felhasználók által létrehozott tartalmak. Ipari szempontból érdekesek lehetnek például egy adott termékre vonatkozó hozzászólások, melyekb®l a gyártó visszajelzéseket kap, megismerheti a vásárlók véleményét. A sok pozitív vélemény el®segíti a termékek értékesítését. A közösségi hálókon megosztott adatok alapján célzott hirdetések, reklámok hozhatók létre. Tudományos szempontból pedig a kapcsolati hálók segítségével elemezhet®vé válik a társadalmi kapcsolatoknak, a közösségeknek a kialakulása és szervez®dése. A hálók különböz® mér®számokkal jellemezhet®ek, szokták vizsgálni például a csomópontok fokszámának eloszlását, a háló átmér®jét, s¶r¶ségét (azaz a lehetséges és a létez® kapcsolatok arányát).
41.2.1. Közösségi hálózatok reprezentálása RDF segítségével Napjainkban az Interneten egyre több, különböz® típusú, eltér® témájú közösségi oldalt találunk, mint például a Facebook, Google+ vagy a LinkedIn. Ezek közös jellemz®je, hogy a felhasználók különféle kapcsolatokat alakítanak ki egymás (barát, rokon, munkatárs) és a tartalmak (látta a lmet, olvasta a könyvet, megvette a terméket) között. A bevezet®ben szó volt róla, hogy ezeknek a hálózatoknak az elemzése milyen el®nyökkel jár. Nincsen kidolgozott szabvány azonban a hálók reprezentálására, a különböz® oldalak eltér® módon, saját formátumokban tárolják azokat, megnehezítve az elemz®k dolgát. Egyrészt a kifejlesztett algoritmusokat hozzá kell igazítani az éppen vizsgált háló tárolási módjához, másrészt a különböz® forrásból származó hálózatokat nehéz integrálni. A Szemantikus Web megoldást nyújt ezekre a problémákra, hiszen az RDF keretrendszer egyik f® célja az adatok integrálásának el®segítése. Ehhez egy olyan leíró nyelvet biztosít, ami elég exibilis a különböz® témájú és szerkezet¶ közösségi hálók reprezentálásához. Továbbá ontológiák segítségével deniálhatjuk a kapcsolatok lehetséges típusait, a felhasználók, illetve a tartalmak (közösen aktorok) lehetséges osztályait. Ilyen ontológiák már léteznek, a legismertebbek közülük a Friend of a Friend (FOAF) és a SemanticallyInterlinked Online Communities (SIOC). A közösségi hálózatokat alapvet®en kétféleképpen lehet reprezentálni. Az els® a hagyományos megközelítés, amikor a háló csúcsai az aktorok, az élek pedig a köztük lév® kapcsolatok. Az aktorokhoz tartozhatnak attribútumok, amik speciális csúcsként jelennek meg.
41.15. deníció. (közösségi háló)
A közösségi háló egy G = (V, E, C, cimke()) élcímkézett irányított gráf, ahol 1. V = A ∪ M a csúcsok halmaza, az aktorok A és a t®le diszjunkt at-
41. Szemantikus web alkalmazásai
1812
tribútumok M halmazának az uniója. Az aktorok halmaza tovább van S particionálva típusok szerint, vagyis A = t At , valamint az attribútumok is lehetnek típusosak. 2. E = EAA ∪ EAM az élek halmaza, az EAA ⊆ A × A aktorok közötti és EAM ⊆ A×M aktorok és attribútumok közötti élek diszjunkt halmazának uniója, 3. C = CAA ∪ CAM az adott éltípushoz tartozó élcímkék halmaza, 4. cimke() az élcímkéz® függvény, és cimke(e) az e él címkéjével egyenl®. Érdemes felhívni a gyelmet arra, hogy a denícióban az A halmaz particionálása, azaz osztályok szerinti szétosztása, valamint az élek címkéje megadható ontológiák segítségével. A fent deniált gráfot ezután a következ®képpen reprezentáljuk RDF hármasok segítségével.
41.16. deníció. (RDF reprezentáció)
egy közösségi hálózat adatmodellje. Ekkor
Legyen G = (V, E, C, cimke())
1. minden a aktorhoz rendelünk egy egyértelm¶ ida azonosítót. 2. Minden a aktorhoz hozzárendeljük a típusát, vagyis egy (ida , tipusa, tipusa ) hármast. HT = {(ida , 'tipusa', tipusa ) | a ∈ A}. 3. Minden e = (a, b) ∈ EAA élhez, ahol a, b ∈ A, hozzárendelünk egy (ida , cimke(e), idb ) hármast. HR = {(ida , cimke(e), idb ) | a, b ∈ A, (a, b) = e ∈ EAA }. 4. Minden e = (a, m) ∈ EAM élhez, ahol a ∈ A, m ∈ M , hozzárendelünk egy (ida , cimke(e), m) ∈ HM hármast. HM = {(ida , cimke(e), m) | a ∈ A, m ∈ M, (a, m) = e ∈ EAM }. Így a G közösségi hálózat RDF reprezentációja a H = HT ∪ HR ∪ HM halmaz. A fent vázolt megközelítésnek az a hátránya, hogy a kapcsolatokhoz nem rendelhetünk attribútumokat. Ez bizonyos esetekben elengedhetetlen, például hogy mikor jött létre a kapcsolat, vagy ha az er®sségét szeretnénk mérni. Egy másik hátrány, hogy ebben a szemléletben csak bináris kapcsolatokat lehet kifejezni. A második megközelítésben éppen ezért a kapcsolatokat is csúcsként reprezentáljuk, így azokhoz is rendelhetünk attribútumokat, illetve több aktor is részt vehet egy kapcsolatban. Az élek ebben az esetben a résztvev®k szerepét jelölik.
41.2. Alkalmazás közösségi hálók elemzésére
41.1. ábra.
1813
Közösségi hálók els® (felül) és második (alul) adatmodell változata.
41.17. deníció. (közösségi háló adatmodellje 2)
A közösségi háló egy G = (V, E, C, cimke()) élcímkézett irányított gráf, ahol 1. V = A ∪ M ∪ R a csúcsok halmaza, az aktorok A, az attribútumok M és a relációk R diszjunkt halmazának az uniója. Az aktorok, attribútumok és relációk halmaza tovább van particionálva típusok szerint, ahogyan az el®z® denícióban láttuk. 2. E = EAR ∪EAM ∪ERM az élek halmaza, az EAR ⊆ A×R, EAM ⊆ A×M és ERM ⊆ R × M diszjunkt halmazoknak az uniója, 3. C = CAR ∪ CAM ∪ CM R az adott éltípushoz tartozó élcímkék halmaza, 4. cimke() az élcímkéz® függvény, és cimke(e) az e él címkéjével egyenl®. A második adatmodell RDF reprezentációja hasonló az els® adatmodelléhez. A reprezentáció részleteinek kidolgozását lásd a gyakorlatok között, amihez segítséget nyújt a 41.1. ábra. A fels® az els® megközelítést, az alsó a másodikat követi. A négyzetek jelölik az aktorokat az azonosítójukkal, az azonosító után kett®sponttal elválasztva pedig a típus szerepel. Az ellipszisek az attribútumok. Az alsó hálóban a rombusz a relációt mint csúcsot jelöli. A hálók mellett az RDF reprezentáció látható. Az el®z®ekben láthattunk két megoldást arra, hogyan lehet a közösségi hálókat RDF hármasokkal reprezentálni. Az els® megoldás, ahol az aktorok a csúcsok és a relációk az élek, egyszer¶bb és természetesebb, viszont a második
1814
41. Szemantikus web alkalmazásai
modell, ahol a relációkat is csúcsokként reprezentáljuk, lehet®séget ad n-áris relációk kifejezésére, illetve attribútumok megadására a relációkhoz is. Mivel a különböz® közösségi hálók eltér® célt szolgálnak, el®fordulhat, hogy egyiket az els®, míg másikat a második modell szerint érdemes tárolni.
41.2.2. Közösségi hálók lekérdezése és transzformálása A közösségi hálók gyakorlati felhasználása igen sokrét¶. Többféle feladatot, lekérdezést szoktak megfogalmazni. A jellemz® használati esetek a lekérdezéseket két nagy csoportba sorolják. Az els® csoportba tartozó lekérdezések a hálónak, vagy annak egyes részeinek a struktúráját vizsgálják, és általában valamilyen mér®számmal jellemzik azt. Ilyen lehet például a bevezet®ben már említett fokszám eloszlás, átmér® vagy a s¶r¶ség. A másik csoportba az adatok kezeléséért, transzformálásáért felel®s lekérdezések tartoznak. Ezek közös jellemz®je, hogy a kimenetük is egy háló, amit a bemenet transzformálásával kapunk. Ilyen feladatok jellemz®en:
•
Csoportok kiválasztása. Talán a leggyakoribb feladat, amikor a hálónak egy adott mintára illeszked® részeit kell kiválogatni.
•
Attribútumok aktorrá alakítása. El®fordulhat, hogy egy attribútumérték több aktornál is szerepel, esetleg egy attribútumhoz összetett értéket kell rendelni. Ezekben az esetekben szükséges lehet, hogy az attribútum értékét aktorrá alakítsuk, amit új objektumok létrehozásával érhetünk el.
•
Relációk összevonása, csoportosítása. Gyakran szükséges adott típusú relációk összevonása, számlálása, aktoronkéni csoportosítása, vagyis az aggregálása.
•
Adott aktor teljes környezetének lekérdezése. Egy adott felhasználó vizsgálatakor ki kell tudni nyerni a felhasználó összes kapcsolatát, a kapcsolatokhoz tartozó további aktorokkal együtt. Ez a feladat általánosítható olyan módon, hogy az adott felhasználó k -sugarú környezetét kérdezzük le.
A következ®kben egy olyan nyelvet vizsgálunk meg, mely a fenti feladatok megoldását segíti. A Social Network Query and Transformation Language (röviden: SNQL) a gyakran el®forduló lekérdezéshez szükséges kifejez®er® biztosítása mellett az alacsony adatbonyolultságra törekszik. Az SNQL els®sorban az adattranszformációs m¶veleteket támogatja. Ennek megfelel®en a lekérdezések felépítése CONSTRUCT WHERE FROM szerkezetet követ. A FROM záradékban megadott közösségi háló lesz a lekérdezés bemenete, amelyb®l a WHERE záradékban megadott kiválasztási minta alapján megsz¶rt adatokat a CONSTRUCT záradékban megadott konstrukciós minta szerint szervezzük újra.
41.2. Alkalmazás közösségi hálók elemzésére
1815
Az alábbi példában a 41.1. ábrán láthatóhoz hasonló szerkezet¶ hálóból a University típusú csúcsok city attribútumait alakítjuk át aktorokká, és a második adatmodellt alkalmazva összekapcsoljuk a régi és az új aktorokat a megfelel® kapcslati csúcsokon keresztül. 41.2.
példa.
Attribútumok aktorrá alakítása
CONSTRUCT { (?U1, rdf:type, ex:University), (?U1, ex:locatedIn, ?R1), (?C1, ex:contains, ?R1), (?R1, rdf:type, ex:City)} IF ?R1=f(?U1,?C1) WHERE
{(?U1, rdf:type, ex:University), (?U1, ex:city, ?C1)}
FROM
EmploymentNetwork
A példán meggyelhetjük a konstrukciós minta és a kiválasztási minta felépítését, valamint a CONSTRUCT záradék IF feltételében szerepl® kifejezést. Az IF kulcsszó után új változókat deniálhatunk a kiválasztási mintában deniált változók segítségével. Az f függvény egyedi azonosítót generál az új reláció csúcsoknak a relációban résztvev® aktorok alapján. Az aggregációs feladatok megoldásához a nyelv az AGG kulcsszót biztosítja. Megadhatjuk az aggregálni kívánt változók nevét, az aggregáló függvényt és egy mintát, amely meghatározza az aggregálandó értékeket. Az alábbi példa hozzárendeli az emberekhez új attribútumként, hogy hány vállalatnál dolgoznak. (A példában az els® adatmodellt követjük.) 41.3.
példa.
Csoportosítás és aggregálás
CONSTRUCT { (?P1, rdf:type, ex:Person), (?P1, ex:worksFor, ?U1), (?P1, ex:numberOfEmployer, ?DB)} WHERE
AGG({?U1}, COUNT AS ?DB,
FROM
EmploymentNetwork
{(?P1, rdf:type, ex:Person), (?P1, ex:worksFor, ?U1)} )
A következ® feladat megoldásához, ahol egy adott csúcs környezetét kell lekérdeznünk tetsz®leges mélységig, szükségünk van a tranzitív lezárt kiszámítására. A nyelv ehhez a TC függvényt vezeti be, melynek három paramétere van, a kezd®pont, a végpont és egy kiválasztási minta, ami tartalmazza ezt a két pontot. Emellett egy kezd®feltételt kell megadnunk a WITH kulcsszó után. A 41.4. példában, az els® adatmodellt használva, olyan embereket keresünk, akik worksFor reláción keresztül elérhet®k Bencét®l indulva, és összekötjük ®ket Bencével egy ex:canReach címkéj¶ éllel. 41.4.
példa.
Tranzitív lezárt
41. Szemantikus web alkalmazásai
1816
CONSTRUCT { (ex:Bence ex:canReach ?P2) } WHERE
TC(?P1, ?P2, {(?P1, rdf:type, ex:Person), (?P1, ex:worksFor, ?U1), (?P2, rdf:type, ex:Person), (?P2, ex:worksFor, ?U1)} FILTER (?P1 != ?P2)) WITH ?P1=ex:Bence
FROM
EmploymentNetwork
Az el®z® három példa jól szemlélteti a nyelv eszközkészletét, amellyel a fontosabb feladatok egyszer¶en leírhatók. A pontos szintaktikai szabályok megtalálhatók a függelékben. A szintaktikai elemek megismerése után vizsgáljuk meg a nyelv szemantikáját. Legyen H egy közösségi háló és Q egy SNQL kérdés, jelölje Q(H) a Q lekérdezés eredményét a H hálóra alkalmazva. A lekérdezések kiértékelése két lépésb®l áll. El®ször az kiválasztási mintát átalakítjuk Datalog szabályokká, majd a konstrukciós minta alapján sorgeneráló függ®ségeket képzünk. A kiválasztási minta átalakítása a következ® szabályok rekurzív alkalmazásával történik: 1. Minden t = (s, p, o) hármast t(s, p, o)-ra fordítunk. 2. Egy P AT T = {t1 , . . . , tn } hármasokból álló mintához a n V p(¯ z) ← ti (si , pi , oi ) szabályt rendeljük, ahol z¯ a P AT T -ban szerepl® i=1
változókat jelöli. 3. P AT T1 AND P AT T2 : p(¯ z ) ← p1 (¯ x), p2 (¯ y ). 4. P AT T1 OR P AT T2 : p(¯ z ) ← p1 (¯ x) p(¯ z ) ← p2 (¯ y ). 5. P AT T1 AND-NOT P AT T2 : p(¯ z ) ← p1 (¯ x), ¬p2 (¯ y ). 6. P AT T1 FILTER C : p(¯ z ) ← p1 (¯ x), c(¯ x). 7. T C(u, v, P AT T1 ) WITH <startCondition> : p(u, v) ← p1 (. . . u . . . v . . .), startCond(. . . u . . . v . . .) p(u, v) ← p1 (. . . u . . . v . . .), p(w, v) 8. AGG(¯ v , agg, P AT T1 ) : p(¯ v , agg(¯ y ) ← p1 (¯ v , y¯), ahol x ¯ a P AT T1 változóit jelöli, v¯ ⊆ x ¯, y¯ = x ¯ − v¯ és agg egy aggregáló függvény. A második lépésben a konstrukciós minta alapján generálunk szabályokat. Ebben a lépésben felhasználjuk az el®z® lépés szabályait. Egy
41.2. Alkalmazás közösségi hálók elemzésére
1817
CONSTRUCT trList IF eqList mintából az eqList alapján vi = termi és termi = terml alakú kifejezéseket hozunk létre, ahol egy term lehet változó, konstans vagy függvény. Majd a minta és az egyenletek alapján V construct(v1 , . . . , vn ) ← p(¯ z ) ∧ j eqj alakú szabályt képzünk. Végül az eredményt a trList alapján konstruáljuk a következ®képpen: S H = {t(u1 , u2 , u3 ) : ∃(..u1 ..u2 ..u3 ..) ∈ construct and t in trList} 41.5.
példa.
A 41.2. példában megadott lekérdezés átírása
p(u1 , c1 ) construct(u1 , r1 , c1 ) output(u1 , rdf:type, ex:University) output(u1 , ex:locatedIn, r1 ) output(c1 , ex:contains, r1 ) output(r1 , rdf:type, ex:City)
← t(u1 , rdf:type, ex:University), t(u1 , ex:city, c1 ) ← ep(u1 , c1 ), r1 = f (u1 , c1 ) ← construct(u1 , r1 , c1 ) ← construct(u1 , r1 , c1 ) ← construct(u1 , r1 , c1 ) ← construct(u1 , r1 , c1 )
Az SNQL nyelv kidolgozásakor az egyik f® szempont az volt, hogy a gyakorlatban legtöbbször el®forduló adattranszformációs feladatokat ki lehessen vele fejezni. A nyelv tervezésekor a Graphlog lekérdez®nyelvet és a másodrend¶ sorgeneráló függ®ségeket vették alapul.
41.18. állítás.
Legyen Q egy SNQL kérdés, H egy közösségi háló és t = (s, p, o) egy RDF-hármas. Ekkor t ∈ Q(H) eldöntése NLOGSPACE-ben van. A bizonyítás, amit most nem közlünk, a Graphlog és a másodrend¶ sorgeneráló függ®ségek vizsgálatán alapul. A fenti példákból látszik, hogy az SNQL nyelv szerkezete és nyelvi elemei hasonlítanak a SPARQL CONSTRUCT típusú lekérdezéséhez. Mindkett® egy kiválasztási minta és egy konstrukciós minta alapján épül fel. Az SNQL annyiban tér el, hogy a kiválasztási mintában nem használhatunk bizonyos elemeket, amiket a SPARQL-ben igen, például az OPT és UNION kulcsszavakat. SNQL-ben az IF konstrukcióval új változókat képezhetünk, továbbá lehet®ség van a tranzitív lezárt kiszámítására. Ezeket a funkciókat a SPARQL 1.1-ben pótolták, ahol a WHERE záradékban BIND kulcsszóval értéket rendelhetünk változókhoz, hasonlóan mint az IF konstrukcióban. Az 1.1-es verzióban továbbá útvonal kifejezéseket is deniálhatunk, vagyis megadhatunk egy reguláris kifejezést az élcímkék fölött, melyre a két csúcs közötti úton szerepl® élek címkéinek illeszkedniük kell.
41. Szemantikus web alkalmazásai
1818
41.2.3. Csoportok kiválasztása hatékonyan A közösségi hálók felhasználásának egyik gyakori feladata adott tulajdonságú csoportok kiválasztása, csoportok közötti kapcsolatok keresése. Egy közösségi háló vizsgálatakor kereshetünk például klikkeket, azaz olyan közösségeket, amelyben minden tag ismeri egymást, összeköt®ket, melyek összekapcsolnak különböz® klikkeket vagy éppen egymástól teljesen független csoportokat is. Az el®z®ekben láttuk, hogyan lehet a közösségi hálókat RDF hármasokkal reprezentálni és azt, hogy milyen el®nyei vannak ennek a rugalmas ábrázolási módnak. Ebben a fejezetben az RDF-hez kidolgozott SPARQL nyelv egy lehetséges kiegészítését vizsgáljuk meg, mely lehet®vé teszi a csoportok kezelését. SPARQL-ben alapvet®en a gráf csúcsaira és éleire vonatkozó konjunktív lekérdezéseket fogalmazhatunk meg. A javasolt kiegészítésben ezeket a konjunktív lekérdezéseket terjesztjük ki csúcshalmazokra.
41.19. deníció. (Reguláris útvonalkérdés) p p ...p
Legyen H = (V, E) egy irányított élcímkézett gráf. Jelöle a −−−−−→ b az a és b csúcs közötti p1 , . . . , pn élcímkékkel címkézett utat. Ekkor QR ← R az R reguláris kifejezéssel deniált reguláris útvonalkérdés. Az ans(QR , H) válasz azokat a csúcspárokat tartalmazza, amelyek a reguláris kifejezésre illeszked® útvonallal össze vannak kötve, vagyis: n o p ans(QR , H) = (a, b) ∈ V × V | a → − b, ahol p ∈ L(R) 1 2
n
L(R) az R reguláris kifejezés által generált nyelvet jelöli.
41.20. deníció. (Konjunktív reguláris útvonalkérdés) reguláris útvonalkérdések a következ® alakúak:
A konjunktív
QC (x1 , . . . , xn ) → y1 R1 y2 ∧ . . . ∧ y2m−1 Rm y2m ,
ahol x1 , . . . , xn , y1 , . . . , ym csúcsváltozók és {x1 , . . . , xn } ⊆ ans(QC , H) válasz azokat a (v1 , . . . vn ) H-beli csúcsokból tartalmazza, amelyekhez létezik olyan σ leképezés, melyre (σ(yi ), σ(yi+1 )) ∈ ans(QR , H) minden yi Ri yi+1 term által guláris útvonalkérdésre.
{y1 , . . . , yn }. Az képzett n-eseket σ(xi ) = vi , és deniált QR re-
Ahhoz, hogy a fenti deníciókat ki lehessen terjeszteni halmazokra, szükséges, hogy a halmazok bizonyos részeit ki tudjuk jelölni. Ehhez megadjuk a ∀ és a ∃ kvantoroknak a halmazokra vonatkozó kiterjesztését.
•
Univerzális kvantor: ∀M = {M }
•
Egzisztenciális kvantor: ∃M = {A ⊆ M | A 6= ∅}
41.2. Alkalmazás közösségi hálók elemzésére •
Számossági kvantor: ∃M ( n) {>, ≥, =, ≤, <}
=
1819
{A ⊆ M | |A| n}, ahol
∈
A továbbiakban a görög Ξ vagy Ψ bet¶ket úgy használjuk, hogy helyükre a fenti kvantorok valamelyike behelyettesíthet®.
41.21. deníció. (Halmaz-csúcs reguláris útvonalkérdések)
QΞ• ← R egy halmaz és egy csúcs közötti reguláris útvonalkérdés, ahol a Ξ kvantor meghatározza, hogy a halmaz hány elemének kell kapcsolódnia a •-al jelölt csúcshoz úgy, hogy az útvonalon szerepl® élek címkéje illeszkedjen az R reguláris kifejezésre. A válasz ennek megfelel®en rendezett párokból áll, melynek els® eleme egy halmaz, a második eleme pedig egy csúcs, vagyis: n o p ans(QΞ• , H) = (A, b) ∈ 2V × V | a → − b, ahol a ∈ ΞA , p ∈ L(R) A fordított irány, azaz egy csúcs és egy halmaz közötti reguláris útvonalkérdések, illetve a halmaz és halmaz közötti kérdések hasonlóan deniálhatóak.
41.22. deníció. (Halmaz-csúcs reguláris útvonalkérdés lezártja) ¯ Ξ• , Legyen QΞ• egy halmaz-csúcs reguláris útvonalkérdés, ekkor a lezártja, Q tovább sz¶kíti az eredményhalmazt úgy, hogy csak azokat az A és b közötti útvonalakat engedi meg, amelyek A-ban maradnak, tehát p
¯ Ξ• , H) = { (A, b) ∈ 2V × V | a → ans(Q − b, ahol a ∈ ΞA , p1 , . . . , pn = p ∈ L(R) p1 ...pi és ∀i ∈ {1, . . . , n − 1} a −−−−→ c => c ∈ A}
41.23. deníció. (Halmaz méretét megszorító kérdés)
A Q|.| ← (f rom, to) kérdés egy unáris relációt ír le, ahol f rom, to ∈ N, f rom ≤ to a halmaz méretének a minimumát és maximumát deniálja. A válasz azokból a halmazokból áll, melyek mérete megfelel a feltételeknek: ans(Q|.| , H) = A ∈ 2V | |A| ∈ {f rom, . . . , to} A fent deniált kérdéstípusokból konjunkcióval összetett kérdéseket lehet alkotni, hasonlóan a konjunktív reguláris útvonalkérdésekhez. A pontos deníció a következ®.
41.24. deníció. (Konjunktív reguláris útvonalkérdés halmazokkal) A halmazokat is megenged® konjunktív reguláris útvonalkérdés alakja 1
1
m Ψm 2
QS (x1 , . . . , xn ) ← y˜1 [(R1 )Ψ1 Ψ2 ]y2 ∧ . . . ∧ y˜2m−1 [(Rm )Ψ1 ∧Z1 [f1 , t1 ] ∧ . . . ∧ Zl [fl , tl ],
]y2 m
41. Szemantikus web alkalmazásai
1820
ahol x1 , . . . , xn , y1 , . . . , ym csúcs- vagy halmazváltozók és {x1 , . . . , xn } ⊆ {y1 , . . . , ym }. Z = {Z1 , . . . , Zl } az yi -k közötti összes halmazváltozó halmaza. A ∼ szimbólum vagy üres, vagy halmazok esetén lehet , ami a lezártat jelenti. A Ψ vagy egy kvantor, vagy a • szimbólum, amely egy egyszer¶ csúcsot jelöl. Az Ri -k reguláris kifejezések. Az ans(QS , H) azokat a (v1 , . . . , vn ) H-beli csúcsokból és halmazokból képzett rendezett n-eseket tartalmazza, melyekhez létezik olyan σ totális leképezés, hogy σ(xi ) = vi és (σ(yi ), σ(yi+1 )) szerepel a megfelel® részkifejezés eredményhalmazában. 41.6.
példa.
Konjunktív reguláris útvonalkérdés halmazokkal
A példában egy olyan adathalmazt kérdezünk le, ahol a csúcsok knows címkéj¶ élekkel vannak összekötve, és feltesszük, hogy ez a reláció reexív. Ekkor olyan (A, B) halmazpárokat keresünk, melyekre a következ® feltételek teljesülnek: 1. Az A halmazban mindenki legfeljebb kett® hosszú úttal össze van kötve Bencével, akit az ex:Bence azonosító jelöl, és ezek az utak nem vezetnek ki A-ból. 2. A B halmazban mindenki ismer mindenkit. 3. A B halmazból mindenki ismer legalább három A halmazbeli személyt. 4. Az A halmaz hat, a B halmaz legalább négy, de legfeljebb öt elem¶. Ezeket a feltételeket fejezi ki az alábbi kérdés:
QS (A, B) ← ∀• ]ex : Bence ¯ A[(knows.knows?) ∧ B[(knows)∀∀ ]B ∧ B[(knows)∀∃(≥3) ]A ∧ A[6, 6] ∧ B[4, 5]
Amit a következ®képpen írhatunk át SPARQL lekérdezéssé: SELECT ??A ??B WHERE{ ALL CLOSURE ??A knows\knows? ex:Bence. ALL ??B knows ALL ??B. ALL ??B knows SOME(≥ 3) ??A. FILTER ( ??A{6, 6}, ??B{4, 5})}
41.2. Alkalmazás közösségi hálók elemzésére
1821
Az átírt lekérdezésb®l látszik, hogy néhány nyelvi elem bevezetésével hogyan fejezhet®k ki a halmazokat is megenged® konjunktív reguláris útvonalkérdések. A halmaz változókat a ?? dupla kérd®jel jelzi. A reguláris kifejezésben szerepl®, halmazokra vonatkozó kvantorok közül az univerzális kvantort az ALL kulcsszóval, az egzisztenciálisat a SOME-mal, míg a számossági kvantort szintén a SOME kulcsszóval jelöljük, amely után zárójelben feltüntettük a megszorítást. A halmaz lezárását a CLOSURE jelzi. Továbbá, a halmazok elemszámára vonatkozó feltételeket a FILTER után írjuk a fent látható alakban. Az átírás után vizsgáljuk meg a halmazokat is megenged® reguláris útvonalkérdések bonyolultságát.
41.25. állítás. Legyen Q egy kérdés, H egy N csúcsú élcímkézett háló, v¯ csúcsváltozók és V¯ halmazváltozók rendezett n-ese. Ekkor (¯ v , V¯ ) ∈ Q(H) eldöntése PTIME-ban van. Az állítás bizonyításhoz elég látni, hogy a csúcs- és halmazváltozók jelöljük ®ket c-vel és C -vel száma rögzített a kérdésben. Továbbá, minden halmaz alulról és felülr®l korlátos a megfelel® megszorító kérdés miatt. Legyen K a fels® korlátok maximuma. Ekkor a kérdés megválaszolásához legfeljebb N c+K∗C esetet kell ellen®rizni, ami a háló méretében polinomiális.
Függelék: az SNQL nyelv szintaxisa
::= CONSTRUCT WHERE <ext-patt> FROM <list-of-networks> ::= <list-of-pattern-triples>[IF <list-of-eqs>] <list-of-eqs> ::= = <expr>[ AND = <expr>]* <ext-patt> ::= <list-of-pattern-triples> | (<ext-patt>) AND (<ext-patt>) | (<ext-patt>) OR (<ext-patt>) | (<ext-patt>) AND-NOT (<ext-patt>) | (<ext-patt>) FILTER () | TC(, , <ext-patt>) WITH | AGG({[, ]*}, , <ext-patt>) <list-of-pattern-triples> ::= {<pattern-triple>[, (<pattern-triple>)]*} <pattern-triple> ::= (, , ) <list-of-networks> ::= [, ]*] ::= | <list-of-instance-triple>
41. Szemantikus web alkalmazásai
1822
<list-of-instance-triple> ::= ::= <expr> ::= ::= ::= ::= ::= ::= ::=
{[, ]*} (, , ) | | func(<expr>[, <expr>]*) ? | $
Gyakorlatok
41.2-1.
Írjuk fel a 41.17. denícióban leírt adatmodellhez tartozó RDF reprezentáció formális denícióját. 41.2-2. A 41.21. deníció alapján írjuk fel a csúcs-halmaz és halmaz-halmaz reguláris útvonal kérdések és a hozzájuk tartozó válaszok formális denícióját.
41.2.4. Közösségi hálózatok lekérdezése MapReduce módszerrel A szemantikusan leírt közösségi adatok lekérdezésének legegyszer¶bb MapReduce szemlélet¶ módszere alaptáblák el®állítására épül. A táblák azokat a hármasokat tartalmazzák, amelyek a lekérdezés egy adott feltételére teljesülnek. Ezt a szakaszt nevezzük SELECTION résznek. A SELECTION szakasz végigfut az adatokon, és kiválasztja azokat az értékeket, amelyek megfelelnek egy adott változónak. 41.7.
példa.
Az alábbi SPARQL lekérdezés a Budapest Bár iránt érdekl®d® fel-
használóknak azokat a barátait adja vissza, akik Budapesten laknak és akikkel egy 2013. május 2nál újabb képen mindketten meg vannak jelölve. SELECT ?Friend WHERE { ?User hasInterest "Budapest Bár" . ?Friend locatedAt "Budapest" . ?Photo laterThan "2013-05-02" . ?User friendOf ?Friend . ?Photo taggedBy ?User . ?Photo taggedBy ?Friend }
A példában egy lekérdezés feltételeit láthatjuk. Ez egy tipikus lekérdezése a közösségi hálóknak, ami a célzott reklámok kiválasztására szolgál. A
41.2. Alkalmazás közösségi hálók elemzésére
1823
lekérdezésben vesszük azokat a felhasználókat, akik egy bizonyos területr®l vannak és egy közeli ismer®sük érdekl®dik egy bizonyos termék iránt. A kiválasztási szakaszban ekkor hat alaptábla fog elkészülni: hasInterest(?User), locatedAt( ?Friend), laterThan(?Photo), friendOf(?User?Friend), taggedBy(?User?Photo) és a taggedBy(?Friend?Photo). Ezeket a táblákat egy join szakasz fogja feldolgozni. Ez a megoldás nem hatékony, mivel vannak benne felesleges MapReduce job-ok. Ennek oka, hogy a hagyományos SQL join operátor és a SPARQL lekérdezés kiértékelése különbözik. A join esetében az egyes összekapcsolásoknál az alaptáblák száma korlátozott, emiatt több jobra van szükségünk. SELECTION rész mellett a join rész sem hatékony. A jelenlegi megoldás a kiválasztásokat MapReduce folyamatokkal oldja meg, és az elkészült alaptáblákat használja kés®bbiekben az összekapcsolásra. Ennél egy hatékonyabb megoldás, ha kihasználjuk a MapReduce rugalmasságát, és a SELECTION részt beolvasztjuk a join részbe, ezzel csökkentve a felesleges jobok számát.
Többszörös összekapcsolás
Legyen adott egy SPARQL lekérdezésünk a következ® négy alaptáblával: t1(?X?Y), t2(?X?Y), t3(?X?Z), t4(?X?Z). Azonos sémájú alaptáblák a különböz® kapcsolatok miatt lehetségesek. Az SQL alapú megoldás el®bb kiértékeli az ?X?Y és ?X?Z táblákat, majd összekapcsolja az eredményeket ?X alapján. Minden join m¶velethez egy MapReduce jobra van szükség. Hatékonyabb, ha összekapcsoljuk az összes alaptáblát ?X alapján, és sz¶rjük párhuzamosan ?Y és ?Z változókra. Ehhez a megoldáshoz mindössze csak egy jobra van szükségünk. Ezt a megoldást nevezzük multiple-join-with-lter metódusnak. A m¶velet szintaxisa a következ®: Multiple join [tables] on [join Key] Filter on [Filter Key] Dump Result to [MT] Vegyük a korábbi 41.7-es példánkat. Miután összekapcsoltuk a hasInterest(?User), friendOf(?User?Friend) és a taggedBy(?UserPhoto) táblákat a ?User alapján, a következ® lépés az így kapott ?User?Friend?Photo tábla összekapcsolása a ?Friend és a ?Friend?Photo táblával a ?Friend változón keresztül. A multiple-join-with-lter m¶velettel ez a következ®képpen néz ki: Multiple join [?Friend, ?Friend?Photo, ?User?Friend?Photo] on [?Friend] Filter on [?Photo] Dump Result to [?User?Photo]
41. Szemantikus web alkalmazásai
1824
Ebben a példában a ?Friend változót használtuk join kulcsnak. Ezzel egy id®ben a ?Photo-ra kapott különböz® értékeket lesz¶rjük a ?User?Friend?Photo és a ?Friend?Photo alapján. A multiple-join-with-lter a ?Photo változót használja sz¶r® kulcsnak.
Kiválasztó összekapcsolás
A rugalmas MapReduce programozás megengedi, hogy egyszerre generáljunk alaptáblákat és végezzünk join m¶veletet. Ennek eredményeként nem kell annyi job a kiválasztási szakaszban. Ezt a hibrid réteget nevezzük primitív select-join m¶veletnek, ahol a kiválasztás be lett integrálva az összekapcsolásba. A m¶velet során két csoportot alkalmazunk, ahol egy csoport hármasokat tartalmazó halmaz. Az els® csoport a kiválasztó csoport, mely az alaptáblákat generálja. A másik csoport az összekapcsolási csoport, amely a join m¶veleteket végzi. A select-join szintaxisa a következ®: Select on [triplets A] Multiple join [triplets B] on [join Key] Filter on [Filter Key] Dump Result to [ST] A select-join m¶ködését az alábbi példa szemlélteti. 41.8. példa. Az alábbi SPARQL lekérdezés olyan hozzászólásokat ad vissza, melyek
2012. január 1-nél újabb keltezés¶ek, és azokat sorba rendezi a rájuk vonatkozó megjelölések száma szerint csökken®en. SELECT ?Post WHERE { ?Post rdf:type Post . ?Post laterThan "2012-01-01" . ?Post tag ?Tag . } GROUP BY ?Tag ORDER BY DESC (count(?Post))
A lekérdezés a legtöbb post-tal rendelkez® aktív témákat kérdezi le 2012 óta. Mivel csak egy megosztott változó van (?Post), ezért elég csak egy összekapcsolás ahhoz, hogy megkapjuk az értékét. Ez megoldható egyetlen MapReduce jobbal, ha a kiválasztást az összekapcsolással együtt végezzük el. Az összes feltétel az összekapcsolási csoportba kerül és a kiválasztási csoportba nem kerül semmi, vagyis nincs szükségünk alaptábla generálásra. Kijelenthetjük, hogy minden olyan SPARQL lekérdezés, amelyben egy változó van megosztva, lefuttatható egy MapReduce jobbal,
41.2. Alkalmazás közösségi hálók elemzésére
1825
amely teljesen kihagyja a köztes adatokat. Ezek a lekérdezések jellemz®ek a közösségi hálók lekérdezésében, ezeket a lekérdezéseket nevezzük csillag alakú lekérdezéseknek .
Lekérdezésterv generálás
Az algoritmus egymás után dolgozza fel a hármasokban lév® változókat. Minden lépésben mindig a leggyakrabban megosztott változó lesz a join kulcs. Az algoritmus indít egy SQL join-t vagy egy multiple-join-with-lter jobot a változóra. A kiválasztási rész mindig benne van az els® joinban. A multiplejoin-with-lter függ attól, hogy van-e érvényes sz¶r® kulcs. Ha megszámoljuk a nem join kulcsváltozókat és találunk olyan változót, amely egynél többször szerepel a hármasokban, akkor azt használhatjuk sz¶r® kulcsnak. Ha két változó számossága megegyezik, akkor az algoritmus önkényesen választ a két változó közül. Az utolsó eredmény legenerálása után az algoritmus visszaadja a MapReduce jobokból álló lekérdezési tervet.
Input. Egy SPARQL lekérdezés Q (hármasok halmaza). Output. MapReduce folyamat W.
MapReduceWorkflowGeneration 1 2 3 4
v = mostFrequentVariable(Q) tp1 = triplets in Q not sharing v tp2 = triplets in Q sharing v fk = v-n kívüli változók amelyek egynél több tp2-beli hármasban szerepelnek 5 job =Select on+ tp1 +Multiple join + tp2 +join on + v + Filter on + fk + Dump Result to + ST 6 W.append(job) 7 while ST.size() > 1 do 8 VA = correspondingVariables(ST) 9 v = mostFrequentVariable(VA) 10 tb = tables in ST sharing v 11 fk = v-n kívüli változók amelyek egynél több tb-beli táblában szerepelnek 12 job = Multiple join + tb + join on + v + Filter on + fk + Dump Result to + MT 13 W.append(job) 14 remove tb from ST 15 add MT to ST 16 return W
1826
41. Szemantikus web alkalmazásai
Gyakorlatok
41.2-1.
Generáljunk lekérdezési tervet a MapReduceWorkflowGeneration algoritmussal az alábbi lekérdezésre. 1 SELECT ?X, ?Y1, ?Y2, ?Y3 2 WHERE { 3 ?X rdf:type ub:Professor . 4 ?X ub:worksFor . 5 ?X ub:name ?Y1 . 6 ?X ub:emailAddress ?Y2 . 7 ?X ub:telephone ?Y3 . 8} 41.2-2. Generáljunk lekérdezési tervet a MapReduceWorkflowGeneration algoritmussal az alábbi lekérdezésre. 1 SELECT ?X, ?Y, ?Z 2 WHERE { 3 ?X rdf:type ub:Student . 4 ?Y rdf:type ub:Department . 5 ?X ub:memberOf ?Y . 6 ?Y ub:subOrganizationOf . 7 ?X ub:emailAddress ?Z 8} 41.2-3. Generáljunk lekérdezési tervet a MapReduceWorkflowGeneration algoritmussal az alábbi lekérdezésre. 1 SELECT ?X, ?Y, ?Z 2 WHERE { 3 ?X rdf:type ub:Student . 4 ?Y rdf:type ub:Faculty . 5 ?Z rdf:type ub:Course . 6 ?X ub:advisor ?Y . 7 ?Y ub:teacherOf ?Z . 8 ?X ub:takesCourse ?Z 9}
Feladatok 41-1 Költségbecslés
Próbáljunk meg aszimptotikus fels® becslést adni a GenerateBestPlan algoritmus futási idejére, a hármas-minta gráf csúcsainak és éleinek a függvé-
41. fejezet megjegyzései
1827
nyében.
41-2 Lekérdezés bonyolultság
Legyen H egy rögzített n csúcsú élcímkézett közösségi háló. Adjuk meg a (¯ v , ¯(V )) ∈ Q(H) döntési probléma bonyolultsági osztályát adott Q, halmazokat is megenged® konjunktív reguláris útvonal kérdésre (41.24. deníció), ahol v¯ csúcsváltozók és V¯ halmazváltozók rendezett n-ese.
Megjegyzések a fejezethez A Szemantikus Web elméleti és gyakorlati problémáiról az els® magyar nyelv¶ tankönyveket Gottdank Tibor [48] és Szeredi Péter [107] írta. A SPARQL lekérdezések MapReduce [28] technikával történ® kiértékelésének megoldását írják le Husain és társai [54]. A cikkben szó esik az adatok tárolásáról és a lekérdezéshez szükséges jobok el®állításáról. Bemutatnak egy algoritmust, amely elkészíti a lekérdezés kiértékeléséhez szükséges futási tervet. A közösségi hálózatok RDF reprezentálásával f®ként a [101] cikk foglalkozik, amely a reprezentálás bevezetése mellett egy lekérdez®nyelvet is bemutat, amelyb®l a szerz®k kés®bb megalkották a [102] cikkben bemutatott SNQL nyelvet a hálók lekérdezésére, transzformálására. A nyelv a Graphlog [25] és a másodrend¶ sorgeneráló függ®ségek [37] el®nyeit egyesíti. A közösségi hálózatok elemzésének egyik alapja a felhasználói csoportok vizsgálata. A SPARQL-ben [49] a lekérdezések alapja a pontokra és a közöttük lév® élekre vonatkozó mintaillesztés, amit a [69] cikkben leírt módon kiegészíthetünk felhasználói csoportok és a csoportok közötti összeköttetések megadásával. A fentebb említett MapReduce technika közösségi hálózatok lekérdezésére történ® alkalmazását Liu, Yin és Gao [70] mutatták be. Megoldásuk a relációs táblák összekapcsolásán alapszik. A szemantikus web technológiák számos további gyakorlati alkalmazásban kerülnek felhasználásra. Matuszka, Gombos és Kiss [80] cikkükben egy beltéri navigációs rendszert ismertetnek, mely a lehetséges útvonalak kiszámításához RDF reprezentációt és következtetéseket használ fel. Gombos és társai egy általános célú virtuális obszervatóriumot ismertetnek szemantikus adatbázisok felett [47]. Zsigmondi és Kiss a [119]-ben bevezették a szemantikus helyettesít® karakter fogalmát, amellyel általánosítható a szöveges keresés. Matuszka a Szemantikus Web kiterjesztett valósággal kapcsolatos alkalmazásáról számolt be a [79] publikációban. Jelen kutatást a FuturICT.hu nev¶, TÁMOP-4.2.2.C-11/1/KONV-20120013 azonosítószámú projekt támogatta az Európai Unió és az Európai Szociális Alap társnanszírozása mellett.
Színes ábrák
36. fejezet színes ábrái
41.2. ábra.
Nem irányított, hurokmentes De Bruijn-gráfok.
41. fejezet megjegyzései
1829
37. fejezet színes ábrái
Grakus API programozási modell
CUDA programozási modell
GPU programozási modellek: grakus árnyalók és az általános célú CUDA. A grakus árnyalókat a Shader Model 4 szabványnak megfelel®en ábrázoltuk, amelyben a programozható egységek piros színnel, a rögzített funkciójúak pedig zölddel jelennek meg (a 37.1. ábra szimes változata). 41.3. ábra.
41.4. ábra.
Az inkrementális képalkotás folyamata (a 37.2 ábra színes változata).
Kever®egység, amely az új pixelszínt a számított és a korábban tárolt színek kombinálásával állítja el® (a 37.3. ábra színes változata. 41.5. ábra.
Tömbökben vagy textúrákban tárolt adatstruktúrák. A részecske pozíció és sebesség egydimenziós oat3 típusú textúrába kerül. A számított s¶r¶séghez és nyomáshoz egydimenziós oat2 típusú textúrát használunk. Végül, egy kétdimenziós textúra azonosítja minden részecskéhez a hozzá közel lév® és ezért hatással bíró további részecskéket (a 37.12. ábra színes változata. 41.6. ábra.
Irodalomjegyzék
Irodalomjegyzék
1831
A lagrange-i megoldás egy id®lépése, amely a pirossal színezett részecskét a sárga szomszédai szerint mozgatja (a 37.13. ábra színes változata). 41.7. ábra.
[1] J.-P. Allouche, M. Baake, J. Cassaigne, D. Damanik. Palindrome complexity. Theoretical Computer Science, 292:931, 2003. 1689 [2] N. Anbarci. Noncooperative foundations of the area monotonic solution. The Quaterly Journal of Economics, 108:245258, 1993. 1779 [3] R. Angles, C. Gutierrez. The expressive power of SPARQL. In The Semantic Web - ISWC 2008. Springer, 114129, 2008. 1803 [4] M.-C. Anisiu. Finite words with special complexity properties. Pure Mathematics and Applications, 13:3137, 2002. 1689 [5] M.-C. Anisiu, A. Iványi. Two-dimensional arrays with maximal complexity. Pure Mathematics and Applications, 17(34):197204, 2006. 1689 [6] M.-C. Anisiu, V. Anisiu, Z. Kása. Total palindrome complexity of nite words. Discrete Mathematics, 310:109114, 2010. 1689 [7] M.-C. Anisiu, Z. Blázsik, Z. Kása. Maximal complexity of nite words. Pure Mathematics and Applications, 13:3948, 2002. 1689 [8] P. Arnoux, C. Mauduit, I. Shiokawa, J. Tamura. Complexity of sequences dened by billiard in the cube. Bulletin de la Société Mathématique de France, 122(1):112, 1994. 1689 [9] M. Baake. A note on palindromicity. Letters in Mathematical Physics, 49(3):217227, 1999. 1689 [10] A. Bagchi, A. Machanti. Search algorithms under dierent kinds of heuristicsa comparative study. Journal of the Association for Computing Machinery, 30(1):121, 1983. 1635 [11] C. Beeri, M. Y. Vardi. A proof procedure for data dependencies. Journal of the ACM (JACM), 31(4):718741, 1984. 1803 [12] A. Bege. Skatulyaelv feladatok. Presa Universitar Clujean , 2007. 1645 [13] A. Bege, Z. Kása. Algorithmic Combinatorics and Number Theory (Hungarian). Presa Universitar Clujean , 2006. 1645 [14] N. Bell, M. Garland. Implementing sparse matrix-vector multiplication on throughputoriented processors. In SC'09: Proceedings of the Conference on High Performance Computing Networking, Storage and Analysis, 111. pages. ACM, 2009. 1722 [15] A. Benczúr, A. Kiss, T. Márkus. On a general class of data dependencies in the relational model and its implication problems. Computers & Mathematics with Applications, 21(1):1 11, 1991. http://www.sciencedirect.com/science/article/pii/089812219190226T. 1803
1832
Irodalomjegyzék
[16] T. Berners-Lee, J. Hendler, O. Lassila. The Semantic Web. Scientic American, 284(5):28 37, 2001. 1803 [17] V. Berthé, L. Vuillon. Palindromes and two-dimensional sturmian sequences. Journal of Automata, Languages and Combinatorics, 6(2):121138, 2001. 1689 [18] C. Bizer, A. Jentzsch, R. Cyganiak. State of the LOD Cloud. Version 0.3 (September 2011), 2011. 1803 [19] J-P. Borel, C. Reutenauer. Palindrome factors of billiard words. Theoretical Computer Science, 340:334348, 2005. 1689 [20] S. Brlek, S. Hamel, M. Nivat, C. Reutenauer. On the palindromic complexity of innite words. International Journal of Foundations of Computer Science, 15(2):293306, 2004. 1689 [21] J. Cassaigne. Complexité et facteurs spéciaux. Bulletin of Bull. Belgian Mathematical Society Simon Stevin, 4(1):6788, 1997. 1689 [22] J. Cassaigne, I. Kaboré, T. Tapsoba. On a new notion of complexity on innite words. Acta Univ. Sapientiae, Mathematica, 2:127136, 2010. 1689 [23] C. Chorut, J. Karhumäki. Combinatorics of words. In G. Rozenberg, A. Salomaa (editors), Handbook of Formal Languages, Vol. I-III. Springer, 1997. 1688 [24] Y. M. Chun. The equal loss principle for bargaining problems. Economics Letters, 26:103 106, 1988. 1779 [25] P. M. Consens, O. A. Mendelzon. GraphLog: a visual formalism for real life recursion. In
Proceedings of the Ninth ACM SIGACT-SIGMOD-SIGART Symposium on Principles of Database Systems, 404416. pages. ACM, 1990. 1827
[26] D. Damanik, D. Zare. Palindrome complexity bounds for primitive substitution sequences. Discrete Mathematics, 222:259267, 2000. 1689 [27] A. de Luca. On the combinatorics of nite words. Theoretical Computer Science, 218(1):13 39, 1999. 1689 [28] J. Dean, S. Ghemawat. MapReduce: simplied data processing on large clusters. Communications of the ACM, 51(1):107113, 2008. 1827 [29] R. Dechter, J. Pearl. Generalized best-rst search strategies and optimality of a∗ . Journal of the Association for Computing Machinery, 32(3):505536, 1985. 1635 [30] A. Deutsch, L. Popa, V. Tannen. Query reformulation with constraints. ACM SIGMOD Record, 35(1):6573, 2006. 1803 [31] J. A. Dossey, A. Otto, L. Spence, C. Van Den Eynden. Discrete Mathematics. Scott, Foresman and Company, 1987. 1645 [32] X. Droubay, G. Pirillo. Palindromes and Sturmian words. Theoretical Computer Science, 223(12):7385, 1999. 1689 [33] D. Eberly. Game Physics. Morgan Kaufmann Publishers, 2004. 1733 [34] C. H. Elzinga. Complexity of categorial time series. Sociological Methods & Research, 38(3):463481, 2010. 1689 [35] C. H. Elzinga, S. Rahmann, H. Wang. Algorithms for subsequence combinatorics. Theoretical Computer Science, 409:394404, 2008. 1689 [36] W. Engel (editor). GPU Pro. A K Peters, 2010. 1736 [37] R. Fagin, P. G. Koloatis, L. Popa, W-C. Tan. Composing schema mappings: Second-order dependencies to the rescue. ACM Transactions on Database Systems (TODS), 30(4):994 1055, 2005. 1827 [38] I. Fekete, T. Gregorics, S. Nagy. Bevezetés a mesterséges intelligenciába. LSI, 1990. 1635 [39] S. Ferenczi. Complexity of sequences and dynamical systems. Discrete Mathematics, 206(1 3):145154, 1999. 1689 [40] S. Ferenczi, Z. Kása. Complexity for nite factors of innite sequences. Theoretical Computer Science, 218:177195, 1999. 1689 [41] F. Fernando (editor). GPU Gems. Addison-Wesley, 2004. 1736 [42] N. P. Fogg. Substitutions in dynamics, arithmetics, and combinatorics (Lecture Notes in Mathematics, Vol. 1794). Springer, 2002. 1688 [43] L. R. Ford, D. R. Fulkerson. Flows in Networks. Princeton Uiversity Press, 2010. Az els® kiadás 1962-ben jelent meg. 1644
Irodalomjegyzék
1833
[44] F. Forgó, J. Szép, F. Szidarovszky. Introduction to the Theory of Games: Concepts, Methods and Applications. Kluwer Academic Publishers, 1999. 1778 [45] N. Fujimoto. Faster matrix-vector multiplication on geforce 8800gtx. In Parallel and Distributed Processing, IPDPS 2008, 18. pages. IEEE, 2008. 1722 [46] I. Futó. Mesterséges intelligencia. Aula, 1999. 1635 [47] G. Gombos, T. Matuszka, B. Pinczel, G. Rácz, A. Kiss. VOSD: A general-purpose virtual observatory over semantic databases. In Á. Kiss (editor), 13th Symposium on Programming Languages and Software Tools (SPLST 2013, Szeged, 2013. aug. 262013. aug. 08. 27). Szegedi Egyetem Informatikai Tanszékcsoport, 9099, 2013. 1827 [48] T. Gottdank. Szemantikus web. Bevezetés a tudásalapú internet világába. Computer Books, 2005. 1827 [49] S. Harris, A. Seaborne. SPARQL 1.1 query language. W3C recommendation, March 2013. 1827 [50] M. J. Harris, W. V. Baxter, T. Scheuerman, A. Lastra. Simulation of cloud dynamics on graphics hardware. In Proceedings of the ACM SIGGRAPH/EUROGRAPHICS Conference on Graphics Hardware, HWWS'03, 92101. pages, 2003. Eurographics Association. 1728 [51] J. F. Harsanyi, R. Selten. A generalized Nash solution for two-person bargaining with incomplete information. Management Science, 12(2):80106, 1972. 1779 [52] P. Hart, N. J. Nilsson, B. Raphael. A formal basis for the heuristic determination of minimum cost paths. IEEE Transactions on System, Man and Cybernetics, 4(2):100107, 1968. 1635 [53] P. Horváth, D. Illés. Sph-based uid simulation in distributed environment. In MIPRO 2009:
32nd International Convention on Information and Communication Technology, Electronics and Microelectronics, 249257. pages, 2009. 1735
[54] M. Husain, P. Doshi, L. Khan, J. McGlothlin. Ecient query processing for large rdf graphs using hadoop and mapreduce. Technical report, University of Texas at Dallas, 2009. 1827 [55] L. Ilie. Combinatorial complexity measures for strings. In Recent Advances in Formal Languages, 149170. pages. Springer-Verlag, 2006. 1689 [56] A. Iványi. On the d-complexity of words. Annales Universitatis Scientiarum Budapestinensis de Rolando Eötvös Nominatae, Sectio Computarorica, 8:6990, 1987. 1689 [57] A. Iványi. Reconstruction of complete interval tournaments. II. Acta Universitatis Sapientiae, Mathematica, 2(1):4771, 2010. 1645 [58] A. Iványi, Z. Kása. Prism complexity of matrices. Annales Universitatis Scientiarum Budapestinensis de Rolando Eötvös Nominatae, Sectio Computatorica, 37:195214, 2012. 1689 [59] A. Iványi. Reconstruction of complete interval tournaments. Acta Universitatis Sapientiae, Informatica, 1(1):7188, 2009. 1644 [60] E. Kalai, M. Smorodinsky. Other solution to Nash' bargaining problem. Econometrica, 43:513518, 1975. 1779 [61] Z. Kása. On the d-complexity of strings. Pure Mathematics and Applications, 9:119128, 1998. 1647, 1689 [62] Z. Kása. On scattered subword complexity. Acta Universitatis Sapientiae, Informatica, 3(1):127136, 2011. 1689 [63] Z. Kása. Super-d-complexity of nite words. In H. Pop, A. Bege (editors), 8th Joint Conference on Mathematics and Computer Science MaCS 2010, (July 1417, 2010, Komárno, Slovakia), 257266. pages. Novadat, Gy®r, 2011. 1689 [64] Z. Kása, Z. Kátai. Scattered subwords and composition of naturals. Acta Universitatis Sapientiae, Informatica, 4(2):225236, 2012. 1689 [65] Khronos. OpenCL overview. 2010. http://www.khronos.org/opencl/. 1694 [66] G. Klyne, J. Carroll, B. McBridge. Resource Description Framework RDF: concepts and abstract syntax, 2004. W3C recommendation 10 February 2004. 1803 [67] R. Korf. Search algorithms under dierent kinds of heuristicsa comparative study. Articial Intelligence, 27:97109, 1985. 1635 [68] F. Levé, P. Séébold. Proof of a conjecture on word complexity. Bulletin of Belgian Mathematical Society Simon Stevin, 8:277291, 2001. 1689
1834
Irodalomjegyzék
[69] V. Liptchinsky, B. Satzger, R. Zabolotnyi, S. Dustdar. Expressive languages for selecting groups from graph-structured data. In Proceedings of the 22nd international conference on World Wide Web. International World Wide Web Conferences Steering Committee, 761770, 2013. 1827 [70] L. Liu, J. Yin, L. Gao. Ecient social network data query processing on MapReduce. In Proceedings of the 5th ACM HotPlanet Workshop, 2732, 2013. 1827 [71] M. Lothaire. Applied Combinatorics on Words. Cambridge University Press, 2005. 1688 [72] M. Lothaire. Combinatorics on Words. Cambridge University Press, 1997 (második kiadás). 1688 [73] M. Lothaire. Algebraic Combinatorics on Words. Cambridge University Press, 2002. 1688 [74] L. Lovász, P. Gács. Algoritmusok. M¶szaki Könyvkiadó és Tankönyvkiadó, 1978. 1591 [75] M. Magdics, G. Klár. Rule-based geometry synthesis in real-time. In W. Engel (editor), GPU Pro: Advanced Rendering Techniques, 4166. pages. A K Peters, 2010. 1699 [76] A. Martelli. A heuristic search algorithm with modiable estimate. Articial Intelligence, 23:113, 1984. 1635 [77] L. Martelli. On the complexity of admissible search algorithms. Articial Intelligence, 8:13 27, 1977. 1635 [78] M. H. Martin. A problem in arrangements. Bulletin of American Mathematical Society, 40:859864, 1934. 1663 [79] T. Matuszka. Augmented reality supported by Semantic Web technologies. In P. Cimiano, O. Corcho, V. Presutti, L. Hollink, S. Rudolph (editors), The Semantic Web: Semantics and Big Data, Lecture Notes in Computer Science. Springer, 7882, 682686, 2013. 1827 [80] T. Matuszka, G. Gombos, A. Kiss. A new approach for indoor navigation using semantic webtechnologies and Augmented Reality. In Virtual Augmented and Mixed Reality. Designing and Developing Augmented and Virtual Environments. Springer, 202210, 2013. 1827 [81] Microsoft. HLSL. 2010. http://msdn.microsoft.com/en-us/library/bb509561(v=VS.85).aspx. 1694 [82] S. Molnár, F. Szidarovszky. Koniktushelyzetek megoldási módszerei. SZIE, 2010. 1779 [83] J. Nash. The bargaining problem. Econometrica, 18:155162, 1950. 1779 [84] A. Newell, G. Ernst The search for generality. In Proceedings of IFIP Congress 1965 szerk. W. A. Kalenich, ????. pages. Spartran, 1965. 1635 [85] H. Nguyen (editor). GPU Gems. Addison-Wesley, 2008. 1736 [86] N. J. Nilsson. Principles of Articial Intelligence. Springer-Verlag, 1982. 1635 [87] N. J. Nilsson. Problem-solving Methods in Articial Intelligence. McGraw-Hill, 1982. 1635 [88] NVIDIA. Cg homepage. 2010. http://developer.nvidia.com/page/cg_main.html. 1694, 1736 [89] NVIDIA. In CUDA Zone, 2010. http://www.nvidia.com/object/cuda_home_new.html. 1694, 1736 [90] Ø. Ore. Studies on directed graphs. I. Annalen of Mathemathics, 63(2):383406, 1956. 1644 [91] Ø. Ore. Studies on directed graphs. II. Annalen of Mathemathics, 64(2):142153, 1956. 1644 [92] J. D. Owens, D. Luebke, N. Govindaraju, M. J. Harris, J. Krüger, A. Lefohn, T. Purcell. A survey of general-purpose computation on graphics hardware. Computer Graphics Forum, 26(1):80113, 2007. 1736 [93] J. Pearl. Heuristics. Addison-Wesley, 1984. 1635 [94] J. Pearl, R. E. Korf. Search techniques. Annual Review Comput. Science, 2:451467, 1987. 1635 [95] M. Pharr (editor). GPU Gems 2. Addison-Wesley, 2005. 1736 [96] J. Pérez, M. Arenas, C. Gutierrez. Semantics of SPARQL. Technical report, TR/DCC-200617, Universidad de Chile, 2006. 1803 [97] J. Pérez, M. Arenas, C. Gutierrez. Semantics and Complexity of SPARQL. In The Semantic Web - ISWC 2006. Springer, 3043, 2006. 1787, 1789, 1790, 1792, 1803 [98] J. Pérez, M. Arenas, C. Gutierrez. Semantics and complexity of SPARQL. ACM Transactions on Database Systems (TODS), 34(3), Article No. 16, 2009. 1803
Irodalomjegyzék
1835
[99] E. Prud'hommeaux, A. Seaborne. SPARQL query language for RDF. W3C recommendation, January 2008. 1803 [100] S. Russell, P. Norvig. Articial Intelligence: A Modern Approach. Prentice Hall Inc., 2009. Magyarul: Mesterséges intelligencia korszer¶ megközelítésben (1995-ös els® kiadás fordítása), Panem, Budapest, 2000. 1635 [101] M. San Martin, C. Gutierrez. Representing, querying and transforming social networks with RDF/SPARQL. In The Semantic Web: Research and Applications, Lecture Notes in Computer Science. Springer, 293307, 2009. 1827 [102] M. San Martin, C. Gutierrez, P. T. Wood. SNQL: A social networks query and transformation language. In 5th Alberto Mendelzon Workshop on Foundations of Databases, 2011. 1827 [103] M. Schmidt, M. Meier, G. Lausen. Foundations of SPARQL query optimization. In Proceedings of the 13th International Conference on Database Theory. ACM, 433, 2010. 1794, 1797, 1798, 1799, 1800, 1802, 1803 [104] J. O. Shallit. On the maximum number of distinct factors in a binary string. Graphs and Combinatorics, 9:197200, 1993. 1689 [105] J. Stam. Stable uids. In Proceedings of SIGGRAPH 99, Computer Graphics Proceedings, Annual Conference Series, 121128. pages, 1999. 1726 [106] T. Ásványi, T. Gregorics. A more eective version of algorithm a. Annales Universitatis Scientiarum Budapestinensis de Rolando Eötvös Nominatae, Sectio Computatorica, 17:33 48, 1998. 1635 [107] P. Szeredi, G. Lukácsy, T. Benk®. A szemantikus világháló elmélete és gyakorlata. Typotex, 2005. 1827 [108] F. Szidarovszky, M. E. Gershon. Techniques for Multiobjective Decision Making in Systems Management. Elsevier Press, 1986. 1778 [109] F. Szidarovszky, L. Domoszlai. Conict situations. In A. Iványi (editor), Algorithms of Informatics, Volume 3, 13511387. pages. AnTonCom, 2011. 1779 [110] L. Szirmay-Kalos, B. Tóth, M. Magdics, D. Légrády, A. Penzov. Gamma Photon Transport on the GPU for PET. Lecture Notes on Computer Science, 5910:433440, 2010. 1714 [111] L. Szirmay-Kalos, L. Szécsi, M., Sbert. GPU-Based Techniques for Global Illumination Effects. Morgan and Claypool Publishers, 2008. 1736 [112] L. Szirmay-Kalos. Számítógépes graka. Addison-Wesley, 2005. 1735 [113] L. Szirmay-Kalos, Gy. Antal, F. Csonka. Háromdimenziós graka, animáació és játékfejlesztés. Computer Books, 2003. 1696 [114] N. Tatarchuk, P. Sander, J. L. Mitchell. Early-z culling for ecient GPU-based uid simulation. In W. Engel (editor), ShaderX 5: Advanced Rendering Techniques, 553564. pages. Charles River Media, 2006. 1729 [115] A. D. Taylor, A. Pacelli. Mathematics and Politics. Springer-Verlag, 2008. 1778 [116] W. Thomson. Cooperative models of bargaining. in r. j. aumann and s. hart (szerk.). In Handbook of Game Theory. Elsevier, 1994. 1779 [117] O. G. Troyanskaya, O. Arbell, Y. Koren, G. M. Landau, A. Bolshoy. Sequence complexity proles of prokaryotic genomic sequences: A fast algorithm for calculating linguistic complexity. Bioinformatics, 18:679688, 2002. 1689 [118] F. Zhe, F. Qiu, A. Kaufman, S. Yoakum-Stover. GPU cluster for high performance computing. In Proceedings of the 2004 ACM/IEEE Conference on Supercomputing, SC'04, 4759. pages, 2004. IEEE Computer Society. 1736 [119] Zs. Zsigmondi A. Kiss. Implementation of natural language semantic wildcards using Prolog. In Á. Kiss (editor), 13th Symposium on Programming Languages and Software Tools Szeged, 2013. aug.262013. aug. 27. Szegedi Egyetem Informatikai Tanszékcsoport, 185199, 2013. 1827
Tárgymutató
A
A algoritmus, 1612 A algoritmus család, 1596, 1611 aaversenyek el®írt pontsorozata@(a, a)versenyek el®írt pontsorozata, 1643 aaversenyek eloirt pontsorozata@(a, a)versenyek el®írt pontsorozata, 1645 ábécé, 1647 abkmnszuperverseny@(a, b, k, m, n)szuperverseny, 1636 ablakbonyolultság, 1659, 1689 abn-verseny@(a, b, n)-verseny, 1638 (a, b)-versenyek el®írt pontsorozata, 1643 abversenyek el®írt pontsorozata@(a, b)versenyek el®írt pontsorozata, 1645 Ac algoritmus, 1615 A∗ algoritmus, 1614 A∗ algoritmus hatékonyságának elemzése, 1633 AA∗ algoritmus hatékonyságának elemzése, 1618 adatfolyamfeldolgozó, 1704 adatfolyamsokszorozás, 1705 adatfolyamsz¶rés, 1705 adatfolyamsz¶r®, 1700 AGG kulcsszó, 1815 A∗∗ algoritmus, 1633 algebrai optimalizálás, 1795 állapottér, 1599 állapottér reprezentáció, 1599 állítmány-tárgy alapú vágás, 1805 állítmányalapú vágás, 1805 alsó maximális bonyolultság, 1658 általános gráfkeres® algoritmus, 1608 általános gráfkeres® algoritmusok, 1596 általános gráfkeres® algoritmus, 1600 árnyaló, 1695 atomi m¶velet, 1717 átviteli függvény, 1730 axiomatikus módszerek, 17731777 B
B' algoritmus, 1632 bázisfüggvények, 1723 bal oldali speciális részszó (bal speciális részszó), 1657 Basic Linear Algebra Subprograms, 1708 befejezetlen verseny, 1637 befejezett verseny, 1637 befok, 1652 bemeneti fájl kiválasztása, 1805 bet¶ (szimbólum), 1647 bevezetés az (a, b)-versenyekhez, 1638 bevezetés az abeversenyekhez@bevezetés az (a, b)-versenyekhez, 1639 bilineáris sz¶rés, 1704 bispeciális részszó, 1657
biztosan lezárt csúcsok, 1624 BLAS, 1708 bonyolultság, 1647 ablak, 1689 alsó maximális, 1658 (d1 , d2 )-bonyolultság, 1670 fels® maximális, 1658 globális maximális, 1658, 1662 gyér, 1689 hasáb, 1689 maximális, 1658, 1662 palindrom-, 1680 részszó-, 1659 teljes, 1658, 1667, 1684 Borda-mérték, 1763, 1766, 1769, 1778 Borda-mérték-módszer, 1767 C
C&B algoritmus, 1802 célfüggvény, 1740 Cg, 1694 Champernowne-szó, 1649, 1660, 1685 chase algoritmus, 1801 COLOR, 1707, 1708 ColorGraph1 algoritmus, 1808 ColorGraph2 algoritmus, 1809 csúcspont-árnyaló, 1699 csillag alakú lekérdezés, 1825 csoportos döntéshozatal, 17621770 CUDA, 1694, 1717 cVars, 1795 D
d-közép sorozat, 1679 (d1 , d2 )-bonyolultság, 1670 (d1 , d2 )-részszó, 1669
De Bruijn-fa, 1655 De Bruijn-gráf, 1651 De Bruijn-szó, 1652 De Bruijn-szavakat el®állító algoritmus, 1654 δ -gráf, 1597 δ -tulajdonság, 1597 digráfos sorozat, 1638 digráfos vektor, 1638 diktátor, 1763 dimultigráfos sorozat, 1638 E
eddig megtett út optimális költségfüggvénye, 1607 EGK, 1610 (1, 1)-versenyek el®írt pontsorozata, 16391641 egyenl® veszteség módszere, 1776 egyenletes gráfkeresés, 1610 egyensúlypont, 1753 egyensúlypontok módszere, 17531758
Tárgymutató
1837
Egyensúlypont-keresés, 1755 egységes bemenet, 1705 egzisztenciális kvantor, 1818 el®retekint® gráfkeresés, 1611 el®szelet, 1648 el®relépéses Euler-integrálás, 1726 élállapot, 1599 euleri, 1723 euleri folyadékszimuláció, 1731 F
faktorizálás, 1659 felhasználói csoport, 1827 fels® maximális bonyolultság, 1658 Fibonacci-szó, 1649, 1656, 1659, 1687 oat2, 1710 oat3, 1710 Friend of Friend (FIEF) ontológia, 1811 G
garantált
együttes
célfüggvényérték,
1760 GenerateBestPlan, 1808
globális maximális bonyolultság, 1658,
1662
global, 1720 GPGPU, 1693 GPU, 1693 gráfos sorozat, 1638 gráf, 1651 Rauzy, 1655 gyér részszó, 1669 gyérbonyolultság, 1689 gy¶jt®, 1714 H
hármas-minta, 1806 hármas-minta gráf, 1807 hátralev® optimális költségfüggvény,
1612
Hadoop job, 1805 halmaz méretét megszorító lekérdezés,
1819
halmaz-csúcs reguláris útvonalkérdés lezártja, 1819 halmaz-csúcs reguláris útvonalkérdés, 1819 Hamilton-út, 1652 hasábbonyolultság, 1689 hasznossági függvény, 1743, 17431745 Hasznossági-függvény-módszer,
1745
hatványszó, 1649, 1656, 1659, 1684 helyettesítés, 1799 heurisztikus függvény, 1610 heurisztikus kiértékel® függvény, 1608 hiányos sport, 1637 hisztogram, 1715 HLSL, 1694 homogén koordinátavektor, 1698 homogén osztás, 1698, 1700 host, 1720 I
ideális pont, 1698, 1741, 1747 idevezet® optimális költségfüggvény,
1611
idevezet®
1612
optimális
imputáció, 1760, 1778
távolságfüggvény,
in, 1707 inkorrekt csúcs, 1603 irányított Euler-gráf, 1652 irányfügg® módszerek, 17501753 J
jól tervezett lekérdezés, 1790 jacobi-iteráció, 1727 job, 1806 jobb algoritmus, 1619 jobb oldali speciális részszó (jobb speciális részszó), 1657 jobban informált algoritmus, 1619 join gráf, 1808 K
közösségi háló, 1813 különbségsorozat, 1637 költségbecslés, 1826 következménytér, 1740 közösségi háló, 1811 közeg s¶r¶sége, 1724 képpont, 1697 képsz¶rés, 1727 KalaiSmorodinsky-megoldás, 1775 kameratér, 1697 kameratranszformáció, 1697 karakterisztikus függvény, 1758 Karakterisztikus-függvény, 1759 keres® gráf, 1600 kernel, 1695 keverés, 1701 kezd® állapot, 1599 kiértékelési adatbonyolultság, 1785 kiértékelési bonyolultság, 1785 kiegyensúlyozott szó, 1650 kifok, 1652 kiválasztás, 1705 kiválasztási minta, 1815 koalíció, 1758 költségfüggvény, 1602 kompozitálás, 1698 kompozitáló egység, 1701 koniktus helyzetek, 1778 koniktusos MapReduce join, 1806 konjunktív lekérdezés, 1801 konjunktív reguláris útvonalkérdés, 1818 konjunktív reguláris útvonalkérdés halmazokkal, 1819 konkatenáció (összef¶zés), 1647 konstrukciós minta, 1815 kooperatív játékok módszerei, 17581762 korai z-teszt, 1701, 1711, 1729 korrekt csúcs, 1603 közép sorozat, 1679 KuhnTucker-egyensúlypont, 1756 L
labdarúgó verseny, 1637 lagrange-i, 1723 latin négyzet módszere, 1672 legkisebb négyzetek módszere, 1745 legkisebb periódus, 1648 lekérdezés terv, 1807 leképezés, 1705 lekérdezés bonyolultság, 1827 Lempel-Ziv faktorizálás, 1659 Lempel-Ziv faktorizálási bonyolultság,
1659
LOD-felh®, 1780, 1803
Tárgymutató
1838 M
mélység, 1697 mélységbuer, 1697 mélységbuer-algoritmus, 1698 m¶velet, 1599 MapReduce join, 1806
MapReduceWorkflowGeneration, 1825 Martelli-féle gráf, 1630 Martin, 1654, 1666
Martin-algoritmus, 1654 maximális bonyolultság, 1658, 1662 megengedhet®, 1614 megengedhet® feladat, 1623 megengedhet® útkeres® algoritmus, 1621 megoldási út, 1599 megszorítás, 1801 megvalósítható job, 1807 megvalósítható lekérdezési terv, 1807 mélyslgi gráfkeresés, 1609 menet, 1698 MGK, 1609 MIMD, 1711 Minden-De-Bruijn, 1655 mini-max feladat, 1639 mohó gráfkeresés, 1633 monoton, 1615 monoton terület módszere, 1776 multigráfos sorozat, 1638 multigráfos vektor, 1638 multihalmaz, 1784 multiplicitás, 1784 N
nézetablak transzformáció, 1697 Naiv-el®állítás, 1644 Nash-féle egyensúlypont, 1754 Nash-féle megoldás, 1773 NavierStokes-egyenlet, 1725 nem rosszabb algoritmus, 1619 nem-koniktusos MapReduce join, 1806 nem-megvalósítható job, 1807 nem-megvalósítható lekérdezési terv, 1807 nem-informált kiértékel® függvény, 1608 NeumannMorgenstern megoldás, 1761 nevezetes kiértékel® függvények, 1608 1611, 1618 nyílt csúcs, 1601 O
OpenCL, 1694, 1717 optimális út, 1598 optimális költség, 1598 optimális költségfüggvény, 1612 optimális megoldás, 1740 összef¶zés (konkatenáció), 1647 összefügg® irányított gráf, 1652 out, 1707 P
páronkénti
összehasonlítás
1764, 1767, 1769
módszere,
páronkénti függetlenségi feltétel, 1764 palindrom, 1659 palindrom faktorizálási bonyolultsága,
1659
palindrom szó, 1648 palindrombonyolultság, 1680 palindrombonyolultság függvény, 1680
Pareto-játék, 1739 Pareto-játékok alkalmazása, 17701773 Pareto-leképezés, 1763 Pareto-optimális, 1741, 1741, 1778 Pareto-optimális megoldás, 1746 Páronkénti-összehasonlítás, 1768 periódus, 1648 periodikus szó, 1650 végperiodikus, 1650 perspektív transzformáció, 1697 perspektív vetítés, 1698 π feszít®fa, 1602 π optimális, 1602 pontmátrix, 1638 pontsorozat, 1637, 1638 pontszám, 1636 pontvektor, 1636, 1638 POSITION, 1707 predikáció, 1711 preferencia-struktúra, 1762 primitív szó, 1647 programozási modell, 1694 pVars, 1796 R
Rauzy-gráf, 1655 részszó, 1648 (d1 , d2 )-részszó, 1669 bispeciális, 1657 gyér, 1669 speciális, 1657 részszóbonyolultság, 1658 részszógráf, 1656 részecskék, 1730 részecske, 1723 radiális bázisfüggvény, 1731 rajzoláshívás, 1698 rajzolási cél, 1702 rasztertár, 1697 Rauzy-gráf, 1656 RDF, 1780 RDF reprezentáció, 1812 RDF reprezentá'ció, 1827 RDF term, 1781 redukció, 1705, 1712 reguláris útvonalkérdés, 1818 relációs tábla, 1827 S
séta, 1652 súlyozásos módszer, 17451746 sakk-bridzs verseny, 1637 sakk-tenisz verseny, 1637 samplerRECT, 1708 SAXPY, 1709 SAXPY-nak, 1708 Semantically-Interlinked Online Communities (SIOC) ontológia, 1811 Shapley-érték, 1760, 1778 Shapley-érték, 1761 simító kernel, 1731 SIMD, 1710 SIMD-gép, 1693 Single-Instruction Multiple-Data, 1693 SNQL, 1814 SPARQL, 1781 SPARQL Ask lekérdezés, 1782 SPARQL bonyolultsági kérdései, 1785 SPARQL halmazalgebra, 1783
Tárgymutató SPARQL halmazszemantika, 1782, 1783 SPARQL kifejezés, 1781 SPARQL lekérdezés, 1782 SPARQL multihalmaz szemantika, 1784 SPARQL multihalmaz-algebra, 1784 SPARQL sz¶r®feltétel szemantika, 1782 SPARQL sz¶r®feltétel szintaxis, 1781 SPARQL szemantika, 1782 SPARQL szintaxis, 1781 speciális részszó, 1657 Sturm-típusú szó, 1660, 1684 Sturm-palindromok, 1686 sugárkövetés, 1736 sugármasírozás, 1735 Súlyozásos-módszer, 1746 számossági kvantor, 1819 szélességi gráfkeresés, 1609 szó, 1647 bonyolultsága, 1658 Champernowne-, 1649, 1685 De Bruijn-, 1652 el®szelet, 1648 faktorizálása, 1659 Fibonacci-, 1649, 1656, 1659 hatvány-, 1649, 1659, 1684 kiegyensúlyozott, 1650 palindrom, 1648 periodikus, 1648, 1650 prexum, 1648 primitív, 1647 részszó, 1648 Sturm, 1684 Sturm-típusú, 1660 szivárvány, 1667, 1670 szuxum, 1648 törthatvány, 1681 tükörképe, 1648 végperiodikus, 1650 végszelet, 1648 végtelen, 1649 végtelen Fibonacci, 1650 szó bonyolultsága, 1658 szó hatványa, 1647 szógráf, 1651, 16511657 szál, 1694 szálblokk, 1694 számítógépes áramlásdinamika, 1723 szórás, 1714 sz¶r®kernel, 1709 szavak bonyolultsága, 16471689 szemantikus adat, 1780 szemantikus helyettesít® karakter, 1827 szemantikus optimalizálás, 1800 Szemantikus Web, 17801803 SZGK, 1609 szigorúan uralkodik, 1623, 1624 szimbólum (bet¶), 1647 szivárvány szó, 1667, 1670 szuperverseny, 16361637 T
tükörkép, 1648
1839 több rajzolási cél, 1703 többcélú programozási, 1739 többségi szavazati szabály, 1763, 1765, 1768 többtest probléma, 1733 tömbprocesszornak, 1705 távolságfügg® módszerek, 17471750 Távolságfügg®-módszer, 1750 teljes bonyolultság, 1658, 16671684 teljes képerny®s téglalap, 1706 teljes nézeti téglalap, 1706 teljes sport, 1637 tenisz-bridzs verseny, 1637 tesszelláció, 1697, 1699 TEXCOORD0..7, 1707 texel, 1697 texRECT, 1709 textúra, 1697 textúrasz¶r®, 1704 Többségi-szavazati-szabály, 1766 tournament (verseny), 1639 trilineáris sz¶rés, 1704 U
unió-normálforma, 1789 uniform, 1708 univerzális kvantor, 1818 uralkodik, 1623 üres szó, 1647 út, 1652 út hossza, 1597 út költsége, 1597 útkeresési feladat, 1597 útkeresési feladat gráfreprezentációja,
1599
útkeresési feladatok, 15961600 V
véges szó, 1647 végperiodikus szó, 1650 változó bemenet, 1705 változó leképezése dokumentumra, 1782 véges szó, 1648 végszelet, 1648 végtelen Fibonacci-szó, 1650 végtelen szó, 16491651 vágás, 1697, 1699 vektorprocesszor, 1705 verseny (tournament), 1639 világtér, 1697 virtuális obszervatórium, 1827 virtuális párhuzamos architektúra, 1694 visszamutató pointer, 1602 vonal, 1652 voxelek, 1728 W
Warshall, 1671 Warshall-Latin, 1672
WilfFine-tétel, 1648 WPOS, 1708 Z
zárt csúcs, 1601
Névmutató
A
Allouche, Jean-Paul, 1689, 1831 Anbarci, Nejat, 1779, 1831 Angles, Renzo, 1831 Anisiu, Mira-Cristiana, 1831 Anisiu, Mira-Cristiana (1954), 1586, 1592, 1647, 1689, 1831 Anisiu, Valeriu (1954), 1689, 1831 Antal György (1975, 1586 Antal, György (1975), 1835 Arbell, Ora, 1835 Arenas, Marcelo, 1803, 1834 Arnoux, Pierre, 1831 Arrow, Kenneth Joseph, 1764 Ásványi Tibor (1960), 1635, 1835 Aumann, R. J., 1835 B
Baake, Michael, 1831 Bacsárdi László (1982), 1586, 1592, 1737 Bacsárdi László (1985), 1692 Bagchi, A., 1635, 1831 Baxter, William V., 1833 Beeri, Catriel, 1803, 1831 Bege Antal, 1831 Bege Antal (19622012), 1833 Beineke, L. W., 1641 Belényesi Viktor, 1592 Bell, Nathan, 1831 Benczúr András (1944), 1803, 1831 Benk® Tamás, 1835 Berners-Lee, Tim, 1803, 1832 Berthé, Valerie, 1832 Bizer, Chris, 1803, 1832 Blázsik Zoltán (1958), 1689, 1831 Blázsik Zoltán (1958), 1586 Bolshoy, Alexander, 1835 Borda, Jean-Charles de (17331799), 1763 Borel, J-P., 1832 Bozóki Sándor, 1636 Brlek, Srecko, 1832 Bruijn, Nicolaas Govert, De (19122012), 1651, 1652 C
Carroll, Jeremy, 1803, 1833 Cassaigne, Julien (1970), 1689, 1831, 1832 Champernowne, David Gawen (1912 2000), 1649 Chorut, Christian, 1688, 1832 Chun, Youngshub, 1779, 1832 Cimiano, Philipp, 1834 Consens, P. M., 1832 Corcho, Oscar, 1834 Csörnyei Zoltán (1964), 1592 Cserg® Bálint (1991), 1592
Csonka, Ferenc (19??), 1835 Cyganiak, Richard, 1803, 1832 D
Damanik, David, 1831, 1832 Dean, Jerey, 1827, 1832 Dechter, R., 1635, 1832 Deutsch, Alin, 1803, 1832 Dijkstra, Edger W. (1930), 1610 Domoszlai László, 1586, 1592, 1739, 1779, 1835 Doshi, Pankil, 1827, 1833 Dossey, John A., 1832 Droubay, Xavier, 1689, 1832 Dul, Susanne, 1642 Dustdar, Schahram, 1827, 1834 E
Eberly, David H., 1832 Elzinga, Cees H. (1970), 1689, 1832 Engel, Wolfgang, 1832, 1834, 1835 Erd®s L. Péter, 1636 Erd®s Pál (1913-1996), 1641 Ernst, G., 1635, 1834 Euler, Leonhard (17071783), 1652, 1723 F
Fülöp János, 1636 Fagin, Ronald (1945), 1832 Fan, Zhe, 1835 Fekete István (1951), 1832 Fekete István (19??), 1635 Ferenczi, Sébastien (1958), 1689, 1832 Fernando, Randima, 1832 Fibonacci, Leonardo (11701250), 1649 Fine, Nathan Jacob (19161994), 1648 Fogg, N. Phyteas, 1832 Ford, L. R., 1644, 1832 Forgó Ferenc (1942), 1778, 1833 Fujimoto, Noriyuki, 1833 Fulkerson, D. R., 1832 Fulkerson, Delbert Ray, 1644 Futó Iván, 1635, 1833 G
Gács Péter, 1834 Galambos Máté (1985), 1586, 1592, 1692, 1737 Gallai Tibor (19121992), 1641 Gao, Lixin, 1827, 1834 Garland, Michael, 1831 Gershon, Mark E., 1778, 1835 Ghemawat, Sanjay, 1827, 1832 Gombos Gerg®, 1586, 1804, 1827, 1833, 1834 Gottdank Tibor, 1827, 1833 Govindaraju, Naga, 1834 Gregorics Tibor (1962), 1586, 1592, 1596, 1635, 1832, 1835
Névmutató Griggs, Jerrold, 1640 Gutierrez, Claudio, 1803, 1827, 1831, 1834, 1835 H
Hakimi, S. Louis, 1636, 1641 Hamel, S., 1832 Hamilton, William, Rowan (18051865), 1652 Harris, Mark J., 1833, 1834 Harris, Steve, 1827, 1833 Harsanyi, John F., 1833 Hart, P. E. (1940), 1635, 1833 Hart, P. E. )1940), 1635 Hart, S., 1835 Havel, Vaclav, 1641 Hendler, James, 1803, 1832 Hollink, Laura, 1834 Horváth Péter, 1833 Hulett, H., 1639 Husain, Mohammad, 1827, 1833 I
Ilie, Lucian, 1833 Illés Dávid, 1833 Imre Sándor (1969), 1586, 1592, 1692, 1737 Iványi Antal Miklós (1942), 1689, 1833 Iványi Anna Barbara (1977), 1586, 1592 Iványi Antal Miklós (1942), 1585, 1586, 1592, 1593, 1636, 1646, 1831, 1835 J
Jacobi, Carl Gustav Jakob (18041851), 1729 Jentzsch, Anja, 1803, 1832 K
Kása Zoltán (1948), 1647, 1689, 1831 1833 Kátai Zoltán (1968), 1689, 1833 Kása Zoltán (1948), 1586, 1592 Kátai Zoltán (1968), 1586 Kéri Gerzson, 1636 Kósa Balázs, 1586, 1780 Kaboré, Idrissa, 1689, 1832 Kalai, Ehud, 1775, 1779, 1833 Kapoor, S. F., 1639 Karhumäki, Juhani, 1688, 1832 Kaufman, Arie, 1835 Kemnitz, Arnfried, 1642 Khan, Latifur, 1827, 1833 Khan, Muhammad Ali, 1586, 1592, 1646 Kim, Hyunje, 1636 Kiss Ákos, 1833, 1835 Kiss Attila (1960), 1586, 1592, 1780, 1803, 1804, 1827, 1831, 18331835 Klár Gergely, 1834 Klyne, Graham, 1803, 1833 Kolaitis, Phoikon G. (1950), 1832 Koren, Yair, 1835 Korf, R. E., 1635, 1833, 1834 Krüger, Jens, 1834 Kuhn, Harold William (1925), 1755 L
Légrády Dávid, 1835 Lagrange, Joseph-Luis (17361813), 1723 Landau, Gad M., 1835 Landau, H. G., 1636, 16391641 Laplace, Pierre-Simon (17491827), 1724
1841 Lassila, Ora, 1803, 1832 Lastra, Anselmo, 1833 Lausen, Georg, 1803, 1835 Lefohn, Aaron E., 1834 Lempel, Abraham (1936), 1659 Levé, Florence (1977), 1689, 1833 Liptchinsky, Vitaliy, 1827, 1834 Liu, Liu, 1827, 1834 Lothaire, M., 1834 Lovász László, 1834 Lovász László (1948), 1591 Luca, Aldo de, 1689, 1832 Lucz Loránd, 1636 Luebke, David, 1834 Lukácsy Gergely, 1835 M
Márkus Tibor (1935), 1803, 1831 Mér® László (1949), 1635, 1834 Magdics Milán, 1834, 1835 Mahanti, A., 1635, 1831 Martelli, A., 1630, 1635, 1834 Martin, Monroe Harnish (19072007), 1654, 1834 Matuszka Tamás (1987), 1586, 1592, 1780, 1827, 1833, 1834 Mauduit, Christian, 1831 McBridge, Brian, 1803, 1833 McGlothlin, James, 1827, 1833 Meier, Michael, 1803, 1835 Mendelzon, O. A., 1832 Miklós István, 1636 Minkowski, Hermann (18641909), 1747 Mitchell, Jason L., 1835 Molnár Sándor, 1586, 1779, 1834 mondAt Kiadó, 1585, 1586 mondAt Nyomdaipari és Szolgáltató Kft., 1586 Moon, John W., 1641 Morgenstern, Oskar (19021977), 1761 N
Nagy Sára, 1832 Nagy Sára (1960), 1635 Nash, John Forbes, jr. (1928), 1747, 1779, 1834 Navier, Claude-Louis (17851836), 1725 Nemzeti Kulturális Alap, 1592 Neumann, János (19031957), 1761 Newell, A., 1635, 1834 Nguyen, Hubert, 1834 Nilsson, N. J. (1933), 1635, 1833, 1834 Nivat, Maurice Paul, 1832 Norvig, Peter (1956), 1635, 1835 O
Oktatási Minisztérium, 1592 Ore, Øystein (18991968), 1834 Otto, Alberto, 1832 Owens, John D., 1834 P
Pérez, Jorge, 1787, 1789, 1803, 1834 Pacelli, Allison M., 1778, 1835 Pareto, Vilfredo Federico Damaso (1848 1923), 1739, 1763 Pearl, J., 1635, 1832, 1834 Penzov, Anton, 1835 Pharr, Matt, 1834 Pinczel Balázs, 1586, 1780, 1833
Névmutató
1842 Pirillo, Giuseppe, 1689, 1832 Pirzada, Shariefudddin, 1646 Pirzada, Shariefuddin, 1586, 1592, 1636 Poesz Attila, 1636 Polimeni, A. D., 1639 Pop, Horia F. (1968), 1833 Popa, Lucian, 1803, 1832 Presutti, Valentina, 1834 Prud'hommeaux, Eric, 1803, 1835 Purcell, Tim, 1834 Q
Qiu, Feng, 1835 R
Rácz Gábor, 1586, 1804, 1833 Rónyai Lajos, 1636 Rahmann, Sven, 1832 Raphael, B., 1635, 1833 Rauzy, Gerard (19382010), 1655 Reid, K. Brooks, 16391641 Renzo, Angles, 1803 Reutenauer, Christoe, 1832 Rozenberg, Grzegorz (1942), 1832 Rudolph, Sebastian, 1834 Russell, Stuart J. (1962), 1635, 1835 S
Séébold, Patrice, 1689, 1833 Sótér Péter, 1636 Salomaa, Arto, 1832 San Martin, Mauro, 1827, 1835 Sander, Pedro V., 1835 Satzger, Benjamin, 1827, 1834 Sbert, Mateu, 1835 Scheuermann, Thorsten, 1833 Schmidt, Michael, 1794, 1797, 1800, 1803, 1835 Seaborne, Andy, 1803, 1827, 1833, 1835 Selten, Richard, 1833 Shallit, O. Jerey (1957), 1689, 1835 Shapley, Lloyd Stowell, 1760 Shiokawa, Iekata, 1831 Sidló Csaba István (1978), 1586 Smorodinsky, Meir, 1775, 1779, 1833 Spence, L., 1832 Stam, Jos, 1835 Stokes, George Gabriel (18191903), 1725 Sturm, Jacques Charles François (1803 1855), 1660, 1661, 1685, 1689, 1832 Szécsi László, 1835 Szécsi László, 1586, 1592, 1693 Székely Lászlóo Aladár, 1636
Szép Jen® (19202004), 1833 Szeredi Péter, 1827, 1835 Szidarovszky Ferenc (1945), 1834, 1835 Szidarovszky Ferenc (1945), 1586, 1592, 1739, 1778, 1779, 1833 Szidarovszky, Ferenc (194545), 1835 Szirmay-Kalos László, 1835 Szirmay-Kalos László (19), 1835 Szirmay-Kalos László, 1586, 1592, 1693, 1835 Szirmay-Kalos László (19), 1835 T
Tóth Balázs, 1835 Tamura, Jun-Ichi, 1831 Tan, Wang-Chiew, 1832 Tannen, Val, 1803, 1832 Tapsoba, Théodore, 1689, 1832 Tatarchuk, Natalya, 1835 Taylor, Alan Dana, 1778, 1835 Thomassen, Carsten, 1640, 1642 Thomson, William, 1779, 1835 Toroczkai Zoltán, 1636 Tripathi, Amindba, 1639 Troyanskaya, Olga G., 1689, 1835 Tucker, Albert William (19051995), 1755 V
Van Den Eynden, Charles, 1832 Vardi, Moshe Y, 1803, 1831 Verlet, Loup (1931 ), 1733 Vuillon, Laurent, 1832 W
Wall, C. E., 1639 Wang, H., 1832 Warshall, Stephen (19352006), 1671, 1672 Wilf, Herbert Saul (19312012), 1648 Will, T. G., 1639 Woeginger, Gerhard J., 1639 Wood, Peter T., 1827, 1835 Y
Yin, Jiangtao, 1827, 1834 Yoakum-Stover, Suzanne, 1835 Z
Zabolotnyi, Rostyslav, 1827, 1834 Zare, Douglas, 1832 Zhou, Guofei, 1636 Ziv, Jacob (1931), 1659 Zsigmondi Zsolt, 1827, 1835