最近开发了一个模型辨识的软件,发现在计算速度方面需要进行优化,于是查找优化相关的算法,这两天在网上搜了搜关于遗传算法相关的资料,记录一下自己对遗传算法的理解。
遗传算法通过模拟自然界生物种群进化的过程,通过选择、交叉、变异等机制,在某个范围的解空间内寻找一个最优解。遗传算法中通过适应度函数(可以看做目标函数的变形)来评价一个个体(解)与最优解的近似程度,设计适应度函数一定意义上与问题本身的目标函数线性相关。
遗传算法的组成:
1.编码。把解空间内的元素用一定的编码方式表示(常见为二进制数)。
2.初始化群体。选定种群大小(每次迭代过程中需要计算、评价的解的个数),随机填充
3.适应度。根据适应度函数对种群进行排序。
4.遗传算子。即通过选择、交叉、变异产生下一代种群。
5.根据终止判定法则判断是否已找到最优解或者继续循环。
这里有几个问题:
遗传算法的优点在于无需对解空间内的每一个解进行计算和比较,一定程度上优化了计算速度,但是收敛速度具有随机性。这里我对遗传算法还有一些疑问:假如解空间的规模不是很大,例如几百,那么如果选取的种群太大,可能进行一两次迭代就几乎遍历了解空间内的所有元素,与顺序遍历没什么差别;如果选取的种群太小,进行交叉、变异操作时,由于基数小,会不会导致算法停滞?(子代与父代完全相同)
选择(以轮盘赌选择方法为例)是不是相当于对父代进行种群大小次数的选择,产生子代,那么子代中适应度较高的解会重复出现,适应度越高偿付概率越大。重复项需要剔除,然后从解空间内随机填充吗?还是说保留重复项?(同理交叉、变异种出现的重复项如何处理?)
另外,该如何终止判定法则该如何确定?