Šíření luteránství na území dnešního Německa v 16. století

Připravil jsem všechna data, procedury [krom základního vzorce a vztahu vstupních dat] a UI a zjistil jsem, že na své mašině nejspíše nedokáži spustit takhle velkou simulaci.

Strávil jsem nad tím nemalou dobu, tak tady nechám alespoň popis se zdrojovým kódem pro budoucí generace a pro mě, až to budu moci s lepší mašinou (doufejme) dokončit.

Základní údaje
Název simulace: Šíření luteránství na území dnešního Německa v 16. století

Datum zpracování: LS 2017/18

Autor: Vojtěch Hyvnar

Typ modelu: Multiagentní

Modelovací nástroj: NetLogo 6.0.3

Definice problému
Začátkem 16. století došlo ve Svaté říši římské, konkrétně na území dnešního Německa, k reformaci církve, kdy na základě učení Martina Luthera vzniklo nové vyznání - luteránství. Luteránství se z Wittenbergu, kde Martin Luther učil, rozšířilo na velkou část německého území a také do některých ostatních částí Svaté říše římské - například území dnešní Francie, Rakouska, Švýcarska či Belgie. Luteránství se však nerozšířilo na celé území dnešního Německa, část regionů zůstala katolická.

Tento model simuluje šíření luteránství v Německu, z Wittenbergu do ostatních regionů v závislosti na jejich geopolitických vlastnostech. Model je tvořen na mapě sestávající z historických regionů Svaté říše římské, které se nacházely na území dnešního Německa. Mapa pokrývá celé dnešní Německo a historické regiony Svaté říše římské zasahují do částí sousedních zemí, konkrétně do Francie, Polska, Rakouska, Belgie a Švýcarska.

Cíl
Cílem simulace je zjistit, jak geopolitická situace jednotlivých regionů ovlivňuje adaptaci nové víry a co by muselo vést k tomu, aby se celé území dnešního Německa stalo plně luteránské.

Model a jeho parametry jsou samozřejmě velice zjednodušeným odrazem reality, jelikož se jedná o opravdu komplexní problém.

Metoda
Pro vytvoření simulace jsem zvolil NetLogo, jelikož mi přišlo, že pomocí něj dokáži nejlépe nasimulovat pohyb osob po mapě Evropy (respektive její části). Simulaci by šlo jistě provést i jinak, a to pomocí zakomponování vzdáleností daných měst a území od Wittenbergu. Byl to jeden z přístupů, které jsem zvažoval a chtěl do simulace zakomponovat, avšak po ručním změření všech vzdáleností mi došlo, že bude nejspíše rozumnější použít pouze vlastností mapy a fyzické vzdálenosti vynechat.

Detailní popis modelu
Pro co nejpřesnější simulaci na už tak ne úplně přesných datech je počátek modelu nastaven na letopočet 1500, i když samotná Lutherova filozofie se začala po Německu šířit až zhruba v roce 1517.

Mapa jako základ modelu
V 16. století obsahovala Svatá říše římská celkem 10 říšských krajů, což byly vyšší územně-správní celky říše. Kromě dnešního Německa tyto kraje pokrývaly část dnešního Polska, Rakousko, Belgii, Nizozemsko a část Francie. Vzhledem k tomu, že záměrem simulace bylo zkoumání luteránství pouze na území Německa, říšské kraje a země, které toto území nepokrývaly (tzn. Rakouský a Burgundský kraj, dále například země Koruny České či Švýcarsko), jsem z mapy vyřadil. Na mapě tedy zbylo těchto 8 krajů pokrývající německé území:
 * Bavorský kraj
 * Francký kraj
 * Hornorýnský kraj
 * Švábský kraj
 * Dolnorýnsko-Vestfálský kraj
 * Kraj porýnských kurfiřtství
 * Hornosaský kraj
 * Dolnosaský kraj

(pozn. Kraj porýnských kurfiřtství vznikl po sněmu v roce 1512 a Hornosaský a Dolnosaský kraj vznikly po rozdělení Saského kraje)

Dané říšské kraje jsem poté rozdělil do menších oblastí - dle městských států či jiných historických území.

Každá oblast má na mapě svou specifickou, unikátní barvu korespondující s barevnou paletou NetLoga. Díky této barevné paletě dokážu v simulaci rozlišit obyvatele jednotlivých oblastí a upravit jejich chování a parametry. Tato mapa je pak obklopena černou barvou značící zbytek Evropy a modrou barvou značící moře (no-go zones). Tvorba mapy byla časově dost náročná, ve finále jsem použil celkem 69 barev pro 69 oblastí, kdy na jeden říšský kraj připadá v průměru zhruba 9 oblastí. Jednotlivé říšské kraje jsem od sebe barevně odlišil, ale vzhledem k tomu, že krajní odstíny (tmavé a světlé) jednotlivých barev částečně splývají, na první pohled nemusí být úplně zřejmé zařazení některých oblastí.

Mapa je pak v jednom z prvních kroků importována do modelu. Menší problém je zde ten, že při importu pro NetLogo docela velkého obrázku (zhruba 2000px * 2000px) dojde ke zmenšení (v modelu jsem použil velikost 400px * 400px, a patches o velikosti 1 pixel) obrázku a v místech, kde se dvě barvy potkávají, dojde ke klasickému blendu dvou barev a vzniku pixelů s odstíny jiných barev [nejsem grafický expert, nikdy jsem nezjistil, co se v těchto situacích vlastně děje], což způsobuje možné vytvoření části obyvatelstva jinde, než by měli správně vytvoření být měli. Toto je však opravdu minimální množina vytvořených agentů, a proto se tímto problémem zabývat nemusím. Kde však bylo potřeba tento problém ošetřit byli vytvoření luteráni jelikož jejich výskyt na začátku simulace musí být jen a pouze v oblasti Wittenbergu. Barva jejich území je proto super-unikátní a nemělo by docházet k vytvoření této barvy blendem dvou dalších někde jinde na mapě.

Vstupní data
Vzhledem k tomu, že se jedná o projekt časově velmi vzdálený dnešní době, nebylo úplně nejjednodušší získat potřebná data případně vůbec vymyslet, jaká data použít. Považoval jsem za důležité získat a použít data o počtu obyvatel jednotlivých území, ale jelikož sčítání lidu v době minulé nebylo moc praktikováno, kompletní data o počtech obyvatel kterékoli evropské země de facto neexistují. Známe jen hrubý počet obyvatel v zemi samotné (v Německu v roce 1500 to bylo údajně kolem 12 milionů, v celé Evropě pak necelých 60 milionů obyvatel) a také počty obyvatel zhruba stovky německých měst. Ostatní cifry můžou být jen a pouze spekulativní. Z toho důvodu jsem se rozhodl, že počet obyvatel jednotlivých území v modelu bude reprezentován počtem obyvatel jejich mocenských celků v roce 1500.

Tam, kde to bylo zjistitelné, jsem zároveň využil také údajů o počtech obyvatel v daných regionech a městech v roce 1600, čili o 100 let později. Z těchto dat jsem poté vypočetl koeficient růstu počtu obyvatel v těchto oblastech za 1 týden [základní časová jednotka v modelu]:

k = [obyvatelstvo(1600)/obyvatelstvo(1500)]^(1/100) / 52

Kde tento údaj (počet obyvatel za 100 let) nebyl dostupný, koeficient se jednoduše rovnal jedné.

Důležitým údajem, plně vypůjčeným z modelu Davide Cantoniho, je podíl toho, jak dané území přispívalo na výdaje Impéria. Velikosti tohoto příspěvku byly počítány v holandských zlatých a vypočítaly se z velikosti vojska, kterým dané území přispělo do armády. Tento ukazatel dle mého dokáže alespoň částečně zachytit důležitost postavení daného regionu v celé říši, a tudíž také fakt, jak snadno či těžce budou lidé v tomto regionu náchylní ke konverzi. Tento údaj jsem pojmenoval jako "prispevek".

Všechna území mají také svůj typ vlády, jak ukazuje následující seznam:


 * Abbey                - opatství               - 1
 * Bishopric            - diecéze                - 1
 * County               - hrabství               - 5
 * Duchy                - vévodství              - 12
 * Electorate           - kurfiřtství            - 1
 * Free Imperial City   - Svobodné říšské město  - 29
 * Landgraviate         - lankrabství            - 1
 * Margraviate          - markrabství            - 3
 * Prince-archbishopric - kníže-arcibiskupství   - 1
 * Prince-bishopric     - kníže-biskupství       - 12
 * Principality         - knížectví              - 3

Jak lze vidět, nejčastěji se zde vyskytuje svobodné říšské město, následně pak kníže-biskupství a vévodství. 5 typů vlády se zde vyskytuje pouze jedinkrát. Forma vlády v daném regionu také ovlivňuje náchylnost obyvatel ke konvertování.

Procedury modelu
...nejdůležitější procedury využívající níže popsané parametry.

go /co se stane každý týden/
Procedura, která říká, co se každý týden stane. Jednoduše v krocích:
 * Pokud jsou všichni obyvatelé luterání, zastav simulaci.
 * Všichni luteráni nad 14 let (minimální věk pro přesvědčování ostatního obyvatelstva) přesvědčují katolíky ke konverzi
 * Všichni katolíci nad 14 let (dtto) přesvědčují luterány ke konverzi
 * Všichni neluteráni se pohnou skrze proceduru o 0.5 bodu
 * Všichni luteráni se pohnou skrze proceduru o zvolenou velikost
 * Všichni lidé, kteří mají tu možnost, reevalují své náboženství
 * Všichni nad 14 let se rozmnožují
 * Všichni umírají
 * Všichni stárnou

to go  if all? turtles [ lutheran? ]      [ stop ]

ask turtles with [ lutheran? and age > 14 * 52 ] [ ; minimalni vek pro nejake presvedcovani je 14 persuade-catholics ]  ask turtles with [ catholic? and age > 14 * 52 ] [ persuade-lutherans ]  ask turtles with [ not lutheran? ] [    move-non-lutheran 0.5 ]  ask turtles with [ lutheran? ] [    move-lutheran rychlost-sireni ]  ask turtles [ reevaluate-religion reproduce (14 * 52) population-growth die-for-reasons set age age + 1 ]  week-counter tick end

persuade-catholics a persuade-lutherans
Zásadní procedury, které slouží ke konvertování na druhou stranu. Bohužel jsem nepřišel na správný vztah toho vstupní dat pro ideální přiblížení se výsledku, proto tyhle procedury nejsou zdaleka funkční.

to persuade-catholics let chyceny one-of turtles-here with [ catholic? and not converted?] if (chyceny != nobody ) - tady měla jít podmínka [ ask chyceny [ set converted? true set-lutheranism set datum-konverze ticks set persuaded-catholics persuaded-catholics + 1 ] ] end

move-lutheran [a move-nonlutheran]
Pohyb luteránů po mapě. Vstupují zde do hry parametry dist, neboli velikost pohybu, a také nadseni-pro-martina (parametr přechodu přes hranice, viz níže). U neluteránů je pak nadseni-pro-martina nahrazeno parametrem cestovatelske-choutky se stejným principem.

to move-lutheran [ dist ] right random 30 left random 30 let turn one-of [ -50 50 ] while [ [ pcolor ] of patch-ahead 1 = 20 or     [ pcolor ] of patch-ahead 1 = 98] [    set heading heading + turn ]   if [ pcolor ] of patch-ahead 1 != home-color [ if random-float 100 < nadseni-pro-martina [ forward dist ] ]  if [ pcolor ] of patch-ahead 1 = home-color [ forward dist ] end

reevaluate-religion
Proces, kdy daný člověk zvažuje své náboženství a s ním přechod k ateismu.

to reevaluate-religion if ticks mod reeval-freq = 0 [ if (lutheran? and ticks - datum-konverze > 52) [ if random 100 < reeval-chance-lutheran [ convert-to-atheism set self-converted-lutherans-to-atheism self-converted-lutherans-to-atheism + 1 ]       ]      if (catholic? and ticks - datum-konverze > 52) [ if random 100 < reeval-chance-catholic [ convert-to-atheism set self-converted-catholics-to-atheism self-converted-catholics-to-atheism + 1 ]       ]      ]     end

die-for-reasons
...aneb umírání buď kvůli stáří nebo z různých, náhodných, neznámých příčin.

to die-for-reasons if age > 35 * 12 and random-float 100 < 1 [ set i-see-dead-people i-see-dead-people + 1 die ] if random-float 100 < 0.0001 [ set i-see-dead-people i-see-dead-people + 1 die ] end

Parametry jsou ještě detailně popsány níže, zde je důležité poznamenat 1% týdenní šanci na úmrtí při věku nad 35 let. Tato míra má totiž úzký vztah s mírou růstu obyvatelstva.

reproduce
...neboli rozmnožování obyvatelstva. Pokud je věk vyšší než nastavené minimum pro rozmnožování (14 let, viz níže), pohlaví je ženské, dochází s určitou pravděpodobností k rozmnožování dané skupiny. Tato pravděpodobnost je založena na koeficientu růstu v daném regionu (viz výše). Ten má hodnoty kolem jedné (přičítám jedničku, pokud je růst v daném regionu záporný, hodnota je menší než 1, pokud kladný, pak větší než 1). Zde je násoben dvěma, jelikož díky omezení na pohlaví je potřeba pro vyrovnání se míře umírání nad 35 let mít zhruba stejnou pravděpodobnost narození. Vzhledem k tomu, že žen je pouze polovina, byla by míra umírání dvojnásobně větší.

Jednotlivé regiony mají svůj koeficient růstu a díky jeho drobným rozdílům mezi regiony dochází k pomalé změně struktury obyvatelstva.

to reproduce [ min-age mira-rozrustani ] ; rozmnozovani if (age >= min-age and random-float 100.0 < 2 * mira-rozrustani and gender = "female") [ hatch 1 [ set age 0 set-gender if lutheran? [ set-lutheranism set converted? false set born-lutheran born-lutheran + 1] if catholic? [ set-catholicism set converted? false set born-catholic born-catholic + 1 ] if atheist? [ set-atheist set converted? false set born-atheist born-atheist + 1] ]  ] end

Parametry modelu
...neboli co všechno v modelu nastavuji

Vlastnosti všech lidí [turtles-own]
Vzhledem k tomu, že lidi jsou lidi a mají všichni stejné vlastnosti, nemám zde potřebu dávat některé ze skupin zvláštní vlastnosti, a proto je mám všechny takhle globálně.


 * age - věk daného člověka - důležité pro reprodukci, šíření víry, a také umírání
 * gender - pohlaví daného člověka - důležité pro reprodukci
 * population-growth -
 * lutheran? - zda je daný člověk luterán
 * catholic? - zda je daný člověk katolík
 * atheist? - zda je daný člověk ateista [logicky má daný člověk aktivní vždy jen jednu z těchto tří hodnot]
 * converted? - zda byl daný člověk v minulosti konvertován (z katolíka na luterána a vice versa). Předpokládám, že pokud jednou takhle člověk konvertoval, podruhé už ho na druhou stranu nikdo nepřesvědčí a v tomto modelu obsahujícím dvě náboženství už je jediná možnost pouze přechod na ateismus.
 * home-color - barva domácího území, na kterém se člověk rodí. Tato barva je použitá při posuzování pohybu přes hranice.
 * datum-konverze - kdy (číslo ticku/týdne) došlo ke konverzi (pokud k ni došlo). Tato hodnota je pak použitá při reevaluaci náboženství (člověk přemýšlí o ateismu nejdříve až rok po konverzi)
 * prispevek - výše zmíněný příspěvek na výdaje impérie
 * home-type - typ území

Parametry UI

 * pocet-luteranu - neboli kolik kluků se ve Wittenbergu objeví. Co známe je, že měl Wittenberg v roce 1500 zhruba 2000 obyvatel. Otázkou je, kolik z nich bylo luterány hned ze startu, a tudíž kolik z nich chceme vypustit do světa. 2000 je zde defaultní hodnota a zároveň maximum, minimum je pak 1 (neboli samotný Martin Luther).


 * cestovatelske-choutky - jelikož je jasné, že lidé se ze svých bydlišť a sídel moc nehýbali a nestěhovali, je potřeba zamezit, aby nám na mapě vesničané někam neutekli. Tento parametr, procentuálně vyjádřen, říká, jaká je šance, že když se člověk z daného území dostane ke hranicím, že tyto hranice přeleze a vydá se dále. Toto omezení se vztahuje jen na neluterány, jelikož v případě zamezení pohybu osob luteránům, model by nám byl úplně k ničemu. Defaultně je tato hodnota 0, ale v podstatě se dá, myslím si, uvažovat jakákoli hodnota do 5%.


 * nadseni-pro-martina - de facto cestovatelské choutky pro luterány. Jedná se opět jenom šanci přechodu přes hranice a víc nic, takže v případě velice entuziastických šiřitelů víry můžeme uvažovat klidně velká procenta.


 * rychlost-sireni - trochu v návaznosti na nadšení, tato hodnota říká, jak rychle chceme, aby se luteráni pohybovali a snažili se šířit svou víru. Hranice jsou od 0 do 2 [jednotky pohybu].


 * reeval-freq - neboli frekvence (v týdnech), jak často má daná osoba rozvažovat (evaluovat), zda opustit své náboženství a stát se ateistou a nebo si žít dále zbožným životem. Defaultní hodnota je zde 52 týdnů, čili jednou za rok, minimum je 4 týdny a maximum pak 10 let (předpokládám, že alespoň dvakrát za život si každý řekl, jestli to má všechno smysl či ne. Na tuto volbu jsou pak navázány dvě další...


 * reeval-chance-lutheran - procentuální šance toho, že při jedné evaluaci dojde ke konverzi luterána k ateismu.


 * reeval-chance-catholic - dtto

Parametry pevně dané
to set-age set age random 36 * 52 end
 * age - průměrná délka života byla v 16. století zhruba 35 let, proto všichni lidé dostanou na začátku simulace hodnotu věku odpovídající náhodnému číslu mezi 0 a 35. Násobím 52, jelikož rok má (zhruba) 52 týdnů. Stejně tak všechny ostatní proměnné související s věkem.


 * min-age - tohle je parametr, nepřekvapivě, minimálního věku. Jedná se o minimální věk, kdy je možné porodit potomka. I když jsem si vědom toho, že v době dávno minulé byl věk průměrný prokreace nižší než dnes, mé morální hodnoty mi nedovolí zvolit tuto hodnotu nižší než 14.

to set-gender ifelse random 2 = 0 [ set gender "male" ] [ set gender "female" ] end
 * generování pohlaví člověka - zde jsem zvolil staré dobré 50/50 pro rozdělení mužů a žen.

if age > 35 * 12 and random-float 100 < 1 [ set i-see-dead-people i-see-dead-people + 1 die ]
 * úmrtnost při překročení očekávané délky žití - jakmile je člověk starší 35 let, je jeho šance na umření 1% každý týden. Věřím, že hodně z nás by se místo pondělního vstávání do práce/školy kolikrát radši ani neprobouzelo, lidé v modelu tuto situaci zažijí na vlastní kůži a hrajou každé pondělí (každý tick) ruskou ruletu se stomístným bubnem a jedním ostrým nábojem. V rámci modelování je to dle mého celkem elegantní řešení, nenapadla mě lepší alternativa.

if random-float 100 < 0.0001 [ set i-see-dead-people i-see-dead-people + 1 die ]
 * úmrtnost kdykoli a z jakýchkoli příčin - podobně jako výše. Vzhledem k tomu, že ani moderní medicína nezná odpovědi na všechny otázky, nevidím důvod, proč by středověcí doktoři měli být v tomto ohledu lepší. Každý týden mají lidé šanci, že z nějakého důvodu umřou. Může se jednat o běžnou nemoc, úraz, mor, živelnou pohromu, nehodu na dálnici [humor], cokoli. Šance je opravdu malá, není potřeba to přehánět.


 * Kdy nejdříve po konverzi (lutheran -> catholic nebo naopak) může dojít k reevaluaci náboženství, respektive kdy nejdříve po konverzi začne člověk přemýšlet o ateismu. Viz datum-konverze a reeval-freq. Zde jsem zvolil celkem diplomatickou hodnotu, a to 52 týdnů neboli 1 rok.

Globální proměnné a jak jsem k nim přišel
Pomocí globálních proměnných počítám některé základní ukazatele spojené s jednotlivými náboženstvími:

to week-counter set tydny tydny + 1 if tydny = 53 [ set tydny 1 ] end --na začátku nastavím tydny = 0, při každém ticku zvednu týden o 1, pokud by měl tick dostat počet týdnů na 53, counter se resetuje a týdny jsou opět 0
 * self-converted-catholics-to-atheism - kolik katolíků samovolně opustilo své náboženství a stalo se ateisty
 * self-converted-lutherans-to-atheism - kolik luteránů samovolně opustilo své náboženství a stalo se ateisty
 * born-lutheran - počet narozených luteránů za období
 * born-catholic - počet narozených katolíků za období
 * born-atheist - počet narozených ateistů za období
 * persuaded-catholics - kolik katolíků bylo "přesvědčeno" luterány ke konverzi
 * persuaded-lutherans - kolik luteránů bylo "přesvědčeno" katolíky ke konverzi
 * i-see-dead-people - počet lidí, kteří od začátku simulace zemřeli
 * tydny - proměnná, která počítá číslo týdnu v daném roce

Sledované ukazatele
Kromě výše zmíněných globálních proměnných sleduji také:

let rok-mod floor ( ticks / 52 ) report 1500 + rok-mod report count turtles report count turtles with [ lutheran? ] report count turtles with [ catholic? ] report count turtles with [ atheist? ]
 * současný rok
 * celkovou populaci
 * počet luteránů běhajících po mém světě
 * počet katolíků běhajících po mém světě
 * počet ateistů běhajících po mém světě

Celkové počty příslušníků jednotlivých náboženství, počty narozených příslušníků jednotlivých náboženství a počty konvertovaných katolíků a luteránů jsou sledovány také v grafech.

Vzhled uživatelského rozhraní
Na obrázku lze vidět, jak všechny výše popsané parametry a ukazatele vypadají pohromadě.



Výsledky
Bohužel žádné nejsou.

Zdrojový kód
Obsahuje *.nlogo model se dvěma *.nls soubory, upravenou mapu a *.xlsx soubor obsahující všechny údaje o regionech.



Reference
Podklad pro mapu 1: ThePrussianRussian, Imperial Circles of Germany. Dostupné online z:

Podklad pro mapu 2: Wikipedie, dostupné online z:

NetLogo dictionary, online

NetLogo programming guide, online