大話智能優化算法之遺傳算法

遺傳算法是根據生物進化理論得來的,在自然社會中,我們染色體的交叉變異都是隨機的,適應能力強的生物得以抵抗惡劣環境發生變異能夠存活下來,而適應能力不強的將消亡。基於這種概念,我們是否可以考慮,在求最優值時,利用隨機的變異交叉,迭代(可以認爲是繁殖的多少代),將變異後好的樣本值(目標值好的)留下來,然後將差的後代去掉,用好的來繁殖,進行迭代,這就是我們所說的優生優育啊。基因好的就該多生,目前這我們還沒這政策呢。
我舉個簡單例子,假如我求一個連續函數的最大值,比如y(x)=x2(這裏是x的平方),x範圍爲[-2,2]。這個函數的函數值就是我們的適應度啊,有的x對應的函數值大,就留下來,有的很小我就用好的替換掉。萬物都是起源的對不,我也得首先給它造個亞當,夏娃啊。當然我們不只是造一個啦,我們造多個啊,這個羣體人口基數大了才能迅速產生優良個體撒。所以我們就先初始化樣本個體,但是如何初始化啊,這個就涉及到編碼問題了,學過生物我們都知道人體有23條染色體,染色體間是實現片段的交叉變異,但是我們這是一個值啊1,2,0.1等,這時我們就想到了用編碼,二進制編碼,反正只有0,1而且二進制和十進制之間是相互轉換的嘛。但是我們取值的範圍不是[-2,2]麼,長度是4,轉化爲二進制就是100,很明顯取值也只能是0,1,2,3,4,加上-2,就是可以取-2,-1,0,1,2。可是這個太短了吧樣本,交叉變異都不好弄,這時我們發現我們精度不夠,取值只有這幾個呀,所以我們想到取精度爲1呀,保留後一位,那取值長度個數就變成了4/0.1=40啊,這時二進制編碼長度就有32~64之間,明顯我們取6,即1000000,注意到其中的我們變量值x到基因值的轉化,這個自己琢磨。有了樣本個體後我們就開始交叉,變異嘛,你要問我如何交叉,就是隨機選兩個樣本來造下一代嘛,呃呃,不是醬紫的。就是隨機先選擇羣體中的兩個樣本,然後用rand()隨機生成在哪個位置交叉啊,就是兩個樣本在指定位置進行交換嘛,也就是交換0,1.一般的嘛,我們這麼想交叉的越多,是不是進化的越快啊,想想人類也有幾萬億年了。所以,看你設定隨機交叉的次數了,交叉了我們就開始變異啊,這個更好辦了,隨機指定變異位置,反正就是0,1的變化。這時我們就需要進行刷選了,有些樣本不行就扔掉了。可是我們如何來確定好與壞呢,對的,我們還先計算函數值大小嘛,也就是y(x)的值。每個樣本都這個適應度(函數值)。這就開始找吧,找到最好的,找到最差的,不過我們可是知道啊,每一代進化是不是有個最好的呀,然後從亞當夏娃開始,我們就記錄一個更更好的個體,它是所有代裏面最好的。然後呢,我們就需要將用這個最最好的個體來代替每一代選出來不行的樣本啊,讓它進化啊。一旦某一代出現了更好的樣本,我們也需要更新這個最最好的樣本嘛。這樣,就完啦,遺傳算法就這麼簡單呀,你給指定交叉變異來個100代,能得出最好的個體的。當然遺傳算法還有許多變種,可是明白這最基礎的原理是最重要的,有興趣的可以解決離散問題的tsp問題,也很有意思。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章