Кіріспе

Лабиринттерді құрудың автоматтандырылған әдістері – лабиринттерді жасауға арналған автоматты әдістер.

Рандомизацияланған тереңдіктегі бірінші іздеу

Бұл алгоритм, сондай-ақ "рекурсивті кері іздеуші" алгоритмі деп аталады, тереңдікке бірінші іздеу алгоритмінің кездейсоқ түрі болып табылады. Көбінесе стекпен іске асырылатын бұл тәсіл компьютер арқылы лабиринт жасаудың ең оңай жолдарының бірі. Лабиринт кеңістігін ұяшықтардың үлкен торы (мысалы, үлкен шахмат тақтасы) ретінде қарастырайық, әрбір ұяшық бастапқыда төрт қабырғамен жабдықталған. Кездейсоқ ұяшықтан бастап, компьютер әлі бармаған кездейсоқ көрші ұяшықты таңдайды. Компьютер екі ұяшық арасындағы қабырғаны жойып, жаңа ұяшықты барылған деп белгілейді және кері іздеуді жеңілдету үшін оны стекке қосады. Компьютер осы процесті жалғастырады, ал бармаған көршісі жоқ ұяшық – тұйыққа тірелу болып саналады. Тұйыққа жеткенде, компьютер бармаған көршісі бар ұяшыққа дейін жол арқылы кері қайтады, содан кейін осы жаңа, бармаған ұяшықты барып (жаңа түйіскен жер құрады) жолды жалғастырады. Бұл процесс барлық ұяшықтар барылғанша жалғасады, соның салдарынан компьютер бастапқы ұяшыққа кері қайтады. Біз барлық ұяшықтар барылғандығына көз жеткізе аламыз. Жоғарыда айтылғандай, бұл алгоритм кейбір компьютерлік архитектураларда стек асығып кетуіне себеп болатын терең рекурсияны қамтиды. Алгоритмді лабиринттің өзінде кері іздеу туралы ақпаратты сақтап, циклға айналдыруға болады. Бұл кез келген нүктеден бастап, бастапқы ұяшыққа кері қайту арқылы шешімді жылдам көрсетуге мүмкіндік береді. Тереңдікке бірінші іздеу арқылы жасалған лабиринттерде тармақтану факторы төмен және көптеген ұзын дәліздер болады, себебі алгоритм кері қайтудан бұрын әр тармақ бойынша мүмкіндігінше алысқа дейін іздейді.

Өзгертілген нұсқасы

Классикалық Прим алгоритмі шеттер тізімін сақтайтын болса, лабиринт жасау үшін көршілес жасушалар тізімін ұстауға болады. Кездейсоқ таңдалған жасушада егер қазіргі лабиринтке қосылатын бірнеше шет болса, сол шеттердің біреуін кездейсоқ таңдаңыз. Бұл, жоғарыдағы шеттерге негізделген нұсқаға қарағанда, сәл көбірек тармақтануға бейім.

Жайдастырылған нұсқа

Алгоритмді барлық ұяшықтардың немесе қабырғалардың салмағын есепке алмастан, бұрын барылған ұяшықтардың жанындағы ұяшықтарды кездейсоқ таңдау арқылы одан да оңайлатуға болады. Бастапқы ұяшыққа жол табу әдетте оңай, бірақ басқа жерге жол табу қиын болады.

Вильсон алгоритмі

Жоғарыда аталған алгоритмдердің барлығының түрлі қиылыстары бар: тереңдікке бірінші іздеу ұзын дәліздерге қарай қиысады, ал Крускаль/Прим алгоритмдері көптеген қысқа тұйыққа қарай қиысады. Вильсон алгоритмі, керісінше, барлық лабиринттер бойынша біркелкі таралудан циклдерді жоятын кездейсоқ жүріс арқылы бейтарап үлгі жасайды. Алгоритмді лабиринтті кездейсоқ таңдалған бір жасушадан бастау арқылы іске қосамыз. Содан кейін, тағы да кездейсоқ таңдалған жаңа жасушадан бастап, лабиринттегі жасушаға жеткенше кездейсоқ жүріс жасаймыз. Бірақ, егер кездейсоқ жүріс өзінің жолына жетіп, цикл құрса, одан әрі жүргенге дейін осы циклді жоямыз. Жол лабиринтке жеткенде, оны лабиринтке қосамыз. Содан кейін, барлық жасушалар толтырылғанша, басқа кездейсоқ басталатын жасушадан циклдерді жоятын кездейсоқ жүрісті қайталап орындаймыз. Бұл процедура бастапқы жасушаны кездейсоқ таңдау үшін қандай әдіс қолданылса да бейтарап болып қалады. Сондықтан, қарапайымдық үшін біз әрқашан бірінші бос жасушаны (мысалы) солдан оңға, жоғарыдан төменге таңдауымыз мүмкін.

Рекурсивті бөлу әдісі

+ Рекурсивті бөлінудің мысалы бастапқы камера екі қабырғамен бөлінеді қабырғалардағы тесіктер бөлінуді жалғастырады аяқталды

Лабиринттерді рекурсивті бөліну арқылы жасауға болады, бұл алгоритм келесідей жұмыс істейді: лабиринт кеңістігін қабырғаларсыз бастаңыз. Бұны камера деп атаңыз. Камераны кездейсоқ орналасқан қабырғамен (немесе бірнеше қабырғамен) бөліңіз, сонда әр қабырғада кездейсоқ орналасқан өту тесігі болады. Содан кейін, барлық камералар ең кішкентай өлшемге жеткенше, осы процесті рекурсивті түрде қайталаңыз. Бұл әдіс кеңістігін кесіп өтетін ұзын, түзу қабырғалары бар лабиринттерді құрайды, бұл қай аймақтардан қашу керектігін анықтауды жеңілдетеді. Мысалы, тіктөртбұрышты лабиринтте екі қабырғаны кездейсоқ нүктелерде бір-біріне перпендикуляр етіп салыңыз. Бұл екі қабырға үлкен камераны төрт кіші камераға, төрт қабырғамен бөліп, бөледі. Төрт қабырғаның үшеуін кездейсоқ таңдап, әрқайсысында кездейсоқ нүктеде бір ұяшық енді тесік жасаңыз. Әр камераның ені екі бағытта бір ұяшыққа дейін жеткенше осылай жалғастырыңыз.

Фракталды теселяция алгоритмі

Бұл лабиринт жасаудың қарапайым және жылдам тәсілі. Әр итерацияда алгоритм өзін 3 рет көшіріп, екі есе үлкен лабиринт құрайды. Әр итерацияның соңында 4 кіші лабиринттің арасында 3 жол ашылады. Бұл әдістің артықшылығы – өте жылдамдығы. Ал кемшілігі – қалаған өлшемдегі лабиринт жасау мүмкін емес, бірақ осы мәселенің шешімі үшін түрлі амалдар қолданылуы мүмкін.

Қарапайым алгоритмдер

Басқа алгоритмдер де бар, олар 2D лабиринттің бір қатарын немесе 3D лабиринттің бір жазықтығын сақтауға жететін жадты ғана қажет етеді. Эллер алгоритмі ағымдағы қатардағы қай жасушалардың бұрынғы қатарлардағы жасушалар арқылы байланысқандығын сақтап, циклдардың пайда болуын болдырмайды және екі бұрыннан байланысқан жасуша арасындағы қабырғаларды ешқашан жоймайды. Sidewinder алгоритмі жоғарғы қатардың бойымен ашық өткелмен басталады, ал келесі қатарлар жоғарыдағы өткелмен бір байланысы бар қысқа көлденең өткелдерден тұрады. Sidewinder алгоритмін төменнен жоғарыға қарай шешу оңай, себебі оның жоғары бағытта тұйықталған жолдары жоқ. Бастапқы ені берілген екі алгоритм де шексіз биіктіктегі лабиринттерді жасай алады. Көптеген лабиринт құру алгоритмдері оның ішіндегі жасушалар арасындағы байланысты сақтауды талап етеді, нәтижесінде оны шешуге болады. Дегенмен, әр жасушаға жеке-жеке назар аудару арқылы қарапайым байланысқан лабиринттерді жасауға болады. Бинарлық ағаш лабиринті – бұл әр жасушада әрқашан жоғары немесе солға қарай өтетін жол бар, бірақ ешқашан екеуі де бірдей болмайды. Бинарлық ағаш лабиринтін құру үшін әр жасуша үшін жоғары немесе солға қарай өтетін жолды қосуды шешу үшін монетаны лақтырыңыз. Шекарадағы жасушалар үшін әрқашан бірдей бағытты таңдаңыз, нәтижесінде бинарлық ағаш сияқты көрінетін, қарапайым байланысқан лабиринт пайда болады, оның түбірі жоғарғы сол жақ бұрышында орналасқан. Sidewinder сияқты, бинарлық ағаш лабиринтінде де бағытталған тұйық жолдар жоқ. Әр жасуша үшін монетаны лақтырудың ұқсас түрі – кездейсоқ араласқан көлденең және кері көлденең белгілерді пайдаланып сурет жасау. Бұл қарапайым байланысқан лабиринтті емес, жабық циклдар мен біржолғы өткелдерді құрады. Commodore 64 нұсқаулығында осы алгоритмді қолданатын BASIC бағдарламасы ұсынылған, графикалық бейнесін жақсарту үшін PETSCII диагональдық сызық графикалық белгілері қолданылған.

Ұялы автомат алгоритмдері

Кейбір түрдегі ұялы автоматтар лабиринттерді жасау үшін қолданылуы мүмкін. Екі танымал мысал – Maze және Mazectric ұялы автоматтары, олардың ережелері B3/S12345 және B3/S1234 болып табылады. Бірінші жағдайда, бұл жасушалардың бір ұрпақтан екіншісіне тірі қалуын білдіреді, егер олардың кемінде бір және көп дегенде бес көршісі болса. Екінші жағдайда, бұл жасушалардың бірден төртке дейін көршісі болса ғана тірі қалатынын білдіреді. Егер жасушада дәл үш көрші болса, ол пайда болады. Бұл Конвейдің «Өмір» ойынына ұқсас, себебі кез келген ұрпақта 1, 4 немесе 5 басқа тірі жасушалармен тікелей жанаспайтын үлгілер осы ойын сияқты әрекет етеді. Дегенмен, үлкен үлгілер үшін ол «Өмірден» мүлдем өзгеше болып көрінеді. Кездейсоқ бастапқы үлгі үшін, бұл лабиринт жасайтын ұялы автоматтар дәліздерді анық көрсететін қабырғалары бар күрделі лабиринттерге айналады. B3/S1234 ережесіне ие Mazectric, B3/S12345 ережесіне ие Maze-ге қарағанда, ұзын және түзу дәліздер жасауға бейім. Бұл ұялы автоматтар ережелері детерминистік болғандықтан, жасалған әр лабиринт оның кездейсоқ бастапқы үлгісімен толық анықталады. Бұл маңызды кемшілік, себебі лабиринттерді болжау оңай. Жоғарыда сипатталған граф теориясына негізделген әдістер сияқты, бұл ұялы автоматтар әдетте бір бастапқы үлгіден лабиринттерді жасайды; сондықтан бастапқы жасушаға жол табу әдетте оңай, бірақ басқа жерге жол табу қиын.