一、遗传算法基本问题
遗传算法有3个最基本的操作:选择,交叉,变异。
抽象:每个问题的元素必须要被抽象成向量(染色体)才能被解决,而且这个向量的所有子集合中尽量没有无效元素(有也要在算法中取出)。
例如: 1、我们可以发现x1和x2的取值都是1~7,可以用三位二进制数表示,所以我们使用六位二进制标识x1和x2的一种组合
2、0-1背包问题,可以把背包标号,如果取这个背包那么向量对应的位置就是1,否则就是0
3、TSP问题,二进制向量的每n位都对应着一个城市的标号,那么染色体可以体现城市经过的顺序
选择:选择一些染色体来产生下一代。
(1)排序选择方法(源代码中使用类似此方法)
排序选择方法是指在计算每一个个体的适应度(源代码中将路径总长度当适应度)之后,根据适应度大小对个体排序,然后按照事先设置好的概率表按序分配给个体,作为个自的选择概率。
(2)适应度比例方法
适应度比例方法是目前遗传算法中最基本也是最常用的选择方法,即各个个体的选择概率和其适应度值成正比。
(3)最佳个体保留方法
即把群体中适应度最高的个体不进行交叉而直接复制到下一代。
一种常用的选择策略是 “比例选择”,也就是个体被选中的概率与其适应度函数值成正比。假设群体的个体总数是M,那么那么一个体Xi被选中的概率为f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) ) 。比例选择实现算法就是所谓的“轮盘赌算法”( Roulette Wheel Selection ) ,轮盘赌算法的一个简单的实现如下:
![](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
/*
* 按设定的概率,随机选中一个个体
* P[i]表示第i个个体被选中的概率
*/
int RWS()
{
m =0;
r =Random(0,1); //r为0至1的随机数
for(i=
* 按设定的概率,随机选中一个个体
* P[i]表示第i个个体被选中的概率
*/
int RWS()
{
m =0;
r =Random(0,1); //r为0至1的随机数
for(i=