基于C++的遗传算法实例
以下是基于C++的遗传算法实例,涵盖不同应用场景和技术实现。这些例子从基础框架到特定问题解决方案,适合学习和实践参考。内容按应用领域分类,并提供关键代码片段或思路说明。
基础框架与模板
1. 基本遗传算法框架
class Individual {
public:
vector<int> genes;
double fitness;
void calculateFitness() { /*...*/ }
};
class GeneticAlgorithm {
vector<Individual> population;
void selection() { /* Roulette wheel or tournament */ }
void crossover() { /* Single-point or uniform */ }
void mutation() { /* Bit-flip */ }
};
2. 二进制编码示例
解决OneMax问题(最大化二进制串中1的个数):
void evaluateFitness(Individual& ind) {
ind.fitness = accumulate(ind.genes.begin(), ind.genes.end(), 0);
}
数值优化问题
3. 函数极值寻优
优化Rastrigin函数:
double rastrigin(const vector<double>& x) {
double sum = 10.0 * x.size();
for (auto xi : x) sum += xi*xi - 10*cos(2*M_PI*xi);
return -sum; // 最小化转为最大化
}
4. 实数编码遗传算法
采用SBX(模拟二进制交叉):
void sbxCrossover(vector<double>& parent1, vector<double>& parent2) {
double eta = 2.0;
for (int i = 0; i < parent1.size(); ++i) {
double u = rand() / (double)RAND_MAX;
double beta = u <= 0.5 ? pow(2*u, 1/(eta+1)) : pow(1/(2*(1-u)), 1/(eta+1));
child1[i] = 0.5 * ((1+beta)*parent1[i] + (1-beta)*parent2[i]);
}
}
组合优化问题
5. 旅行商问题(TSP)
路径表示与顺序交叉(OX):
void oxCrossover(const vector<int>& parent1, const vector<int>& parent2) {
int a = rand() % parent1.size(), b = rand() % parent1.size();
if (a > b) swap(a, b);
vector<int> child(parent1.begin()+a, parent1.begin()+b);
// 填充剩余城市保持顺序
}
6. 背包问题
惩罚函数处理约束:
void evaluateKnapsack(Individual& ind) {
int totalWeight = 0, totalValue = 0;
for (int i = 0; i < genes.size(); ++i) {
if (ind.genes[i]) {
totalWeight += weights[i];
totalValue += values[i];
}
}
ind.fitness = (totalWeight > capacity) ? 0 : totalValue;
}
机器学习与神经网络
7. 神经网络权重优化
染色体表示网络权重:
vector<double> flattenWeights(const NeuralNetwork& net) {
vector<double> genes;
for (auto& layer : net.weights) {
genes.insert(genes.end(), layer.begin(), layer.end());
}
return genes;
}
8. 特征选择
二进制编码选择特征子集:
void evaluateFeatureSubset(Individual& ind) {
vector<bool> selected(ind.genes.begin(), ind.genes.end());
double accuracy = trainModel(selectedFeatures);
ind.fitness = accuracy - 0.01*selected.count(); // 平衡准确率与特征数
}
游戏与仿真
9. 游戏AI控制
训练智能体走迷宫:
void simulateAgent(const vector<double>& genes) {
Robot robot;
for (auto gene : genes) {
robot.turn(gene * 360.0);
robot.moveForward();
}
fitness = distanceToGoal();
}
10. 物理参数优化
优化弹簧系统阻尼系数:
void simulateSpringSystem(const vector<double>& params) {
SpringSystem system(params[0], params[1]);
system.runSimulation();
fitness = system.getStabilityMetric();
}
其他领域应用
11. 自动作曲
MIDI音符序列生成:
vector<int> generateMusicSequence(const Individual& ind) {
return ind.genes; // 每个基因代表音符编号
}
12. 图像滤波器设计
优化卷积核参数:
void applyFilter(const vector<double>& kernel) {
Mat image = imread("input.jpg");
Mat filtered = convolve(image, kernel);
fitness = calculateImageQuality(filtered);
}
高级改进算法
13. 自适应遗传算法
动态调整变异率:
void updateMutationRate() {
if (populationDiversity() < threshold) {
mutationRate *= 1.1;
}
}
14. 多目标优化(NSGA-II)
快速非支配排序:
vector<vector<Individual>> nonDominatedSort(vector<Individual>& pop) {
// 实现Pareto前沿分层
}
以上实例可根据具体问题修改编码方式、适应度函数和遗传算子。实际应用时建议结合OpenMP或CUDA加速计算密集型部分。
基于C++和MIT许可的遗传算法
以下是一些基于C++和MIT许可的遗传算法实现示例,涵盖不同应用场景。这些资源可从GitHub、学术平台或开源社区获取,适合学习和二次开发。
遗传算法基础框架
GALIB
经典C++遗传算法库,提供多种选择、交叉和变异算子。MIT许可,适合研究或商业项目。
GitHub:gaul-devel/gaul
(需确认最新分支)Evolving Objects (EO)
模板化C++框架,支持多种进化算法。文档详细,含多目标优化示例。
源码:eodev/eo
数值优化示例
Rastrigin函数优化
求解高维非线性函数最小值,演示二进制与实数编码差异。
代码片段:double fitness(const vector<double>& x) { double sum = 10 * x.size(); for (auto xi : x) sum += xi*xi - 10*cos(2*M_PI*xi); return -sum; // 最小化转为最大化 }
旅行商问题(TSP)
使用顺序编码和OX交叉算子,包含可视化输出。
推荐仓库:marcosfpr/tsp-genetic-algorithm
机器学习结合
神经网络权重优化
用遗传算法替代反向传播训练MLP,适合不可微网络结构。
关键步骤:struct Individual { vector<double> weights; double accuracy; // 适应度=验证集准确率 };
特征选择
二进制编码表示特征子集,适应度函数为模型AUC分数。
工程应用
无人机路径规划
动态障碍物避碰,适应度函数结合路径长度与碰撞惩罚。
项目参考:PathPlanning-GA-3D
天线阵列设计
优化天线间距与相位,最大化方向性。需电磁仿真接口。
其他领域
游戏AI
训练赛车控制器,输入为传感器数据,输出为转向/油门。
示例:OpenDDA/GeneticRacing
音乐生成
音符序列进化,适应度基于和声规则与用户评分。
注意事项
- MIT许可项目需保留原始版权声明
- 部分仓库可能依赖Boost或Eigen库
- 实践时建议从简单测试函数(如De Jong)开始验证
最新资源可通过GitHub搜索关键词genetic-algorithm c++ mit
获取,按Star数排序筛选高质量项目。
模板化C++框架
模板化C++框架设计要点
使用C++模板和策略模式实现通用进化算法框架,核心组件包括:
- 种群容器:
template<typename T> class Population
- 个体表示:通过模板参数支持
vector<double>
、bit_string
等 - 算法策略:遗传算法、粒子群等作为可插拔组件
示例框架头文件结构:
template<typename GeneType, typename FitnessType>
class EvolutionaryAlgorithm {
public:
virtual void initializePopulation() = 0;
virtual void evolve() = 0;
};
遗传算法实现示例
template<typename GeneType>
class GeneticAlgorithm : public EvolutionaryAlgorithm<GeneType, float> {
private:
float crossoverRate;
float mutationRate;
public:
void evolve() override {
// 锦标赛选择 + 单点交叉实现
}
};
算法实例分类
1. 经典遗传算法
- 实数编码GA:
NumericGA<double>
- 二进制编码GA:
BinaryGA<std::bitset<64>>
- 混合编码GA:支持
std::variant<double, int>
2. 粒子群优化
- 标准PSO:
ParticleSwarm<float, 3>
(3维空间) - 自适应权重PSO:
AdaptivePSO<vector<double>>
3. 差分进化
- 基本DE:
DifferentialEvolution<array<float, 10>>
- jDE:自适应参数DE
4. 遗传编程
- 树基GP:
GPNode<Polynomial>
- 线性GP:
LinearGP<Bytecode>
5. 其他进化算法
- 蚁群优化:
ACO<GraphPath>
- 文化算法:
CulturalAlgorithm<BeliefSpace>
- 协进化:
CoEvolution<PredatorPrey>
关键模板技术
- CRTP模式:用于静态多态
template<typename Derived>
class EvolutionBase {
void evolve() { static_cast<Derived*>(this)->implEvolve(); }
};
- 策略模板参数:
template<
typename Selection = TournamentSelection,
typename Mutation = GaussianMutation
>
class CustomGA { /*...*/ };
性能优化技巧
- 使用SIMD指令:
#include <immintrin.h>
对浮点基因加速 - 内存池预分配:避免进化过程中频繁内存分配
- 并行评估:OpenMP评估种群适应度
完整项目参考
GitHub开源项目推荐:
- Evolving Objects (EO)
- DEAP (C++/Python混合框架)
- MOEA Framework (多目标优化)
每个算法实例应提供:
- 可编译的独立头文件
- 示例问题(如Rastrigin函数优化)
- 可视化支持(可选Matplotlib-cpp)
框架扩展建议:
- 添加CUDA支持用于GPU加速
- 集成Google Benchmark进行性能测试
- 支持JSON配置文件的算法参数加载
基于C++ MOEA Framework
以下是基于C++ MOEA Framework(多目标优化框架)的实例分类与实现方向,涵盖经典问题、实际应用及算法扩展案例。所有示例均可通过框架的模块化设计实现,需结合文档中的API和算法接口。
经典测试问题
ZDT系列
- ZDT1:凸型Pareto前沿,连续变量
- ZDT2:凹型Pareto前沿
- ZDT3:离散Pareto前沿
- ZDT4:多模态问题,含局部最优
- ZDT6:非均匀解分布
DTLZ系列
- DTLZ1:线性Pareto前沿
- DTLZ2:球型Pareto前沿
- DTLZ3:多模态问题
- DTLZ4:偏置解分布
- DTLZ7:带约束的断开前沿
WFG系列
- WFG1:混合形状前沿
- WFG2:非连续前沿
- WFG3:退化前沿
- WFG4:凹型前沿噪声干扰
- WFG5:凹型前沿参数依赖
实际应用场景
工程优化
- 电机设计:多目标参数优化(效率 vs 成本)
- 结构拓扑优化:刚度 vs 材料用量
- 供应链调度:时间 vs 成本 vs 资源利用率
能源管理
- 微电网调度:发电成本 vs 排放量
- 风光储配置:投资回报 vs 稳定性
- 电动汽车充电:充电速度 vs 电网负荷
交通规划
- 路径规划:距离 vs 时间 vs 能耗
- 信号灯配时:通行效率 vs 等待时间
- 共享单车调度:覆盖率 vs 调度成本
算法扩展案例
算法改进
- NSGA-II 自定义交叉算子实现
- MOEA/D 权重生成策略修改
- SPEA2 环境选择逻辑重写
- 基于参考点的自适应变异
混合算法
- 粒子群与遗传算法混合
- 局部搜索嵌入NSGA-III
- 代理模型辅助优化
- 并行化岛屿模型实现
性能分析
- 超体积(HV)指标计算
- IGD 指标动态监测
- 解集分布可视化
- 运行时间与收敛性对比
实现要点
- 问题定义:继承
Problem
类并实现evaluate()
方法 - 算法配置:通过
Algorithm
类选择策略(如NSGAII
、MOEAD
) - 实验流程:使用
Experiment
类管理独立运行与统计分析 - 可视化:调用
Plotter
工具生成Pareto前沿图
示例代码片段(ZDT1问题):
#include <moeaframework.h>
class ZDT1 : public Problem {
public:
ZDT1() : Problem(30, 2) {} // 30维变量,2目标
void evaluate(double* x, double* y) {
y[0] = x[0];
double g = 1 + 9.0/(n-1)*sum(x+1, n-1);
y[1] = g*(1 - sqrt(x[0]/g));
}
};
框架源码与完整案例可参考MOEA Framework官方GitHub。
基于C++与Matplotlib-cpp的可视化实例
以下是基于C++与Matplotlib-cpp的可视化实例合集,涵盖常见场景和进阶用法。Matplotlib-cpp是一个轻量级库,通过调用Python的Matplotlib实现C++数据可视化。
基础绘图示例
折线图
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;
int main() {
std::vector<double> x = {1,2,3,4}, y = {1,4,9,16};
plt::plot(x, y, "r--");
plt::title("Basic Line Plot");
plt::xlabel("X");
plt::ylabel("Y");
plt::show();
}
散点图
std::vector<double> xs = {0.1,0.5,0.8}, ys = {0.2,0.6,0.9};
plt::scatter(xs, ys, 50.0, {
{"c", "blue"}, {"alpha", "0.5"}});
plt::grid(true);
plt::show();
多图与子图
多曲线同图
std::vector<double> t(100);
std::generate(t.begin(), t.end(), [n=0]() mutable { return n++ * 0.1; });
plt::plot(t, [](double d) { return sin(d); }, "b-");
plt::plot(t, [](double d) { return cos(d); }, "r--");
plt::legend({"sin(t)", "cos(t)"});
子图布局
plt::subplot(2, 1, 1);
plt::plot(x, y, "g-");
plt::subplot(2, 1, 2);
plt::bar(x, y);
高级可视化
3D曲面图
std::vector<std::vector<double>> z(100, std::vector<double>(100));
for(int i=0; i<100; ++i)
for(int j=0; j<100; ++j)
z[i][j] = sin(i/10.0)*cos(j/10.0);
plt::plot_surface(z);
plt::title("3D Surface");
热力图
plt::imshow(z, {
{"cmap", "hot"}, {"interpolation", "nearest"}});
plt::colorbar();
动态更新
实时数据绘制
for(int i=0; i<100; ++i) {
plt::clf(); // 清空画布
y.push_back(rand()%10);
plt::plot(y);
plt::pause(0.1); // 延迟100ms
}
完整配置示例
保存为文件
plt::figure_size(1200, 800);
plt::plot(x, y, {
{"linewidth", "2"}, {"label", "data"}});
plt::xlim(0, 5);
plt::savefig("output.png", dpi=300);
注意事项
- 需安装Python和Matplotlib,并通过
-I
指定头文件路径,链接Python库:g++ example.cpp -I/path/to/matplotlib-cpp -lpython3.8
- 动态绘图需调用
plt::pause()
而非plt::show()
阻塞模式
通过组合上述方法,可实现科学计算、实时监控、数据交互等复杂可视化需求。
经典C++遗传算法库及实例
以下是一些经典C++遗传算法库及实例的整理,涵盖不同应用场景和实现方式。内容基于开源库、学术资源和实践案例,可直接用于学习或项目开发。
遗传算法库推荐
1. GAlib
- 由Matthew Wall开发,支持多种遗传算法操作(选择、交叉、变异)。
- 示例:函数优化、TSP问题、神经网络训练。
- 关键代码片段:
#include <ga/ga.h>
float objective(GAGenome& g) { /* 适应度函数 */ }
GARealGenome genome(dim, objective);
GASimpleGA ga(genome);
ga.evolve();
2. DEAP (Distributed Evolutionary Algorithms in Python/C++)
- 支持多目标优化和并行计算,C++接口需通过Boost.Python调用。
- 示例:多目标优化、符号回归。
3. EO (Evolving Objects)
- 模板化设计,支持遗传算法、粒子群优化等。
- 示例:动态负载均衡、参数调优。
4. OpenBEAGLE
- 面向对象的框架,支持协同进化。
- 示例:游戏AI策略优化。
实例分类
函数优化
问题:Rastrigin函数最小化
// 适应度函数
float rastrigin(const GARealGenome& g) {
float sum = 10.0 * g.length();
for (int i = 0; i < g.length(); ++i)
sum += g.gene(i) * g.gene(i) - 10 * cos(2 * M_PI * g.gene(i));
return -sum; // 最小化转为最大化
}
组合优化
TSP问题
- 使用排列编码和顺序交叉(OX)。
GAPermutationGenome genome(numCities, objective);
GATournamentSelector selector;
ga.selector(selector);
机器学习
神经网络权重优化
- 将权重编码为染色体,适应度函数为分类准确率。
struct NeuralGenome : public GABin2DecGenome {
float evaluate() override {
neural_net.setWeights(chromosome);
return neural_net.test(data);
}
};
游戏开发
AI策略进化
- 在棋类游戏中,染色体表示决策规则,适应度为胜率。
while (ga.done() == false) {
ga.step();
auto best = ga.statistics().bestIndividual();
simulateGame(best);
}
多目标优化
NSGA-II实现
- 使用快速非支配排序和拥挤距离计算。
vector<Individual> fronts = nonDominatedSort(population);
for (auto& front : fronts)
crowdingDistanceAssign(front);
关键实现技巧
编码方式
实数编码(连续优化)、二进制编码(离散问题)、排列编码(TSP)。参数调优
交叉率(0.6-0.9)、变异率(0.001-0.05)、种群大小(50-200)。并行化
使用OpenMP或MPI评估种群适应度。
#pragma omp parallel for
for (int i = 0; i < pop.size(); ++i)
pop[i].fitness = evaluate(pop[i]);
以上内容可直接用于项目开发或学术研究,建议结合具体问题调整参数和操作符。
基于C++ DEAP
以下是基于C++ DEAP(Distributed Evolutionary Algorithms in Python)框架的实例分类和示例代码片段。DEAP虽以Python为主,但通过C++扩展或混合编程可提升性能。以下案例涵盖遗传算法、遗传编程、多目标优化等方向。
遗传算法(GA)基础示例
二进制编码优化
// C++ 实现伪代码(需结合DEAP Python接口)
#include <deap/ga.h>
using namespace deap;
void main() {
GAAlgorithm ga;
ga.setPopulationSize(100);
ga.addBinaryChromosome(10); // 10位二进制编码
ga.setFitnessFunction([](const Chromosome& c) {
return std::count(c.begin(), c.end(), true); // 最大化1的个数
});
ga.run(50); // 迭代50代
}
实数编码优化(Rastrigin函数)
# Python DEAP 实现
from deap import base, creator, tools
import numpy as np
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register("attr_float", np.random.uniform, -5.12, 5.12)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=10)
多目标优化(NSGA-II)
ZDT1问题求解
# DEAP 多目标示例
from deap import algorithms
toolbox.register("mate", tools.cxSimulatedBinaryBounded, low=0, up=1, eta=20.0)
toolbox.register("select", tools.selNSGA2)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("pop", np.copy)
result, logbook = algorithms.eaSimple(population, toolbox, cxpb=0.9, mutpb=0.1, ngen=100, stats=stats)
遗传编程(GP)
符号回归
# 生成算术表达式树
pset = gp.PrimitiveSet("MAIN", arity=1)
pset.addPrimitive(np.add, 2)
pset.addPrimitive(np.subtract, 2)
toolbox.register("expr", gp.genHalfAndHalf, pset=pset, min_=1, max_=3)
并行计算
多进程评估
from multiprocessing import Pool
pool = Pool(4)
toolbox.register("map", pool.map)
高级应用
神经网络权重优化
// C++ 混合示例:用GA优化神经网络
class NeuralNetwork {
public:
std::vector<double> weights;
double fitness() { /* ... */ }
};
GAAlgorithm<NeuralNetwork> ga;
ga.setCrossover([](NeuralNetwork& a, NeuralNetwork& b) {
// 单点交叉
});
C++ 遗传编程符号回归分类器
C++ 遗传编程符号回归分类器设计实例
遗传编程(Genetic Programming, GP)是一种基于进化算法的自动程序生成技术,常用于符号回归和分类问题。以下是使用C++实现遗传编程符号回归分类器的设计实例和相关方法。
基本概念
遗传编程通过模拟自然选择过程,生成解决特定问题的程序或表达式。符号回归是一种通过搜索数学表达式来拟合数据的方法,常用于分类问题。
实现步骤
1. 定义个体结构 每个个体代表一个数学表达式,通常以树形结构表示。节点可以是操作符(如+、-、*、/)或操作数(如变量、常数)。
struct Node {
std::string value;
Node* left;
Node* right;
};
2. 初始化种群 随机生成一组个体,构成初始种群。每个个体的树结构深度和节点类型可以随机生成。
std::vector<Node*> initializePopulati