让我从我正在实现的遗传算法的版本开始。对于我在这里犯的任何术语错误,我都要事先道歉。请随时纠正我。
我问题的染色体是二维的三行三十二列。基本上,等位基因(值)是这个染色体所包含的指标。
如何制定索引
染色体的每一行和每一列(一起)都指一个基因每个基因包含一个整数值(0-30)因此,单个列(我认为称为gnome)指的是一个包含用户数据的四维数组的索引,fitness函数对其进行操作。
This is how a chromosome would look like
11 22 33 14 27 15 16 ...
3 29 1 7 18 24 22 ...
29 9 16 10 14 21 3 ...
e.g. column 0 ==> data[11][3][29]
where
11 -> (0, 0); 0th row, 0th column
3 -> (1, 0); 1st row, 0th column
29 -> (2, 0); 2nd row, 0th column
对于完整性,适应度函数的工作方式如下:(对于单个染色体)
for first 10 iterations: (user 0 to 9)
for each column (genome)
consider gene value for first row as the first index of data array
consider gene value for the second row as the second index of data array
consider gene value for the third row as the third index of data array
so if the first column contains [11][3][29] user = 0
it refers to data[0][11][3][29]
SUM the data array value for all columns and save it
Do the same for all iterations (users)
for second 10 iterations: (user 10 to 19)
for each column (genome)
consider gene value for the SECOND row as the FIRST index of data array
consider gene value for the THIRD row as the SECOND index of data array
consider gene value for FIRST row as the THIRD index of data array
SUM the data array value for all columns and save it
Do the same for all iterations (users)
for third 10 iterations: (user 20 to 29)
for each column (genome)
consider gene value for the THIRD row as the FIRST index of data array
consider gene value for FIRST row as the SECOND index of data array
consider gene value for the SECOND row as the THIRD index of data array
SUM the data array value for all columns and save it
Do the same for all iterations (users)
Out of the 30 (sum) values calculated so far, assign the minimum value as fitness value
to this chromosome.
这里解释适应度函数的重点是解释我正在处理的优化问题。对不起,我不能用数学符号来表示它。任何能做到的人,他/她的评论都是非常受欢迎的本质上,它最大化X的最小值,其中x表示数据数组中包含的数据。(最大化是在产生下一代的最高适配染色体的情况下进行的)
q1)我用一个随机数发生器来计算交叉和变异概率。一般来说,用一个生成器实现它是正确的吗?我问这个问题是因为我选择的交叉率是0.7,突变率是0.01。我的随机数生成器生成一个均匀分布的整数。数字在0到(2^31-1)之间。如果随机函数产生的一个数位于它满足变异的边界之下,则相同的数也满足交叉。这会影响进化过程吗?
注:随机数生成的最大数为2147483647这个值的1%是21474836。因此,当一个数字小于21474836时,就意味着这个基因可以突变。这个数字也表明,交叉必须做。不是应该有不同的发电机吗?
q2)虽然我看到基因之间有关系,但在计算适应度时是一个列。但是在进行突变时,所有的基因都应该被认为是相互独立的,或者一个基因组(列)的所有行都应该受到突变的影响。
解释
正如我在一个二进制字符串中所学到的,例如1000位,其中每一位对应一个基因,如果突变率为1%,则意味着100位中有1位可能被翻转。但在我的例子中,我的染色体是二维的(3行32列)。我应该考虑所有96个相互独立的基因还是仅仅考虑32个基因每当我需要翻动的时候,把柱子都翻过来。突变在二维染色体中是如何工作的?
问题3)这里的行之间真的有关联吗?我有点困惑?
解释
我有一个二维染色体,它的列值都指向了我用来计算这个染色体适合度的数据遗传算法操纵染色体,其中作为适应度是由与此染色体相关的数据分配的。我的问题是遗传算法应该如何处理二维染色体列中的基因是否有关联。我可以参考一些操作二维染色体的纸张/代码吗?
最佳答案
我不确定我是否理解染色体的结构,但没关系,概念是一样的:
1-你有一个染色体对象,你可以访问单个基因
2-你有一个适应度函数,它接受一个染色体并输出一个值
3-你有一个选择函数,它选择要交配的染色体
4-你有一个交叉功能,通常需要两条染色体,在它们之间交换基因,然后输出两条新的染色体
5-你有一个突变算子,它随机作用于染色体的基因
所以
q1)你可以使用一个随机发生器,完全没有问题。但你为什么要用
整数?在[0,1]之间生成随机数要容易得多。
问题2)这取决于你,但通常基因是随机变异的,彼此独立(变异发生在交叉后,但我想你已经知道了)。
编辑:是的,你应该考虑所有的96个基因相互独立对于每个突变,您将选择一个“行”和一个“列”,并用一些probability p
修改(突变)该基因,因此:
for row in chromosome.row
for col in row
val = random_between_0_and_1
if val < p
chromosome[row][col] = noise
问题4)健身功能的作用取决于你自己如果这个染色体在解决你的问题时是“好”或“坏”,那么你应该返回一个反映这个问题的值。