让我先从我正在实施的遗传算法版本开始。我提前为我在这里做的任何术语错误道歉。请随时纠正我。
我的问题的染色体是二维的。三行三十二列。基本上等位基因(值)是该染色体包含的索引。
如何制定指数
染色体的每行和每列(一起)指单个基因。每个基因含有一个整数值(0-30)。因此,单列(我相信称为gnome)是指包含适应度函数运行的用户数据的四维数组的索引。
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个可能会被翻转。在我的情况下,我有染色体是2D(3行,32列)。我应该考虑所有96个基因彼此独立或仅考虑32个基因。每当我需要翻转时,将列一起翻转。突变如何在2D染色体上发挥作用?
Q3)这里的行之间确实存在关联吗?我有一点困惑?
解释 我有2D染色体,其列值总共指向我必须用来计算该染色体适合度的数据。遗传算法操纵染色体,其中适应性由与该染色体相关的数据指定。我的问题是遗传算法应该如何处理2D染色体。如果列中的基因之间存在关联。我可以参考一些操纵2D染色体的纸张/代码吗?
答案 0 :(得分:3)
我不确定我是否理解染色体结构,但无所谓,概念是相同的:
1 - 你有一个染色体对象,你可以访问个别基因
2 - 你有一个健身功能,它接受染色体并输出一个值
3 - 你有一个选择功能,它选择要交配的染色体
4 - 你有一个交叉功能,通常需要2条染色体,在它们之间交换基因并输出两条新的染色体
5 - 你有一个变异算子,它随机作用于染色体的基因
所以
Q1)您可以使用单个随机发生器,完全没有问题。但你为什么要用 整数?在[0,1]之间生成随机数要容易得多。
Q2)这取决于你,但通常基因是随机突变的,彼此独立(突变发生在交叉之后,但我想你已经知道了)。
编辑:是的,您应该考虑所有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
Q4)由您来决定健身功能将做什么。如果这条染色体在解决你的问题时“好”或“坏”,那么你应该返回一个反映这一点的值。
答案 1 :(得分:1)
您使用的所有随机数通常都是独立生成的,因此使用一个或多个RNG,无所谓。你应该为每个基因生成新的数字用于交叉和变异步骤,如果你为同一个目的使用相同的单个随机数,你将限制可探索的解空间。
为了使您的算法更容易理解,在[0..1]中生成均匀分布的浮点数作为r()= rand()/(2 ^ 32-1),然后您可以简单地表达事物,例如,
if r() < 0.3
mutate()
我不明白你的其他问题。请改写它们。
答案 2 :(得分:1)
您可以相对于突变和交叉概率进行改进,建立了一个可以自行选择这些概率的GA。因为使用给定的概率(或随着概率的运行次数而演变的函数)始终是任意的,所以将操作符编码在染色体内。
例如,您有两个运营商。添加一点到染色体的末端,其中1编码突变,0编码交叉。当您在父母身上应用运算符时,您将获得具有运算符代码的子代。通过这种方式,GA进行了双重搜索:在解决方案的空间和运营商的空间中。操作员的选择取决于问题的性质a,具体的运行条件。在计算过程中,两个算子的概率都会自动改变,以最大化您的目标函数。
对于任意数量的运算符也是如此。你需要更多的位来编纂。我通常使用三个运算符(三个用于交叉,一个用于突变),这种机制运行正常。