Avagy a (Hetedik Szem-es) tudatminták rendezéséről szólunk ebben a posztban. Az ilyen minták elemzését, avagy a Digitális Tudatlenyomatok Összehasonlító Könyvtárának létrehozását már beharangoztuk korábbi, Közösségi háló reloaded posztunkban.
De mik is ezek a minták, mi a Hetedik Szem? A Hetedik Szem egy a szerző doktori dolgozata kapcsán megnyitott mobil játék:
A „Hetedik Szem” egy Szabad Akarat Szonda (SZ.A.SZ) program, mely egy 2048 bites lelki (normál és erotikus) ujjlenyomatot vesz fel a játékostól. A program 10 ilyen lenyomat kezelésére: tárolására és összehasonlítására ad lehetőséget. Figyelem: ez egy játékprogram! Kizárólag szórakoztatásra szolgál, tipikus felhasználása, hogy ismerőseinktől felveszünk egy lenyomati görbét, amit aztán a sajátunkkal összehasonlíthatunk.
A játékba épített Szabad Akarat Szonda működése alatt feltesszük, hogy a játékos relaxációhoz hasonló állapotban játszik: csendes vagy halk, nyugtató jellegű zene mellett, besötétített vagy nem túl világos helyen kényelmesen elhelyezkedve, szemeket becsukva próbál ellazulni. Közben a telefon előkészítve a kézben, ujjak a megfelelő gombokon...
"Ez adja a mobil megoldás erejét és szükségszerűségét, mert egy ilyen relaxációs állapotban a PC billentyűzetének használata nem megoldható."
A Norbert Bátfai, Erika Bátfai, Ildikó Pšenáková (2010): Jávácska One: Open Source Mobile Games to Revolutionize Education of Programming, Journal of Computer Science and Control Systems, Vol. 3., No. 2., pp. 5-10, (2010) cikkből fordítva:
A játék ötletét Kornhuber és Libet (*, **) a tudatosság és az idő kapcsolatáról szóló eredményei sugallták. A program 2048 darab 100 milliszekundumos időszelettel dolgozik. Ha a játékos tűzgombot nyom az adott időszeletben, akkor 1-re, különben 0-ra állítjuk a szeletnek megfelelő bitet. Tehát esetünkben a tűzgomb nyomását feleltetjük meg egy "akaratlagos..."voluntary finger movements"-nek.
Az említett kísérletben résztvevő alanyoknak jobb mutatóujjukat kellett akaratlagosan behajlítani, a behajlítás időpontját EGM készülékkel határozták meg, miközben az fejbőrre rögzített elektródákkal mérték az agy elektromos aktivitását. Alanyonként ezer kísérletet átlagolva azt találták, hogy a behajlítást megelőzően már egy másodperccel megkezdődik az aktivitás.
A hasonló kísérletekből ragadtuk ki az akaratlagos ujjbehajlítást. (92. o.)
De pillantsunk a programba!
A mintákat folyamatosan animálva mutatja a jobb felső ábra, a jobb alsón az a box-plot látható, ami egyszerű értelmezhetősége miatt került a játékba: a két minta annál hasonlóbb, minél jobban fedi egymást a sárga és a kék téglalap.
A minták bitenkénti összehasonlítása másra nem jó, hacsak nem a feladat nehézségének érzékeltetésére. (Továbbá a játékélmény emelése miatt a 0-1 lenyomatok megjelenítését némi „zajjal” színezve, a nulla szintet néhány pixel magas véletlen amplitúdóval rajzoljuk meg.)
Esetünkben a lenyomatok összehasonlításának alapja a Ziv-Lempel-Welch (LZW) algoritmus, mely mellett a (***) utalására építünk, miszerint – az ismeretlen adatsorokkal való első ismerkedésben – az LZW során épített fa ághosszainak szórását érdemes összevetni.
Digitális Tudatlenyomatok Összehasonlító Könyvtára
Arra készülve, hogy hamarosan rendelkezni fogunk olyan humán mintákkal, ahol a minta mellett rendelkezésre fog állni a mintákat szolgáltatók kapcsolati hálója is, készítsük el azokat a C++ osztályokat, amik segítségünkre lesznek majd a minták elemzésében. Először rendezzük sorba a mintákat:
typedef std::bitset<50> TudatMinta; struct tudatRendezes { bool operator()(const TudatMinta& a, const TudatMinta& b) { LZWBinFa afa, bfa; for (int i=0; i<a.size(), i<b.size(); ++i) { afa << a[i]; bfa << b[i]; } return bfa.getSzoras() < afa.getSzoras(); } }; int main (int argc, char *argv[]) { std::vector< TudatMinta > v; TudatMinta elso(std::string("11111111111111111111111111111111111111111111111111")); TudatMinta masodik(std::string("11111000001111100000111110000011111000001111100000")); TudatMinta harmadik(std::string("01100101100111110010011011001100001100110010110111")); v.push_back(elso); v.push_back(masodik); v.push_back(harmadik); std::copy(v.begin(), v.end(), std::ostream_iterator<TudatMinta>(std::cout, "\n")); std::sort(v.begin(), v.end(), tudatRendezes()); std::copy(v.begin(), v.end(), std::ostream_iterator<TudatMinta>(std::cout, "\n")); }
A tudatRendezes funktor mutatja a rendezés alapját: a minta LZW fája ághosszainak szórása szerint rendezünk. Ezzel az iránnyal két legyet ütünk majd egy csapásra: a Hetedik Szemmel is fogalkozunk és a Prog1 előadással is szinkronban vagyunk: funktorok, az STL használata :)
(Vedd észre, hogy a példában használod az eddig kifejlesztgetett LZWBinFa osztályunkat.)
*: H. H. Kornhuber, L. Deecke, and P. Scheid, “Voluntary finger movement in man: Cerebral potentials and theory”, Biological Cybernetics, (23), 1976. 13
**: B. Libet, E. Wright, B. Feinstein, , and D. K. Pearl. “Subjective referral of the timing for a conscious sensory experience”, Brain, (102):193{224, 1979.
***: G. Tusnády, “Sztochasztikus számítástechnika”, KLTE, 1996.