C++遗传算法实战:高效应用案例

发布于:2025-08-03 ⋅ 阅读:(11) ⋅ 点赞:(0)

基于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

  • 音乐生成
    音符序列进化,适应度基于和声规则与用户评分。

注意事项

  1. MIT许可项目需保留原始版权声明
  2. 部分仓库可能依赖Boost或Eigen库
  3. 实践时建议从简单测试函数(如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 (多目标优化)

每个算法实例应提供:

  1. 可编译的独立头文件
  2. 示例问题(如Rastrigin函数优化)
  3. 可视化支持(可选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 指标动态监测
  • 解集分布可视化
  • 运行时间与收敛性对比

实现要点

  1. 问题定义:继承Problem类并实现evaluate()方法
  2. 算法配置:通过Algorithm类选择策略(如NSGAIIMOEAD
  3. 实验流程:使用Experiment类管理独立运行与统计分析
  4. 可视化:调用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);


注意事项

  1. 需安装Python和Matplotlib,并通过-I指定头文件路径,链接Python库:
    g++ example.cpp -I/path/to/matplotlib-cpp -lpython3.8
    

  2. 动态绘图需调用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

网站公告

今日签到

点亮在社区的每一天
去签到