MATLAB 中用遗传 GA 算法求解函数极值:初学者友好指南

📅 发布时间:2026/7/6 11:30:58 👁️ 浏览次数:
MATLAB 中用遗传 GA 算法求解函数极值:初学者友好指南
MATLAB环境下运用遗传GA算法求解函数极值问题demo代码采用实数编码方式非均匀变异算子进行变异轮盘转法进行选择。 适合初学者快速入门上手有详细的注释和使用说明。在优化问题的求解领域遗传算法GA凭借其独特的仿生学理念和高效的搜索能力占据着重要地位。今天咱们就来聊聊在 MATLAB 环境下如何运用遗传算法求解函数极值问题而且采用实数编码方式搭配非均匀变异算子和轮盘赌选择法。代码和注释安排得明明白白助你快速入门上手。实数编码遗传算法基础遗传算法模拟生物进化过程从初始种群开始通过选择、交叉和变异操作一代一代“进化”出更好的个体。实数编码就是直接用实数表示基因相比二进制编码在处理连续变量优化问题时更直观高效。非均匀变异算子变异是为了引入新的基因避免算法陷入局部最优。非均匀变异算子能随着进化代数自适应调整变异步长在进化初期步长大全局搜索能力强后期步长小聚焦于局部最优解的微调。轮盘赌选择法选择操作决定哪些个体能进入下一代。轮盘赌选择法就像抽奖每个个体被选中的概率与其适应度成正比。适应度越高被选中参与繁殖下一代的概率越大。MATLAB 代码及分析% 遗传算法求解函数极值问题 % 函数定义这里以简单的一元函数 f(x) -x^2 4*x 为例 fun (x) -x.^2 4*x; % 遗传算法参数设置 popSize 50; % 种群大小 chromLength 1; % 染色体长度这里是一维问题 maxGen 100; % 最大进化代数 pc 0.8; % 交叉概率 pm 0.1; % 变异概率 xMin 0; % 变量 x 的最小值 xMax 4; % 变量 x 的最大值 % 初始化种群采用实数编码 pop xMin (xMax - xMin) * rand(popSize, chromLength); for gen 1:maxGen % 计算适应度 fitness fun(pop); % 轮盘赌选择 totalFitness sum(fitness); selectionProb fitness / totalFitness; selectedIndex randsample(popSize, popSize, true, selectionProb); newPop pop(selectedIndex, :); % 交叉操作 for i 1:2:popSize if rand pc % 单点交叉 crossPoint floor(rand * chromLength) 1; temp newPop(i, crossPoint); newPop(i, crossPoint) newPop(i 1, crossPoint); newPop(i 1, crossPoint) temp; end end % 变异操作采用非均匀变异 for i 1:popSize if rand pm for j 1:chromLength if rand 0.5 delta (newPop(i, j) - xMin) * (1 - rand ^ (1 - gen / maxGen)); newPop(i, j) newPop(i, j) - delta; else delta (xMax - newPop(i, j)) * (1 - rand ^ (1 - gen / maxGen)); newPop(i, j) newPop(i, j) delta; end newPop(i, j) max(xMin, min(xMax, newPop(i, j))); % 确保变异后的值在范围内 end end end pop newPop; end % 输出结果 [bestFitness, bestIndex] max(fun(pop)); bestSolution pop(bestIndex, :); fprintf(最优解 x %.4f, 对应的函数值 f(x) %.4f\n, bestSolution, bestFitness);代码分析函数定义fun (x) -x.^2 4*x;这里定义了我们要求极值的目标函数简单的一元二次函数-x^2 4*x。参数设置popSize 50; chromLength 1; maxGen 100; pc 0.8; pm 0.1; xMin 0; xMax 4;设置了种群大小、染色体长度、最大进化代数、交叉概率、变异概率以及变量x的取值范围。这些参数对算法的性能和结果有很大影响需要根据具体问题调整。种群初始化pop xMin (xMax - xMin) * rand(popSize, chromLength);利用rand函数在xMin和xMax之间随机生成初始种群这就是第一代个体。适应度计算与选择轮盘赌法fitness fun(pop); totalFitness sum(fitness); selectionProb fitness / totalFitness; selectedIndex randsample(popSize, popSize, true, selectionProb); newPop pop(selectedIndex, :);计算每个个体的适应度即目标函数值。然后算出总适应度得到每个个体的选择概率。通过randsample函数按照概率选择个体组成新种群。交叉操作for i 1:2:popSize if rand pc crossPoint floor(rand * chromLength) 1; temp newPop(i, crossPoint); newPop(i, crossPoint) newPop(i 1, crossPoint); newPop(i 1, crossPoint) temp; end end以概率pc对相邻个体进行单点交叉交换部分基因创造新的个体。变异操作非均匀变异for i 1:popSize if rand pm for j 1:chromLength if rand 0.5 delta (newPop(i, j) - xMin) * (1 - rand ^ (1 - gen / maxGen)); newPop(i, j) newPop(i, j) - delta; else delta (xMax - newPop(i, j)) * (1 - rand ^ (1 - gen / maxGen)); newPop(i, j) newPop(i, j) delta; end newPop(i, j) max(xMin, min(xMax, newPop(i, j))); end end end以概率pm对个体进行非均匀变异根据当前代数自适应调整变异步长同时保证变异后的值在取值范围内。结果输出[bestFitness, bestIndex] max(fun(pop)); bestSolution pop(bestIndex, :); fprintf(最优解 x %.4f, 对应的函数值 f(x) %.4f\n, bestSolution, bestFitness);找到最终种群中的最优个体及其对应的函数值并输出。MATLAB环境下运用遗传GA算法求解函数极值问题demo代码采用实数编码方式非均匀变异算子进行变异轮盘转法进行选择。 适合初学者快速入门上手有详细的注释和使用说明。希望这篇博文能让你对在 MATLAB 中用遗传算法求解函数极值问题有更清晰的认识赶紧动手试试吧