判别两棵树是否相等 设计算法_从匈牙利算法到KM算法
網(wǎng)上搜了好多KM算法的文章,都寫得云里霧里。看了半天之后,我終于看懂了。其實(shí)KM算法非常簡單,只要會匈牙利算法了,一下就能看懂KM算法。
如果大家對自己的匈牙利算法不夠自信的話,可以先復(fù)習(xí)一下,放上我的上一篇文章。
https://zhuanlan.zhihu.com/p/208596378?zhuanlan.zhihu.comKM算法是解決什么問題的?
要知道,最大匹配不是唯一的,不同的人用匈牙利算法,可能找到不同的匹配結(jié)果。那么怎么評估這些不同的匹配呢?還是拿情侶配對舉例子,一種評價(jià)方法就是,看情侶彼此的滿意程度。比如,有的人當(dāng)媒人,介紹的每一對情侶都極其滿意,有的人當(dāng)媒人,雖然把情侶都湊在了一起,介紹的每一對情侶只是略微有意向,但是沒和最喜歡的在一起。
這個喜歡程度,就是給原本的二分圖,加了一個權(quán)重。
圖1 權(quán)重二分圖的最大匹配問題在權(quán)重的前提下,該如何尋找最大匹配,且使得權(quán)重最大呢?KM算法就是為了解決這個問題的。
權(quán)重問題的轉(zhuǎn)化 / KM算法和匈牙利算法的關(guān)系
我剛開始學(xué)習(xí)的時候,根本沒有想明白,KM算法和匈牙利算法的關(guān)系。
遇到不會的問題,一個思路就是想辦法轉(zhuǎn)換成自己會的問題。我們現(xiàn)在知道匈牙利算法能解決最大匹配的問題,現(xiàn)在加了權(quán)重,KM算法實(shí)際上就是想了個辦法,將問題轉(zhuǎn)換成了匈牙利算法可以解決的形式。
現(xiàn)在二分圖帶了權(quán)重,可以理解為加了一種約束,這種約束讓我們優(yōu)先選擇那些權(quán)重大的邊出來,進(jìn)行匹配。
因此我們要先把權(quán)重最大的邊都挑出來,學(xué)術(shù)一點(diǎn),就是挑一個子圖出來。因?yàn)槲覀兲舫鰜淼亩际菣?quán)重最大的邊,我們只要在這個子圖中,找到最大匹配,這個最大匹配一定是權(quán)重最大的(很重要,意思就是這個子圖里,在上面隨便找都是權(quán)重最大的匹配,這樣我們就能用匈牙利算法解決問題了)。流程就是:
找權(quán)重最大的邊組成的子圖--------→在這個子圖上找最大匹配上述流程很簡單吧,有一個問題是,我們都找最大權(quán)重的邊組成子圖,這個子圖很小,很容易沖突。形象來說,大家找對象的要求都太高了,很可能會沒法滿足他們的要求。眾所周知,找不到對象是很慘的,因此對象還是得找的。這時候只能委屈一部分人,讓他稍微降低一下的要求,讓他從別的人里挑對象。
因此目前的流程變成了:
-----------這個KM算法的流程,核心思想就是:優(yōu)先選擇最滿意的,因?yàn)橐筇哒也坏綄ο蟮哪切┤?#xff0c;降低標(biāo)準(zhǔn)擴(kuò)大擇偶范圍,直到找到對象為止。
這個問題中,找最大匹配的那一部分我們會了呀,用匈牙利算法就搞定了。剩下就是兩個問題了:
(1)怎么找到這個所謂的“權(quán)重最大的子圖”。
(2)怎么擴(kuò)大擇偶范圍。既不能降得太低,也不能不降。
上述兩個問題,就是KM算法的精髓。
這個權(quán)重最大的子圖,就是“相等子圖”。擴(kuò)大擇偶范圍,就是“頂標(biāo)的更新---建立新的相等子圖”的過程。
要注意的是,上面說的權(quán)重最大,并不是整個圖的范圍內(nèi)權(quán)重越大越好,而是目前能力范圍內(nèi)我們能選的最大的權(quán)重邊(畢竟有些人需要降低標(biāo)準(zhǔn)才能找到對象)。
接下來就要講如何解決上面提出的兩個問題。
第一個問題 如何尋找“權(quán)重最大的”子圖?
首先強(qiáng)調(diào)一點(diǎn),我們的這個子圖的目的,是為了實(shí)現(xiàn)一個效果:
在這個子圖上,不考慮權(quán)重找到最大匹配 等價(jià)于 在帶權(quán)重的圖上找權(quán)重最大的最大匹配。
我們挑一伙人出來,這些人彼此的滿意度都比較高,那些低的暫時不考慮。在這伙人里找對象。找不到了再考慮加人進(jìn)來。
為了實(shí)現(xiàn)這個目標(biāo),我們給每個人,增加一個頂標(biāo)。我們暫不考慮這個頂標(biāo)是怎么加的,將在下一步中再詳細(xì)講這個問題。現(xiàn)在假設(shè)我們已經(jīng)有一個頂標(biāo)了。
這個頂標(biāo)是我們決定一條邊是否加入子圖的依據(jù)。頂標(biāo)可以理解為擇偶的最高標(biāo)準(zhǔn),如果雙方的適配程度達(dá)到了這個最高標(biāo)準(zhǔn),就加入到擇偶范圍內(nèi)來,就是加入到子圖中。
因此,比如說小王擇偶的最高標(biāo)準(zhǔn)是
,小李擇偶最高標(biāo)準(zhǔn)。小王和小李的喜歡程度是 (即二分圖中,小王和小李的連線權(quán)重),若,小王和小李的連線就加入子圖中,進(jìn)入擇偶候選人范圍。注意到上面這個等式,于是這樣選出來的子圖,叫做相等子圖。
然而這個最高標(biāo)準(zhǔn),是不斷變化的。也就是下一個問題,如何不斷地調(diào)整最高標(biāo)準(zhǔn),讓擇偶范圍不斷變化。
第二個問題 如何擴(kuò)大擇偶范圍?
我們這里拿一個具體的例子來看。
這里有5個女生x1-x5, 5個男生y1-y5。他們之間為0就是沒有連線,大于0的數(shù)是權(quán)重,就是他們相互喜歡的程度。
第一步,最高標(biāo)準(zhǔn)初始化。
需要注意的是,我們是一個無向的二分圖,意思就是權(quán)重是雙方共同的喜歡程度,因此可以選一個人作為代表就行了。于是,我們讓女生做單方面的選擇。
于是男生們的頂標(biāo)都設(shè)為0。
一開始女生們都想找最喜歡的對象,我們將她們的最高標(biāo)準(zhǔn)都設(shè)為她們最喜歡的那個。比如,x1對所有男生都有意向,喜歡程度分別是3,5,5,4,1。那小王目前的最高標(biāo)準(zhǔn)就是5。
在第一次選擇中,y2、y3加入擇偶范圍,其他三人暫不考慮。所有女生都這樣,選出自己最喜歡的加入擇偶范圍。
我們就得到了子圖
這樣的好處就是,這樣挑出來的子圖中,彼此喜歡程度一定是最大的。這樣我們就不用考慮權(quán)重的問題了,問題就變成了一個在局部子圖上,挑選最大匹配的問題,就可以用匈牙利算法解決了。
接下來,我們就用匈牙利算法來給她們分配對象。紅線表示匹配好了。
x1和x2都成功找到了對象。但是x3也愿意和y2一起。沖突了。一開始有了矛盾,我們先用匈牙利算法給她們嘗試解決一下。
我們找到一條增廣路,x3---y2---x1----y3。取個反,沖突就解決了。x3也找到了自己最滿意的對象。
輪到x4了。x4最滿意的是y2和y3,但是都被挑走了。我們先用匈牙利算法,給她也試一下。開始找增廣路。x4----y2----x3----y3------x1----y2----????,發(fā)現(xiàn)到了y2,找不下去了,又回到y(tǒng)3了。 我們優(yōu)先廣度,試試另一條路。 x4----y3-----x1------y2-----x3------y3----???,發(fā)現(xiàn)又找不下去了。
此時此刻,匈牙利算法也解決不了了,就要開始擴(kuò)大擇偶范圍了。
第二步,最高標(biāo)準(zhǔn)調(diào)整。
我們隨便選擇一條上面沒走下去的交替路(由于沒有成功找到另一個未匹配的對象,所以這條交替路沒有資格被稱為增廣路)比如就選這條:
x4----y2----x3----y3------x1----y2----????
這條路線,在很多文章里也會被成為交替樹。一旦找到增廣路,我們就能擴(kuò)大匹配范圍,給x4也找到對象。但是現(xiàn)在失敗了,這個失敗的本質(zhì)是和路線上的人發(fā)生了沖突。2
于是我們看看,有哪些人和x4的失敗有關(guān)。女生:x1,x3,x4。男生:y2,y3。
現(xiàn)在我們要協(xié)調(diào)這幾個人的擇偶最高標(biāo)準(zhǔn)(也就是他們的頂標(biāo)),擴(kuò)大擇偶范圍了。
首先,我們不能破壞原有的關(guān)系,原來的頂標(biāo)都是設(shè)計(jì)好的,能保證選到自己最喜歡的對象。所以要保證他們之間最高標(biāo)準(zhǔn)不變,這樣保證原來的匹配不會發(fā)生變化。
這里讓上面和x4沖突的這些人里:女生的頂標(biāo)減少,男生頂標(biāo)增加,這樣他倆合起來標(biāo)準(zhǔn)不變。
但是,女生的頂標(biāo)減小了,其他人的機(jī)會就來了。
再回到剛剛我們挑子圖的公式,就是小王配小李的這個等式,
,現(xiàn)在小王因?yàn)楹蛣e人沖突了,降低了標(biāo)準(zhǔn),W就減小了,也就是有些權(quán)重沒那么大的邊,現(xiàn)在有機(jī)會被加進(jìn)子圖里了。
現(xiàn)在女生:x1,x3,x4都喜歡y2和y3,發(fā)生沖突了,而y1,y4,y5還沒被他們考慮。原本x1的標(biāo)準(zhǔn)是5,現(xiàn)在她要考慮y1的話,x1y1權(quán)重是3,需要降低2個標(biāo)準(zhǔn)。
同理,x1y4需要降低1; x3y1需要降低2, x3y4需要降低4-1=3;x3y5需要降低4-0=4。x4也一樣算法。
所以考慮到最大權(quán)重,最少要降低1個標(biāo)準(zhǔn)。
因此我們把x1,x3,x4的標(biāo)準(zhǔn)-1,y2,y3對應(yīng)+1。
在這個標(biāo)準(zhǔn)下,我們依舊要挑滿足“兩人頂標(biāo)和=兩人連線權(quán)重”的邊。
可以看出來,x4同學(xué)降低標(biāo)準(zhǔn)后,所有男同學(xué)都滿足她的標(biāo)準(zhǔn)了。
這時候按照匈牙利算法,x4和y1配對,沖突了,找到增廣路x4---y1---x2---y4。取反后,x4和y1配對,x2和y4配對。
再給x5找對象。x5也找到了y5作為對象。
現(xiàn)在所有人都有對象了。
此時他們的權(quán)重為4+2+3+0+3+0+1+1 +0+0 =14。
總結(jié)
以上是生活随笔為你收集整理的判别两棵树是否相等 设计算法_从匈牙利算法到KM算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone字体_iOS 13终于能换花
- 下一篇: 电脑教程从入门到精通_HALCON机器视