小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Beam Search算法初探

 520jefferson 2023-04-11 發(fā)布于美國(guó)

一、算法概述

當(dāng)涉及到搜索和決策問(wèn)題時(shí),傳統(tǒng)的搜索算法(如深度優(yōu)先搜索、廣度優(yōu)先搜索)往往面臨著搜索空間過(guò)大、低效等挑戰(zhàn)。Beam Search算法是一種常見(jiàn)的搜索算法,它的基本思想是在搜索過(guò)程中保留一個(gè)固定大小的集合(稱為"beam"),并且只考慮這個(gè)集合中概率最高的一部分結(jié)果。通過(guò)限制搜索空間,Beam Search算法能夠在較短的時(shí)間內(nèi)找到概率最高的解決方案。
Beam Search算法被廣泛應(yīng)用于自然語(yǔ)言處理、機(jī)器翻譯、語(yǔ)音識(shí)別等領(lǐng)域。比如,在機(jī)器翻譯中,Beam Search可以用來(lái)生成翻譯結(jié)果;在文本生成中,它可以用于生成文章摘要、對(duì)話生成等;在語(yǔ)音識(shí)別中,該算法可以用于識(shí)別出口語(yǔ)中的關(guān)鍵字、命令等。
雖然Beam Search算法具有高效性和可擴(kuò)展性,但是它也存在一些問(wèn)題,例如可能會(huì)陷入局部最優(yōu)解、束寬大小不好確定等問(wèn)題。針對(duì)這些問(wèn)題,研究人員提出了一些優(yōu)化策略,例如剪枝、重排序等。
總的來(lái)說(shuō),Beam Search算法是一種有效的搜索方法,它在自然語(yǔ)言處理、機(jī)器翻譯、語(yǔ)音識(shí)別等領(lǐng)域有著廣泛的應(yīng)用,對(duì)于提高搜索效率和結(jié)果質(zhì)量具有重要意義。

圖片

圖 beam search

二、算法原理

Beam Search算法是一種在搜索階段保留固定大小集合并只考慮概率最高一部分結(jié)果的搜索算法。算法從初始狀態(tài)開始,計(jì)算每個(gè)可能的下一個(gè)狀態(tài),并將這些狀態(tài)添加到一個(gè)新的Beam集合中。然后,從新的Beam集合中選擇概率最高的前N個(gè)狀態(tài),并將它們作為新的Beam集合。重復(fù)上述步驟直到滿足終止條件,返回概率最高的狀態(tài)。當(dāng)N等于1時(shí),Beam Search與貪心算法等同,下面是Beam Search算法的偽代碼。

圖片

束寬大小和節(jié)點(diǎn)評(píng)價(jià)函數(shù)是Beam Search算法的兩個(gè)核心點(diǎn),對(duì)于搜索效率和結(jié)果質(zhì)量都具有重要影響。合適的束寬大小能夠平衡搜索速度和結(jié)果準(zhǔn)確性;正確的節(jié)點(diǎn)評(píng)價(jià)函數(shù)能夠確保選擇概率最高的候選項(xiàng),從而提高搜索結(jié)果的質(zhì)量。

三、單源最短路徑問(wèn)題

為了詳細(xì)闡述Beam Search算法的運(yùn)行原理,本文以較為簡(jiǎn)單的單源最短路徑問(wèn)題為例,逐步向讀者介紹Beam Search的求解過(guò)程。同時(shí)以Greedy作為該問(wèn)題的baseline,論證Beam Search相對(duì)于Greedy的優(yōu)越性,全局性。

單源最短路徑問(wèn)題是在一個(gè)有向或無(wú)向加權(quán)圖中,找到從一個(gè)起點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑的問(wèn)題。其中,邊的權(quán)重表示從一個(gè)節(jié)點(diǎn)到另一個(gè)節(jié)點(diǎn)的距離、時(shí)間或費(fèi)用等。該問(wèn)題被廣泛應(yīng)用于尋找路線規(guī)劃、網(wǎng)絡(luò)優(yōu)化、資源分配等領(lǐng)域。常用的解決算法包括Dijkstra算法、Bellman-Ford算法和SPFA算法等。下圖為一個(gè)簡(jiǎn)單的單源最短路徑問(wèn)題,問(wèn)題的目標(biāo)是找到從節(jié)點(diǎn)0到節(jié)點(diǎn)4的最短路徑。

圖片

圖 單源最短路徑問(wèn)題

四、貪心算法求解最短路徑問(wèn)題

假如使用貪心算法求解該問(wèn)題,第一步會(huì)從0走到1,第二步從1走到2,第三步從2走到8,,第四步從8走到6,第五步從6走到7,從節(jié)點(diǎn)7只能走到1或者8,都是已經(jīng)訪問(wèn)過(guò)的節(jié)點(diǎn),因此回退一步,第五步改為從節(jié)點(diǎn)6到節(jié)點(diǎn)5,第六步從節(jié)點(diǎn)5到節(jié)點(diǎn)4。貪心算法最終探索出的最短路徑為0-1-2-8-6-5-4,總距離為32,貪心算法代碼如下。

def greedy(graph,start,end):    nodes=graph['nodes']    '''    轉(zhuǎn)字典,便于查詢,例:[0,1,4]->{0:[(1,4)],1:[(0,4)]}    '''    edges={}    for edge in graph['edges']:        if not edge[0] in edges:            edges[edge[0]]=[(edge[1],edge[2])]        else:            edges[edge[0]].append((edge[1],edge[2]))                    if not edge[1] in edges:            edges[edge[1]]=[(edge[0],edge[2])]        else:            edges[edge[1]].append((edge[0],edge[2]))    '''    貪心求解    '''    cur=start    path=[start]    tabu=[start]    distance=[]    while cur!=end:        '''        選擇和cur相連的最短節(jié)點(diǎn)        '''        minDis=1e10        bestNode=-1        for edge in edges[cur]:            '''            如果存在節(jié)點(diǎn)為最終節(jié)點(diǎn),則此節(jié)點(diǎn)最優(yōu)。            否則選擇最近節(jié)點(diǎn)            '''            if edge[0]==end:                minDis=edge[1]                bestNode=end                break            else:                if minDis>edge[1] and not edge[0] in tabu:                    minDis=edge[1]                    bestNode=edge[0]        '''        存在可選節(jié)點(diǎn)則更新當(dāng)前節(jié)點(diǎn)、路徑、距離。        如果不存在則倒退一步        '''        if not bestNode==-1:            cur=bestNode            path.append(cur)            distance.append(minDis)            tabu.append(cur)        else:            tabu.append(path[-1])            path.pop()            distance.pop()            cur=path[-1]    return path,sum(distance)    graph={}nodes=[0,1,2,3,4,5,6,7,8]edges=[(0,1,4),(0,7,8),(1,2,8),(1,7,11),(2,3,7),(2,5,4),\       (2,8,2),(3,4,9),(3,5,14),(4,5,10),(5,6,2),(6,7,1),(6,8,6),(7,8,7)]graph['nodes']=nodesgraph['edges']=edgesgreedy(graph,0,4)

五、Beam Search求解最短路徑問(wèn)題

不同于簡(jiǎn)單的Greedy算法,Beam Search考慮一個(gè)固定寬度的beam,即每個(gè)階段得分最高的固定數(shù)量的節(jié)點(diǎn)。算法的輸入為一張有向圖、起始節(jié)點(diǎn)編號(hào)終止節(jié)點(diǎn)編號(hào)、beam的寬度,輸出為最短路徑以及路徑對(duì)應(yīng)的距離

首先,算法定義隊(duì)列queue,記錄每個(gè)節(jié)點(diǎn)的狀態(tài),即[當(dāng)前節(jié)點(diǎn)的距離,當(dāng)前節(jié)點(diǎn)編號(hào),具體路徑]。初始狀態(tài)為[0,0,[0]],下一個(gè)階段可觸達(dá)的節(jié)點(diǎn)是1和7,將新增節(jié)點(diǎn)放入隊(duì)列中,而后對(duì)隊(duì)列進(jìn)行排序,保留距離最短的beam_search個(gè)節(jié)點(diǎn);接著對(duì)隊(duì)列中所有節(jié)點(diǎn)進(jìn)行expand,考慮所有可觸達(dá)的節(jié)點(diǎn),將節(jié)點(diǎn)添加到隊(duì)列,再保留最優(yōu)的beam_width個(gè)節(jié)點(diǎn),重復(fù)操作,直到隊(duì)列為空。

下面給出了Beam Search求解單源最短路徑的源代碼,代碼中包含詳細(xì)的注釋。

import heapq
def beam_search(graph, start, end, beam_width=3): queue = [(0, start, [start])] # 初始化隊(duì)列,第一個(gè)元素為代價(jià)、第二個(gè)為節(jié)點(diǎn)、第三個(gè)為路徑 visited = set() # 初始化已訪問(wèn)節(jié)點(diǎn)集合 while queue: cost, node, path = heapq.heappop(queue) # 取出最小代價(jià)的節(jié)點(diǎn) if node == end: # 如果找到了終止點(diǎn),則返回最短路徑 return path,cost if node in visited: # 如果節(jié)點(diǎn)已經(jīng)被訪問(wèn)過(guò),則跳過(guò) continue visited.add(node) # 將當(dāng)前節(jié)點(diǎn)添加到已訪問(wèn)集合中 for neighbor, weight in graph[node].items(): # 擴(kuò)展當(dāng)前節(jié)點(diǎn)的鄰居節(jié)點(diǎn) new_cost = cost + weight # 計(jì)算新的代價(jià) new_path = path + [neighbor] # 添加新節(jié)點(diǎn)到路徑中 heapq.heappush(queue, (new_cost, neighbor, new_path)) # 將擴(kuò)展出來(lái)的節(jié)點(diǎn)加入優(yōu)先隊(duì)列中 queue = sorted(queue)[:beam_width] # 限制隊(duì)列寬度,只保留代價(jià)最小的beam_width個(gè)節(jié)點(diǎn) return None # 如果沒(méi)有找到可行路徑,則返回None
'''定義圖''' graph={0: {1: 4, 7: 8}, 1: {0: 4, 2: 8, 7: 11}, 7: {0: 8, 1: 11, 6: 1, 8: 7}, 2: {1: 8, 3: 7, 5: 4, 8: 2}, 3: {2: 7, 4: 9, 5: 14}, 5: {2: 4, 3: 14, 4: 10, 6: 2}, 8: {2: 2, 6: 6, 7: 7}, 4: {3: 9, 5: 10}, 6: {5: 2, 7: 1, 8: 6}}  ''' 求解 '''beam_search(graph,0,4,20)

當(dāng)beam_width等于10時(shí),得到的最優(yōu)路徑為0-1-2-3-4,總距離為28;當(dāng)beam_width為20時(shí),得到的最優(yōu)路徑為0-7-6-5-4,總距離為21。

六、本文小結(jié)

本文首先簡(jiǎn)單介紹了Beam Search的基本概念以及應(yīng)用場(chǎng)景,然后通過(guò)單源最短路徑問(wèn)題對(duì)Beam Search做了進(jìn)一步闡述,并給出了貪心算法和Beam Search的源碼,與貪心算法相比,Beam Search考慮了更多節(jié)點(diǎn),能夠在可接受的時(shí)間范圍內(nèi)獲得更好的解。

為了讀者快速理解,本文選擇的例子是一個(gè)規(guī)模極小的單源最短路徑問(wèn)題,實(shí)際上Beam Search在很多問(wèn)題的求解上都有不俗表現(xiàn)。它既不像貪心算法,僅考慮當(dāng)前狀態(tài),極易陷入局部最優(yōu),又能夠有效避免深度廣度搜索等精確算法對(duì)應(yīng)的時(shí)間復(fù)雜度過(guò)高的問(wèn)題,通過(guò)調(diào)整beam的寬度可以在時(shí)間和效果上進(jìn)行有效的trade-off??偠灾?,Beam Search的應(yīng)用廣泛,操作簡(jiǎn)單,是極為有效的算法。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多