Algoritmus

Mohl by nějaký algoritmus vzniknout samovolně bez působení inteligence?

pavelkabrtGenetika-teorie informace Napsat komentář

Tvorba (genetických) algoritmů [GA]

Václav Dostál

Tento článek jsem vytvořil na základě textů, uvedených v hypertextových odkazech. Pro mé úvahy přitom významnou roli hrály texty W. Gitta, J. Potočky a T. T. Akiry. Článek také reaguje na některé „argumenty“ evolucionistů, zapojených do diskuzí na webu.

Pokud by se otázka týkala „vzniku“ algoritmu, používaného ve výpočetní technice, odpověď by zněla, že samozřejmě ne. Někdo by dokonce dodal, že jde o hloupou otázku, kterou není vůbec nutné klást. Jestliže však jde o genetický nebo evoluční algoritmus, pak už se budou odpovědi lišit. Genetické algoritmy totiž podle definice napodobují evoluci v přírodě, o níž celá spousta lidí předpokládá, že proběhla. Dodají, že to přece už odhalil Charles Darwin a že v přírodě či v přírodní vědě – zejména v biologii – nemá bez evoluce nic smysl. Z toho potom logicky vyplývá, že algoritmy, obsahující instrukce (povely či příkazy, data nebo adresy) pro živé organismy se vyvinuly samovolně, bez jakéhokoliv působení nějaké inteligence, přesněji bez nutnosti Tvůrce (Stvořitele). Zde platí, že ze špatného výchozího předpokladu dojdeme pomocí správné logiky k nesprávnému výsledku.

Je podivné, že některé algoritmy – používané v technice či ve výrobě – své tvůrce potřebují a jiné – zaznamenané v živých organismech – žádného tvůrce nepotřebují. Ty druhé – nazvěme je „přirozené“ – by měly vznikat „přirozeně“ a ne „nadpřirozeně.“ Jenže z čeho a jak? Odkud se vzala prvotní instrukce pro samovolný vznik protobuňky? Jak se z této jednoduché informace stal celý postup, zvaný algoritmus? A jak se tyto algoritmy samovolně spojily do velmi složitého programu, zaznamenaného v DNA u lidí?

Už tyto počáteční otázky naznačují, že samovolný vývoj, zvaný evoluce (přesněji: makroevoluce) je velmi špatným řešením otázky existence života na Zemi. Přitom vznik a/nebo rozvoj života někde jinde – na jiné planetě nebo ve volném kosmickém prostoru – je tímtéž problémem. Jeho řešení pomocí evoluce – zejména samovolná evoluce genetických či evolučních algoritmů nutných pro život – je zcela stejně špatné jako pro naši planetu.

Zbývá tedy jediná možnost. Instrukce, algoritmy a programy pro život nevznikly samovolně, ale byly vytvořeny neboli stvořeny. Jejich existenci umožnil Tvůrce neboli Stvořitel. Ten je vymyslel, sestavil a umístil (implementoval) na patřičná, tj. jím určená, místa v DNA nebo obecně v organismu.

Tento závěr je ovšem pro řadu lidí nepřijatelný. Budou tvrdit, že jde o náboženství a ne o vědu. Přitom ve skutečnosti jde o logiku – a to je také věda! Nebo existuje třetí možnost, že život ani nevznikl samovolně, ani jej nikdo nevytvořil (nestvořil)?  Jak by tato třetí možnost vypadala? Otázku lze obejít tím, že ji nebudeme vůbec klást a tedy ani náznakem řešit. Člověk je však tvor zvídavý a tak odsunutím nebo zamítnutím této otázky si předem klade velkou mez ve svém poznávání světa.

Zapálení zastánci evoluce namítnou, že genetický algoritmus obsahuje zvláštní operace, tj. operace mutace a křížení, které jiné algoritmy neobsahují. Jsou však tyto operace příčinou zásadní či principiální odlišnosti genetických algoritmů od jiných, která by odůvodňovala jejich samovolný vznik a ještě k tomu jen u živých organismů? Genetické algoritmy totiž patří mezi optimalizační výrobní – technické. Neexistuje žádný (umělý) genetický algoritmus, který by řídil nějaký umělý život, byť na elementární úrovni. Algoritmy tzv. umělé inteligence neřídí živé organismy, ale jisté stroje, jimž se říká „inteligentní.“ Mezi tyto stroje patří např. roboty, nebo dokonce celé výrobní linky – složené z různých výrobních strojů a robotů. Taková linka pracuje samočinně (automaticky), ale ne samovolně – bez vloženého programu, vytvořeného celým programátorským týmem.

A co třeba kardiostimulátor? Tento sofistikovaný přístroj přece řídí srdce, ne? Ale kdepak, jen upravuje vzniklou arytmii na rytmický „tlukot“ srdce. Bez programu, uloženého v jisté části mozku, i když se v něm vyskytla řídící chyba, by byl k ničemu.

Hierarchie informací při řízení a „vývoj“ programu

Nejnižší řídící jednotkou je instrukce. Může to být povel (příkaz), údaj nebo adresa. Příkaz říká, co se má provést, jaká funkce má nastat. Nejjednodušší je čítač, tedy „počitadlo“, který přikazuje, aby se hodnota matematické proměnné zvětšila o jedničku. Mívá tvar: N = N +1. Před tímto příkazem musí být zadána výchozí hodnota, nejčastěji jednička: N = 1. V algoritmu, obsahujícím počáteční hodnotu a čítač bude smyčka (cyklus), která bude průběh vracet k čítači. Při druhém průchodu tedy proměnná N nabude hodnoty 2, při třetím 3, atd. Prostě se počítá počet průchodů smyčkou. V této smyčce musí být podmínka jejího ukončení. Nejjednodušší bude zadání maximální hodnoty, při níž se skočí ven ze smyčky. Bude znít: Je-li N = dané maximální hodnotě, potom jdi na další řádek (pokyn). Velmi jednoduchými příkazy budou „Začni“ a „Skonči“ (které budou doplněny: nějak to oznam – např. vypiš na monitor titulek).

Údaj udává hodnotu. Výše jsem uvedl údaj počáteční hodnoty čítače. Několik údajů tvoří data nebo dokonce databanku (velký soubor dat). Z uvedeného vyplývá, že může jít o číselnou hodnotu. Ta bývá vyjádřena součinem velikosti v nultém číselném řádu a mocniny desítky. Tak, jak jsme to zvyklí u velikých či malinkých čísel. Např. 2,34.10^6 (v programu: 2,34 E6, kde E = exponent) nebo 9,87.10^–15 (či raději: 9,87 E–15).

Adresa je (pořadové) číslo, udávající polohu části algoritmu (např. smyčky) v celém algoritmu. Je to obdoba čísla domu, v němž bydlíme. Na tuto adresu je v jiné části algoritmu či programu odkaz. Jakmile doběhne určitá část algoritmu, musí bezprostředně následovat povel, kde (od kterého místa) má algoritmus pokračovat. Bez určení adresy algoritmus neví, odkud má pokračovat a tak by mohl nepokračovat vůbec – i když ještě pokračovat má.

Jednotlivé instrukce jsou seřazeny do algoritmu. Algoritmus už určuje jednoduchý průběh podle zadané funkce. Algoritmus je tedy několik instrukcí, řádně sestavených do určitého pořadí. Skládá se z několika řádků, na každém řádku je jedna instrukce. Algoritmus musí být: 1. konečný, 2. univerzální (pro podobné úlohy), jednoznačně určený, 3. s výstupem (a samozřejmě se vstupem), 4. co nejjednodušší a 5. co nejelegantnější. Může být lineární (při sériovém řazení instrukcí), větvený (paralelní) nebo kombinovaný.

Z výčtu vlastností algoritmu je zřejmé, že nemůže vznikat náhodným řazením jednotlivých instrukcí, kdy by tyto instrukce nějak samy od sebe „skákaly“ na nějaká náhodná místa v algoritmu. Žádné vnější podmínky (teplota, tlak, záření, atd.) neuspořádají instrukce do funkčního algoritmu. Mohou ovšem zničit zápis algoritmu. Např. zápis na papíře při požáru shoří. Nemožnost samovolného vzniku algoritmu jen pomocí vnějších podmínek platí i pro ty algoritmy, jež jsou uloženy v živém organismu. (Zde se opakuji, ale myslím, že ne bezdůvodně).

Několik algoritmů vzájemně propojených vytvoří program. Program přesně a jednoznačně určuje, co a jak se má dít. Řídí daný proces a má tytéž vlastnosti jako algoritmus (konečnost, jednoznačnost, atd.). Je zřejmé, že ke „vzniku“ programu je zapotřebí inteligentních lidí, tzv. programátorů neboli „moderně“ „ajťáků.“ Postup, jímž programátoři nějaký program vytvářejí, se nazývá programování. Program se obvykle vkládá („implementuje“) do počítače nebo do sítě počítačů, v níž je aspoň jeden řídící počítač („server“). V minimálním provedení jde o „kartu“ s elektronickými obvody – například v automatické pračce. Jedna část karty je paměť, do níž jsou prací programy implementovány.

Programátoři sestavují program v nějakém programovacím jazyku, který je v počítači přeměňován – překódován, překládán na tzv. strojový kód. Strojový kód obsahuje strojové instrukce (a tedy i algoritmy a celý program) v číselném tvaru. Jednotlivé číselné kódy mají svůj význam, který byl předem stanoven a jemuž se příslušné počítače či sítě podřizují. Jedno číslo může znamenat buď adresu nebo povel nebo znak (písmeno, rovnítko, údaj), přičemž se význam může přepínat, takže soustava číselných kódů je potom přehledně sestavena do kódovací tabulky. Tato tabulka pak obsahuje zakódovaná písmena latinky, řecké abecedy, arabské abecedy, čísla, grafické znaky, povely, atd. Přiřazením více významů jednomu číslu ve strojovém kódu se ušetří spousta místa zejména v paměti a na disku či ve flešce.

O kódování se může každý dovědět např. zde. Do strojového (tj. číselného) kódu musí být zakódována nejen čísla, ale také text, zvuk a obraz. Překlad (překódování) je rozebrán tady. Jeho jednotlivé části jsou tu, tuhle, tadyhle, tuto a tuná.

Program „se“ vyvíjí, vlastně jej vyvíjí či lépe řečeno vytváří programátor nebo tým programátorů. Programátor takový program nejprve navrhuje a potom jej „ladí.“ Při návrhu obvykle nejdříve určí účel programu, soubor dat a jejich označení i tvar výsledků. Určí způsoby zpracování (použité matematické funkce, druh matematických algoritmů, aj.). Data, která nemají matematický tvar (např. pravidla pravopisu) musí přitom být zakódována do číselného tvaru. Datové typy jsou: logické hodnoty (0 či 1), celá čísla, reálná čísla, pole, textové řetězce (slova v mateřském jazyku), seznamy, ukazatele, soubory, komplexní čísla. Je zřejmé, že např. iracionální čísla (např. Ö2, e, p) nemohou být uložena přesně, protože nelze uložit nekonečný počet desetinných míst).

Představa, že program pro živý organismus vzniká a vyvíjí se sám, bez působení inteligentního programátora, je nesmyslná. Z jaké hmoty vznikne nápad o určení a chodu programu sám od sebe? Čím je program složitější, tím více potřebuje tvůrčího myšlení a praktického uskutečňování těch myšlenek pomocí konkrétních a jednoznačně vybraných instrukcí a dat.

Genetický algoritmus

Podle wikipedie je obecné schéma algoritmu toto:

  1. Vytvoř nultou populaci (obvykle složenou z náhodně vygenerovaných jedinců)
  2. Začátek cyklu. Pomocí určité výběrové metody (zpravidla zčásti náhodné) vyber z populace několik jedinců s vysokou zdatností
  3. Z vybraných jedinců vygeneruj nové použitím následujících metod (operátorů), čímž vznikne další generace:
    • křížení – „prohoď“ části několika jedinců mezi sebou
    • mutace – náhodně změň část jedince
    • reprodukce – kopíruj jedince beze změny
  4. Vypočti zdatnost těchto nových jedinců
  5. Konec cyklu. Pokud není splněna zastavovací podmínka, tak pokračuj od bodu 2
  6. Konec algoritmu. Jedinec s nejvyšší zdatností je hlavním výstupem algoritmu a reprezentuje nejlepší nalezené řešení.

Podle Lunera:

t := 0
Initialize G(0) inicializuj počáteční generaci
Evaluate G(0) proveď ohodnocení
do while not Done dokud není splněna ukončovací podmínka, proveď  t := t + 1
Select G(t) from G(t-1) proveď přirozený výběr
Crossover G(t) aplikuj křížení
Mutate G(t) aplikuj mutaci
 Evaluate G(t) proveď ohodnocení
loop

Genetický algoritmus kromě křížení a mutace tedy obsahuje obecně užívané instrukce: začátek cyklu, konec cyklu, čítač (počitadlo), počáteční a horní hodnotu čítače, skok při splnění horní meze čítače, druh funkce a její výpočet. Všechny, tj. běžné i zvláštní algoritmy (genetické) mají tytéž vlastnosti, které jsem uvedl výše (např. konečnost).

V kapitole „Jak genetické algoritmy pracují“ Luner uvádí: „Nejprve je třeba vybrat nějakou počáteční populaci přípustných řešení. To se děje většinou náhodně, ale máme-li k dispozici nějaké heuristiky, můžeme je uplatnit právě v tomto kroku.“ Zde bude hrát velkou roli intuice, protože není možné zkoušet nekonečně nebo velmi mnoho alternativ. Příkazem ve skutečnosti je celistvá část generování pseudonáhodného čísla z intervalu  se zaokrouhlením na celé číslo, jehož výsledkem je buď 0, nebo 1. Tento příkaz se má provést opakovaně, tzn. ve smyčce. Takto se vygeneruje celý osmibitový bajt, který se zde nazývá „jedinec“ nebo „chromozom.“ Po vygenerování určitého počtu jedinců neboli po vygenerování populace jedinců (počtu bajtů) následuje ohodnocení jedinců (fitness), a to podle počtu jedniček. Výsledek by pak vypadal takto (cituji z daného textu):

„jedinec ohodnocení
A 00010000 1
B 11011101 6
C 10000100 2
D 01100001 3“

Algoritmus bude pokračovat výběrem stejného počtu bajtů (jedinců) podle ohodnocení. Takže vznikne nová „populace“ B, D, B, C. „Dále budeme aplikovat křížení. To se děje podle nějaké předem dané pravděpodobnosti. Pro jednoduchost předpokládejme, že se uplatní u páru B, D a u páru B, C nikoliv.“ Křížení totiž může nastat jen u páru jedinců.

Dalším příkazem je mutace. „Pro pár B, D tedy určíme náhodně pozici. Nechť je to např. hned první pozice. Provedeme výměnu konců řetězců a dostaneme tak dva nové jedince E=11100001 a F=01011101. Nyní na každý z jedinců E, F, B, C může být aplikována mutace. Předpokládejme, že se tak stane u jedince B, a to např. na páté pozici. Dostaneme tedy B’=11010101. Nová generace bude vypadat takto:

jedinec ohodnocení
E 11100001 4
F 01011101 5
B’11010101 5
C 10000100 2

Můžete si povšimnout, že maximální ohodnocení v nové generaci je menší (klesnulo ze 6 na 5), průměrné ohodnocení se však zvýšilo.“

Vypadá to skvostně. Jenže údajná historická evoluce takto probíhat nemohla. Každý bajt v příkladech je kódem určitého skutečného biologického jedince a v něm každý bit představuje určitou vlastnost tohoto organismu. Jestliže je hodnota určitého bitu (např. čtvrtého v pořadí zleva) u některého jedince jiná, má tedy tento jedinec danou vlastnost (již ten bit kóduje) jinou. Zde se jedinec E liší od jedince F a B´, ale ne od jedince C. Vlastnosti jedinců se v globálu v populaci jedinců liší poměrně značně a vzniká otázka, zda jde jen o malou změnu nebo zda se populace už od počátku skládá z naprosto odlišných jedinců, kteří nemohou být zahrnuti do jednoho druhu organismu. Tou odlišnou vlastností není „fitness“, tedy schopnost přežití, ale může to být schopnost vidění, slyšení, nebo něco jiného!

Autor nezapomněl uvést:

„Jaké jsou hlavní výhody GA [genetického algoritmu]?

  • nevyžadují žádné speciální znalosti o cílové funkci
  • jsou odolné vůči sklouznutí do lokálního optima
  • vykazují velmi dobré výsledky u problémů s rozsáhlými množinami přípustných řešení
  • mohou být využity pro nejrozmanitější optimalizační problémy

Jaké jsou hlavní nevýhody GA?

  • mají problém s nalezením přesného optima
  • vyžadují velké množství vyhodnocování cílové funkce
  • jejich implementace není vždy přímočará.“

Také z tohoto je zřejmé, že takto evoluce (makroevoluce) nefungovala. V principu tedy genetické algoritmy žádnou skutečnou historickou evoluci nenapodobují, ale napodobují předpokládaný či lépe řečeno lidmi vymyšlený vývoj.

Závěr

Informace je nehmotná, nevzniká z něčeho hmotného. Pro její identifikaci námi lidmi musí být zaznamenána. Tento záznam už hmotný je. Už samovolný vznik jednoduché instrukce (např. příkazu „jdi tam a tam“) je nesmysl. Natož přesné a správné uspořádání instrukcí do algoritmu a přesné a správné uspořádání algoritmů do programu. Také kódování, překlad a přesné uložení jednotlivých instrukcí, jakož algoritmů v programu. Nemůže samovolně vzniknout nějakými kombinacemi hmoty. A ani průběhem fyzikálních podmínek (teploty, tlaku či intenzity záření).

Pominul jsem vznik a vývoj nepohlavně se reprodukujících organismů, u nichž žádné křížení nenastává. A samozřejmě jejich údajnou přeměnu na párující se organismy. Tady už vůbec nelze aplikovat výše uvedené genetické algoritmy.

Život nevznikl a neměnil se náhodně a působením či vlivem podmínek, ale byl vytvořen Tvůrcem. To už jenom proto, že od nejjednodušších organismů obsahuje instrukce, nehmotné entity.

Subscribe
Upozornit na
0 Komentáře
Inline Feedbacks
View all comments