采用C/C++编写遗传算法代码 2、求解最小化问题f(x,y,z)=x2+(y+1)2+(z-1)2,变量取值为[-100,100]之间的实数,算法控制参数可通过实验确定
时间: 2024-09-15 21:11:39 浏览: 59
遗传算法是一种模拟自然选择和遗传学的搜索优化算法,它通常用于解决优化和搜索问题。以下是使用C/C++编写遗传算法代码的一般步骤,以及针对特定问题的一个简单示例。
### 遗传算法的一般步骤:
1. **初始化种群**:随机生成一组候选解,这些候选解构成了初始种群。
2. **适应度评估**:为种群中的每个个体计算适应度,通常是一个函数,用于评价个体的优劣。
3. **选择**:根据个体的适应度,从当前种群中选择优良个体作为下一代的父母。
4. **交叉(杂交)**:通过某种方式(如单点交叉、多点交叉等)组合父母个体的遗传信息来产生新的后代。
5. **变异**:以一定的概率随机改变个体的部分基因,以增加种群的多样性。
6. **替换**:用新产生的后代替换当前种群中的部分或全部个体。
7. **终止条件**:当满足预设的终止条件时(如迭代次数、适应度阈值等),算法终止。
### 解决最小化问题的示例代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
// 定义个体结构体
struct Individual {
std::vector<double> genes;
double fitness;
};
// 适应度函数
double fitnessFunction(const std::vector<double>& genes) {
double x = genes[0], y = genes[1], z = genes[2];
return x * x + (y + 1) * (y + 1) + (z - 1) * (z - 1);
}
// 初始化种群
std::vector<Individual> initializePopulation(int populationSize, int geneLength) {
std::vector<Individual> population;
for (int i = 0; i < populationSize; ++i) {
Individual individual;
individual.genes.resize(geneLength);
for (int j = 0; j < geneLength; ++j) {
individual.genes[j] = (rand() % 201) - 100; // 随机生成[-100, 100]之间的值
}
individual.fitness = fitnessFunction(individual.genes);
population.push_back(individual);
}
return population;
}
// 选择过程(轮盘赌选择)
Individual select(const std::vector<Individual>& population) {
double totalFitness = 0;
for (const auto& individual : population) {
totalFitness += 1.0 / individual.fitness; // 适应度越高,被选中的概率越大
}
double spin = (double)(rand() / (RAND_MAX + 1.0)) * totalFitness;
double position = 0;
for (const auto& individual : population) {
position += 1.0 / individual.fitness;
if (position >= spin) {
return individual;
}
}
return population[0]; // 如果没有选中,返回第一个个体
}
// 交叉过程(单点交叉)
void crossover(Individual& parent1, Individual& parent2) {
int crossoverPoint = rand() % parent1.genes.size();
for (int i = crossoverPoint; i < parent1.genes.size(); ++i) {
std::swap(parent1.genes[i], parent2.genes[i]);
}
}
// 变异过程
void mutate(Individual& individual) {
for (double& gene : individual.genes) {
if ((rand() / (RAND_MAX + 1.0)) < 0.01) { // 以1%的概率变异
gene = (rand() % 201) - 100;
}
}
}
// 主函数
int main() {
srand(time(0)); // 设置随机种子
const int populationSize = 100; // 种群大小
const int geneLength = 3; // 基因长度
const int maxGenerations = 1000; // 最大迭代次数
// 初始化种群
std::vector<Individual> population = initializePopulation(populationSize, geneLength);
// 进化过程
for (int generation = 0; generation < maxGenerations; ++generation) {
std::vector<Individual> newPopulation;
for (int i = 0; i < populationSize; i += 2) {
Individual parent1 = select(population);
Individual parent2 = select(population);
crossover(parent1, parent2);
mutate(parent1);
mutate(parent2);
parent1.fitness = fitnessFunction(parent1.genes);
parent2.fitness = fitnessFunction(parent2.genes);
newPopulation.push_back(parent1);
if (i + 1 < populationSize) {
newPopulation.push_back(parent2);
}
}
population = newPopulation;
// 这里可以输出每一代的最优解以观察收敛情况
}
// 输出最优解
auto bestIndividual = std::min_element(population.begin(), population.end(),
[](const Individual& a, const Individual& b) {
return a.fitness < b.fitness;
});
std::cout << "Best fitness: " << bestIndividual->fitness << std::endl;
std::cout << "Solution: ";
for (double gene : bestIndividual->genes) {
std::cout << gene << " ";
}
std::cout << std::endl;
return 0;
}
```
在上面的代码中,我们定义了一个简单的遗传算法来最小化问题 `f(x,y,z)=x^2+(y+1)^2+(z-1)^2`。请注意,这里的代码仅作为一个示例,实际应用中需要根据问题特点调整选择、交叉和变异的具体实现方式,以及算法的控制参数,如种群大小、交叉概率、变异概率等。
阅读全文