```c++
// 定义个体的结构体
struct Individual {
double value; // 存储适应度值
double fitness; // 存储适应度
Individual(double value) : value(value), fitness(value * value) {} // 初始化适应度值为个体的值
};
// 遗传算法类
class GeneticAlgorithm {
private:
int populationSize; // 种群大小
int generation; // 代数
double crossoverRate; // 交叉率
double mutationRate; // 变异率
vector<Individual> population; // 种群
vector<Individual> newPopulation; // 新种群
public:
GeneticAlgorithm(int populationSize, int generation, double crossoverRate, double mutationRate) : populationSize(populationSize), generation(generation), crossoverRate(crossoverRate), mutationRate(mutationRate) {
srand(time(0)); // 初始化随机数种子
for (int i = 0; i < populationSize; ++i) { // 生成初始种群
population.push_back(Individual(rand() % 10000 / 10000.0)); // 生成随机个体
}
}
void evolve() { // 进化过程
for (int i = 0; i < generation; ++i) {
select(); // 选择操作
crossover(); // 交叉操作
mutate(); // 变异操作
}
}
void select() { // 选择操作,这里使用轮盘赌选择法
newPopulation.clear();
double totalFitness = 0; // 适应度总和
for (int i = 0; i < population.size(); ++i) {
totalFitness += population[i].fitness; // 计算适应度总和
}
for (int i = 0; i < population.size(); ++i) { // 计算每个个体的适应度比例
population[i].fitness /= totalFitness;
}
double r = rand() / double(RAND_MAX); // 生成随机数
double sum = 0; // 当前适应度比例总和
for (int i = 0; i < population.size(); ++i) { // 选择个体,选择概率与适应度成正比
sum += population[i].fitness;
if (sum >= r) { // 选择个体,并加入新种群中
newPopulation.push_back(population[i]);
break;
}
}
}
void crossover() { // 交叉操作,这里使用单点交叉法
for (int i = 0; i < newPopulation.size() - 1; ++i) { // 对每一对个体进行交叉操作
int r1 = rand() % newPopulation.size(); // 随机选择一个个体作为父本1
int r2 = rand() % newPopulation.size(); // 随机选择一个个体作为父本2,保证r2不等于r1和i+1(防止自交)
double x = rand() / double(RAND_MAX); // 生成[0,1]之间的随机数,作为交叉点位置的概率值,小于等于0.5时执行交叉操作(模拟自交)
if (x < crossoverRate) { // 进行交叉操作,生成新的后代1和后代2(这里只是简单地交换了父本的位置)
Individual c1 = newPopulation[r1]; newPopulation[r1] = newPopulation[r2]; newPopulation[r2] = c1;
} else { // 不进行交叉操作,保持父本不变(模拟自交)
newPopulation[i+1] = newPopulation[r1]; newPopulation[r1] = newPopulation[r2]; newPopulation[r2] = newPopulation[i+1];
}
}
}
void mutate() { // 变异操作,这里对每个个体的值加上一个随机量(相当于基因突变)
```