用c++写出遗传算法代码
时间: 2023-09-09 10:06:26 浏览: 47
以下是一个简单的遗传算法的C++实现代码。该代码实现了遗传算法的基本流程:初始化种群、计算适应度、选择、交叉、变异等操作。这个实现是一个通用的框架,可以用来解决各种优化问题,只需要根据具体问题定义相应的适应度函数即可。
```c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <random>
using namespace std;
//定义个体
struct Individual {
vector<int> genes; //基因序列
double fitness; //适应度
};
//初始化种群
vector<Individual> initializePopulation(int populationSize, int geneLength) {
vector<Individual> population(populationSize);
for (int i = 0; i < populationSize; ++i) {
for (int j = 0; j < geneLength; ++j) {
population[i].genes.push_back(rand() % 2);
}
}
return population;
}
//计算适应度
void calculateFitness(vector<Individual>& population, double(*fitnessFunc)(const vector<int>&)) {
for (int i = 0; i < population.size(); ++i) {
population[i].fitness = fitnessFunc(population[i].genes);
}
}
//选择
vector<Individual> selection(vector<Individual>& population, int eliteSize) {
vector<Individual> matingPool;
sort(population.begin(), population.end(), [](const Individual& a, const Individual& b) {
return a.fitness > b.fitness;
});
for (int i = 0; i < eliteSize; ++i) {
matingPool.push_back(population[i]);
}
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<> dis(0, 1);
double totalFitness = accumulate(population.begin(), population.end(), 0.0, [](double sum, const Individual& ind) {
return sum + ind.fitness;
});
for (int i = 0; i < population.size() - eliteSize; ++i) {
double r = dis(gen) * totalFitness;
double sum = 0;
for (int j = 0; j < population.size(); ++j) {
sum += population[j].fitness;
if (sum >= r) {
matingPool.push_back(population[j]);
break;
}
}
}
return matingPool;
}
//交叉
void crossover(vector<Individual>& matingPool, int eliteSize) {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(0, matingPool[0].genes.size() - 1);
for (int i = eliteSize; i < matingPool.size(); i += 2) {
int point = dis(gen);
for (int j = point; j < matingPool[i].genes.size(); ++j) {
swap(matingPool[i].genes[j], matingPool[i + 1].genes[j]);
}
}
}
//变异
void mutation(vector<Individual>& matingPool, double mutationRate, int eliteSize) {
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<> dis(0, 1);
for (int i = eliteSize; i < matingPool.size(); ++i) {
for (int j = 0; j < matingPool[i].genes.size(); ++j) {
if (dis(gen) < mutationRate) {
matingPool[i].genes[j] = 1 - matingPool[i].genes[j];
}
}
}
}
//遗传算法
vector<int> geneticAlgorithm(double(*fitnessFunc)(const vector<int>&), int geneLength, int populationSize, int eliteSize, double mutationRate, int generations) {
vector<Individual> population = initializePopulation(populationSize, geneLength);
for (int i = 0; i < generations; ++i) {
calculateFitness(population, fitnessFunc);
vector<Individual> matingPool = selection(population, eliteSize);
crossover(matingPool, eliteSize);
mutation(matingPool, mutationRate, eliteSize);
population = matingPool;
}
sort(population.begin(), population.end(), [](const Individual& a, const Individual& b) {
return a.fitness > b.fitness;
});
return population[0].genes;
}
//适应度函数示例
double fitnessFunction(const vector<int>& genes) {
double sum = accumulate(genes.begin(), genes.end(), 0.0);
return sum / genes.size();
}
int main() {
vector<int> result = geneticAlgorithm(fitnessFunction, 10, 100, 10, 0.1, 100);
for (int i = 0; i < result.size(); ++i) {
cout << result[i] << " ";
}
cout << endl;
return 0;
}
```
在这个实现中,我们定义了一个`Individual`结构体,表示一个个体,包括基因序列和适应度。`initializePopulation()`函数用于初始化种群,`calculateFitness()`函数用于计算适应度,`selection()`函数用于选择,`crossover()`函数用于交叉,`mutation()`函数用于变异,`geneticAlgorithm()`函数用于整个遗传算法的流程。在`main()`函数中,我们使用`geneticAlgorithm()`函数来解决一个简单的问题。适应度函数`fitnessFunction()`的定义可以根据具体问题进行修改。