亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        改進(jìn)的并查集迷宮地圖生成算法研究與設(shè)計(jì)

        2022-06-27 10:00:00史寶明賀元香馬少斌
        關(guān)鍵詞:單元格子集結(jié)點(diǎn)

        史寶明,賀元香,馬少斌

        (蘭州文理學(xué)院數(shù)字媒體學(xué)院,甘肅 蘭州 730010)

        0 引言

        迷宮存在的歷史已經(jīng)有5 000多年,最早可以追溯到古希臘的神話傳說(shuō)。迷宮不僅在現(xiàn)實(shí)生活中比較常見(jiàn),而且在計(jì)算機(jī)游戲中也有很廣泛的應(yīng)用[1-3],游戲中的迷宮可以通過(guò)手工繪制或建模的方式生成,也可以通過(guò)設(shè)計(jì)迷宮生成算法自動(dòng)生成,游戲中的迷宮地圖可以極大地增強(qiáng)游戲的趣味性,提升游戲的吸引力。一般而言,迷宮有單迷宮和復(fù)迷宮之分,單迷宮是指只有一種走法的迷宮,可沿著某一面墻壁走,用左(右)手始終摸著左(右)面的墻壁,就一定可以走出迷宮。復(fù)迷宮是指有多種走法的迷宮。在復(fù)迷宮中如果存在一些路徑可以不回頭地走回原點(diǎn),則以這條閉合的回路為界,復(fù)迷宮可以被劃分為多個(gè)部分,因此復(fù)迷宮可看作由多個(gè)單迷宮組合而成。

        迷宮地圖在計(jì)算機(jī)游戲中有著廣泛的應(yīng)用,可以通過(guò)特定的算法來(lái)隨機(jī)生成迷宮地圖,當(dāng)游戲角色在迷宮場(chǎng)景中隨機(jī)游走時(shí)[4],可以極大地增強(qiáng)游戲的趣味性和吸引力。迷宮的生成算法多種多樣,典型的生成算法主要有深度優(yōu)先搜索算法[5]、隨機(jī)Prim算法[6]、遞歸分割算法[7]、并查集算法[8-11]等。并查集(Union-Find Sets)是一種樹(shù)型的數(shù)據(jù)結(jié)構(gòu),主要用來(lái)處理不相交集合的合并及查詢問(wèn)題,在任務(wù)規(guī)劃求解[8]、聚類分析[9]、機(jī)器視覺(jué)檢測(cè)[10-12]等領(lǐng)域有著廣泛的應(yīng)用,以下著重研究使用并查集算法生成迷宮地圖。

        1 并查集

        1.1 并查集算法

        并查集是一種應(yīng)用廣泛的集合,由若干不相交的子集合組成,并查集算法主要包含并(Union)操作和查(Find)操作。

        Find(a):判斷元素a屬于哪一個(gè)子集,即在一個(gè)集合樹(shù)中不斷向上查找到它的根結(jié)點(diǎn)并返回。這個(gè)操作可以判斷兩個(gè)元素是否屬于同一個(gè)子集,即判斷根結(jié)點(diǎn)是否相同。

        Union(a,b):將元素a所在的集合和元素b所在的集合并為一個(gè)集合。

        除了這兩個(gè)操作,還有建立單元素集合的操作(MakeSet),通過(guò)這些操作可以解決實(shí)際中經(jīng)常碰到的規(guī)劃問(wèn)題、聚類問(wèn)題、迷宮生成問(wèn)題等。并查集通常采用樹(shù)形結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),每個(gè)元素中都存儲(chǔ)其父元素的地址信息,下面通過(guò)圖1和圖2演示并查集的操作過(guò)程。

        (a)子集一 (b)子集二圖1 兩個(gè)并查集子集

        (a)C接A (b)A接C圖2 執(zhí)行并操作

        在圖1中,對(duì)于D和G兩個(gè)元素,判斷它們是否連通,即是否屬于同一個(gè)集合,可按如下方法進(jìn)行:對(duì)于元素D和G執(zhí)行查操作Find(x),返回對(duì)應(yīng)元素的根結(jié)點(diǎn),即有Find(D)的值為A,F(xiàn)ind(G)的值為C,發(fā)現(xiàn)兩個(gè)根元素不相同,可知D和G屬于兩個(gè)不同的子集,此時(shí)表明這兩個(gè)子集是不連通的。若希望D和G連通時(shí),就需要執(zhí)行并操作,即將G的根C接到D的根A上,如圖2(a)所示,此時(shí)樹(shù)的深度為3,或?qū)的根A接到G的根C上,如圖2(b)所示,此時(shí)樹(shù)的深度為4。子集連接的選擇,對(duì)整個(gè)算法的性能有很大的影響,可采取如下策略對(duì)并查集算法進(jìn)行優(yōu)化。

        1.2 優(yōu)化方法

        在執(zhí)行并操作時(shí),如果不注意連接方式,就有可能導(dǎo)致連接后的樹(shù)出現(xiàn)不平衡的現(xiàn)象,如圖2(b)所示,進(jìn)而導(dǎo)致查找過(guò)程變慢。解決的辦法有兩鐘:一種方法是按秩合并;另一種方法是采用路徑壓縮來(lái)優(yōu)化集合樹(shù)。

        1.2.1 按秩合并

        這里的秩指的就是樹(shù)的深度,按秩合并即記錄每個(gè)子集樹(shù)的深度,當(dāng)執(zhí)行兩個(gè)子集樹(shù)的并操作時(shí),選擇始終將深度小的樹(shù)的樹(shù)根接到深度大的樹(shù)的樹(shù)根上,如圖2(a)所示,即將深度小的樹(shù)C接到深度大的樹(shù)A上,樹(shù)的深度不變;若兩個(gè)樹(shù)的深度大小一樣,則可任意合并,合并后的樹(shù)的深度加1。按秩合并可以讓集合樹(shù)盡可能地保持相對(duì)平衡,進(jìn)而可以提升查找效率。

        1.2.2 路徑壓縮

        路徑壓縮是一種在執(zhí)行“查”操作時(shí)扁平化樹(shù)結(jié)構(gòu)的方法,即在遞歸的查找樹(shù)的過(guò)程中,將每一個(gè)結(jié)點(diǎn)的父結(jié)點(diǎn)直接設(shè)置為根結(jié)點(diǎn)(圖3),這樣可讓查找效率大大提升。路徑壓縮的思想著重關(guān)注每個(gè)結(jié)點(diǎn)的父結(jié)點(diǎn),而無(wú)需關(guān)注樹(shù)的結(jié)構(gòu),這個(gè)方法不僅極大地優(yōu)化了“查”操作,同時(shí)也優(yōu)化了“并”操作,可使并查集算法的效率大大提高。

        圖3 路徑壓縮

        2 改進(jìn)的并查集迷宮生成算法

        2.1 迷宮初始化

        當(dāng)設(shè)定好一個(gè)m行n列的迷宮時(shí),考慮墻體在內(nèi)則需要一個(gè)2m+1行2n+1列的矩陣Maze[2m+1,2n+1]來(lái)進(jìn)行迷宮的初始化。假設(shè)行列的序號(hào)都從0開(kāi)始,則一個(gè)迷宮空間可被偶數(shù)行和偶數(shù)列墻體劃分為一個(gè)一個(gè)的小單元。一個(gè)2m+1行2n+1列迷宮矩陣的初始化過(guò)程如下:

        for (i = 0; i < 2*m+1; i++)

        for (j = 0; j < 2*n+1; j++)

        {

        if (i == 0 || i ==2*m || j == 0 || j ==2*n)

        maze[i,j] = 1; //迷宮外墻設(shè)置

        else if (i % 2 == 0 || j % 2 == 0)

        maze[i,j] = 1; //迷宮中間墻設(shè)置

        else

        maze[i,j] = 0; //迷宮單元格設(shè)置

        }

        Maze[i,j]的值為1表示墻體單元格,為0表示迷宮單元格。一個(gè)3×3迷宮的初始化狀態(tài)如圖4(a)所示,其中,黑色單元格為永久性墻體,網(wǎng)格狀單元格和斜線單元格為可拆除墻體,白色單元格為迷宮單元格。如果墻體單元格用1表示,迷宮單元格用0表示,則可得到圖4(b)所示的一個(gè)二維01矩陣。將墻體簡(jiǎn)化為線條后的迷宮如圖4(c)所示。

        (a)初始化 (b)數(shù)據(jù)化 (c)墻體簡(jiǎn)化為線條

        2.2 迷宮生成

        迷宮生成的基本思路是在已初始化的迷宮矩陣中先設(shè)定起點(diǎn)和終點(diǎn),并將可拆除的墻(即圖4(a)中的網(wǎng)格墻和斜線墻)放入一個(gè)列表,然后循環(huán)從列表中不斷隨機(jī)選擇一面墻,判斷被墻分隔的兩個(gè)迷宮單元是否連通,若不連通就拆掉該墻,并將該墻從列表中移除,重復(fù)此過(guò)程直到起點(diǎn)和終點(diǎn)連通為止。在迷宮生成的過(guò)程中,執(zhí)行并查集算法中的并操作時(shí),采用按秩合并的策略進(jìn)行,在執(zhí)行查操作之前,先對(duì)集合樹(shù)進(jìn)行路徑壓縮處理。整個(gè)迷宮生成的算法設(shè)計(jì)如下:

        Step1 在迷宮中選定起點(diǎn)a和終點(diǎn)b;

        Step2 將網(wǎng)格墻和斜線墻單元格結(jié)點(diǎn)信息放入列表list中;

        Step3 隨機(jī)從list中取出一面墻,對(duì)該墻兩側(cè)的單元格結(jié)點(diǎn)分別執(zhí)行“查”操作,查找其根結(jié)點(diǎn);

        Step4 判斷兩個(gè)結(jié)點(diǎn)的根結(jié)點(diǎn)是否相同,若不相同,執(zhí)行“并”操作,打通墻,并將此墻移出對(duì)應(yīng)列表;

        Step5 對(duì)起點(diǎn)a和終點(diǎn)b分別執(zhí)行“查”操作,判斷其是否連通,若不連通,跳轉(zhuǎn)到Step3繼續(xù),否則算法終止。

        在每次執(zhí)行“并”操作時(shí),使用按秩合并的方法進(jìn)行集合樹(shù)的合并,在執(zhí)行“查”操作時(shí),先采用路徑壓縮的方式對(duì)集合樹(shù)進(jìn)行扁平化處理,再進(jìn)行查找,可以極大地提高查找效率。上述算法結(jié)束的條件是起點(diǎn)和終點(diǎn)連通,此時(shí)迷宮中有些單元格可能還未訪問(wèn)到,這會(huì)導(dǎo)致有些迷宮單元格永遠(yuǎn)都到達(dá)不了的情形出現(xiàn),若希望能夠到達(dá)迷宮的任意單元格,則只需將算法結(jié)束的條件更改為列表list為空即可。

        3 算法仿真及結(jié)果分析

        3.1 實(shí)驗(yàn)環(huán)境

        實(shí)驗(yàn)仿真的計(jì)算機(jī)型號(hào)為L(zhǎng)enovo啟天M6600,操作系統(tǒng)為Window10(64位),處理器為Intel?CoreTMi5-6500 CPU@3.20 GHz,測(cè)試軟件為Visual Studio 2017,算法用C#編程實(shí)現(xiàn)。

        3.2 迷宮地圖生成仿真

        迷宮生成程序使用C#語(yǔ)言實(shí)現(xiàn),使用并查集算法思想先生成迷宮矩陣,再根據(jù)迷宮矩陣來(lái)繪制迷宮地圖。

        設(shè)定迷宮格為15×15,則對(duì)應(yīng)的迷宮矩陣為31×31,迷宮單元格之間的墻體采用線條來(lái)進(jìn)行繪制,設(shè)定迷宮的起點(diǎn)為最左上的單元格,終點(diǎn)為最右下的單元格,則當(dāng)起點(diǎn)連通終點(diǎn)時(shí),運(yùn)行3次程序生成的迷宮,如圖5所示。

        (a)第1次 (b)第2次 (c)第3次圖5 起點(diǎn)連通終點(diǎn)時(shí)生成的迷宮

        由圖5可以看出,每一次運(yùn)行生成的迷宮均不相同,在3次生成的迷宮地圖中,均存在一些封閉的迷宮單元格,四面都有墻體,在這樣的迷宮中行走時(shí),這些封閉的迷宮單元格是無(wú)法訪問(wèn)到的。將迷宮生成的終止條件變更為遍歷到每一個(gè)迷宮單元格,再運(yùn)行程序,運(yùn)行3次后得到的結(jié)果如圖6所示。

        (a)第1次 (b)第2次 (c)第3次圖6 遍歷所有單元格后生成的迷宮

        由圖6可以看出,3次運(yùn)行結(jié)果中均不存在不可訪問(wèn)的迷宮單元格,此時(shí)從迷宮中任意一點(diǎn)出發(fā),都可以遍歷所有的迷宮單元格,這也是在實(shí)際中應(yīng)用較為廣泛的一種迷宮。

        3.3 算法結(jié)果分析

        以上使用并查集思想設(shè)計(jì)的迷宮生成算法在生成迷宮時(shí),只需要控制一個(gè)二維矩陣中矩陣元素的01變化即可,在迷宮初始化時(shí),通過(guò)雙重循環(huán)來(lái)設(shè)置矩陣元素,時(shí)間復(fù)雜度為O(n2),使用并查集算法生成迷宮時(shí),時(shí)間主要消耗在“查”操作上,如果對(duì)查找的樹(shù)采用了路徑壓縮,則可將“查”操作的時(shí)間復(fù)雜度由O(n)提升為O(1)。在遍歷迷宮單元格時(shí),只需一個(gè)while循環(huán)作為遍歷結(jié)束的終止條件,其時(shí)間復(fù)雜度為O(n),并且可通過(guò)控制結(jié)束條件來(lái)生成不同類型的迷宮??偟貋?lái)看,使用改進(jìn)的并查集算法生成迷宮地圖時(shí)效率較高,生成的迷宮地圖結(jié)構(gòu)布局合理,適合在各種迷宮探索游戲中進(jìn)行部署和應(yīng)用。

        4 結(jié)語(yǔ)

        本文設(shè)計(jì)并實(shí)現(xiàn)了基于并查集思想的迷宮地圖自動(dòng)生成算法,通過(guò)按秩合并、路徑壓縮等方式對(duì)迷宮生成算法進(jìn)行了優(yōu)化,算法設(shè)計(jì)高效,可以應(yīng)用在各類游戲開(kāi)發(fā)中。除了文中探討的并查集迷宮自動(dòng)生成算法外,研究如何將深度優(yōu)先搜索算法、Prim算法、遞歸切割算法應(yīng)用在迷宮地圖的生成中并加以改進(jìn),如何在生成好的迷宮地圖中進(jìn)行高效的智能尋路,是今后課題研究的重點(diǎn)方向。

        猜你喜歡
        單元格子集結(jié)點(diǎn)
        由一道有關(guān)集合的子集個(gè)數(shù)題引發(fā)的思考
        拓?fù)淇臻g中緊致子集的性質(zhì)研究
        玩轉(zhuǎn)方格
        玩轉(zhuǎn)方格
        關(guān)于奇數(shù)階二元子集的分離序列
        淺談Excel中常見(jiàn)統(tǒng)計(jì)個(gè)數(shù)函數(shù)的用法
        西部皮革(2018年6期)2018-05-07 06:41:07
        Ladyzhenskaya流體力學(xué)方程組的確定模與確定結(jié)點(diǎn)個(gè)數(shù)估計(jì)
        每一次愛(ài)情都只是愛(ài)情的子集
        都市麗人(2015年4期)2015-03-20 13:33:22
        基于Raspberry PI為結(jié)點(diǎn)的天氣云測(cè)量網(wǎng)絡(luò)實(shí)現(xiàn)
        基于DHT全分布式P2P-SIP網(wǎng)絡(luò)電話穩(wěn)定性研究與設(shè)計(jì)
        我和隔壁的少妇人妻hd| 69堂在线无码视频2020| 日本在线观看一区二区视频| 富婆叫鸭一区二区三区| 亚洲av迷人一区二区三区| 亚洲av无码一区二区三区乱子伦| 看全色黄大色大片免费久久| 91精品国产91久久久无码95| 久久99久久99精品观看| 日韩av在线手机免费观看| 日日日日做夜夜夜夜做无码| 欧美aa大片免费观看视频| 亚洲国产精品久久九色| 亚洲第一大av在线综合| 欧美成人午夜免费影院手机在线看 | 加勒比av在线一区二区| 婷婷成人丁香五月综合激情| 亚洲av片不卡无码久久| 国产精品涩涩涩一区二区三区免费| 亚洲白嫩少妇在线喷水| 夜夜爽妓女8888888视频| 亚洲女人被黑人巨大进入| 日产精品一区二区三区免费| 日本午夜a级理论片在线播放| 天堂8在线新版官网| 97久久天天综合色天天综合色hd | 精品国产免费久久久久久| 国产色婷亚洲99精品av网站| 丰满人妻熟妇乱又仑精品| 人妻少妇精品视频一区二区三区| 亚洲精品亚洲人成在线播放| 日韩av在线手机免费观看| 人妻少妇精品视频专区| 精品国产一级毛片大全| 99RE6在线观看国产精品| 一二三四在线观看视频韩国| 中文字幕无码毛片免费看| 无码人妻精品一区二区三18禁| 亚洲一区不卡在线导航| 人妻中文字幕日韩av| 亚洲av无码国产精品色软件下戴 |