我将区间[x:y]编码为二进制代码,如 10101111 ,因此对于填充,它就像[[1,0,1,1],[0,1,0,1]]
。
我使用函数(sin(x)^2
)的值直接定义了适应度函数。
为了选择,我正在使用锦标赛选择和交叉,只有这样的染色体的简单交换部分:1(10)0
和0(01)1
- > 1(01)0
和0(10)1
。
对于变异,使用比特反转。
算法类型有效,它有时可以生成全局最小值,有时可以生成局部最小值。但是我没有在这个问题上看到交叉的功能,因为' x'每次都被打破(我认为),我不知道为什么,如果它甚至是编码交叉或编码部分的正确方法。
答案 0 :(得分:2)
我担心交叉没有“正确的方法”。
有许多交叉算子(例如Comparison of a Crossover Operator in Binary-coded Genetic Algorithms - STJEPAN PICEK,MARIN GOLUB)可以用于二进制编码遗传算法,但是:
交叉是遗传算法的主要探索机制,但GA背后的驱动力是选择,交叉和突变之间的合作(突变阻止了群体的收敛并引入了变异)。
通常只有突变的方法没有足够的探索力来达到最小值,成功主要是由于初始人群中解决方案的分布。
对于连续功能优化,您还应该检查differential evolution。