云枕青山塔影斜,湖楼放舟摇柳叶。
春风吹荷花未歇,长醉梦中各华颠。
------敬 子瞻
遗传算法是美国的J.Holland教授和他的学生于1975年受生物进化论的启发而提出并建立发展起来的。现在在诸多研究领域都有其应用。
主要涉及TSP求解问题;后来研究者的改进遗传算法也有很多。
遗传算法借鉴的是生物进化过程,遵循“适者生存”的规律。流程大概如下:
Step1
输入:种群大小、染色体长度、交叉概率、变异概率、停止规则
Step2
初始化种群
Step3
计算个体适应度
Step4
选择操作
Step5
交叉操作
Step6
变异操作
关于Step5和Step6,也有很多改进规则。
参数定义:
#define POP_SIZE 600 // 群体大小
#define MAX_GEN 1000 // 最大迭代次数
#define PC 0.99 // 交叉概率
#define PM 0.2 // 变异概率
#define VariableNum 7 //
#define alpha 0.6 // 隐含的算法选择压力
变异实现代码:
void CAlgorithm::mutation(double x[POP_SIZE][VariableNum + 1])
{
for (int i = 0; i < POP_SIZE; i++)
{
for (int j = 0; j < VariableNum; j++)
{
if (rand() / 32767.0 < PM)
{
switch (rand()%3)
{
case 0:
{
x[i][j] = Boundary[j][0] + (Boundary[j][1] - Boundary[j][0]) * rand() / 32767.0;
break;
}
case 1:
{
x[i][j] = x[i][j] + (Boundary[j][1] - x[i][j]) * rand() / 32767.0;
break;
}
case 2:
{
x[i][j] = Boundary[j][0] + (x[i][j] - Boundary[j][0]) * rand() / 32767.0;
break;
}
default:
break;
}
}
}
}
}
交叉操作:
void CAlgorithm::intercrose(double x[POP_SIZE][VariableNum + 1])
{
int RandData[POP_SIZE], n[VariableNum], TempInt;
double RandDouble[VariableNum], RandDouble2[VariableNum], TempDouble;
SearchRandData(RandData);
for (int j = 0; j < POP_SIZE - 1; j += 2)
{
switch (rand()%3)
{
case 0:
{
SearchRandData2(n);
if (n[0] > n[1])
{
TempInt = n[0];
n[0] = n[1];
n[1] = TempInt;
}
for (int k = n[0]; k <= n[1]; k++)
{
TempDouble = x[RandData[j]][k];
x[RandData[j]][k] = x[RandData[j + 1]][k];
x[RandData[j + 1]][k] = TempDouble;
}
break;
}
case 1:
{
for (int k = 0; k < VariableNum; k++)
{
if (rand() / 32767.0 > 0.5)
{
x[RandData[j]][k] = x[RandData[j + 1]][k];
}
else
x[RandData[j + 1]][k] = x[RandData[j]][k];
}
break;
}
case 2:
{
for (int k = 0; k < VariableNum; k++)
{
RandDouble[k] = x[RandData[j]][k];
RandDouble2[k] = x[RandData[j + 1]][k];
}
TempDouble = rand() / 32767.0;
for (int k = 0; k < VariableNum; k++)
{
x[RandData[j]][k] = RandDouble[k] + (RandDouble2[k] - RandDouble[k]) * TempDouble;
x[RandData[j + 1]][k] = RandDouble2[k] + (RandDouble[k] - RandDouble2[k]) * TempDouble;
}
break;
}
default:
break;
}
}
}
实验结果: