遺傳算法,核心是達爾文
優勝劣汰適者生存的進化理論的思想。
我們都知道一個種群,通過長時間的繁衍,種群的基因會向着更適應環境的趨勢進化,牛B個體的基因被保留,后代越來越多,適應能力低個體的基因被淘汰,后代越來越少。經過幾代的繁衍進化,留下來的少數個體,就是相對能力最強的個體了。
那么在解決一些問題的時候,我們能不能學習這樣的思想,比如先隨機創造很多很多的解,然后找一個靠譜的評價體系,去篩選比較好的解 ,再用這些好的解像生小寶寶一樣生一堆可能更好的解,然后再篩再生,反復弄個幾代,得到的說不定就是近似最優解喲
說干就干,有一個經典組合問題叫“背包問題”,我們拿這種思路來試試
這個問題的衍生簡化問題 “0-1背包問題” 增加了限制條件:每件物品只有一件,可以選擇放或者不放,更適合我們來舉例
這樣的問題如果數量少,當然最好選擇窮舉法
比如一共3件商品,用0表示不取,1表示取,那么就一共有
000 001 010
011 100 101
110 111
這樣8種方案,然后讓計算機去累加和,與重量上限比較,留下來的解里取最大即可。
但如果商品數有300,3000,甚至3w種呢,計算量太大窮舉法可能就不適用了,這時如果遺傳算法使用得當,就能在較短的時間內幫我們找到近似的最優解,我們繼續往下看:
新的問題是12件商品的0-1背包問題
我們先讓計算機隨機產生1000個12位的二級制數
把總重量超過背包上限的解篩掉
剩下的兩兩一對隨機交換“基因片段”產生下一代
交換前:
0000 1100 1101
0011 0101 0101
交換后:
0000 0101 1101
0011 1100 0101
再篩選,再交配,如此反復幾代,留下的解攜帶的“基因“差不多就是最好的了,怎么樣跟生物進化是不是一模一樣?
其實還差點,生物繁殖過程中,新產生的基因是有一定幾率突變的,這是很多優良性狀的重要來源,遺傳算法中可也不能忽略它
那也有人得疑惑了,我怎么知道要讓哪個地方產生突變呢?其實蜘蛛俠NB之前,他也不知道蜘蛛咬在那能讓他變NB而不是SB,這就是一個概率問題。我們在設計算法的時候,會給每個基因設置一個突變概率(當然是非常非常小了)同樣的在基因交換階段交換哪些基因呢,也是一個算法設置問題。
總結一下,遺傳算法應該有
一個基本函數:適度函數f(x)
三個基本操作:選擇,交叉,變異
一.適度函數
適度函數很好理解,其實就是指解的篩選標准,比如我剛才說的把所有超過上限重量的解篩選掉,但是不是有更好的篩選標准或者這個現有的標准根本就是個渣呢?這將直接影響最后結果的接近程度以及求解所耗費的時間,所以設置一個好的適度函數很重要
二.選擇
剛才為了大家理解方便,我直接讓所有解都參與了后續的交叉以及變異,但真實世界可不是這樣子的,因為也不是每個人都會結婚生子的對吧。
說直白點,所謂【屌絲注孤生】【工科男注孤生】什么的還不是因為loser的基因不適合往下傳唄。不過實際情況是我們偶爾也能看到或聽到屌絲逆襲、鮮花牛糞之類勵志故事,只不過頻率比較低咯
沒錯,概率!在遺傳算法中 選擇也是個概率問題,在解的世界中(姑且這么稱呼吧)適度更高的高富帥們是不是應該有更高的概率被選去傳宗接代才合適呢?不過和現實世界一樣,適度低的屌絲解是要給人家一點希望的對不對?所以
在選擇一些解來產生下一代時,一種常用的選擇策略是 “比例選擇”,也就是個體被選中的概率與其適應度函數值成正比。假設群體的個體總數是M,那么那么一個體Xi被選中的概率為f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) )
三.交叉
這是例子中詳細說到的,交換兩個解的部分”基因”,來構造兩個子代的解。
四.變異
在繁殖子代的過程中,新產生的解中的“基因”會以一定的概率出錯,稱為變異。我們可以吧變異發生的概率設置為Pm
五.基本遺傳算法優化
精英主義:這是基本遺傳算法的一種優化。目的是防止進化過程中產生的最優解被變異和交叉所破壞。《遺傳算法原理及應用》介紹的最優保存策略是:即當前種群中適應度最高的個體不參與交叉運算和變異運算,而是用它來替換掉本代群體中經過交叉、變異等遺傳操作后所產生的適應度最低的個體。
后記:
其實不管是遺傳算法,還是模擬退火算法或者其他算法,其本質都是借鑒自然界中的規則規律,人為的為問題設置了一個模擬模型,然后用大自然告訴我們的規律去找最優解,在理解這些算法的時候,可以照着這個思路去走,一般能讓你快速撥雲見日,了解算法的核心思想。
比如遺傳算法,我們可以對比種群的進化,給問題設置的模型就是:
這樣參照着我們熟悉的知識體系,去理解學習,原來聽上去遙不可及的理論是不是一下就變得親切易懂了吧?
可是我們再看一些教科書或者就拿百度百科來說(怕也是摘抄的某本書上的段落)
真的是通篇不說人話啊!對已經了解這個算法思想的人來說,還能勉強硬着頭皮看下去,但對入門者來說,這TMD簡直就是噩夢!而這完全是國內各種教材的通病!
我其實一直在想,教材面向的明明就是望門欲入的初學者,你不弄得生動活潑一點招徠門徒就算了,在一群幼兒園小朋友面前賣弄之乎者也還顯本事了是么!我是還記得我們學校的高數書編的有多么生澀難懂,結果第一節課老教授上課時還說“我們不用同濟的版本,那本書太淺,不適合我們學校的學生” 可是在我和大多數同學看來,同濟版本的高數倒更像是為了要入門的同學編寫的教材,自己學校編的那本卻更像是給同行評閱炫耀作者深度的大部頭。
知識明明可以講的更有趣,讓人願意入其門來探個究竟。
我們都知道一個種群,通過長時間的繁衍,種群的基因會向着更適應環境的趨勢進化,牛B個體的基因被保留,后代越來越多,適應能力低個體的基因被淘汰,后代越來越少。經過幾代的繁衍進化,留下來的少數個體,就是相對能力最強的個體了。
那么在解決一些問題的時候,我們能不能學習這樣的思想,比如先隨機創造很多很多的解,然后找一個靠譜的評價體系,去篩選比較好的解 ,再用這些好的解像生小寶寶一樣生一堆可能更好的解,然后再篩再生,反復弄個幾代,得到的說不定就是近似最優解喲
說干就干,有一個經典組合問題叫“背包問題”,我們拿這種思路來試試
“背包問題(Knapsack problem)是一種 組合優化的 NP完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和價格,在限定的總重量內,我們如何選擇,才能使得物品的總價格最高。問題的名稱來源於如何選擇最合適的物品放置於給定背包中。”
這個問題的衍生簡化問題 “0-1背包問題” 增加了限制條件:每件物品只有一件,可以選擇放或者不放,更適合我們來舉例
這樣的問題如果數量少,當然最好選擇窮舉法
比如一共3件商品,用0表示不取,1表示取,那么就一共有
000 001 010
011 100 101
110 111
這樣8種方案,然后讓計算機去累加和,與重量上限比較,留下來的解里取最大即可。
但如果商品數有300,3000,甚至3w種呢,計算量太大窮舉法可能就不適用了,這時如果遺傳算法使用得當,就能在較短的時間內幫我們找到近似的最優解,我們繼續往下看:
新的問題是12件商品的0-1背包問題
我們先讓計算機隨機產生1000個12位的二級制數
把總重量超過背包上限的解篩掉
剩下的兩兩一對隨機交換“基因片段”產生下一代
交換前:
0000 1100 1101
0011 0101 0101
交換后:
0000 0101 1101
0011 1100 0101
再篩選,再交配,如此反復幾代,留下的解攜帶的“基因“差不多就是最好的了,怎么樣跟生物進化是不是一模一樣?
其實還差點,生物繁殖過程中,新產生的基因是有一定幾率突變的,這是很多優良性狀的重要來源,遺傳算法中可也不能忽略它
比如:
變異前:
000101100101
變異后:
000101110101
那也有人得疑惑了,我怎么知道要讓哪個地方產生突變呢?其實蜘蛛俠NB之前,他也不知道蜘蛛咬在那能讓他變NB而不是SB,這就是一個概率問題。我們在設計算法的時候,會給每個基因設置一個突變概率(當然是非常非常小了)同樣的在基因交換階段交換哪些基因呢,也是一個算法設置問題。
總結一下,遺傳算法應該有
一個基本函數:適度函數f(x)
三個基本操作:選擇,交叉,變異
一.適度函數
適度函數很好理解,其實就是指解的篩選標准,比如我剛才說的把所有超過上限重量的解篩選掉,但是不是有更好的篩選標准或者這個現有的標准根本就是個渣呢?這將直接影響最后結果的接近程度以及求解所耗費的時間,所以設置一個好的適度函數很重要
二.選擇
剛才為了大家理解方便,我直接讓所有解都參與了后續的交叉以及變異,但真實世界可不是這樣子的,因為也不是每個人都會結婚生子的對吧。
說直白點,所謂【屌絲注孤生】【工科男注孤生】什么的還不是因為loser的基因不適合往下傳唄。不過實際情況是我們偶爾也能看到或聽到屌絲逆襲、鮮花牛糞之類勵志故事,只不過頻率比較低咯
沒錯,概率!在遺傳算法中 選擇也是個概率問題,在解的世界中(姑且這么稱呼吧)適度更高的高富帥們是不是應該有更高的概率被選去傳宗接代才合適呢?不過和現實世界一樣,適度低的屌絲解是要給人家一點希望的對不對?所以
在選擇一些解來產生下一代時,一種常用的選擇策略是 “比例選擇”,也就是個體被選中的概率與其適應度函數值成正比。假設群體的個體總數是M,那么那么一個體Xi被選中的概率為f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) )
三.交叉
這是例子中詳細說到的,交換兩個解的部分”基因”,來構造兩個子代的解。
四.變異
在繁殖子代的過程中,新產生的解中的“基因”會以一定的概率出錯,稱為變異。我們可以吧變異發生的概率設置為Pm
五.基本遺傳算法優化
精英主義:這是基本遺傳算法的一種優化。目的是防止進化過程中產生的最優解被變異和交叉所破壞。《遺傳算法原理及應用》介紹的最優保存策略是:即當前種群中適應度最高的個體不參與交叉運算和變異運算,而是用它來替換掉本代群體中經過交叉、變異等遺傳操作后所產生的適應度最低的個體。
后記:
其實不管是遺傳算法,還是模擬退火算法或者其他算法,其本質都是借鑒自然界中的規則規律,人為的為問題設置了一個模擬模型,然后用大自然告訴我們的規律去找最優解,在理解這些算法的時候,可以照着這個思路去走,一般能讓你快速撥雲見日,了解算法的核心思想。
比如遺傳算法,我們可以對比種群的進化,給問題設置的模型就是:
這樣參照着我們熟悉的知識體系,去理解學習,原來聽上去遙不可及的理論是不是一下就變得親切易懂了吧?
可是我們再看一些教科書或者就拿百度百科來說(怕也是摘抄的某本書上的段落)
真的是通篇不說人話啊!對已經了解這個算法思想的人來說,還能勉強硬着頭皮看下去,但對入門者來說,這TMD簡直就是噩夢!而這完全是國內各種教材的通病!
我其實一直在想,教材面向的明明就是望門欲入的初學者,你不弄得生動活潑一點招徠門徒就算了,在一群幼兒園小朋友面前賣弄之乎者也還顯本事了是么!我是還記得我們學校的高數書編的有多么生澀難懂,結果第一節課老教授上課時還說“我們不用同濟的版本,那本書太淺,不適合我們學校的學生” 可是在我和大多數同學看來,同濟版本的高數倒更像是為了要入門的同學編寫的教材,自己學校編的那本卻更像是給同行評閱炫耀作者深度的大部頭。
知識明明可以講的更有趣,讓人願意入其門來探個究竟。
作者:彈彈彈球
鏈接:https://www.zhihu.com/question/23293449/answer/29287544
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
