Umělá inteligence při matematických výpočtech

Algoritmy Matematické Umělá inteligence při matematických výpočtech

Již od 6. třídy základní školy hledám odpověď na to, jak správně udělat program, který zvládne vyřešit (téměř) libovolný matematický problém, podobně jako by to dělal člověk, podá kompletní postup a nakonec ještě výsledek v mnoha formátech. Řešení jsem již nalezl a tento článek má sloužit jako teoretický nádech toho, jak to zhruba funguje.

Nebojte se rekurze

Znáte lepší příklad rekurze, než samotnou matematiku? Již paní učitelka na Základní škole říkávala: "Matematika je královna všech věd, protože všechno vychází ze všeho a vše je vzájemně propojeno."

Sice jsem tomu tehdy moc nerozuměl, ale jak plynul čas, tak jsem pochopil samotnou podstatu toho všeho. Pro vyřešení libovolného matematického problému v zásadě nepotřebuji mít pokročilé znalosti dané problematiky, stačí jen znát obecná pravidla a naprosto vše lze odvodit na základě předchozích znalostí.

Asi vás napadá, že takto nemůžeme pokračovat do nekonečna a nějaké základní znalosti mít musíme, takže si nejprve definujeme seznam základních pravidel, o kterých prohlásíme, že platí za jakýchkoli okolností a nebudeme je hlouběji zkoumat (aspoň tedy ne po programové části). Tyto základní (primitivní) entity budou tvořit jádro našeho systému, takže jakýkoli složitější problém půjde postupně rozdělit na kombinaci těchto pravidel.

V rámci úspory zde nebudu vypisovat všechna pravidla, která moje jádro využívá, takže bude muset stačit jen několik příkladů. Veškeré "vzorečky" jsou pouze symbolické:

  • Znaky 0, 1, 2, 3, 4, 5, 6, 7, 8 a 9 jsou číslice.
  • Číslo je definováno jako posloupnost jedné a více číslic.
  • Mezi čísly lze použít tyto operace: + (sčítání), - (odčítání), * (násobení, opakované sčítání), / (dělení, opakované odečítání), ^ (mocnění, opakované násobení), ...
  • Mocnění má přednost před násobením a dělením, násobení a dělení má přednost před sčítáním a odčítáním.
  • sin, cos, tg, tan, log, ... jsou funkce (definovány se samostatným algoritmem, využívám zabudovaných funkcí přímo v PHP).
  • samovolně ležící znak (rozmezí a-z) je proměnná, skupina znaků je buď funkce (zjišťuje se podle tabulky, nebo skupina proměnných, které se mezi sebou násobí).
  • znak "=" znázorňuje rovnost, obě strany si musí být rovny.

Takto můžeme pokračovat dál a definovat si veškeré matematické poučky, až vytvoříme obrovskou znalostní bázi toho, co vše se může v zápisu vyskytovat. V zásadě pouze popisujeme chování jednotlivých entit, nikoli postupy, jak s nimi pracovat.

Těžkou práci nechme strojům

Představme si, že máme k dispozici počítač, který zná veškeré matematické poučky pouze na teoretické bázi a ještě nikdy neřešil nějaký konkrétní příklad, vůbec nezná žádné chytré metody, zkrátka se neučil jako člověk, ale jako stroj.

Jak si tedy poradí s následujícím příkladem?

5 + 3 * x = 20

Na tuto otázku neexistuje jednoznačná odpověď, protože jsme ještě nezačali počítat a nemáme k dispozici žádný vyhodnocovací algoritmus, pouze seznam základních pravidel. Pojďme si tedy nejprve teoreticky říct, jak by program měl postupovat a čeho by si měl všímat.

Už jenom podle syntaxe příkladu je jasné, že si jej musí podle naučených pravidel rozdělit na několik oblastí, které bude řešit samostatně a opět použije stejná pravidla. Protože jsou matematické zápisy strukturované a záleží na pořadí jednotlivých entit a platí nejrůznější pravidla ohledně přednosti, tak se dělení na jednotlivé elementy musí provést rekurzivně. Ideálně tedy tak, že se nalezne první rozdělující pravidlo, zavolá se znovu dělící funkce s rozdělenými objekty a takto se pokračuje dále, než je vše rozděleno na triviální elementy, které lze řešit přímo.

  • Nejprve tedy program zjistí, že zápis obsahuje znak "=", který celý příklad dělí na 2 nezávislé části. Provede tedy hrubé rozdělení řetězce se vstupem na 2 nezávislé a zavolá je jako argument vyhodnocovací funkce, která provedla toto rozdělení (zkrátka spustí rekurzi).
  • Rozhodovací funkce se spouští znovu a tentokrát má za úkol zpracovat 2 různé vstupy. Neví jak, jediné co ví je fakt, že její výstup musí vyhovět podmínce rovnosti obou vstupů. Začne tedy znovu aplikovat další vhodný vzorec ze své znalostní báze.
  • Dále si všimne, že násobení má přednost před sčítáním, takže nejprve musí násobit a poté výsledek přičíst. Není nic lehčího, než proces násobení převést rovnou na výsledek - ale na jaký, když je v předpisu neznámá proměnná? To ještě nevíme, ale můžeme si na to napsat opět rekurzi a poznamenat si podmínku toho, jaký očekáváme výstup. V kódu by to mohlo vypadat třeba takto: 5 + rekurze("3*x")
  • Dobrá, máme k dispozici už jen sčítání dvou entit, to je triviální, takže ukončujeme rekurzi, náš "strom" pravidel je hotový a můžeme jít vyhodnocovat.

Vyhodnocení pravidel

V této fázi máme k dispozici seznam pravidel, která musíme splnit, abychom našli řešení. Pravidla jsme si vytvořili na základě rekurze, která podle naučených vzorců prošla zadání.

Protože program ví, že se obě strany musí rovnat a že znak "x" představuje proměnnou (nějaké číslo), tak může začít zkusmo dosazovat, než se trefí. V tomto není žádná logika, program to bude zkrátka jenom zkoušet a za nějaký čas se dostane k výsledku.

Při každém pokusu o nějaké řešení provede analýzu všech podmínek a pokud se všechny splní, tak je program ukončen a vypíše se výsledek. Pokud by bylo vstupních podmínek mnoho, tak můžeme nasadit nějaký algoritmus, který bude hlídat postupné "blížení" k výsledku a bude omezovat kroky, které nemají smysl a akorát plýtvají čas.

Expení znalostí

Pokud takový program vypočítá mnoho různých příkladů, tak si může postupně ukládat, jak postupoval a jaké metody vedly často k dobrému výsledku. Pokud se nějaká metoda dobře osvědčí, tak jí může zařadit jako nové pravidlo a příště ji nebude muset znovu odvozovat a bude "chytřejší" a hlavně rychlejší.

Na podobném principu funguje i lidský mozek a jeho schopnost provádět nové objevy při zkoumání světa. Efektivitu zatím neřešme, takto jsme totiž sestrojili plně funkční univerzální "mozek", který se popere s téměř libovolně složitým úkolem. Bude jen vyžadovat definici toho, co může udělat a další definice si postupně vytvoří (spíše odvodí na základě pozorování) sám.

Pokud bychom měli opravdu hodně výpočetního výkonu, tak můžeme takto prakticky sestrojit umělou inteligenci, ale to je v současné době spíše nereálné, protože tato metoda neřeší mnoho problémů, které reálně nastanou. Cílem článku bylo spíše vysvětlení toho, jaké myšlenkové metody jsem při návrhu umělé inteligence ve svém vyhledávači použil.


 

  Aktivity (1)

Článek pro vás napsal Jan Barášek
Avatar
Autor se věnuje návrhu algoritmů, vyhledávání a matematice. Jednou by rád naprogramoval matematický vyhledávač, který bude lepší než Wolfram|Alpha.

Jak se ti líbí článek?
Celkem (17 hlasů) :
4.647064.647064.647064.647064.64706


 


Miniatura
Předchozí článek
Pojmy
Miniatura
Všechny články v sekci
Matematické algoritmy

 

 

Komentáře
Zobrazit starší komentáře (2)

Avatar
Michal Žůrek (misaz):

a víš jak ten WolframAlpha nebo MathWay funguje?

Odpovědět  ±0 13.6.2015 18:36
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jan Barášek
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Jan Barášek:

Já to vím, dokonce o tom mám už rozepsaný článek.

Odpovědět  +4 13.6.2015 20:28
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
Odpovídá na Jan Barášek
Michal Žůrek (misaz):

já jsem se ptal jeho. Protože on asi nepochopil význam tohoto článku.

Odpovědět  +3 13.6.2015 20:34
Nesnáším {}, proto se jim vyhýbám.
Avatar
vojta3310
Člen
Avatar
vojta3310:

Podle mě to postupné dosazování čísel nebude fungovat úplně dobře, protože jsou příklady co mají mnoho řešení, takže by si musel vyzkoušet všechna reálná čísla a když budeš pracovat s tím že se k výsledku blížíš tak nenajdeš všechna řešení. Takže by bylo dobré to spíše naučit vyjadřování proměnné, pomocí všech těch pouček.
Taky mě nenapadá jak by to řešilo nerovnice.
Nicméně ten princip s poučkami je zajímavý a možná by se tam nechalo implementovat i to vyjadřování proměnné a celkově práce s rovnicemi (převeď na druhou stranu ...).

 
Odpovědět  ±0 14.6.2015 9:09
Avatar
aetherofchao
Člen
Avatar
Odpovídá na vojta3310
aetherofchao:

s nerovnicemi to funguje téměř stejně jako s rovnicemi jen musíš dávat pozor aby se ti neprotočilo znaménko (nesmíš rozšiřovat záporným číslem, a když už ano pak musíš otočit znaménko < na >)

 
Odpovědět  ±0 14.6.2015 10:32
Avatar
vojta3310
Člen
Avatar
Odpovídá na aetherofchao
vojta3310:

Jo jasně to vím. Jen jsem se špatně vyjádřil. Myslel jsem jak by na nerovnici reagoval ten algoritmus s dosazováním. Když by hledal jen jedno řešení a pak skončil, tak vypíše jen krajní hodnotu jednoho z intervalů. A když by hledal více řešení ta by vypsal nekonečno reálných čísel (samozřejmě ne nekonečno ale několik podle toho s kolika desetinnými čísly by pracoval.
proto si myslím že místo dosazování by měl znát ty postupy jak se to učí ve škole a prostě vyjádřit proměnnou, dosadit za případné další proměnné a spočítat (případně použít nějakou tu tabulku na nerovnice, diskriminant ...).

 
Odpovědět  -1 14.6.2015 10:50
Avatar
Jan Barášek
Redaktor
Avatar
Odpovídá na vojta3310
Jan Barášek:

Omlouvám se, ale mýlíš se. Algoritmus samozřejmě udělá mnoho chyb a ze začátku nenajde úplně nejlepší řešení, ale najde aspoň nějaké uspokojivé. Postupem času může u některého z příkladů zjistit, že může existovat více řešení a pak se vrátí zpět k předchozím a znovu je přepočítá.

Naučit algoritmus konkrétní metody je cesta do pekel - takový algoritmus bude totiž umět vypočítat jen některé typy příkladů, ale nebude připraven řešit nové příklady s neznámou strukturou. Pokud chceš udělat program, který svojí inteligencí umí přesáhnout člověka, tak musíš napsat něco, co se zvládá samo učit do nekonečna. A právě na jednoduchých příkladech lze tuto inteligenci "odladit" dostatečně na to, abych mohl prohlásit, že je funkční a nechat jí naučit se celou matematiku.

Odpovědět  +1 14.6.2015 11:35
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
Michal Žůrek (misaz):

nemohl by ten algoritmus teoreticky najít poučky, které nám jsou zatím neznámé?

Odpovědět 14.6.2015 11:42
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jan Barášek
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Jan Barášek:

Ano, to je dokonce cílem. Současná matematika je již natolik složitá, že nové objevy budou dělat spíše stroje, než lidé.

Odpovědět  +3 14.6.2015 12:56
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
bem.jiri12
Člen
Avatar
bem.jiri12:

No článek se mi nelíbil, hlavně proto že byl absolutně zprmitivněn pro ZŠ. Na článek o tom jak funguje např. wolfram se určitě moc těším. Resp. mi příjde samozřejmé mít bázi pravidel apod. Od článku jsem čekal spíše možnosti jejich implementaci, nalezení všech řešení (důkaz o tom že to nemá více řešení), či nějakou matematiku vyší dívčí (statistiku, multilineárku či intergrální počty funkcí více proměných - což již ani wolfram nedokáže). Závěrem tedy chci říct, že článek určitě může mít několika dílné pokračování :). Jinak je to dobrý projekt na strávení zbytku života.

 
Odpovědět  -5 16.6.2015 22:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 12. Zobrazit vše