Multiagentní modelování: Budování modelu segregace krok za krokem František Kalvas* (Filozofická fakulta Západočeské univerzity v Plzni)
Agent-based Modeling: Constructing a Model of Segregation Step by Step** Abstract: The article presents the construction of an agent-based model of segregation step by step. The article is intended as a tutorial for the reader’s first steps with agent-based modeling. The model is programmed in the NetLogo software and provided in two versions: first as an online executable version, for first-impression purposes, and second as NetLogo code, for serious experiments and further model improvements by the reader. The article describes the user interface and source code of the model in close detail. Most of the article is dedicated to careful, in-depth explanation of the NetLogo code. The model aims to answer Schelling’s classical question: “Is it possible to obtain an ethnically segregated structure of a town with relatively tolerant inhabitants?” The model also aims to answer the question: “Does size of recognized neighbourhood suppress tendency to segregation?” Analysis of the data produced by the model informs us that the tendency to segregation decreased with larger recognized neighbourhood – the larger the neighbourhood the lower the number of inhabitants living in an ethnically homogenous neighbourhood. However, size of recognized neighbourhood did not moderate the relationship between intolerance and tendency to segregation – the slope of the relationship was still the same (or even steeper for larger neighbourhoods). Keywords: Agent-based modeling; multi-agent modeling; social simulation; tutorial; segregation Data a výzkum - SDA Info 2015, Vol. 9, No. 2: 71–102. DOI: http://dx.doi.org/10.13060/23362391.2015.9.2.273 (c) Sociologický ústav AV ČR, v.v.i., Praha 2015 * Kontakt:
[email protected], František Kalvas, Katedra sociologie ZČU, Univerzitní 8, 306 14 Plzeň. Autor děkuje dvěma anonymním recenzentům, jejichž připomínky pomohly zlepšit finální podobu tohoto textu. ** Podpořeno grantem: GA ČR č. P404/11/0949
- 71 -
Již přes 40 let se v zahraničí rozvíjí metodologie multiagentního modelování – zprvu opatrně, posledních 20 let však bouřlivě –, která je českou sociologií zatím málo používána. Multiagentní modelování přistupuje ke zkoumání sociálních procesů pomocí počítačově simulovaných sociálních aktérů, které nazývá agenty. Agenti jsou vlastně krátké počítačové programy, které obsahují instrukce pro to, jak se má agent chovat, jaké informace má sbírat, jak má tyto informace vyhodnocovat, jak má interagovat s ostatními agenty a prostředím, které je také počítačový program. Metoda tak umožňuje sledovat vnitřní stavy agentů, chování agentů, jak je toto chování ovlivněno vzájemnou interakcí agentů, interakcí agentů se simulovaným prostředím a parametry tohoto simulovaného prostředí. Čtenářům časopisu Data a výzkum tato metoda není úplně neznámá. V roce 2013 v tomto časopise vyšel článek Anny Krčkové (2013), který čtenáře seznámil obecně s problematikou multiagentního modelování. Radek Pelánek (2011) věnoval multiagentnímu modelování (pod zkratkou ABM)1 jednu kapitolu ve své knize o modelování komplexních systémů. Hlubší diskusi základů metody v příbuzné sociální vědě, ekonomii, český čtenář najde v práci Tomáše Cahlíka a kolektivu (2006), a to i včetně několika ekonomických problémů řešených pomocí multiagentního modelování. Ve slovenské sociologii uvedli čtenáře obecně, avšak hlouběji do tématu multiagentního modelování Juraj Schenk (2007, 2011) a Marek Mathias (2010, 2013). Jak jsem uvedl, metoda se velice bouřlivě rozvíjí v zahraničí, můžeme tak nalézt nepřeberné množství literatury v angličtině. Za základní kanonické práce v oblasti multiagentního modelování jsou považovány práce Joshuy Epsteina (Epstein, Axtell 1996; Epstein 2006), Nigela Gilberta a Klause Troitzche (2005) a Thomase Schellinga (1978),2 abych uvedl alespoň některé. Často citovaným úvodem do multiagentního modelování je malá kniha, kterou pro slavnou kapesní zelenou kvantitativní řadu nakladatelství SAGE napsal Gilbert (2008). 1 V době, kdy Pelánek (2011) svou knihu psal, nebyl ustálený překlad anglického termínu agent-based modelling, proto autor raději používal anglickou zkratku ABM místo českého termínu. Netroufám si soudit, zda je v současné době již překlad ustálený, nicméně si troufám tvrdit, že v české a slovenské literatuře, která je mi známá, se nejčastěji objevuje termín multiagentní modelování. Pročež jsem jej použil i pro název tohoto článku. Je třeba čtenáře upozornit, že byť je ABM nejrozšířenějším anglickým termínem pro multiagentní modelování, existují i další termíny a jejich zkratky. Zájemce tedy jistě časem narazí na ABC (agent-based computational modelling), ABMS (agent-based modelling and simulation), ABSS (agent-based social simulation), ABS (agent-based simulation), MABS (multiagent-based simulation), MAS (multiagent systems) nebo na artificial society. Nejde o nějakou zlomyslnost autorů, mezi jednotlivými variantami existují vždy nějaké jemné rozdíly, které jsou pro autory v danou chvíli natolik důležité, že úmyslně opouští nejrozšířenější název, ABM, a svůj přístup popisují méně rozšířeným názvem. Odlišovat od sebe jednotlivé přístupy je mimo možnosti tohoto článku. 2 K místu Schellinga v kánonu multiagentního modelování je třeba poznamenat, že jeho uvažování bylo vždy zcela v souladu s touto metodou, avšak vždy brojil proti používání počítačů pro simulování multiagentních modelů. Místo toho doporučoval používat např.
- 72 -
Podobným úvodem je i tento článek, bude však sledovat strategii, která není běžná – bude podrobně sledovat naprogramování klasického modelu krok za krokem, včetně zabudování drobného rozšíření. Dále bude sledovat, jak lze s modelem provést experiment, zaznamenat jeho výsledky a ty nahrát a analyzovat ve statistickém softwaru. Článek by tak měl sloužit jako podrobný praktický průvodce prvními kroky v krajině multiagentního modelování. Nemůže suplovat praktický kurz ani učebnici. Měl by však čtenáři usnadnit rozhodování, zda chce multiagentní modelování používat a investovat čas do jeho ovládnutí. To je hlavní smysl článku: pomoci čtenářům bez jakékoliv předchozí průpravy v programování pochopit logiku multiagentního modelování a sledovat poměrně nekomplikovaný projekt od prvotního nápadu přes realizaci modelu až po analýzu výsledků. Ještě než přistoupíme k samotnému výkladu, je třeba čtenáře varovat před určitým zkresleným dojmem, který by následující text mohl vyvolat, jak naznačili recenzenti tohoto článku ve svých posudcích. Po přečtení článku by se někomu mohlo zdát, že multiagentní modelování spočívá především v tom, že se sepíše a spustí nějaký počítačový program, protože rozboru programovacího jazyka se článek věnuje především. Je to proto, že má-li pro nás počítač nasimulovat nějaký sociální jev, je třeba se s ním „domluvit“ a vhodným programovacím jazykem počítači „vysvětlit“, co po něm chceme simulovat. Trošku v pozadí pak zůstalo, co programování předchází a co po něm následuje. Také bych rád předeslal, že zde prezentované rozšíření modelu není průlomové a má spíše edukativní roli – ukazuje, jak je možné zkusit rozšířit model a jak ověřit, zda jde o průlom, či nikoli. Co a v čem budeme modelovat? V tomto článku se budeme společně zabývat nejklasičtějším multiagentním sociologickým modelem – jde o model etnické segregace (Schelling 1969, 1971). Model je motivován jednoduchou výzkumnou otázkou: Je možné, aby i etnicky tolerantní jedinci vytvořili etnicky homogenní ghetta? Schelling tento model postavil na předpokladu, že aktér se bude řídit jediným jednoduchým pravidlem: pokud v sousedství aktéra nebude dostatek aktérů stejného etnika (řekněme 30 %), aktér bude nespokojený a přestěhuje se na nové místo vybrané zcela náhodně. Experimenty s tímto modelem ukázaly, že toto jednoduché pravidlo, kterým se řídí i relativně tolerantní aktéři na mikro úrovni, vede na makro úrovni ke vzniku ghett a tak silné etnické homogenizaci, kterou bychom při relativní toleranci aktérů intuitivně nečekali. Toto samozřejmě neznamená, šachovnice jako prostředí a mince jako reprezentaci agentů. Tento paradox vysvětlil Rainer Hegselmann (2012). V 70. letech, kdy Schelling tvořil své nejslavnější práce, nebyly počítače připojeny k monitorům, jak je to dnes běžné, nejběžnějším výstupem byla tiskárna, kde se tiskl obvykle výsledek celého výpočetního procesu a ne jeho průběh. Proto Schelling trval na používání šachovnic a mincí či figurek, aby sociální vědec mohl přímo pozorovat rodící se dynamiku studovaného procesu.
- 73 -
že v reálném sociálním světě jsou všichni aktéři tolerantní. Model a s ním provedené experimenty pouze dokazují, že pro vznik etnicky homogenních části města není nutné, aby byli aktéři nějak výrazněji netolerantní. Model, tak jak je v textu prezentován, je rozšířen na základě výzkumných otázek technického charakteru: Ovlivní velikost vnímaného sousedství výsledky? Bude větší vnímané okolí tlumit segregaci? Těmito otázkami se snažím zjistit, zda pozorované výsledky simulací nejsou pouhými artefakty, které vznikají v důsledku toho, jak je model naprogramovaný a jaké parametry jsme pro model zvolili (Hegselmann 2010). Všechny multiagentní modely etnické segregace, které jsem měl možnost studovat, využívaly jako sousedství tzv. Moorovo okolí, tj. 8 nejbližších políček. Je možné, že při větším okolí nebude docházet k tak razantní segregaci, protože se ve větším rozeznávaném sousedství agenti různých etnik lépe rozloží tak, aby segregace nebyla nutná. Navíc je v okolí o např. 80 polích váha každého agenta mnohem menší než v okolí o 8 polích – v širokém okolí méně často dojde k těsnému atakování vyžadované hranice, a tak přesun jednoho podobného agenta méně často vyvolá přesun agenta, který toto pozoruje. Vzato do extrému, kdyby agenti vnímali jako své okolí celé město a pokud by vyžadovaný podíl agentů stejného etnika byl menší než podíl etnika ve městě, byli by všichni spokojení a nikdo by se nestěhoval. Pokud by byly tyto poměry v rozporu, stěhovali by se všichni. A protože nevíme, jak velké okolí rozeznávají reální sociální aktéři, myslím, že je nutné podrobit parametr velikosti sousedství bližšímu zkoumání.3 Schelling sám brojil proti využívání počítačů v multiagentním modelování (Hegselmann 2012, podrobněji viz poznámku pod čarou č. 2), není proto překvapivé, že jej sám nikdy nenaprogramoval. V tomto článku se budeme zabývat modelem segregace, který vychází z verze, kterou naprogramoval Uri Wilensky (1997) v programovacím jazyku NetLogo (Wilensky 1999). Tento jazyk je obecně považován za jednoznačně nejvhodnější pro první kroky v krajině multiagentních modelů. Z dostupných programovacích jazyků, které jsou vhodné pro multiagentní modelování, je NetLogo nejintuitivnější, a proto jej snadno ovládnou badatelé bez jakékoli předchozí zkušenosti s programováním (Gilbert 2008). Z vlastní zkušenosti to mohu potvrdit, avšak musím dodat, že uživatelé za tento snadný vstup musejí zaplatit určitou daň – a tou je snížení výpočetního výkonu. Architektura NetLoga primárně sleduje snadné ovládnutí jazyka začátečníky, ale zároveň zatěžuje počítač více než jiné programovací jazyky. V praxi to znamená, že je možné nenáročné simulace provádět pouze s desítkami tisíc agentů a náročnější maximálně s tisícovkami agentů. Při vyšších počtech agentů se čas běhu simulací přestane prodlužovat lineárně a začne 3 Provedeme tak analýzu robustnosti, jelikož do modelu přidáme nový prvek – velikost sousedství. Jde samozřejmě jen o jednu z mnoha možností, jak robustnost testovat. Mohli bychom do města zavádět větší počet etnik, měnit jejich poměry na různě nevyrovnané, mohli bychom zavést nové pravidlo, že jedno z etnik ve svém sousedství vyžaduje určitou míru přítomnosti toho druhého, tj. je nespokojené v segregované lokalitě, atd.
- 74 -
se prodlužovat exponenciálně, takže je simulace prakticky neproveditelná, a to právě z časových důvodů.4 Pro čtenáře jsem připravil dva způsoby, jak si model segregace prakticky vyzkoušet: v prostředí webového prohlížeče a po instalaci NetLoga. Jednak jsem na adresu http://abm.euweb.cz/SegregationV04DavWeb.html umístil verzi modelu, kterou je možné spouštět přímo v prostředí webového prohlížeče a není nutné si instalovat software NetLogo jen kvůli vyzkoušení modelu segregace. Tato verze má však jisté omezení – v prostředí prohlížeče je možné spouštět pouze jednotlivé simulace, není možné nechat počítač provést systematický experiment a zaznamenat jeho výsledky. Není to možné z principu, jelikož modely jsou z prostředí NetLogo převedeny do prostředí webu tak, aby neměly možnost cokoli ukládat na pevný disk počítače. Proto jsem alespoň na ukázku připravil ke stažení *.csv soubor5 s uloženými výsledky experimentu a *.do soubor6, pomocí kterého je možné *.csv soubor nahrát do programu STATA a zde jej dále analyzovat. Pro čtenáře, kteří program STATA nepoužívají a ani si nevědí rady, jak do jejich statistického programu nahrát *.csv soubor, jsem připravil alespoň dva grafy (viz Grafy 1 a 2 dále)7 jako výstup analýzy vlivu velikosti vnímaného sousedství na míru segregace. Samotný programový kód modelu je ke čtení přístupný v obou připravených variantách, ale upravovat kód programu je možné pouze poté, co si nainstalujeme software NetLogo. Instalační soubor je k dispozici zdarma ke stažení na stránkách North Western University.8 Všechny popisy v tomto článku vycházejí z verze NetLoga 5.3.1, pokud si čtenář opatří vyšší verzi, může se drobně lišit. Po nainstalování NetLoga je třeba z adresy http://abm.euweb.cz/ SegregationV04Dav.nlogo stáhnout soubor s modelem a otevřít jej v NetLogu. Pokud vše proběhlo v pořádku, měl by model vypadat po otevření v prostředí nainstalovaného NetLoga a v prostředí webového prohlížeče takto: 4 Jako příklad mohu uvést vlastní jednoduchý simulační experiment, jehož doba běhu se v NetLogu a Javě lišila o pět řádů. Cílem experimentu bylo vyvrátit hypotézu, že za diskrepancí pozorovanou v sexuologických výzkumech v průměrném počtu sexuálních partnerů mužů a žen by mohla stát úzká skupina žen, která má stovky až tisíce partnerů a která je z důvodu malého počtu těchto žen z výzkumů náhodou opominuta (tedy že výzkumy při vzorku 500 respondentů a 500 respondentek vždy náhodou minou ty ženy, které by průměr žen vybalancovaly na úroveň průměru mužů). Bylo třeba simulovat populaci sedmi milionů agentů, přičemž bylo třeba provést asi 80 milionů simulací z důvodu statistické spolehlivosti při extrémní distribuci partnerů u žen a důvodu mnoha variant počtu žen s extrémně vysokým počtem sexuálních partnerů. Po třech dnech simulování tohoto jevu pomocí software NetLogo jsem odhadl celkovou dobu experimentu na tři tisíce let. Když jsem tutéž simulaci naprogramoval v jazyce Java, proběhl celý experiment za šest dní. 5
http://abm.euweb.cz/nebojmeSeABM.csv.
6
http://abm.euweb.cz/nebojmeSeABM.do.
7 Ke stažení zde: http://abm.euweb.cz/nebojmeSeABM-h3.png a http://abm.euweb.cz/ nebojmeSeABM-psi.png. 8
http://ccl.northwestern.edu/netlogo/.
- 75 -
Obrázek 1: Model v NetLogu
Obrázek 2: Model ve webovém prohlížeči
Popis modelu Simulace využívá model města, který představuje pravidelná čtvercová mřížka o velikosti 5 041 polí (71 x 71), přičemž každé pole reprezentuje jeden dům s pozemkem. Dům je buď prázdný, nebo v něm žije právě jeden agent. Ve městě žijí dvě rovnoměrně zastoupená etnika agentů, červené a zelené. Jednotliví agenti jsou reprezentováni šipkou (konkávní čtyřúhelník) příslušné barvy. Minimální počet jsou dva, maximální 5 040, avšak tyto extrémní počty jsou velmi nepraktické, proto v připraveném modelu nabízím možnost pomocí šedozeleného posuvníku number nastavit počet agentů na 500 až 5 000. Na počátku simulace budou agenti umístěni náhodně do jednotlivých domů (políček modelu města). Po stisknutí šedého tlačítka setup se celý model inicializuje, některé domy se zaplní agenty, některé zůstanou prázdné. V monitorovacím okénku % similar vidíme, kolik má v průměru každý agent ve svém sousedství agentů shodného etnika. Jak se tento údaj vyvíjí během simulace, budeme moci sledovat ve vedlejším grafu Percent similar. Sousedství je definováno pro každého agenta zvlášť, představují jej všechna obsazená9 políčka (domy), jejichž střed se nachází od středu agentova domu (políčka) maximálně v určené vzdálenosti. Tuto vzdálenost, jejíž jednotka je šířka jednoho políčka, se nastavuje posuvníkem stated-radius. Pokud je tato vzdálenost nastavena na 1, představují sousedství agenta až 4 obsazené domy v kolmých směrech (tzv. von Neumannovo okolí), protože středy všech ostatních políček jsou od středu agentova 9 Pokud se na políčku nenachází žádný agent, tak se toto políčko do sousedství nezapočítává.
- 76 -
domu dále než 1. Pokud je nastavena na 1,5, představuje sousedství agenta až 8 obsazených domů, kromě kolmých i v úhlopříčných směrech (tzv. Moorovo okolí), protože vzdálenost domů v rozích sousedství je přibližně 1,41 (přesněji druhá odmocnina ze dvou). Pokud budeme dále po polovině jednotky rádius sousedství zvyšovat, postupně se bude sousedství rozrůstat na 12, 20, 28 obsazených domů atd., až při rádiu 5 bude jeho rozsah až 80 obsazených domů. Okolí je důležité pro určení spokojenosti agenta. Pokud se nachází v jeho okolí dostatečný počet agentů jeho etnika, lépe řečeno pokud tvoří agenti jeho etnika dostatečný podíl mezi jeho sousedy, je agent spokojený. Pokud tento podíl klesne pod mez stanovenou na posuvníku %-similar-wanted, je agent nespokojený. Počet momentálně nespokojených agentů můžeme vidět v monitorovacím okénku % unhappy a jeho vývoj budeme moci sledovat ve vedlejším grafu Percent unhappy. Nespokojený agent se ze svého domu odstěhuje, náhodně si vybere jeden z prázdných domů a přesune se do něj bez ohledu na etnické složení jeho sousedství. Pokud agentovi nebude etnické složení v příštím kole vyhovovat, bude se přesouvat dále. Jak vypadají přesuny agentů v praxi, zjistíme, pokud stiskneme šedé tlačítko go, které celou simulaci spustí. Simulace probíhá v jednotlivých kolech, za nulté kolo můžeme považovat samotnou inicializaci (tlačítko setup), kdy se agenti náhodně rozmístili do jednotlivých domů, spočetli si poměr etnik v sousedství a na základě toho stanovili, zda jsou spokojení, či nikoliv. V prvním kole se všichni nespokojení agenti náhodně přestěhují do některého z prázdných domů. Na konci kola opět všichni agenti zjišťují, zda jsou spokojení s etnickým složením. Nespokojený totiž může být jak stěhující se agent, který si nevybral dobrý dům, tak agent, z jehož okolí se odstěhovalo tolik agentů shodného etnika, že jejich podíl klesl pod přijatelnou mez. Pokud simulaci spustíme (tlačítko go), můžeme si obou těchto případů všimnout. Simulace poběží do té doby, dokud je některý z agentů nespokojený, jakmile nebude přítomen žádný nespokojený agent, simulace se zastaví. Pokud však simulace nedosáhne rovnovážného stavu do 250 kol, zastaví se automaticky po 250. kole. Na následujících šesti obrázcích se můžeme podívat na podobu modelu těsně po inicializaci a po dosažení rovnovážného stavu, a to pro různě hustě obydlené město: 1 010 agentů (20 % domů obydleno), 2 520 agentů (50 %) a 4 030 agentů (80 %). Ve všech třech simulacích je minimální podíl vlastního etnika (%-similar-wanted) nastaven na 30 %, tedy agent je ochoten tolerovat, pokud v jeho sousedství žije i 70 % agentů opačného etnika, a stále jej to nijak nepudí k odstěhování. Z obrázků je patrné, že naše modelové město je nejprve etnicky promíšené, nespokojení agenti se však přesunují, takže v něm vznikají etnicky homogenní plochy. Pro kvantifikaci etnické homogenity jsem vytvořil vlastní velmi jednoduchý index H, který má hodnotu 0–100 a udává, kolik procent agentů žije v etnicky homogenním sousedství, tj. v jejich sousedství nežije žádný agent
- 77 -
Obrázky 3a až 5b:
Ukázky inicializace a rovnovážného stavu modelu segregace
Pozn. Grafické výstupy ze simulací v programu NetLogo. V levém sloupci jsou zobrazeny stavy simulací po inicializaci (a), v pravém rovnovážný stav (b). V jednotlivých řádcích jsou různě hustá obydlení, shora: (3) 20 % domů, (4) 50 % domů a (5) 80 % domů. Velikost mřížky je 71 X 71 polí, minimální požadovaný podíl vlastního etnika 30 %, velikost sousedství 8 nejbližších dlaždic (Moorovo okolí).
- 78 -
opačného etnika. Index má čtyři varianty H0 až H3, H0 počítá se všemi agenty, i s těmi, v jejichž sousedství žádný další agent není. H1 pak bere za základ výpočtu pouze ty agenty, v jejichž sousedství je obydlen alespoň jeden dům, H2 počítá jen s těmi, kteří mají alespoň dva sousedy, a konečně H3 počítá jen s agenty, kteří sousedí s alespoň třemi obydlenými domy. Hodnoty jednotlivých variant indexu H se ukazují ve čtyřech monitorovacích okénkách v levém dolním rohu karty Interface. Ať už se spolehneme na pohled na obrázek rovnovážného stavu, nebo kvantitativní indikátor, je patrné, že o tendenci vytvářet etnicky homogenní plochy nerozhoduje jen požadavek na minimální podíl vlastního etnika v sousedství, ale i hustota obydlení. Pokud nás bude zajímat, jak index H ovlivní hustota obydlení (tj. počet agentů v simulaci), velikost vnímaného sousedství a minimální požadovaný podíl vlastního etnika v sousedství, můžeme nyní nastavovat různé kombinace hodnot těchto proměnných a simulace třeba i opakovaně spouštět. Můžeme ale také provést experiment, kde budeme hodnoty studovaných proměnných systematicky po zvolených krocích měnit, spouštět jednotlivé simulace, jejich výsledky zaznamenávat a tyto výsledky pak analyzovat. Abychom sami nemuseli jednotvárně a mechanicky simulace spouštět a hodnoty zaznamenávat, je v nabídnutém modelu takový experiment naprogramován a připraven. Jak bylo upozorněno výše, pokud chceme s modelem takto experimentovat, není to možné v prostředí webového prohlížeče, je nutné si nainstalovat software NetLogo. Experimenty lze poměrně snadno plánovat a provádět v NetLogo pomocí nástroje BehaviorSpace. Najdeme jej buď v záložce „Tools“ (na obr. 6 vlevo), nebo tento nástroj můžeme spustit klávesovou zkratkou Ctrl+Shift+B. Po spuštění BehaviorSpace se otevře malé okno (na obr. 6 uprostřed nahoře), kde je možné zakládat nové experimenty tlačítkem New. Připravené experimenty lze spouštět stiskem tlačítka Run. Po jeho stisku se nám otevře dialog (viz obr. 6 uprostřed dole), kde můžeme zvolit způsob ukládání výsledků a vytížení procesoru. Doporučuji zaškrtnout Table output, protože pak mají data tvar klasické datové matice, řádky jsou jednotlivé případy, sloupce jednotlivé proměnné. Co se týče nastavení počtu paralelních simulací v okénku Simultaneous runs in paralel, doporučuji zjistit si, kolik jader má procesor vašeho počítače, a na tuto hodnotu jej nastavit. Vyšší hodnoty vedou k zbytečnému zahlcování procesoru, nižší zase k nedostatečnému využití výkonu – v obou případech ztratíme cenný čas. Po stisknutí tlačítka OK budeme vyzváni, abychom zvolili jméno souboru s výsledky a místo, kam se má průběžně ukládat. Zde je třeba varovat – NetLogo samo nedoplňuje koncovky souborů podle jejich typu, nesmíme proto zapomenout za název souboru připojit koncovku .csv. Vraťme se k základnímu oknu BehaviorSpace (obr. 6 uprostřed nahoře). Experimenty, které již nechceme používat, můžeme mazat pomocí tlačítka Delete. Pokud chceme vytvořit velmi podobný experiment a jen jej drobně upravit, avšak původní experiment zachovat, použijeme tlačítko Duplicate. Již existují-
- 79 -
Obrázek 6:
Práce s nástrojem BehaviorSpace
cí experimenty můžeme také upravovat po stisknutí tlačítka Edit. Vidíme, že je zde připraven zatím jeden experiment, pokud jej vybereme a stiskneme Edit, otevře se nám karta s plánem experimentu (na obr. 6 vpravo). Jak můžeme experiment plánovat? V samotném záhlaví karty můžeme měnit jeho název. V horním okně plánujeme, se kterými proměnnými a jak chceme experimentovat – každý řádek je ohraničen hranatými závorkami a věnuje se právě jedné proměnné. Struktura je vždy shodná – nejprve je uvedeno v uvozovkách jméno proměnné a poté jsou uvedeny hodnoty, na které bude proměnná systematicky nastavovaná. Tyto hodnoty se definují buď prostým výčtem, kdy jsou vypsány a odděleny pouze mezerami, nebo definujeme spodní a horní mez intervalu a délku kroku, kterým se má postupovat od dolní k horní mezi. Pokud zvolíme druhou možnost, zapisuje se do hranatých závorek – nejprve spodní mez, poté délka kroku a nakonec horní mez. V našem případě je naplánován experiment s proměnnými %-similar-wanted (hodnoty 15, 34, 41, 51, 61, 67, 72 a 76), number (interval od 500 do 4100 s krokem 900) a stated-radius (hodnoty 1, 1,5, 3 a 5). Všechny tyto hodnoty je v tomto okně samozřejmě možné měnit – pokud bychom se chtěli zaměřit na jemné změny proměnné stated-radius, můžeme např. stávající výčet nahradit intervalem [1 0.5 5]. Po spuštění bude experiment fungovat tak, že pro každou kombinaci hodnot vybraných proměnných bude simulovat model tolikrát, kolikrát je uvedeno v okénku Repetitions. Nyní je nastaveno na 60 opakování pro každou unikátní kombinaci hodnot proměnných, se kterými experimentujeme. V připraveném experimentu je pro %-similar-wanted nastaveno 8 hodnot, pro number 5 hod- 80 -
not a pro stated-radius 4 hodnoty, což představuje 160 kombinací (8 * 5 * 4). Jestliže provedeme pro každou z nich 60 simulací, bude jich v rámci experimentu provedeno celkem 9 600. Jak vidíme, počty simulací rostou s nárůstem počtů použitých hodnot geometrickou řadou, proto je nutné simulované hodnoty promýšlet a zároveň zvažovat i počet opakování. Ideálně bychom měli vybrat omezený počet klíčových hodnot zkoumaných proměnných a nastavit co nejvyšší počet opakování, abychom tak snížili na co nejnižší míru variabilitu výsledků. Pod okénkem Repetitions je okno s proměnnými, jejichž hodnota se bude během všech simulací zaznamenávat a průběžně ukládat do souboru. Proměnné, které jsou uvedené v našem konkrétním případě, budeme podrobně rozebírat níže, nyní postačí uvést, že jsou to různé míry segregace (jak moc jsou agenti obklopeni pouze svým vlastním etnikem) a spokojenosti (jak velký podíl agentů je s etnickým složením nespokojen). Tyto míry se v našem případě zaznamenávají pouze po doběhnutí simulace. Pokud bychom chtěli sledovat vývoj každé simulace od inicializace po její konec, můžeme zaškrtnout políčko Measure runs at every step. Musíme si pak ale vyhradit dost místa na pevném disku počítače, jelikož se velikost souboru s výsledky znásobí průměrným počtem kroků simulace v našem experimentu. V našem případě by to nebyl takový problém – průměrný počet kroků je necelých 67 a velikost souboru je 740 kB, soubor sledující vývoj krok po kroku by tak měl necelých 50 MB, což jistě není u dnešních počítačů problém. Nyní jsou v prostředním okně zaznamenávány pouze globální proměnné, jednotkou záznamu tak je výsledek jedné simulace. Hodnoty individuálních proměnných jednotlivých agentů zaznamenávány nejsou. V principu by to bylo možné, mohli bychom zaznamenávat pro každý krok simulace pro každého agenta jeho spokojenost s etnickým složením jeho sousedství, jeho souřadnice, kolik agentů je v jeho sousedství atd. Věc komplikují tři důvody: (1) Bylo by nutné do prostředního okna zavést pro každého agenta a každou jeho vlastnost proměnnou. To je celkem řešitelné, byť nepohodlné. (2) Razantně by se zvětšil datový soubor s výstupy experimentu, a to pravděpodobně minimálně na desítky GB. Současný soubor s výstupy má cca 760 kB, jde však o závěrečné výsledky popisující pouze výstupy 9 599 simulací. Kdybychom v každém kroku stejně podrobně zaznamenávali stav každého agenta, musíme uvážit, že agentů je v simulacích v průměru 2 300 a simulace běží v průměru asi 60 kol. Velikost souboru se tak musí zvětšit minimálně o pět řádů, tedy ze stovek kB na desítky GB. Zde záleží na technických možnostech každého uživatele simulace, zda má na svém počítači dostatek volného místa. (3) Nejpalčivější problém však je, že pro taková data nyní nemáme žádné vhodné výzkumné otázky. Schelling si kladl otázku, zda i tolerantní aktéři mohou vyprodukovat segregovanou prostorovou strukturu. Na její zodpovězení nám stačí výsledky agregované za celou simulaci. Já jsem model rozšířil na základě výzkumných otázek technického charakteru, zda velikost vnímaného sousedství ovlivní výsledky a zda větší vnímané okolí bude tlumit segregaci. Ani tyto otázky nepotřebujeme řešit pomocí - 81 -
mikro dat zaznamenaných za jednotlivé agenty. Zcela nám postačí makro data popisující simulaci jako celek.10 V dolních oknech Setup commands a Go commands jsou uvedena jména procedur, kterými se má inicializovat simulace (obvykle zde použité setup) a řídit její průběh (obvykle go). Obecně řečeno, všechny procedury, které budou uvedeny v levém okně, provedou nastavení počátku simulace, a které budou v pravém, budou prováděny v každém jednotlivém kroku simulace. V záložce Final commands specifikujeme procedury, které mají být provedeny na konci každého kola. Všimněme si, že zde není žádný prostor pro procedury, které by se měly spustit pouze na konci celé simulace. V záložce Stop condition můžeme specifikovat vnitřní stav simulace, za kterého má být simulace ukončena. Často jde o rovnovážný stav, ve kterém by simulace setrvala donekonečna a již se nevyvíjela (např. všichni agenti jsou spokojení se svým bydlištěm, nikdo nemá chuť se stěhovat). Zda simulace skončí, nemusí vyplývat jen z jejího vnitřního stavu. Můžeme nastavit maximální počet kroků, po které má simulace běžet. Vyhýbáme se tak problému, že simulace za daných podmínek buď rovnovážný stav nemá, nebo je vysoce nepravděpodobné, že jej dosáhne, a tudíž by běžela do nekonečna. Počet maximálních kroků můžeme nastavit v okénku Time limit. Zde je nastavena hodnota 250. Po stisknutí tlačítka OK v zápatí karty (obr. 6 vpravo) se naše úpravy experimentu uloží a můžeme experiment spustit tlačítkem Run v hlavním okně BehaviorSpace (obr. 6 uprostřed nahoře). Jak jsem naznačil výše, NetLogo nám pak ukládá výsledky do zvoleného adresáře ve formě *.csv souboru. Tento formát obsahuje data v textové podobě, jednotlivé výsledky jsou oddělené čárkami. Soubor si tak můžeme prohlédnout v libovolném textovém editoru, ale především každý statistický program umí tento formát dat načíst. Pro uživatele programu STATA jsem připravil ke stažení *.do soubor11, který data načte a provede jednoduchou analýzu. K dispozici je i soubor s výsledky experimen10 Můžeme si však představit, že bychom proměnné, které nyní nastavujeme všem agentům stejně (stated-radius, %-similar-wanted), nastavovali každému agentovi jinak – např. náhodně v zadaném rozmezí. Každý z nich by pak vnímal jinak velké sousedství a každý by v něm vyžadoval jiný podíl vlastního etnika. Pak by bylo namístě se ptát: Jakou má proces segregace dynamiku? Rozhýbávají ho nejvíce netolerantní aktéři? Může jejich netoleranci tlumit velikost vnímaného okolí? Jaká je distribuce netolerance napříč segregovanými oblastmi? Kolik aktérů vůbec nezmění své místo za celou dobu simulace? Mají nějaké typické vlastnosti? Některé tyto otázky jsou zodpověditelné, pokud údaje o agentech zaznamenáme na začátku a konci simulace. Pokud bychom ale chtěli sledovat dynamiku jevu v rámci jednotlivých mikro kontextů, tedy sousedství každého agenta, je nutné zaznamenat údaje každého agenta v každém kroku simulace. Původní Schellingův model stojí na skrytém předpokladu, že všichni jsme zhruba stejně tolerantní a vnímáme stejně své okolí. Kladením výše uvedených otázek a sledováním změny také na úrovni sousedství každého agenta bychom testovali, zda má smysl s těmito skrytými předpoklady vůbec polemizovat. 11 http://abm.euweb.cz/nebojmeSeABM.do.
- 82 -
tu ve formátu *.csv12, který jsem připravil pro čtenáře, kteří si nemohou nebo nechtějí instalovat NetLogo, ale přesto by si rádi zkusili analyzovat výsledky z experimentu. Pozor, všechny údaje, byť číselné, jsou zaznamenávány jako textový řetězec. Většina statistických balíků je proto načte jako text a je třeba se připravit na převod číselných údajů do formátu čísla. Zde může nastat poslední problém – NetLogo používá desetinnou tečku a nikoli čárku. Je s tím třeba opět počítat – pokud váš statistický balík používá desetinné čárky, je dobré tečky ještě ve formě textu nahradit čárkami a až poté převést text na číslo. STATA však používá desetinné tečky, je tedy v tomto s NetLogem kompatibilní. Komentované představení programového kódu Detailně jsme probrali viditelnou část modelu. Nyní se podíváme, jak je tato viditelná část naprogramována. Samotný programový kód je viditelný i v prostředí webového prohlížeče, ale není jej v tomto prostředí možné upravit. A protože budu diskutovat možnosti úprav, budu v této části vycházet z předpokladu, že má čtenář nainstalované NetLogo. Čtenáři, kteří nad instalací stále váhají, mohou samozřejmě na konci webové stránky http://abm.euweb. cz/SegregationV04DavWeb.html kód sledovat po rozkliknutí nabídky NetLogo Code na konci stránky. Ale mohou jej pouze sledovat. V software NetLogo musíme přepnout mezi kartami, na kterých je uložen model, abychom programový kód modelu viděli. Musíme tedy přepnout z karty Interface, kde jsme až dosud pracovali, na kartu Code, kde se skrývá samotný kód. Kódem budeme procházet po jednotlivých blocích. Začneme blokem, kde se definují použité proměnné.
Kód 1: Definice proměnných globals [ percent-similar ;; on the average, what percent of a turtle‘s neighbors ;; are the same color as that turtle? percent-unhappy ;; what percent of the turtles are unhappy? h0 ;; homogeneity coeficient: counts how many turtles are ;; living in ethnicly homogamous neighbourhood h1 ;; homogeneity coeficient: counts how many turtles ;; (with at least 1 neighbour) are living in ethnicly ;; homogamous neighbourhood h2 ;; homogeneity coeficient: counts how many turtles ;; (with at least 2 neighbours) are living in ethnicly ;; homogamous neighbourhood h3 ;; homogeneity coeficient: counts how many turtles ;; (with at least 3 neighbours) are living in ethnicly ;; homogamous neighbourhood ] 12 http://abm.euweb.cz/nebojmeSeABM.csv.
- 83 -
turtles-own [ happy? ;; for each turtle, indicates whether at least ;; %-similar-wanted percent of that turtles‘ neighbors ;; are the same color as the turtle similar-nearby ;; how many neighboring patches have turtle with my color? total-nearby ;; how many neighboring patches have turtle? ]
Příkaz globals [] zavádí globální proměnné, tedy takové, kam se ukládají nějaké celkové hodnoty, jde obvykle o nějaké kontextové proměnné, přičemž kontextem je celá simulace. Mezi hranatými závorkami jsou tyto proměnné vypsány. Jde o percent-similar, což je průměrný údaj udávající, kolik mají jednotliví agenti agentů shodné barvy/etnika v sousedství, které sledují. Další globální proměnnou je percent-unhappy, ta říká, jak velký podíl agentů je nespokojený s etnickou skladbou svého sousedství. Globální proměnné h0, h1, h2 a h3 udávají, jak velký podíl agentů žije v etnicky naprosto homogenním sousedství, tj. všichni agenti v sousedství mají stejnou barvu jako agent, který toto sousedství sleduje. Rozdíly mezi jednotlivými proměnnými h byly již rozebrány výše. Hranaté závorky („[]“) jsou věcí syntaxe jazyka NetLogo, píší se za každý příkaz a mezi tyto závorky se pak píší parametry a argumenty tohoto příkazu. Díky tomu je možné příkaz přehledně rozepsat na několik řádek a i tak je jasné, že vše na řádcích mezi úvodní a závěrečnou závorkou náleží příkazu, který závorku předchází. Další prvek, který se zde objevuje, je dvojstředník („;;“). Ten se používá pro psaní poznámek a komentářů přímo do kódu. To, co je za tímto znakem, nijak neovlivní běh programu, poznámky tak slouží jen autorovi a dalším uživatelům modelu pro snadnou orientaci v kódu programu. Ještě poznamenám, že by stačilo psát pouhý středník („;“) z důvodů, které neznám, se však v komunitě uživatelů NetLoga vyvinul zvyk používat dvojstředník („;;“). Má vlastní zkušenost je taková, že oddělování poznámek dvojstředníkem („;;“) je přehlednější. Příkaz turtles-own [] zavádí proměnné agentů. Agenti mají sice řadu proměnných zavedených přímo NetLogem, např. pořadové číslo (who), barvu (color), velikost (size), polohu (xcor a ycor), směr pohybu nebo pohledu (heading) a další. Pokud v našem modelu s těmito předem zavedenými proměnnými nevystačíme, je třeba je zavést. Nyní, když chápeme funkci dvojstředníku, je z ukázky patrné, že k zavedení obou typů proměnných dojde pouze tím, že se vyjmenují. První nově zavedenou proměnnou agentů je proměnná happy?, která indikuje, zda je agent spokojený nebo ne. Otazník jako součást názvu proměnné je konvencí zavedené v komunitě uživatelů NetLoga. Autor tak naznačuje uživatelům, že v modelu hodlá takovou proměnnou používat jako typ pravda/nepravda (true/false). Zde tedy již nyní můžeme tušit, že agenti, kteří budou se skladbou svého sousedství spokojení, budou mít hodnotu proměnné happy? pravda a ti nespokojení v ní budou mít uloženu hodnotu nepravda. V proměnné similar-nearby bude uložen počet agentů stejné barvy - 84 -
ve sledovaném sousedství a total-nearby bude obsahovat počet všech agentů v sousedství. Toto však nejsou všechny proměnné, které model obsahuje. Posuvníky (number, %-similar-wanted, stated-radius) zároveň fungují jako číselné proměnné, které je možné v modelu využívat. Je také možné z programu modelu hodnoty posuvníků nastavovat. Pak se v modelu ještě vyskytují dočasné proměnné, ale jejich funkci si vysvětlíme, až na ně narazíme během procházení kódu modelu. Kód 2: Inicializace modelu to setup ;; clear-all ca ;; create turtles on random patches. ask n-of number patches [ sprout 1 [ set color red ] ] ;; turn half the turtles green ask n-of (number / 2) turtles [ set color green ] update-variables reset-ticks end
Samotná inicializace začíná příkazem to setup a končí příkazem end. Tuto obecnou strukturu mají všechny procedury v NetLogu, jak ve zbytku programu modelu uvidíme. Samozřejmě ostatní procedury se nejmenují setup, a tak mají po to uvedené své vlastní jméno. Vlastní proceduru pak tvoří kód mezi názvem a příkazem end. Na počátku procedury setup nám jde o to, promazat všechny potřebné objekty na kartě Interface. Můžeme to jednoduše provést příkazem clear-all, zde je použita jeho zkratka ca. Následuje příkaz ask n-of number patches []. Samotné ask se používá proto, abychom buď my jako pozorovatel o něco požádali agenty či nějakou část simulovaného prostředí, nebo aby sami agenti či části prostředí o něco někoho či něco žádali. Kdo žádá, to vyplývá vždy z kontextu, v tomto případě jsme to my jako pozorovatelé, neboť tento konkrétní příkaz ask je volán procedurou setup (je její součástí) a tuto proceduru jsme zavolali my stisknutím tlačítka setup. Kdo je žádán, to je specifikováno vždy mezi ask a počáteční hranatou - 85 -
závorkou („[“). V tomto případě to je n-of number patches. O co jde? Klíčové slovo patches označuje všechny dlaždice, ze kterých se skládá půdorys našeho simulovaného města. Pokud by ve specifikaci toho, kdo je žádán, nebylo již nic dalšího uvedeno, žádali bychom všech 5 041 dlaždic. Ale je tu ještě uvedeno n-of number, což znamená, že bude požádána pouze část dlaždic. Proměnnou number již známe, její hodnota je určena posuvníkem number, bude tedy požádáno právě tolik dlaždic, jako je hodnota nastavená na posuvníku. A příkaz n-of říká, že má být tento počet vybrán náhodně. Význam příkazu tedy je, že náhodně vybereme tolik dlaždic, kolik odpovídá proměnné number, a ty požádáme. V hranatých závorkách („[]“) je pak uvedený příkaz, který mají požádané dlaždice vykonat. Tím příkazem je sprout 1 [set color red].13 A znamená, že každá požádaná dlaždice vytvoří právě jednoho agenta (sprout 1), jehož barva bude nastavena jako červená ([set color red]). Příkaz set se používá vždy, když chceme nastavit hodnotu nějaké již existující proměnné. Víme již, že agenti automaticky obsahují proměnnou color, pokud tedy chceme, aby všichni agenti měli jednotnou barvu, je třeba to nastavit. Po příkazu sprout může následovat i jiná číslovka, nebo dokonce číselná proměnná a dlaždice pak stvoří přesně tolik agentů, kolik je v číslovce či proměnné uvedeno. Dodejme, že v hranatých závorkách („[]“) může být uvedeno libovolné množství příkazů, tyto příkazy se pouze musejí týkat právě stvořených agentů, protože právě jejich podobu a vlastnosti tyto příkazy formují. Nyní je snadné dešifrovat příkaz ask n-of (number / 2) turtles [ set color green ]. Jsme to opět my jako pozorovatelé, kdo pomocí ask žádá, a to náhodně vybranou (n-of) část agentů (turtles). Jelikož v předchozím příkazu dlaždice v počtu odpovídajícím hodnotě proměnné number stvořili právě jednoho agenta, víme, že počet agentů také odpovídá hodnotě proměnné number. Žádáme tedy polovinu agentů (number / 2) a tito vybraní agenti změní svou barvu na zelenou (set color green). Dodejme, že z historických důvodů se agenti v NetLogu označují klíčovým slovem turtles.14 Ještě je nutné poznamenat, že příkazy uvedené v hranatých závorkách („[]“) nevykonají požádaní všichni zároveň. NetLogo zvolí náhodné pořadí a v něm požádaní vykonají jeden po druhém zadanou sadu příkazů.15 13 Všimněte si, že zde v textu nejsou odsazovány hranaté závorky tak, jak jsou odsazené v NetLogo a ukázce kód 2. Oba způsoby jsou ekvivalentní. V praxi se však využívá odsazování, které zvyšuje přehlednost. 14 Kořeny NetLoga sahají přes StarLogoT až k programovacímu jazyku Logo, který sloužil k výuce programování školních dětí, které v něm měly získat základní návyky a měly si osvojit programátorské myšlení. Aby pro ně programování bylo zábavnější, spočívalo v tom, že malý začínající programátor svým programem řídil chování jedné želvy nebo rovnou několika želv. Zde je dle mého názoru historický kořen toho, proč nejsou agenti v NetLogu označováni logičtějším agents. 15 V tomto případě je samozřejmě jedno, zda se vybraná polovina agentů obarví na zeleno jeden po druhém, nebo všichni zároveň. Pokud však agenti reagují vzájemně jeden
- 86 -
Těsně před koncem procedury setup nalezneme volání procedury update-variables. Její obsah si podrobněji vysvětlíme později, nyní postačí, když uvedu, že zavoláním této procedury dojde k tomu, že všichni agenti prozkoumají své sousedství a zjistí, zda je zde dostatečný poměr agentů jejich etnika. Pokud ano, jsou šťastní, pokud ne, chtějí se odstěhovat (ale nestěhují se!). Dále tato procedura nastaví všechny indikátory, které monitorují stav celé simulace (kolik je celkem šťastných agentů, koeficienty homogenity atd.). Procedura setup tak končí příkazem reset-ticks, který nastaví počítadlo proběhlých kol simulace na hodnotu 0. Kód 3: Běh modelu to go move-unhappy-turtles update-variables tick if (ticks >= 250 or percent-unhappy = 0) [stop] end
O samotný běh modelu se stará poměrně krátká procedura go. Spouštíme ji buď pomocí spuštěného experimentu z BehaviorSpace, nebo z karty Interface tlačítkem go, které je nastaveno tak, aby spouštělo proceduru go neustále, dokud nebude zastavena příkazem stop. Jak vidíme v kódu 3, příkaz stop je zavolán příkazem if. Obecná struktura příkazu je if (podmínka)[], přičemž podmínku není nutné psát do závorek, zde tak činím jen pro přehlednost. Jako podmínka se chápe argument specifikovaný mezi if a úvodní hranatou závorkou („[“). Pokud je splněna, provede se příkaz uvedený mezi hranatými závorkami. Nejsme přitom omezeni na jediný příkaz, mezi hranatými závorkami může být uvedena rozsáhlá sada příkazů strukturovaná dalšími podmínkami. Zde je však volán pouze příkaz stop, a to pokud je splněna podmínka ticks >= 250 or percent-unhappy = 0. Proměnná ticks je přímo vestavěná v NetLogu na druhého, je tento detail důležitý. Představme si situaci, kdy máme 4 červené a 4 zelené agenty, všech 8 agentů tuto situaci vnímá jako sousedství, jehož etnickou skladbu sleduje. Dejme tomu, že vyžadovaný poměr vlastního etnika je 50 %. Každý agent tedy vnímá situaci jako nevyhovující, protože v ní pozoruje 3 sousedy vlastního a 4 sousedy cizího etnika. Dejme tomu, že agenti budou příkazem ask požádáni, aby zhodnotili situaci, a pokud s ní budou nespokojení, aby ji opustili a přestěhovali se na jiné místo. Pokud bude náhodou jako první vybrán zelený agent, zhodnotí situaci jako nevyhovující (protože pozoruje 3 zelené sousedy a 4 červené), a tudíž se tento zelený agent přesune jinam. Pokud po něm bude vybrán červený agent, nic nebude provádět, protože bude pozorovat 3 červené sousedy a 3 zelené, což odpovídá minimálnímu podílu vlastního etnika 50 %. Sousedství tedy postupně opustí 3 zbývající zelení agenti, protože budou vnímat situaci jako nevyhovující (budou postupně zaznamenávat etnické poměry sousedů 2 : 4, 1 : 4 a 0 : 4). Pokud by náhodou byl jako první vybrán červený agent, situace by dopadla přesně opačně – v sousedství by zbyli pouze zelení agenti a všichni červení by je opustili.
- 87 -
a udává, kolik kol simulace již proběhlo. Proměnná percent-unhappy udává podíl nespokojených agentů s etnickou skladbou jejich sousedství. Pokud se tedy stane, že buď proběhne 250. kolo simulace, nebo budou všichni agenti spokojení, podmínka bude splněna, bude proveden příkaz stop a nekonečný běh tlačítka go se ukončí. Vestavěné počítadlo proběhlých kol ticks ovlivňuje příkaz tick, kdykoli je použit, zvýší se hodnota ticks o jedna. V proceduře go tak zbývají již jen procedury move-unhappy-turtles a update-variables, na které se nyní podíváme podrobněji. Kód 4: Procedura move-unhappy-turtles to move-unhappy-turtles ask turtles with [not happy?] [ find-new-spot ] end to find-new-spot rt random-float 360 fd random-float 10 if any? other turtles-here [ find-new-spot ] ;; keep going until we find an unoccupied patch move-to patch-here ;; move to center of patch end
Samotná procedura move-unhappy-turtles obsahuje vlastně jediný příkaz, a to ask, který vybrané agenty požádá, aby provedli proceduru find-new-spot. Podmínka with[] specifikuje, kteří agenti budou požádáni – jsou to samozřejmě ti, kteří odpovídají podmínce uvedené v hranatých závorkách („[]“). V našem případě zní podmínka not happy?. Již víme, že happy? je proměnná typu pravda/nepravda, operátor not pak neguje její hodnotu. Je-li v proměnné uložena hodnota pravda (true), operátor ji zneguje a výsledek bude nepravda (false), podobně původní hodnotu nepravda (false) zneguje operátor not na pravdu (true). Požádáni tedy budou ti agenti, pro které je výsledná hodnota podmínky with[] pravda (true), jsou to tedy nespokojení agenti, kteří mají v proměnné happy? uloženu hodnotu nepravda (false). Alternativní zápis podmínky by tedy také mohl být happy? = false. Zatímco jsme proceduru move-unhappy-turtles volali my z pozice pozorovatele, proceduru find-new-spot volají sami vybraní agenti. Na rozdíl od předchozích procedur, které jsme volali jako pozorovatelé, a tudíž byly provedeny jen jednou (neboť pozorovatel je jen jeden), bude procedura find-new-spot provedena tolikrát, kolik agentů vyhovuje podmínce not happy?. Samotná procedura se skládá ze dvou příkazů (rt a fd) a jedné podmínky (if), která může vyústit v opětovné zavolání procedury. Příkaz rt přepíše hodnotu do agentů vestavěné proměnné heading, která určuje, pod jakým úhlem se bude agent dívat nebo pohybovat. Hodnota pro-
- 88 -
měnné heading je 0 až 360, přičemž 0 znamená, že se agent dívá nebo pohybuje přímo vzhůru k hornímu okraji monitoru (směřuje tedy kolmo k němu), hodnota 90 znamená, že se dívá přímo vpravo, 180 přímo dolů a 270 přímo vlevo. Argument random-float 360 vybere náhodné desetinné číslo, které je menší než 360 a větší nebo rovno 0. Příkaz rt random-float 360 tedy agenta otočí náhodně vybraným směrem. Příkaz fd posune agenta o udaný počet polí vpřed, jelikož celý příkaz zní fd random-float 10, tak víme, že se agent posune o náhodně vybraných 0 až 10 polí vpřed. Následuje příkaz if, jehož obecný význam již známe. Pokud zde bude splněna uvedená podmínka, tak agent znovu zavolá proceduru find-new-spot. Takže aktuální běh procedury ani nedokončuje, okamžitě se znovu otočí náhodným směrem, znovu se posune vpřed o 0 až 10 polí a znovu prověří podmínku, která zní if any? other turtles-here [find-new-spot]. Podmínce if [] a proceduře find-new-spot již rozumíme, víme, že procedura bude zavolána, když bude pravdivý argument any? other turtles-here. Ten se vlastně ptá: „Je na dlaždici, kde právě stojím, ještě nějaký jiný agent?“ Argument any? má totiž hodnotu pravda (true), pokud existuje alespoň jeden agent nebo jakýkoli další prvek, který splňuje další podmínky. Operátor other znamená „jiný, než ten, kdo operátor other použil“. V tomto případě, kdy other použije některý vybraný agent, je jasné, že označuje jiné agenty. Po other je však vždy nutné uvést, kdo mají být ti jiní – nemusí totiž jít o všechny agenty (turtles), může jít o agenty s nějakou vlastností (with[]), agenty v určité vzdálenosti (in-radius) atd. Zde jsou tito jiní specifikovaní jako turtles-here, což označuje agenty, kteří stojí na stejné dlaždici jako agent, který proceduru zavolal a nyní posuzuje pravdivost argumentu podmínky. Tedy, argument any? other turtles-here má hodnotu pravda (true), pokud agent stojí na dlaždici, kde stojí také nějaký další agent. Pokud stojí agent na dlaždici sám, je hodnota argumentu nepravda (false), a agent tedy nevolá proceduru find-new-spot znovu a místo toho ji dokončí. Poslední příkaz, move-to, přesune agenta na vybranou dlaždici. Argument patch-here může na první pohled působit zbytečně, neboť označuje dlaždici, na které právě agent stojí. Proč tedy přesouvat agenta někam, kde už je? Příkaz move-to má však jistý smysl – pokud agenta přesouvá, přesune ho tak, aby střed agenta (šipky/konkávního čtyřúhelníku) byl přesně na středu dlaždice. Z výše uvedeného víme, že se agenti posouvají vpřed o jakékoli číslo ze spojitého intervalu 0 až 10, je tak málo pravděpodobné, že by se vždy strefili přesně na střed volné dlaždice. Příkaz move-to patch-here tedy nezajišťuje přímo přesun agenta, je zde použit proto, aby střed agenta byl umístěn přesně na střed dlaždice. Jak by běh modelu vypadal bez tohoto příkazu, snadno zjistíme, když před něj napíšeme dvojstředník („;;“), NetLogo tak příkaz bude považovat za poznámku a nebude mu věnovat pozornost.
- 89 -
Kód 5: Procedury update-variables a update-turtles to update-variables update-turtles update-globals end to update-turtles ask turtles [ let turtles-nearby other turtles in-radius stated-radius set similar-nearby count turtles-nearby with [color = [color] of myself] set total-nearby count turtles-nearby let minimum-wanted (%-similar-wanted * total-nearby / 100) set happy? similar-nearby >= minimum-wanted ] end
Procedura update-variables zajišťuje aktualizaci hodnot vybraných globálních proměnných a vybraných proměnných agentů. Již víme, že je tato procedura volána na konci procedury setup a na konci každého kola simulace v proceduře go. Procedura funguje tak, že nejprve zavolá proceduru update-turtles, která zajistí aktualizaci proměnných similar-nearby, total-nearby a happy?. Tyto aktualizované hodnoty pak využije procedura update-globals, která s jejich pomocí aktualizuje proměnné percent-similar a percent-unhappy a indexy h0, h1, h2 a h3. Samotná procedura update-turtles požádá16 příkazem ask turtles [] všechny agenty, aby provedli sadu příkazů specifikovanou v hranatých závorkách („[]“). První je zatím nediskutovaný příkaz let. Ten má tu funkci, že ustaví novou dočasnou proměnnou, jejíž název je uvedený ihned za příkazem. To znamená, že let vytvoří proměnnou, která po doběhnutí procedury nebo příkazu okamžitě zaniká. Důležité je upozornit, že proměnná zaniká až na konci příkazu nebo procedury. Procedura (nebo příkaz), která použila příkaz let, totiž může obsahovat další vnořené procedury a příkazy. V nich bude proměnná vytvořená pomocí let stále existovat. Musíme tedy pečlivě zvažovat název proměnné, není totiž možné vytvořit dočasnou proměnnou pod názvem, pod kterým již existuje jiná proměnná. V praxi se let používá pro uložení hodnot, které zjednoduší konstrukci jinak komplikovaných vzorců (např. pro uložení hodnoty čitatele nebo jmenovatele komplikovaného zlomku), nebo pro uložení specifikace skupiny agentů, se kterými chceme dále pracovat. V našem případě si pomocí let potřebujeme poznamenat do proměnné turtles-nearby, jací agenti se vyskytují v sousedství agenta, který právě provádí příkaz ask[]. Sousedství je zde de16 Přesněji žádáme my jako pozorovatel, neboť my jsme zavolali buď proceduru go, nebo setup, tudíž procedura update-variables je sensu stricto volána námi, stejně jako další volaná procedura update-turtles. Jsme to tedy my jako pozorovatel, kdo žádá všechny agenty příkazem ask turtles [].
- 90 -
finováno jako other turtles in-radius stated-radius. Náš agent tedy jako své sousedy vidí ostatní agenty, než je on sám (other), kteří se nacházejí v okruhu (in-radius) vymezeném proměnnou stated-radius. Všechny sousedy bez ohledu na jejich barvu máme uložené v dočasné proměnné a můžeme s nimi dále pracovat. Nejprve z těchto sousedů uděláme výběr těch, kteří mají shodnou barvu s agentem, který sadu příkazů právě provádí. Počet těchto vybraných sousedů bude uložen do proměnné similar-nearby pomocí příkazu set. V proměnné turtles-nearby nemáme uložený počet sousedů, jsou tam uloženi samotní sousedé (resp. jejich seznam), proto musíme použít příkaz, kterým spočítáme, kolik sousedů na seznamu je. Tím příkazem je count. V případě similar-nearby však nehledáme počet všech sousedů, ale jen těch, kteří mají stejnou barvu jako agent, který příkaz provádí. Výběr z turtles-nearby provedeme pomocí podmínky with[]. Argument této podmínky (color = [color] of myself) znamená, že agent vybírá sousedy, jejichž barva (color) je shodná s jeho. Tento argument si ale zasluhuje naši bližší pozornost. Již víme, že color je vestavěná proměnná, jejíž hodnota kóduje barvu agenta, první část argumentu je tedy jasná, budeme vybírat sousedy, kteří budou mít určitou barvu. Ta je definovaná zatím nesrozumitelným [color] of myself. Proč je proměnná color v hranatých závorkách? Je to kvůli syntaxi operátoru of myself. Do hranatých závorek se uvede nějaká proměnná, kterou má agent, který tento operátor používá. Celý operátor pak odpovídá hodnotě, kterou má proměnná uvedená v závorkách v případě agenta, který operátor použil. V našem případě to znamená, že jsme jako pozorovatel zadali příkaz ask turtles [], ten v danou chvíli náhodně vybral agenta, který provádí jednotlivé příkazy uvedené mezi hranatými závorkami („[]“). Tento konající agent postupně dospěl k příkazu set similar-nearby count turtles-nearby with [color = [color] of myself]. Protože operátor []of myself odkazuje k agentovi, který provádí příkaz (nebo volá proceduru), má [color] of myself hodnotu barvy tohoto agenta. Konající agent tedy porovná postupně barvu všech sousedů se svou vlastní barvou a počet (count) sousedů (turtles-nearby) vyhovujících podmínce (with[]) o shodné barvě (color = [color] of myself) si uloží do proměnné similar-nearby. Dalším příkazem si agent zaznamená, kolik sousedů vlastně v jeho okolí je (set total-nearby count turtles-nearby). Jde tady opět o použití příkazu count, kterým se pouze spočte, kolik sousedů je na seznamu turtles-nearby. Pak si agent vytvoří dočasnou proměnnou minimum-wanted příkazem let. Její hodnota říká, kolik by měl minimálně najít ve svém okolí sousedů shodné barvy, aby byl spokojený. Minimální vyžadovaný podíl sousedů shodné barvy pro celou simulaci je uložen v globální proměnné %-similar-wanted, která představuje celé číslo na škále 0–100. Tuto globální proměnnou vydělíme 100, abychom dostali desetinné číslo na škále 0–1, a toto číslo vynásobíme počtem sousedů konajícího agenta (turtles-nearby). A na závěr použijeme tuto dočasnou proměnnou na nastavení spokojenosti konajícího agenta.
- 91 -
To se provede pomocí příkazu set happy? similar-nearby >= minimum-wanted. Z předchozího již víme, že příkaz set nastaví hodnotu existující proměnné a že happy? je proměnná typu pravda/nepravda, kde je buď uložena hodnota true, nebo false. Zbytek příkazu nás ale může zarazit tím, že vypadá spíše jako argument podmínky než nějaká hodnota, na kterou má být happy? nastaveno. Je tu třeba upozornit na jednu vlastnost NetLoga: kdykoli je někde uvedeno srovnání hodnot nebo proměnných, NetLogo automaticky zjistí, zda je toto pravdivé (true), nebo nepravdivé (false), a místo srovnání operuje s příslušnou hodnotou (true nebo false). Tam, kde jsme až dosud viděli argumenty podmínek, tam NetLogo a v něm vytvoření agenti viděli buď true, nebo false. Pokud tedy v případě našeho diskutovaného příkazu platí, že sousedů shodné barvy (similar-nearby) je více nebo stejně, jako je minimální požadavek na jejich počet (minimum-wanted), pak bude happy? nastaveno na hodnotu true. V opačném případě na hodnotu false. Kód 6: Procedura update-globals to update-globals let similar-neighbors sum [similar-nearby] of turtles let total-neighbors sum [total-nearby] of turtles set percent-similar (similar-neighbors / total-neighbors) * 100 set percent-unhappy (count turtles with [not happy?]) / (count turtles) * 100 set h0 (count turtles with [similar-nearby = total-nearby] / count turtles) * 100 set h0 precision h0 1 ifelse count turtles with [total-nearby > 0] = 0 [set h1 0] [set h1 (count turtles with [similar-nearby = total-nearby and total-nearby > 0] / count turtles with [total-nearby > 0]) * 100] set h1 precision h1 1 ifelse count turtles with [total-nearby > 1] = 0 [set h2 0] [set h2 (count turtles with [similar-nearby = total-nearby and total-nearby > 1] / count turtles with [total-nearby > 1]) * 100] set h2 precision h2 1 ifelse count turtles with [total-nearby > 2] = 0 [set h3 0] [set h3 (count turtles with [similar-nearby = total-nearby and total-nearby > 2] / count turtles with [total-nearby > 2]) * 100] set h3 precision h3 1 end
Procedura update-globals, kterou voláme my jako pozorovatel, vytvoří nejprve pomocí příkazů let proměnné similar-neighbors a total-neighbors. Oba příkazy mají totožnou strukturu a využívají funkci sum[] of. Tato funkce funguje tak, že sumarizuje hodnoty proměnné uvedené v hranatých závorkách („[]“) a tyto hodnoty proměnné hledá u všech agentů, kteří jsou specifikovaní dále - 92 -
za of. V našem případě bude funkce prohledávat všechny agenty, neboť specifikace zní turtles, což odkazuje ke všem agentům v simulaci. Funkce u nich bude hledat hodnotu proměnné similar-nearby či total-nearby, protože právě tyto proměnné jsou v příkazech uvedené v hranatých závorkách („[]“). Dočasná proměnná similar-neighbors tak bude obsahovat údaj, kolik sousedů shodné barvy vidí ve svém okolí všichni agenti (turtles). Podobně total-neighbors bude obsahovat údaj, kolik sousedů vidí ve svém okolí všichni agenti (turtles) dohromady. Pomocí těchto údajů následným příkazem set nastavíme globální proměnnou percent-similar, a to tak, že similar-neighbors vydělíme total-neighbors a výsledek vynásobíme 100. Tento údaj nám pak říká, kolik sousedů shodné barvy v průměru pozorují ve svém okolí všichni agenti. Mírně odlišným způsobem je nastavena hodnota proměnné percent-unhappy. Příkaz set, který ji nastavuje, totiž nevyužívá pomocné proměnné, ale používá funkci count přímo ve výpočtu a nastavení hodnoty. Funkce count turtles with [not happy?] sečte, kolik máme v simulaci celkem momentálně nespokojených agentů – hledá tedy agenty s hodnotou false uložené v proměnné happy?, protože negace pomocí not dá u těchto agentů hodnotu true a tito agenti vyhoví podmínce, a budou tedy sečteni. Spokojení agenti, kteří mají v proměnné happy? hodnotu true, budou mít po negaci (pomocí not) false jako celkovou hodnotu argumentu podmínky with[], a tak sečteni nebudou. Počet nespokojených agentů se vydělí počtem všech agentů v simulaci (count turtles) a výsledek se vynásobí 100. Hodnota percent-unhappy nám pak udává, kolik procent agentů je v simulaci nespokojených z etnické skladby svého sousedství. Dodejme jen, že obě řešení jsou stejně funkční. Při nastavování proměnné percent-similar jsme mohli funkci sum[] of také použít přímo ve výpočtu, nebylo bezpodmínečně nutné vytvářet dočasné proměnné. Podobně jsme také mohli použít dočasné proměnné pro výpočet percent-unhappy a nebylo nutné používat funkci count přímo ve výpočtu. Volba toho či onoho řešení spíše záleží na naturelu toho či onoho autora programu simulace: někteří dávají přednost dočasným proměnným a považují takové řešení za přehlednější a plynulejší, jiní umísťují funkce přímo do finálního výpočtu a nastavení a považují takové řešení za efektivnější a přehlednější z hlediska úspornějšího užitého počtu proměnných. Je na čtenáři, jaký přístup ke svým vlastním multiagentním modelům zvolí. Nakonec se v proceduře update-globals nastaví indexy homogenity h0, h1, h2 a h3. Základní logika všech čtyř indexů je shodná: zajímá nás, pro kolik agentů ze všech agentů v simulaci platí, že ve svém okolí vidí pouze sousedy, kteří mají shodnou barvu jako oni. Proto nejprve sečteme, pro kolik agentů platí, že celkový počet jejich sousedů odpovídá počtu sousedů shodné barvy (count turtles with [similar-nearby = total-nearby]), tento počet vydělíme počtem všech agentů (count turtles) a vynásobíme 100. Výsledek poté ještě zaokrouhlíme na jedno desetinné místo (set h0 precision h0 1). Přesně takto vypočítáme index h0. U dalších indexů si ještě klademe podmínku, aby byl v jejich okolí dostatečný počet sousedů. Výsledky by totiž mohly být zkreslené - 93 -
vysokým počtem agentů, jejichž okolí je z hlediska vzorce automaticky homogenní (pokud nemají žádné sousedy, nemohou mít ani žádné sousedy shodné barvy). Např. u h1 trváme na tom, aby byl v sousedství počet sousedů vyšší než nula, a příkaz s dodatečnou podmínkou pak vypadá takto: Kód 7: Výpočet indexu h1 set h1 (count turtles with [similar-nearby = total-nearby and total-nearby > 0] / count turtles with [total-nearby > 0]) * 100
Při takovém výpočtu ovšem hrozí, že budeme dělit 0, může se totiž stát, že v celé simulaci nebude žádný agent s dostatečně obsazeným sousedstvím, např. pokud agenti rozeznávají jako sousedství von Neumannovo okolí (4 nejbližší dlaždice v kolmých směrech) a agentů bude na 5 041 dlaždicích rozptýleno pouze 500, stane se to snadno. Proto musíme před výpočtem indexů h1, h2 a h3 pomocí příkazu ifelse[][] ověřit, zda vůbec v simulaci existují nějací agenti s dostatečně obsazeným sousedstvím. Pokud je jejich počet roven nule (ifelse count turtles with [total-nearby > 0] = 0), automaticky přiřadíme indexu hodnotu 0 (set h1 0). Pokud je počet nenulový, provedeme výpočet (viz kód výše). Příkaz ifelse (podmínka) [][] tedy specifikuje podmínku, pokud je tato podmínka pravdivá, provede se první sada příkazů, pokud není, provede se druhá sada. Každá sada příkazů je uvedena v hranatých závorkách („[]“). Pro výpočet indexu h2 vypadá kód stejně, pouze s tím rozdílem, že trváme na tom, aby počet sousedů byl větší než 1. Analogicky u indexu h3 trváme na tom, aby byl počet sousedů větší než 2. Zrekapitulujme si, co jsme se zatím s prezentovaným modelem naučili. Známe jeho ovládací prvky, a tak jsme schopni zkoušet různé kombinace nastavení a zkoumat, jaký mají na chod modelu vliv. Známe podrobně programový kód modelu, víme, co která jeho část činí, což nám umožňuje model v software NetLogo upravit tak, aby se s jeho pomocí daly řešit nové výzkumné otázky. Jsme schopni spustit v NetLogu systematický experiment a jeho data uložit. Nyní již záleží na statistickém balíku, který ten který čtenář používá. V různých statistických balících je odlišný postup načtení dat ve formátu *.csv. Já osobně používám software STATA, kam je možné vyprodukovaná data načíst příkazem: insheet using nebojmeSeABM.csv, name delim(,)
Pro čtenáře, kteří používají STATA, jsem připravil *.do soubor, který jim data nejen načte, ale také převede do korektní číselné podoby, přejmenuje proměnné a opatří je popiskami.17 Pouze je nutné, aby si čtenář v tomto souboru upravil cestu do svého pracovního adresáře, resp. do adresáře, kde je uložen 17 http://abm.euweb.cz/nebojmeSeABM.do.
- 94 -
soubor nebojmeSeABM.csv. Věřím, že si však s importem dat v *.csv formátu poradí i uživatelé jiných balíků.18 Pokud by se chtěli ABM dále zabývat, je to nutné – NetLogo data do jiného formátu nezaznamenává. Ukázka možné analýzy dat Hlavní motivací tohoto článku bylo ukázat čtenářům jednoduchý model naprogramovaný v NetLogo a zevrubně vysvětlit jeho fungování a objasnit základní příkazy tohoto programovacího jazyka.19 Další motivací bylo podrobně dokumentovat cestu od jednoduchého nápadu (Schellingova hypotéza) k datům z experimentu. Prosím čtenáře, nechť tedy hodnotí shovívavě tuto závěrečnou část. Její motivací je pouze ukázat, jak je možné analyzovat data z experimentu. Mým cílem není přinést nějaký zásadní průlom, který by Schellingův model zpochybnil, či dokonce ukázal, že vše je jinak. To by bylo příliš troufalé – Schellingův model je zkoumán již přes 40 let. Tento model jsem použil proto, že je jednoduchý, a tudíž se hodí k zevrubnému popisu. Nyní však musím ukázat poslední krok, který je třeba učinit, pokud má mít ABM smysl – analýzu dat a interpretaci výsledků. Sice bez nároku na převratné zjištění, ale s touhou ukázat, jak je možné projekt s ABM smysluplně dokončit. Provedli jsme tedy simulační experiment, kde jsme variovali klasický parametr, který bych tu přejmenoval na netoleranci – tj. jak velký podíl vlastního etnika agenti vyžadují ve svém okolí. Dále tu máme údaj o počtu agentů v simulaci. Jelikož všechny simulace probíhají ve městě, které má shodný počet obyvatelných domů (5.041), budu tuto proměnnou dále nazývat hustota osídlení. V analýze ji však nebudeme měřit v procentech, ale v tisících agentů, kteří obývají virtuální město s 5.041 obyvatelným domem. Pozornost budeme vzhledem k výzkumné otázce upírat k proměnné velikost okolí. Budeme ji měřit průměrem pozorovaného sousedství. Na jednotkách zde příliš nezáleží, protože tato proměnná nebude použita jako kardinální, ale jako kategorizovaná – budeme si ukazovat, jak se liší efekt rozeznávaného sousedství o velikosti 80 nejbližších domů, 28 domů a 8 domů a budeme je kontrastovat se sousedstvím o velikosti 4 nejbližších domů. Jako závislé proměnné použijeme homogenitu, tj. kolik % agentů ve svém sousedství pozoruje pouze agenty svého etnika, jsou tedy plně segregovaní. Druhá míra je podíl vlastních, tj. jaký podíl vlastního etnika pozorují ve svém sousedství. Poslední závislá proměnná je podíl nespokojených, tj. kolik % agen18 Pozor, prvních 6 řádek *.csv souboru obsahuje informační hlavičku, 7. řádek pak názvy proměnných. Samotná data jsou uložena od 8. řádku dále. V nabízeném *.do souboru je tento problém vyřešen. 19 Tento článek, jak jsem poznamenal již v úvodu, rozhodně nemůže suplovat kurz programování v NetLogo nebo učebnici. Zájemce o NetLogo nechť se obrátí na manuál dodávaný elektronicky s bezplatnou instalací NetLogo, kde jsou vysvětleny širší základy a najde zde i vyčerpávající slovník příkazů. Český manuál je k nalezení na stránkách http://www. robotomie.cz/netlogo.php spolu s dalšími materiály.
- 95 -
Graf 1:
Vztah etnické homogenity a netolerance kontrolovaný velikostí sousedství
tů bylo po ukončení simulace stále nespokojených se svým sousedstvím. Pokud nebyl konec vynucený v 250. kole, bude hodnota této proměnné 0, protože simulace byly nastavené tak, aby se při 0 % nespokojených zastavily. Nenulová hodnota proměnné bude tedy jen u těch simulací, které nedosáhly rovnováhy před 250. kolem. Podívejme se tedy na Grafy 1 a 2. Z grafů 1 a 2 je patrné, že etnicky velmi homogenní osídlení a vznik ghett může vzniknout i při velmi nízké netoleranci (Schellingova hypotéza). Např. při požadavku na přítomnost minimálně 34 % vlastního etnika může více než 50 % agentů pozorovat etnicky naprosto homogenní okolí, ale tyto hodnoty je možné dosáhnout jen za předpokladu, že agenti sledují velmi malé sousedství (4 nebo 8 okolních políček). Pokud je sousedství větší (28 nebo 80 okolních políček), vznikají etnicky homogenní sousedství častěji pouze při vysokých hodnotách netolerance. Ukazuje se tedy, že rozeznávaná velikost sousedství intervenuje do vztahu netolerance a etnické homogenity. A to tak, že koriguje rozsah etnické homogenity, nikoli však charakter tohoto vztahu. I pro různé velikosti rozeznávaného sousedství platí, že větší netolerance vede k větší homogenitě. Dá se tedy říci, že větší okolí tlumí tendenci k segregaci při nízkých hodnotách netolerance. Při vyšších hodnotách netolerance bude segregace vyšší bez ohledu na velikost okolí. Je také patrné, že záleží na tom, jak segregaci měříme. Pokud jako etnickou homogenitu, je mezi jednotlivými velikostmi okolí na počátku větší odstup (při - 96 -
Graf 2:
Vztah podílu vlastního etnika a netolerance kontrolovaný velikostí sousedství
netoleranci 34 % je maximální rozdíl více než 50 procentních bodů), rozdíly se snižují zhruba lineárně a zvolna (minimální rozdíl je 23 procentních bodů, a to při netoleranci 67 %). Pokud segregaci měříme jako podíl vlastního etnika v sousedství, jsou rozdíly zprvu také velké (přes 30 procentních bodů při netoleranci 34 %), ale od tohoto momentu segregace pro jednotlivá okolí roste zhruba po křivce kvadratické funkce, rozdíly se snižují rychleji (14 procentních bodů při netoleranci 41 %), až se sníží na minimum (6 procentních bodů při netoleranci 67 %). Je třeba vzít v úvahu, že teoretické minimum homogenity je 0 %, tj. žádný agent nežije pouze mezi agenty svého etnika, zatímco podíl vlastního etnika má teoretické minimum 50 % – pokud budou všichni agenti rovnoměrně promícháni, bude každý ve svém okolí pozorovat polovinu vlastního a polovinu opačného etnika. Pokud chceme obě míry segregace srovnat, je třeba počítat s polovičními rozdíly v případě homogenity. V grafech jsou dvě zajímavé anomálie. (1) Zatímco křivky větších okolí zhruba plynule rostou (alespoň mezi hodnotami netolerance 34 % až 67 %), křivka pro von Neumannovo okolí roste trhaně. (2) Segregace kulminuje kolem netolerance 67 či 72 %, poté prudce klesá. Začněme tedy první z nich. Trhaný růst křivky pro okolí o velikosti 4 polí nastává proto, že mnoho hodnot netolerance splývá. Pokud má agent obsazeny všechny čtyři okolní dlaždice, mohou na nich být 4 agenti jeho etnika (100 %), nebo 3 (75 %), 2 (50 %), 1 (25%) nebo nikdo. Jiná možnost není. Při třech agentech může nově pozo-
- 97 -
rovat 66,7 % a 33,3 % agentů svého etnika. A žádná další mimo těchto sedm uvedených hodnot (0; 25; 33,3; 50; 66,7; 75; 100) není při von Neumannově okolí možná. Je-li úroveň netolerance nastavena na 34 % nebo 43 %, výsledek je stejný – agenti budou nespokojení, pokud se v jejich okolí vyskytnou dva agenti opačného etnika. Jelikož je toto okolí malé, i malé změny v přítomnosti agentů způsobí velké rozdíly v podílu vlastního etnika. Pokud jsou v tomto okolí dva stejní a dva odlišní agenti a jeden stejný odejde, poklesne podíl vlastního etnika z 50 % na 33 %. Pokud prázdné místo obsadí agent odlišného etnika, poklesne podíl vlastních na 25 %, což agenta ve středu okolí pravděpodobně přiměje k odstěhování. Jak tedy vidíme, drobné změny v počtech agentů vedou logicky ve von Neumannově okolí k razantním změnám v podílu etnik. A pokud se míra netolerance pohybuje kolem jedné ze sedmi výše specifikovaných hranic, může to vést k prudkým změnám v tendenci k segregování i při drobných změnách netolerance. Tím bychom vysvětlili nehybnost mezi hodnotami netolerance 34% a 41% či 51 % a 61 % a zároveň prudkou změnu mezi 41 % a 51 %. Proč však k prudkému nárůstu segregace nedojde při změně netolerance na 67 %? Domnívám se, že to souvisí s druhou anomálií – poklesem křivek při vysoké netoleranci. Při netoleranci 67 % v simulaci využívající von Neumannovo okolí dochází ke dvěma protichůdným procesům – část agentů se zcela segreguje a pozoruje zcela homogenní okolí a druhá část agentů nemá s nalezením takového sousedství štěstí, je stále nespokojená, stále se neúspěšně stěhuje a tím snižuje ukazatele segregace. Připomeňme si dva fakty: míry segregace se vypočítávají ze všech agentů, i z těch nespokojených; a agenti si nové bydliště vybírají zcela náhodně. Při vysokých hodnotách netolerance je tak šance na nalezení vyhovujícího sousedství malá. Agent se může octnout v homogenním sousedství svého etnika, ale na druhé straně je pravděpodobnější, že náhodným výběrem místa narazí na smíšené sousedství nespokojených agentů nebo homogenní sousedství opačného etnika (jehož případnou křehkou rovnováhu může svou přítomností rozbít). Tento princip platí při vyšší netoleranci i pro ostatní okolí, dokonce tím více, čím je okolí větší. Při náhodném výběru místa totiž poměr etnik v největším okolí tenduje k poměru etnik v celém městě. Pokud je netolerance nižší než 50 %, bude velké okolí segregaci tlumit, pokud bude netolerance růst výrazně nad 50 %, bude velké okolí podněcovat v agentech nespokojenost, protože při náhodném výběru místa je méně pravděpodobné, že bude splněna podmínka vysoké netolerance na celé ploše velkého okolí. Toto vysvětlení potvrzuje i regresní model B3 v tabulce 1. Je patrné, že s velikostí okolí roste i podíl agentů, kteří jsou na konci simulace nespokojení. A je logické, že nespokojení agenti nejsou segregovaní (obráceně to však neplatí, zvlášť v případě většího okolí může být agent spokojený, aniž by byl segregovaný). Tabulka 1 přináší i podporu předpokladům o vlivu velikosti okolí na vztah netolerance a míry segregace. Z modelů B1 a B2 je zřejmé, že čím větší okolí je, tím více tlumí segregaci. Důležité je však srovnání modelů A1 s B1 a A2 s B2. V obou případech roste R2 o více než 10 procentních bodů. Je tedy - 98 -
- 99 -
1,187 (0,033) −0,111 (0,012)
Netolerance (%)
Interakce: hustota * netolerance
< 0,001
31,1 %
R2
p
13,647 (1,677)
8,794 (1,815)
Konstanta
< 0,001
1358,2 (6; 9592)
45,9 %
−26,859 (0,777)
80 polí
1440,3 (3; 9595)
−4,656 (0,777)
28 polí
F (df1; df2)
12,145 (0,777)
−0,111 (0,011)
1,187 (0,029)
−0,864 (0,611)
B1: (homogenita)
8 polí
4 pole (kontrast)
Velikost sousedství:
−0,861 (0,690)
A1: (homogenita)
< 0,001
1491,6 (3; 9595)
31,8 %
69,070 (0,858)
−0,045 (0,006)
0,502 (0,015)
−2,182 (0,326)
A2: (% vlastních)
< 0,001
1202,9 (6; 9592)
42,9 %
73,888 (0,819)
−14,155 (0,379)
−5,165 (0,379)
0,091 (0,379)
−0,045 (0,005)
0,502 (0,014)
−2,186 (0,298)
B2: (% vlastních)
< 0,001
1337,0 (3; 9595)
29,5 %
6,967 (1,211)
0,286 (0,008)
−0,199 (0,022)
−10,001 (0,460)
A3: (nespok.)
< 0,001
751,3 (6; 9592)
32,0 %
6,976 (1,241)
6,202 (0,575)
−2,913 (0,575)
−3,325 (0,575)
0,286 (0,008)
−0,199 (0,021)
−10,008 (0,452)
B3: (nespok.)
Regrese závislosti etnické homogenity, podílu vlastního etnika v sousedství a nespokojenosti na netoleranci, hustotě osídlení a velikosti vnímaného sousedství. Nestandardizované koeficienty (standardní chyby). (N = 9 599)
Hustota osídlení (v tisících agentů)
Proměnná
Tabulka 1:
jisté, že zavedení proměnné velikost sousedství do modelů spolehlivě zlepšuje jejich kvalitu. R2 se na druhou nezlepšuje dramaticky. Tedy i výsledky analýzy pomocí lineární regrese nám signalizují, že vnímaná velikost okolí je důležitá proměnná, avšak nemění zásadním způsobem fungování modelu. Pouze tlumí dopad netolerance. Závěr V tomto článku jsem na praktickém příkladu ilustroval metodu multiagentního modelování. Pokusil jsem se – nepříliš úspěšně – navrhnout jedno z mnoha možných rozšíření klasického Schellingova modelu segregace. Výzkumná otázka, která nás tímto článkem provázela, zněla: Bude větší vnímané sousedství tlumit segregaci? Abychom ji mohli zodpovědět, ukázali jsme si, jak může být pro tento účel naprogramován multiagentní model. Ukázali jsme si, jak naplánovat simulační experiment s tímto modelem a jak z něj uložit data. Také jak tato data načíst do statistického balíku a jak je analyzovat. Výsledky zásadní průlom nepřinesly. Ukázalo se sice, že velikost okolí proces segregace tlumí, ale zásadně ho nemění. Nicméně pro velká vnímaná okolí platí, že míra netolerance musí být vysoká (kolem 51–61 %), aby došlo k segregaci, zatímco při malém vnímaném okolí může dojít k vyšší míře segregace již při netoleranci 34 %. Je tedy legitimní se ptát, jak široké sousedství vnímají obyvatelé měst, která se segregují. O jak širokém okolí přemýšlejí, když se rozhodují, zda zůstat, či se odstěhovat? A je také namístě ptát se, jak moc tolerantní tito obyvatelé jsou. Nevím o tom, že by někdo empiricky ověřoval, jak rozsáhlé sousedství obvykle vnímají obyvatelé segregovaných měst. Není to jistě snadno měřitelná proměnná. Naše analýza však ukazuje, že by tato proměnná mohla vnést světlo do vztahu netolerance a segregace. A to je jeden ze zásadních významů multiagentního modelování a simulačních experimentů – mohou inspirovat náš výzkum reálného sociálního světa. Literatura: Cahlík, Tomáš a kolektiv. 2006. Multiagentní přístupy v ekonomii. Praha: Karolinum. ISBN 80-246-1223-2. Epstein, Joshua M. 2006. Generative social science. Princeton: Princeton University Press. Epstein, Joshua M. a Robert Axtell. 1996. Growing artificial societies: Social science from bottom up. Washington: The Brookings Institution. ISBN 0-262-55025-3. Gilbert, Nigel. 2008. Agent-based models. Thousand Oaks: Sage publications. Gilbert, Nigel a Klaus G. Troitzsch. 2005. Simulation for the social scientist. Maidenhead – New York: Open University Press. ISBN 978-0335-21600-0. Hegselmann, Rainer. 2010. „Cellular Automata in the Social Sciences: Perspectives, Restrictions, and Artefacts.“ Pp. 3–25 in Nigel Gilbert (ed.) Computational Social Science, Vol. I. London: SAGE.
- 100 -
Hegselmann, Rainer. 2012. „Thomas C. Schelling and the Computer: Some Notes on Schelling‘s Essay On Letting a Computer Help with the Work.“ Journal of Artificial Societies and Social Simulation [online] 15 (4). [cit. 12. 10. 2013]. Dostupné z: http://jasss.soc.surrey.ac.uk/15/4/9.html. DOI: 10.18564/jasss.2146. Krčková, Anna. 2013. „Multiagentní modelování v sociologii: úvod do tématu.“ Data a výzkum 7 (2): 167–186. DOI: http://dx.doi.org/10.13060/23362391.2013.127.2. 38. Mathias, Marek. 2010. „Možnosti využitia multiagentového modelovania v sociológii.“ Sociálne a politické analýzy 4(1): 19–38. Mathias, Marek. Použitie a konštrukcia multiagentových modelov sociálnych systémov. Bratislava, 2013. Disertační práce. Univerzita Komenského, Filozofická fakulta, Katedra sociológie. Pelánek, Radek. 2011. Modelování a simulace komplexních systémů. 1. vyd. Brno: Masarykova univerzita. ISBN 978-80-210-5318-2. Schelling, Thomas Crombie. 1969. „Models of segregation.“ American Economic Review: Papers and Proceedings, 59 (2): 488–493. Schelling, Thomas Crombie. 1971. „Dynamic models of segregation.“ Journal of Mathematical Sociology, 1 (2): 143–186. DOI: http://dx.doi.org/10.1080/002225 0X.1971.9989794. Schelling, Thomas Crombie. 1978. Micromotives and Macrobehavior. New York – London: W.W. Norton & Company. ISBN 0-393-05701-1. Schenk, Juraj. 2007. „Multiagentové modelovanie ako metodologická inovácia.“ Filozofia 62: 777-789. Schenk, Juraj. 2011. Metodologické problémy multiagentového modelovania v sociológii. Bratislava: Stimul. ISBN 978-80-8127-031-4. Wilensky, Uri. 1997. „NetLogo Segregation model.“ http://ccl.northwestern.edu/netlogo/models/Segregation. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL. Wilensky, Uri. 1999. NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
- 101 -
- 102 -