今天我們開始詳細的介紹作曲是如何與基因演算法做結合
首先我們先快速複習一下基因演算法的流程:
(1) 隨機亂數的給予一定數量的個體。
(2) 而這些個體彼此之間會互相交配並產生子代。
(3) 子代有機會產生些微的突變。
(4) 把所有親代以及子代 集合起來,根據問題所劃出的標準去做篩選,把不符合標準或是得分(看問題如何定義)較低的後半部份個體淘汰 (不適者淘汰)。
(5) 步驟(4) 存活下來的較好個體成為下一個世代的親代 (適者生存),接著回到步驟(2) 並不停的重複這些過程,直到達成預設的目標或是演化的世代 (每次2~5為一個世代) 到達設定的數目。
(6) 最後,活到最後一代的個體裡面,選出最好的那一個天選之人 ,即為最後的解。
我們用關鍵字來簡化以上的流程:
(1) 產生個體 (Individual)
(2) 交配 (Crossover)
(3) 突變 (Mutation)
(4) 評分 (Fitness Evaluation)
(5) 適者生存不適者淘汰 (Survivor Selection)
(6) 選出最強的個體成為最佳解
因此在基因演算法中,所有產生出來的子代都是由親代彼此交配後產生,他們身上都會帶著親代遺傳下來的基因並且會有機率產生突變,經過許多世代 (Generation) 之後,最強者誕生成為最佳解。
(這張既是梗圖也可以當作認真說明上述文字的圖....)
那麼我們一樣照著之前的脈絡,一步一步講解要讓基因演算法如何懂得什麼是音樂以及作曲:
首先,跟任何演算法一樣,我們必須先讓電腦知道音樂/音符長什麼樣子。
在這邊我們用之前爬山法介紹的範例,把音符從中音Do開始設定為0,每往上半音就增加1。
將音樂/音符轉換成電腦看得懂的形式 (Representation) 後,我們開始來針對 步驟(1) 的 個體(Individual) 來做設定。
每一個個體在這邊代表的就是一首完整的音樂,因此首先我們要先決定個體的長度有多長。而所有的個體必須設定成同樣的長度大小,不能偏頗的讓其中某些個體比較長/大。
因此我們先設定好一首歌的長度要多長來當作個體長度的依據,在這邊我們一樣用八個音符當作範例,當然實作要怎麼設定就看需求以及喜好,沒有一定。
接下來我們要決定需要多少數量的個體,一般來說數量越多的個體,越有機會找出更好的結果,然而也會增加演算法運行的時間。我們在這邊設定一次產生一百個個體,換句話說就是產生一百首八個音符的音樂。
接下來我們以亂數的方式,隨機的把這一百首裡面的八個音符產生出來,因此我們會得到以下形式的音樂:
個體1 : [0, 2, 0, 9, 15, 24, 16, 10]
個體2 : [6, 2, 9, 17, 17, 17, 3, 17]
個體3 : [1, 6, 14, 2, 19, 17, 20, 9]
.
.
.
個體100 : [5, 0, 9, 9, 12, 23, 0, 21]
由於這系列會介紹的比較詳細,如果一口氣說太多相信大家都看不太下去,所以我們今天就先聊到這,明天我們再繼續介紹基因演算法曲的其他設定。