今天我们开始详细的介绍作曲是如何与基因演算法做结合
首先我们先快速复习一下基因演算法的流程:
(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]
由於这系列会介绍的比较详细,如果一口气说太多相信大家都看不太下去,所以我们今天就先聊到这,明天我们再继续介绍基因演算法曲的其他设定。
<<: Day 18: LeetCode 322. Coin Change
介绍 切面导向程序设计(Aspect-Oriented-Programming,AOP),它的目的在...
Hi 我是 Tomaz. 第一次参加铁人赛,和各位铁人一起进行磨练,希望撑得过去 ? 认真学 Co...
接下来我们要针对复杂度做介绍,首先要说的就是高手们常常说的「Big O」! 但是到底什麽是 big ...
如何正确选择高防服务呢?首选是高防CDN。那麽它具备哪些优势呢? 高防CDN的优势 CDN即内容...
今天我们要介绍UIPickerView,UIPickerView可以让你在列表中选择所需要的项目,後...