Informacni hodnota clanku je slusna, to ano, ale ten kod. Nejde cist. Nazvy mnohych promennych jsou krypticke. Vypocet probiha v konstruktoru (!) tridy. Navic se tam micha kreslici a vypocetni kod. Temer nic neni oddelene do samostatnych metod, napr. doCrossover(), doMutation() apod. Takhle ja si ukazkovy kod nepredstavuju. "Setreni mistem" (uspora par radku inlinovanim funkci) zde opravdu "neni na miste".
Navic mam pocit, ze SimpleGA mutuje jedince i tehdy, pokud se nekrizili, coz tenhle kod myslim nedela.
Jo, uvedeny kod nedovoluje mutaci, pokud se nekrizilo.
Je to sice jen o definici SimpleGA a vuli autora, ale mnohdy je uzitecne provadet mutaci i bez krizeni. Obzvlaste kdyz krizenim hrozi rozbiti jedince (vznik nevalidniho reseni), nebo je oprava rozbiteho jedince prilis draha.
Napriklad pri krizeni (rozhodovacich) stromu s unikatnimi atributy v listech a pritom chceme zajistit, aby vysledny strom po krizeni (prohozeni nahodne vybranych podstromu) mel i nadale dane vlastnosti - urcitou hloubku, unikatni atributy v listech - tedy ze se nam nestane, ze ve 2 listech budeme mit shodny atribut apod.
Proto taky v pripadech, kdy mame v genu kodovane slozitejsi struktury nez pole cisel - napriklad uz zminene stromy, kusy zdrojoveho kodu, polynomy, atd. a mame i striktnejsi pozadavky na validitu reseni, prichazi do uvahy evolvovat misto techto struktur gramatiky poposujici pripustna reseni. Obrovskou vyhodou je, za kazda takto vznikla gramatika produkuje pouze validni reseni. Nic anm vsak nezarucuje, ze takto produkovana reseni budou lepsi, nez jina - primo nalezena pomoci GA i za cenu velmi slozitych implementaci doCross()/doMutate() s pripadnymi naslednymi opravami vzniklych zmetku.
Je tedy na kazdem, aby peclive uvazil jakou cestou jit a idealne se rovnou poucit z predchozich (ne)uspechu jinych experimentatoru.
Souhlasim. Cvicne jsem si zkusil zavest tridu Organism s tim double[9] a fitness, par radku pribylo, velikost souboru se vsak dokonce zmensila a je to samozrejme mnohem prehlednejsi. Takhle to autor utopil v polich a indexech. Pripomina mi to starou poucku, ze fortranske programy se daji psat v jakemkoli jazyce :-)
Jinak serial hezky, sice jsem se na GA vyblbnul az moc, ale cist bych o tom mohl porad. Tesim se na dalsi dil.
ja myslim, ze vytky na kod jsou temer zbytecne, vzdyt je to jen par desitek
radku, tak to snad dokaze precist kazdy.
rozsekat tenhle kousek kodu na milion ruznych metod, ktere by stejne
obsahovaly radek nebo dva radky kodu, abyste se v tom
vyznali by byl kanon na komara.
tak mohlo by se pole zaznam[][] jmenovat treba record[][] kdyz uz se vsechny ostatni promenne pojmenovavaji anglicky.... :-)
bez podrobnejsiho zkoumani treba nezjistim k cemu je vubec pole arFitness[] to se opravdu nemohlo jmenovat hur...
v celem kodu chybi mezery - okolo zavorek, znamenek, vsude
a asi nejvetsi maglajz v tom dela to proporcionalni pismo... to by se mozna jeste dalo vytunit
jasne ze se to da s trochou snahy precist a pochopit, ale autor si dela spatne PR a asi mu klesne pocet ctenaru, coz je imho skoda
Kdyby byl autor profesionální programátor, tak by ten kód vypadal jinak, ale autor je profesionál v něčem jiném a ten kód podle toho vypadá - a co? Když nějakého čtenáře zajímá problematika natolik, že je ochoten číst zdroják, tak beztak nejlepší způsob na pochopení je copy&paste do nějakého IDE a hrát si s tím... a může si to i cvičně zrefaktorovat ;)
Ano, kod je citelny, ale s urcitou davkou usili. Nekdy proste par radek kodu rekne vic, nez odstavec popisku. A kdyz ten kod je takto zatemnen, je to pochopeni slozitejsi.
Za me tedy vic oddelovat kod na vypocty a malovani, vystiznejsi pojmenovavani a vic odsazovani. jinak super!
Asi opravdu skoncim u toho cvicneho refaktoringu. Nebyl to nakonec autoruv cil, nedelat to ctenarum zbytecne jednoduche a zadat takhle domaci ukol :) ?
http://jgap.sourceforge.net/ - trosku horsie sa to rozsiruje a defunuje strom
http://www.epochx.org/ - celkom pekna kniznica a dobre funguje,len je to single thread
Teraz sa akurat hram z http://watchmaker.uncommons.org/
Ked mas pevne dane miesto v obrazku a presny font, pricom mas cisla, tak nepotrebujes ziadne evolucne algoritmy a ani neuronove siete, lebo nie je treba ziadne prisposobovanie sa niecomu.
Podla mna je najlepsie skusit spravit na konkretnom mieste rozdiel medzi niekde zaznamenanym cislom (kludne vo forme obrazku) a aktualnym stavom. Tieto rozdiely staci nejak scitat a vratit to cislo, ktore da najmensi rozdiel. Mierne vylepsenie je, ked sa nevrati nic, ak je najmensi rozdiel prilis velky.
Toto som nejaku dobu uspesne pouzival na odcitavanie hodnot zo 7 segmentoveho displeja pomocou webkamery; stacilo na to za hodinu "ubastlit" cca 50 riadkovy kod v PHP (inde neviem tak lahko pristupovat k jednotlivym pixelom).
Ak je treba nieco na "mechanicke porovnavanie", tak odporucam taketo riesenie - urcite to funguje lepsie, nie je to treba skoro vobec ladit a skoro nie je moznost, aby sa tam vyskytla skryta chyba.
Jsem liny si s tim hrat, ale takhle od pohledu bych nasel i lepsi vysledek.
Zajima me, co vedlo autora k pouziti normalniho rozdeleni v hodnotici funkci. Tim myslim radek:
quality += Math.exp( -(x*x) / (2.0*sigma*sigma) );
Co by se stalo, kdybych to jen tak hloupe poscital:
quality += x*x;
A pak zrejme otocil znamenko, protoze vlastne hledame maximum, takze vlastne:
quality -= x*x;
Zmensi se tim rozdil fitness mezi lepsim a horsim resenim. Pri selekci pak bude o neco vetsi pravdepodobnost vyberu horsich jedincu a tim o neco vetsi diverzita populace. Muze to pomoct proti predcasne konvergenci k lokalnimu minimu.
Metod pro zachovani diverzity populace je spousta a predpokladam, ze se tomu nejaky dalsi clanek bude venovat.
Bez toho by to fungovalo taky. Jak dobre, to nevim. Muselo by se to zmerit. Neexistuje zadny presny navod jak pouzivat EA.
U nas na pracovisti mame oblibeny bonmot: nevis-li si rady s problemem, nasroubuj na to adhoc neuronovku, nejlepe mixlou genetickym algoritmem, ant kolonii a uplne nejlip totalnim random blind-searchem ve vysocedimenzionalnim prostoru (pro jistotu ho pred hodne lidma nazyvej poradne vedecky, jako n-dimenzionalni krychle, abys nebyl za pitomecka), pak udelej nezopakovatelny experiment na pochybnych datech, ktery nejde nijak interpretovat, ale neco si vymysli ... a uspech je zarucen; tohle je oblibena kratochvile ruznych velkych ceskych IT odborniku, kvazivedcu a dalsi pakaze, ktera pumpuje prachy od statu a EU. Inu, staci se podivat na webove stranky nekterych VS u nas, kde se ,,dela informatika'', ... to je teda pekny pruser, ... to jen tak pro zamysleni.
Zkusil jsem to udělat v CoffeeScriptu:
https://gist.github.com/2367382
Taky tam mám některé názvy docela kryptické, ale psal jsem to pro sebe a až pak mě napadlo to sem hodit... F je fitness, apod...
Ke stažení i tady (nevím na jak dlouho, CloudApp si čistívám):
http://cl.ly/2S3N2s1o431e3X1x163w
clanek je skvelej. ctu o tom poprve.
pro kod bych se primluvil za vice popisku v kodu aby clovek co zna z programovani jen par jednoduchych veci se v tom vyznal a chapal zpusob vypoctu. napr ja znam jen neco malo z vba a javu vubec. verim ze nas je hodne co skoro vubec neumime programovat ale postup nas zajima :)
jinak je to skvely a v clanku dobre popsany.