一、遺傳演算法概述
1.1 群體
1.2 基因型和表現型
1.3 突變
1.4 選擇
1.5 遺傳
二、智慧型鳥群的實現
2.1 小鳥的基因型和表現型
2.2 小鳥的基因如何影響小鳥的飛行路線
2.3 小鳥的適應性
2.4 選擇:選擇適應度更高的小鳥
2.5 突變:增加基因的豐富性
2.6 繁殖:產生新的dna
2.7 群體的繁殖
三
、總結和優化
智慧型鳥群
本文通過使用遺傳演算法實現了乙個智慧型鳥群。場景如下圖,小鳥從螢幕右側開始,越過障礙物最終到達螢幕左側的目標點。鳥群在初始狀態時會在螢幕中亂飛(下圖1),隨著不斷的進化,最終鳥群會直接飛向目標點(下圖2),可點選這裡看效果。下面先介紹下遺傳演算法。
遺傳演算法借用了達爾文自然選擇的思想,即在乙個群體中,適應性更高的個體,會更有可能將自己的基因(特性)遺傳下去。下面是自然選擇中的一些關鍵概念:
1. 群體
群體為自然選擇提供了豐富的基因庫,保證了個體的多樣性,群體越大越容易產生更具適應性的個體。
2. 基因型和表現型
我們看到的個體的外貌和行為等外在表現是由內部的基因決定的。基因型即為決定個體表現的內部資料,表現型為個體的外觀和行為。比如數字125,即可以表示個體的顏色,也可以表示個體的高度。數字125即為個體的基因型,顏色、高度等為個體的表現型。 在設計遺傳演算法時,要著重設計個體的基因型和表現型。
3. 遺傳、突變和選擇
遺傳、突變和選擇是達爾文演化論中的3個基本法則。遺傳保證了子代能夠繼承父代的特性。突變保證了個體的多樣性,如果沒有突變子代和父代會永遠保持一致,新的特性就永遠不會出現,種群也不會進化。選擇保證了群體向更具適應性的方向進化,使群體中某些個體能夠繁殖而另一些個體卻沒有機會或有很少的機會繁殖。這就是通常說的「適者生存」。在遺傳演算法中,在每一代都會計算個體的適應性,適應性高的個體的基因會在下一代遺傳下去,適應性低的個體的基因會被淘汰。
下面借助白鷺引擎實現智慧型鳥群
1. 小鳥的基因型和表現型
為了使小鳥不斷飛行,在小鳥的生命週期的每一時刻都會為小鳥賦予乙個推力,通過推力改變小鳥的加速度,進而影響到小鳥的速度和位置。在小鳥的整個生命週期中(假設為200幀),可以把每一幀上的推力所組成的陣列作為小鳥的基因型。小鳥在一系列的推力作用下所形成的飛行路線,為小鳥的表現型。可以用dna類來定義小鳥的基因,其中推力用乙個二維向量來定義。
12. 小鳥的基因如何影響小鳥的飛行路線class
dna 13}
1415
public
getgenes()
18 }
13. 小鳥的適應性class bird extends
egret.sprite
3435
public
run()
4142
public
43 let f:vector2d=vector2d.div(force,this
.mass);//力除以質量為加速度
44this
.acceleration.add(f);//改變加速度45}
4647
public
update()
5253
public
display()
59 }
在小鳥的生命週期結束時,我們通過判斷小鳥離目標點的距離來判斷小鳥的適應性,離目標點越近的小鳥適應性越高,否則適應性越低。可以通過小鳥離目標點的距離的倒數的平方作為小鳥的適應度。計算小鳥的適應度函式如下(在bird類中定義):
14. 選擇:選擇適應度更高的小鳥/*適應度計算*/2
public
fitness()67
public
getfitness()
我們定義乙個population類來管理所有的小鳥以及負責小鳥的選擇和遺傳。在population類中定義了乙個population陣列來儲存所有的小鳥,另外定義了乙個matingpool陣列作為交配池,我們根據小鳥適應性的強弱來將其放入交配池中,適應性越強的小鳥放入交配池中的數量越多,否則就越少。最後我們從交配池中隨機的選擇小鳥進行交配遺傳,這樣就保證了適應性強的小鳥選到的概率就越大。population類中的選擇函式如下:
1上面的方法,先計算所有小鳥的適應度之和,最後計算每個小鳥的適應度在所有小鳥的適應度中所佔比例,然後將這個比例換算為相應的個數存入交配池。可以把這種選擇方法想象成乙個輪盤,某個個體的適應度所佔的比例約大,它被選中的概率就越高。public
selection()78
for(let i=0;i
13for(let j=0;j)16}
17 }
5. 突變:增加基因的豐富性
為了增加基因的豐富性,從而產生適應性更強的個體,我們需要在每一代使小鳥的基因有一定的機率產生突變,我們在小鳥的dna類中加入突變函式:
1並且為bird類新增mutate介面public mutate(mutationrate:number)8
}9 }
16. 繁殖:產生新的dnapublic mutate(mutationrate:number
)
在dna類中,新增crossover方法,它接受另乙個dna例項,通過交叉組合生成新的dna:
1在上面方法中,在生命週期的每一幀中隨機選擇雙親對應節點的資料作為子代的基因。下面為bird類新增繁殖的方法:public
crossover(partner:dna):dnaelse10}
11return
child;
12 }
/*7. 群體的繁殖小鳥的繁殖
*/public
crossover(b:bird):bird
接下來在population中新增reproduction方法,用來產生下一代。在reproduction方法中,我們從交配池中隨機的選擇兩個小鳥作為雙親,產生新的小鳥,並使小鳥發生突變,最後把新產生的小鳥加入陣列population中。
1總結通過上面的示例,我們可以總結出使用遺傳演算法時的幾個關鍵步驟:public
reproduction()
16 }
1. 定義個體的基因型和表現型,基因型發生改變表現型也會隨之變化。
2. 計算群體中每個個體的適應性;
3. 選擇適應性更高的個體作為下一代的雙親(可以通過交配池實現);
4. 通過雙親繁殖下一代,產生的下一代會發生基因突變;
5. 返回2進行下下一代的繁殖;
優化
上例中,小鳥在進行多代繁殖後,最終會沿直線朝目標飛去。為了體現遺產演算法的強大,可以在小鳥和目標之間加入障礙物,當小鳥碰到障礙物時會停止,並且碰到障礙物的小鳥的適應性會急速下降。可以看看經過幾代的進化後聰明的小鳥會如何繞過障礙物到達目標點。
上面只貼出了整個專案中關鍵幾步的**,整個專案可以訪問我的github,歡迎提交issues交流。
人工智慧 遺傳演算法
這是一類智慧型的演算法,沒有什麼固定的模式,就是乙個演算法思想,可以給我們一些有價值的指導,當我們想要做一些相關工作的時候,可以擴寬我們的視野,開啟我們的腦洞,借鑑其中的原理。我不想多說裡面的什麼數學和公式,只要你懂裡面的思想會遷移到實際的應用中就很不錯,更好的則是在其基礎上形成自己的思維,需要用的...
人工智慧 遺傳演算法
實驗過程 結果分析 摘要 設計遺傳演算法求解乙個 tsp 問題,要求求得的解不超過最優解的 10 設計較好的交叉操作,並且引入多種區域性搜尋操作 和之前的模擬退火演算法 採用相同的區域性搜尋操作 進行比較 得出設計高效遺傳演算法的一些經驗,並比較單點搜尋和多點搜尋的優缺點。遺傳演算法思想流程 實現遺...
python遺傳演算法 Python 遺傳演算法實現
關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...