Кіріспе

Ұялы автоматтарды симуляциялауды жеделдету алгоритмі. Hashlife – Конвейдің «Өмір» ойыны және ұқсас ұялы автоматтардағы берілген бастапқы конфигурацияның болашақ тағдырын есептеуге арналған жадқа сақтау алгоритмі. Бұл алгоритм, автоматтың әрбір жасушасының әрбір уақыт қадамын симуляциялайтын баламалы алгоритмдерге қарағанда әлдеқайда жылдам жұмыс істейді. Алгоритмді алғаш рет Билл Госпер 1980-ші жылдардың басында Xerox Palo Alto Research Center-дегі зерттеу жұмыстары кезінде сипаттаған. Hashlife бастапқыда Symbolics Lisp машиналарында Flavors кеңейтуімен іске асырылған.

Хашлайф

Hashlife көптеген Life ережелерінде кеңістіктік және уақыттық артықшылықты пайдалануға арналған. Мысалы, Конвейдің өмірінде көбінесе кездейсоқ сияқты үлгілер қарапайым тұрақты түйірлер мен осцилляторлардың жиынтығымен аяқталады. Дегенмен, Hashlife үлгілердің бір орында қалуына тәуелді емес; ол үлкен үлгілерде бірнеше жерде, тіпті әртүрлі уақыттарда пайда болатын кіші үлгілердің болуын пайдаланады.

Өкілдік

Өріс әдетте теориялық шексіз тор ретінде қарастырылады, онда зерттеліп отырған үлгі координаталардың басына жақын орналасқан. Өрісті бейнелеу үшін квадри ағашы (түйіндерді бөлісу арқылы) қолданылады. Ағаштың k-шы деңгейіндегі түйін 22k ұяшықтан тұратын шаршыны, әр қабырғасында 2k ұяшықпен көрсетеді, сондай-ақ сол k-шы деңгей шаршысының төрт төртбұрышын білдіретін төрт k-1 деңгейлі түйіндерге сілтеме жасайды. Мысалы, 3-деңгейлі түйін 8×8 шаршыны көрсетеді, ол төрт 4×4 шаршыға бөлінеді. Нақты ұяшықтардың мазмұны тек 0-деңгейде ғана сақталады. Түбірлік түйін барлық тірі жасушалар ол көрсететін шаршының ішінде болатындай жеткілікті биік деңгейде болуы керек. Квадри ағашы көбінесе қарапайым бейнелеулерге (мысалы, биттер матрицасын пайдалану) қарағанда көп қосымша шығындарды қажет ететіндей көрінеді, бірақ ол түрлі оңтайландыруларға мүмкіндік береді. Әрбір жасуша тірі немесе өлі болғандықтан, 0-деңгейдегі түйін үшін тек екі мүмкіндік бар, сондықтан түйіндерді ата-аналар арасында бөлісуге рұқсат етілсе, барлығы 2-ден аспайтын 0-деңгейлі түйіндердің қажеті болмайды. Сол сияқты, 2×2 шаршыдағы 4 ұяшық тек әртүрлі комбинацияларды ғана көрсетуі мүмкін, сондықтан 1-деңгейлі түйіндерден артық қажет емес. Деңгейлер жоғарылаған сайын, мүмкін болатын kth деңгейлі шаршылардың саны өседі, бірақ кез келген нақты орында кездесетін ерекше kth деңгейлі шаршылардың саны әлдеқайда төмен, және көбінесе бір шаршының мазмұны бірнеше жерде кездеседі. Квадри ағашта түйіндерді барынша бөлісу үшін (бұл ағаш емес, бағытталған ациклдік граф), бірдей мазмұндағы барлық шаршыларды көрсету үшін тек бір түйін пайдалану жеткілікті.

Ашшінгіш

Хаш кестесі немесе, жалпы алғанда, кез келген ассоциативтік массив, квадраттың мазмұнын осы мазмұнды бейнелейтін бұрыннан бар түйінге байланыстыру үшін пайдаланылуы мүмкін, осылайша хэш келісімі арқылы сол мазмұнды бейнелейтін дубликат түйін жасаудан аулақ болуға болады. Егер бұл тұрақты қолданылса, төрт компоненттік түйіндік сілтемелерді хэштеу жеткілікті, себебі квадрат мазмұнының төменнен жоғары қарай хэштелуі әрқашан сол төрт түйіннің төменгі деңгейде екенін анықтайды. Көрсетілген деңгейдегі түйіндердегі бірнеше операцияларды осы түйіндердің мазмұнын тікелей жасамай-ақ, оның орнына белгілі бір деңгейде төменгі түйіндерге сілтемелермен жұмыс істеу арқылы орындауға болады.

Кэші және супер жылдамдық

Квадри ағашты түйіннің мазмұнына қатысты жаңарту нәтижесін кэшке сақтау арқылы толықтыруға болады. Квадраттың ішіндегі келесі уақыт қадамының мазмұнын анықтау үшін жеткілікті ақпарат жоқ, бірақ дәл сол нүктеде орналасқан квадраттың мазмұны, осы квадраттың келесі уақыт қадамының мазмұнын анықтайды. Келесі уақыт қадамындағы k деңгейлі түйін, көлденең және тік бағыттағы ұяшықтармен смещается, сондықтан тіпті өлі жағдайларда да, ол квадратты құрайтын k деңгейлі түйіндердің арасында болмауы мүмкін, бірақ k-1 деңгейінде квадраттар қайтадан бірдей орында болады және егер өзгермесе, ортақ пайдаланылады. Іс жүзінде, келесі уақыт қадамының мазмұнын есептеу – төменнен жоғарыға қарай рекурсивті операция, ол әрбір k деңгейлі түйіннің кэш өрісін, жаңартылған орталық квадраттың мазмұнын көрсететін k-1 деңгейлі түйінмен толтырады. Түйіндерді ортақ пайдалану осы операцияны айтарлықтай жылдамдатады, себебі қажетті жұмыс ұяшықтардың санына емес, түйіндердің санына пропорционалды. Егер түйіндер әртүрлі уақыт қадамдарын көрсететін квадри ағаштар арасында ортақ болса, онда кэштелген мәнді тек алдыңғы уақыт қадамында жаңадан құрылған түйіндерге ғана есептеу қажет. Супер жылдамдық одан да әрі барып, квадраттың мазмұны оның орталық квадратының келесі уақыт қадамдарындағы мазмұнын анықтайды деген тұжырымды пайдаланады. K деңгейлі түйіннің 1 қадам алдындағы мазмұны үшін k-1 деңгейлі түйінді кэштеудің орнына, оны бірнеше қадам алдындағы мазмұны үшін кэштеуге болады. K деңгейіндегі жаңартулар k-1 деңгейіндегі жаңартулардан есептелетіндіктен және k-1 деңгейінде уақыт қадамдарын жылжыту үшін кэштелген нәтижелер болғандықтан, k деңгейінде бірнеше қадамға жылжу үшін k-1 деңгейінде екі рет қайталау жеткілікті. Ең нашар жағдайда, k-1 деңгейіндегі 2 рет қайталау k-2 деңгейінде 4 толық рет қайталауды талап етуі мүмкін, бұл өз кезегінде k-3 деңгейінде 8 толық рет қайталауды қажет етеді, бірақ іс жүзінде ағаштағы көптеген кіші үлгілер бір-біріне ұқсас және рекурсияның көптеген тармақтары қысқа болады. Мысалы, зерттеліп жатқан үлгіде бір ғарыш кемесінің көптеген көшірмелері болуы мүмкін, сондай-ақ кеңістіктің үлкен бөліктері бос болуы мүмкін. Бұл кіші үлгілердің әрбір мысалы бірдей квадри түйінге хэштелді, сондықтан оларды бір рет қана сақтау қажет. Сонымен қатар, бұл кіші үлгілерді басқа Life алгоритмдеріндегідей әр көшірме үшін емес, бір рет бағалау қажет. Классикалық планерлік қару сияқты сирек немесе қайталанатын үлгілер үшін бұл үлкен жылдамдыққа ие болуға мүмкіндік береді, бұл жоғары буында үлкен үлгілерді жылдам, кейде экспоненциалды түрде есептеуге мүмкіндік береді. Полиномдық жылдамдықпен өсетін әртүрлі өсірушілер мен кеңістік толтырғыштардың ұрпағы Hashlife-те логарифмдік кеңістік пен уақыт арқылы бағалануы мүмкін. Әртүрлі өлшемдегі қосалқы үлгілер әртүрлі жылдамдықпен тиімді орындалатындықтан, кейбір іске асырулар, мысалы, Gosper-дің hlife бағдарламасы сияқты, интерактивті дисплейге ие емес; олар бастапқы үлгіге берілген санда қадамдарды жылжытады және әдетте командалық жолдан орындалады. Алайда, Golly сияқты жақында пайда болған бағдарламаларда Hashlife негізделген қозғалтқышты басқаратын графикалық интерфейс бар. Hashlife бағдарламасының қолайлы үлгідегі әдеттегі мінез-құлқы келесідей: алдымен алгоритм хэштеу және ағаш құрумен байланысты тұрақты шығындарға байланысты басқа алгоритмдерге қарағанда баяу жұмыс істейді; бірақ кейіннен жеткілікті деректер жиналады және оның жылдамдығы айтарлықтай артады – жылдамдықтың күрт өсуі көбінесе «жарылыс» деп сипатталады.

Кемшіліктері

Көптеген жадқа сақтау арқылы жұмыс істейтін кодтар сияқты, Hashlife басқа алгоритмдерге қарағанда әлдеқайда көп жадты пайдалануы мүмкін, әсіресе энтропиясы жоғары орташа өлшемді үлгілерде немесе квадри ағаштың түйіндерінің шекараларына нашар сәйкес келетін (яғни екінің дәрежесіндегі) кіші үлгілер болғанда; кэш – осал компонент. Бұл үлгілерде ол басқа алгоритмдерге қарағанда көбірек уақытты жұмсауы да мүмкін. Golly және басқа да Life симуляторлары Hashlife мен дәстүрлі алгоритмдер арасында ауысу опцияларын ұсынады. Hashlife-ті жүзеге асыру да әлдеқайда күрделі. Мысалы, кэштегі пайдаланылмаған түйіндерді жою үшін арнайы қоқыс жинағыш қажет. Басқа да алгоритмдерге қарағанда нашар жұмыс істейтін хаотикалық және жарылғыш ережелер, Hashlife әдетте болжамды үлгілерді өңдеу үшін жасалғандықтан, осындай жағдайда нашар жұмыс істейді.