【GA】GA算法寻优
Navigator
- Genetic Algorithm
- GA算法的特点
- 编码
- 初始群体
- 杂交
- 适应度值评估检测
- 选择
- 变异
- 中止
- GA Demo
- objective function
- GA main function
- 编码算子(Code)
- 验证函数(test)
- 选择算子(Select)
- 变异算子(Mutation)
- 交叉算子(Cross)
- 算法对比:PSO
- Reference
Genetic Algorithm
GA算法的主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具备隐并行性和较好的全局寻优能力。GA在进行全局搜索和优化搜索时不依赖梯度信息,只需要搜索方向的目标函数和相应的适应度函数,所以GA提供了一种求解复杂系统问题的通用框架。
GA算法的特点
- GA从问题的串集开始搜索,而不是从单个解开始,传统优化算法从单个值开始求最优解,容易陷入局部最优解。GA从串集开始搜索,覆盖面大,有利于全局寻优。
- GA同时对搜索空间多个解进行评估,算法本身支持并行化
- GA算法仅用适应度函数值进行个体评估,并在此基础上进行遗传操作,适应度函数不仅不受连续可微的约束,而且其定义域可以任意设定
- GA采用概率变迁的规则指导搜索方向
- GA具有自组织,自适应和自学习性。GA利用进化过程中获得的信息自行组织搜索,适应度大的个体具有较高的生存概率
编码
GA不能直接处理问题空间的参数,必须将其转为遗传空间由基因按一定结构组成的染色体或者个体,这种转换操作就是编码,评估编码的策略采用以下3种规范:
- 完备性(
completeness
):问题空间中的所有点(候选解)都能作为GA空间中的染色体表现 - 健全性(
soundness
):GA空间中的染色体能对应所有问题空间中的候选解 - 非冗余性(
nonredundancy
):染色体和候选解一一对应
目前常用的编码方式有二进制编码,浮点数编码,字符编码和编程编码等。
初始群体
随机产生NNN个初始串结构数据,其中每个串数据为一个个体
,NNN个个体构成一个群体,参数NNN的选择需要根据问题的规模而确定。
杂交
杂交是GA中的主要遗传操作,由交换概率挑选的每两个父代通过将相异的部分信息进行交换,从而产生新的个体。
适应度值评估检测
适应度是用来度量种群中个体优劣的指标,适应度是特征组合的判据的值,该判据的选取是遗传算法的关键。GA在搜索进化的过程中一般不需要外部信息,仅用评估函数来评估个体或者解的优劣,并作为之后遗传的依据。在GA中,适应度函数需要进行比较排序并在此基础上计算选择概率。
适应度函数的设计需要满足以下条件:
- 单值、连续、非负、最大化
- 合理、一致性
- 计算量小
- 通用性强
选择
选择的目的是为了从交换后的群体中选出优良的个体,使得适应性强的个体为下一代贡献的概率变大。
变异
变异首先会在群体中随机选择一定数量的个体,对于选中的个体以一定的概率随机改变串结构数据中的某个基因值。
中止
中止的条件一般有3种:
- 给定一个最大的遗传代数,算法迭代到最大数时停止
- 给定问题一个下界计算方法,当进化中达到要求的偏差ε\varepsilonε时,算法中止
- 当发现算法进化到无法改进解的性能时停止算法
GA Demo
求解如下线性规划
min5x1+4x2+6x3s.t.{x1−x2+x3≤203x1+2x2+4x3≤423x1+2x2≤300≤x1,0≤x2,0≤x3\begin{aligned} \min& 5x_1+4x_2+6x_3\\ s.t.& \begin{cases} x_1-x_2+x_3\leq 20\\ 3x_1+2x_2+4x_3\leq 42\\ 3x_1+2x_2\leq 30\\ 0\leq x_1, 0\leq x_2, 0\leq x_3 \end{cases} \end{aligned} mins.t.5x1+4x2+6x3⎩⎪⎪⎪⎨⎪⎪⎪⎧x1−x2+x3≤203x1+2x2+4x3≤423x1+2x2≤300≤x1,0≤x2,0≤x3
objective function
function y = func2(x)y=5*x(1)+4*x(2)+6*x(3);
end
GA main function
clc;
close all;
clear all;%% initialize parameters
popsize = 100;
lenchrom = 3;
pc = 0.7; % probability of crossover
pm = 0.3; % probability of mutation
maxgen = 100; % # of generations% population
popmax = 50;
popmin = 0;
bound = [popmin popmax; popmin popmax; popmin popmax];% initialization particles
for i=1:popsize% generate a population randomly GApop(i, :) = Code(lenchrom, bound);% calculate the fitnessfitness(i) = func(GApop(i, :));
end% find the best chromesome
[bestfitness, bestindex] = min(fitness);
zbest = GApop(bestindex, :); % the global best
gbest = GApop; % the individual best
fitnessgbest = fitness;
fitnesszbest = bestfitness;% find the optimal value iteratelly
for i=1:maxgeni% update population: GAGApop = Select(GApop, fitness, popsize);% crossGApop = Cross(pc, lenchrom, GApop, popsize, bound);% mutationGApop = Mutation(pm, lenchrom, GApop, popsize, [i maxgen], bound);pop = GApop;for j = 1:popsize% fitnessif pop(j, 1)-pop(j, 2)+pop(j, 3)<=20if 3*pop(j, 1)+2*pop(j, 2)+4*pop(j, 3)<=42if 3*pop(j, 1)+2*pop(j, 2)<=30fitness(j)=func(pop(j, :));endendend% update the optimal value of individualif fitness(j) < fitnessgbest(j)gbest(j, :) = pop(j, :);fitnessgbest(j) = fitness(j);end% update the optimal value of populationif fitness(j) < fitnesszbestzbest = pop(j, :);fitnesszbest = fitness(j);endendyy(i) = fitnesszbest;
end%% results
disp '********************best particle number********************'
zbest
plot(yy, 'linewidth', 2);
title(['Fitness curve ', 'Generation of Stopping: ' num2str(maxgen)]);
xlabel('Generation of evolution');
ylabel('Fitness');
grid on;
编码算子(Code)
function ret = Code(lenchrom, bound)flag = 0;while flag == 0pick = rand(1, lenchrom);ret = bound(:, 1)'+(bound(:, 2)-bound(:, 1))'.*pick;flag = test(lenchrom, bound, ret); % verify the feasibility of the chromesomeend
end
验证函数(test)
function flag = test(lenchrom, bound, code)
flag = 1;
[n, ~] = size(code);
for i=1:nif code(i)<bound(i, 1) || code(i)>bound(i, 2)flag = 0;end
end
选择算子(Select)
function ret = Select(individuals, fitness, sizepop)fitness = 1./fitness;sumfitness = sum(fitness);sumf = fitness./sumfitness;index = [];for i=1:sizepop % Turn sizepop roulettepick = rand;while pick == 0pick = rand;endfor j=1:sizepoppick = pick-sumf(j);if pick<0index = [index j];break;endendendindividuals = individuals(index, :);fitness = fitness(index);ret = individuals;
end
变异算子(Mutation)
function ret = Mutation(pmutation, lenchrom, chrom, sizepop, pop, bound)for i=1:sizepop% select a chromosome for mutation randomlypick = rand;while pick == 0pick = rand;endindex = ceil(pick*sizepop);% the probability of mutation decide wheter to mutate in this roundpick = rand;if pick > pmutationcontinue;endflag = 0;while flag == 0% position of mutationpick = rand;while pick == 0pick = rand;endpos = ceil(pick*sum(lenchrom)); % select the pos variable to mutatev = chrom(i, pos);v1 = v-bound(pos, 1);v2 = bound(pos, 2)-v;pick = rand;if pick > 0.5delta = v2*(1-pick^((1-pop(1)/pop(2))^2));chrom(i, pos) = v+delta;elsedelta = v1*(1-pick^((1-pop(1)/pop(2))^2));chrom(i, pos) = v-delta;endflag = test(lenchrom, bound, chrom(i, :)); % test the feasibility of chromosomeendendret = chrom;
end
交叉算子(Cross)
function ret = Cross(pcross, lenchrom, chrom, sizepop, bound)for i = 1:sizepoppick = rand(1, 2);while prod(pick) == 0pick = rand(1, 2);endindex = ceil(pick.*sizepop);% the probability for crossingpick = rand;while pick == 0pick = rand;endif pick>pcrosscontinue;endflag = 0;while flag == 0% select the position for crossing randomlypick = rand;while pick == 0pick = rand;endpos = ceil(pick.*sum(lenchrom));pick = rand;v1 = chrom(index(1), pos);v2 = chrom(index(2), pos);chrom(index(1), pos)=pick*v2+(1-pick)*v1;chrom(index(2), pos)=pick*v1+(1-pick)*v2;% test the feasibility of chromosomeflag1 = test(lenchrom, bound, chrom(index(1), :));flag2 = test(lenchrom, bound, chrom(index(2), :));if flag1 * flag2 == 0flag = 0;elseflag = 1;endendendret = chrom;
end
算法对比:PSO
clc;
clear all;
close all;% initialize parameters
c1 = 1.49445;
c2 = 1.49445;maxgen = 200; % numbers of generation
sizepop = 200;% size of population% velocity of particle
Vmax = 1;
Vmin = -1;% population
popmax = 20;
popmin = 0;% best particle number
par_num = 3;% initialize
for i=1:sizepop% generate a population randomlypop(i, :) = 2.*abs(rands(1, par_num)); % populationV(i, :) = 1.*rands(1, par_num); % velocity% fitnessfitness(i) = func(pop(i, :));
end% find the best fitness
[bestfitness, bestindex] = min(fitness);
zbest = pop(bestindex, :);
gbest = pop;
fitnessgbest = fitness;
fitnesszbest = bestfitness;% find the optimal value iteratively
for i = 1:maxgenifor j = 1:sizepop% update velocityV(j, :) = V(j, :)+c1*rand*(gbest(j, :)-pop(j, :))+c2*rand*(zbest-pop(j, :));V(j, find(V(j, :)>Vmax))=Vmax;V(j, find(V(j, :)<Vmin))=Vmin;% update populationpop(j, :)=pop(j, :)+0.5*V(j, :);pop(j, find(pop(j, :)>popmax)) = popmax;pop(j, find(pop(j, :)<popmin)) = popmin;% adaptive mutationif rand > 0.8k = ceil(par_num*rand);pop(j, k) = rand;end% fitness valueif pop(j, 1)-pop(j, 2)+pop(j, 3)<=20if 3*pop(j, 1)+2*pop(j, 2)+4*pop(j, 3)<=42if 3*pop(j, 1)+2*pop(j, 2)<=30fitness(j) = func(pop(j, :));endendend% update the individual optimal valueif fitness(j) < fitnessgbest(j)gbest(j, :)=pop(j, :);fitnessgbest(j) = fitness(j);end% update the population optimal valueif fitness(j)<fitnesszbestzbest = pop(j, :);fitnesszbest = fitness(j);endendyy(i) = fitnesszbest;
end%%
disp '************best particle number*************'
zbestplot(yy);
title(['Fitness Curve ' 'Generation of stopping: ' num2str(maxgen)]);
xlabel('Generation of evolution');
ylabel('Fitness');
对比GA和PSO可以发现,GA极值寻优计算具有较好的鲁棒性,收敛较快,PSO存在早熟现象
Reference
MATLAB优化算法案例分析与应用 余胜威
【GA】GA算法寻优相关推荐
- 基于果蝇优化算法的函数寻优算法
文章目录 一.理论基础 二.算法步骤 1.启发 2.方向和距离 3.气味浓度判断值 4.适应度评估 5.寻找最优个体 6.飞行 7.迭代优化 三.案例背景 问题描述 四.MATLAB程序实现 1.清空 ...
- dijkstra算法c++_Matlab 二维模拟退火算法最优路径(主程序)
这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线), 之后把经过的每个虚线段分成1000份,它们的基准点分别是b1.b2等 随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火 ...
- 模拟退火算法_Matlab 二维模拟退火算法最优路径(主程序)
这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线), 之后把经过的每个虚线段分成1000份,它们的基准点分别是b1.b2等 随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火 ...
- 【超参数寻优】遗传算法(GA) 超参数寻优的python实现
[超参数寻优]遗传算法(GA) 超参数寻优的python实现 一.遗传算法简介 1.遗传算法由来 2.遗传算法名词概念 3.遗传算法中对染色体的操作 3.1.选择 3.2.交叉 3.3.变异 二.遗传 ...
- 【超参数寻优】粒子群算法(PSO) 超参数寻优的python实现
[超参数寻优]粒子群算法(PSO) 超参数寻优的python实现 一.算法原理 1.粒子群算法的名词解释 2.粒子更新 二.PSO算法参数寻优的python实现 参考资料 粒子群优化算法(Partic ...
- python路线寻优_基于DEAP库的Python进化算法从入门到入土 --(四)遗传算法的改进...
前言 前面一节我们尝试了用GA求解TSP问题,简单遗传算法总是不能很好收敛到一个较优的解,在用时和求解精度上都被贪心算法吊打.在末尾我们总结了三个可能的改进方向,这次我们想要沿着这三个方向试着改进简单 ...
- java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
- 计算智能——粒子群算法的寻优算法
文章目录 粒子群算法的寻优算法 1.简介 2.基本原理 3.代码实现 4.参数调试记录 4.1默认参数下的运行结果 4.2关于惯性权重w 4.2.1最大权重ws=0.9,最小权重we=0.4 4.2. ...
- 粒子群算法中的罚函数matlab,第18章基于罚函数的粒子群算法的函数寻优范例.ppt...
第十八章 MATLAB优化算法案例分析与应用 第18章 基于罚函数的粒子群算法的函数寻优 第十八章 MATLAB优化算法案例分析与应用 18.1 粒子群算法概述 自20世纪50年代中期创立了仿生学,许 ...
最新文章
- FromBottomToTop团队项目总结
- VTK:Points之ExtractPointsDemo
- 集成Swagger(API)---SpringBoot
- 【转】ABP源码分析二十七:ABP.Entity Framework
- JSP和Tag之文件上传
- python分解word文档为多个_用python批量处理word文档
- 永大电梯小键盘服务器显示黑色条杠,永大电梯小键盘操作手顺
- 整数的二进制表示中 1 的个数
- 如何一次为 Safari 中的所有标签添加书签?
- java 车牌号 正则_正则验证车牌号码,包括新能源车牌
- webgl漫反射公式物理原理猜测
- [YYOJ]LZY喜欢的数字
- eclipse常用搜索快捷键
- FastReport打印标签
- uniapp实现生成海报功能
- Java8 Stream流式操作接口详解
- 心跳信号分类 ---参数调整
- Vue 使用高德地图,精确定位ip定位,获取城市、地区位置
- 批量识别图片大致不相同图片_批量图片识别文字软件
- 如何构建一个神经网络以使用TensorFlow识别手写数字
热门文章
- win10开机自启应用的设置
- Flex swc swz swf RSL
- 轻松看懂CCRC信息安全服务资质认证
- Matlab子图绘制subplot函数快速入门
- 厦大AI研究院今日揭牌成立:数学系校友陈纯院士领衔,最亮眼的是「交叉」研究思路...
- 百度之星-1001 调查问卷
- flex vue 垂直居中居上_CSS3 Flex实现元素的水平居中和垂直居中
- CISA Cert Prep: 3 Information Technology Life Cycle for IS Auditors CISA证书准备3:信息技术审计员的信息技术生命周期 Lynd
- 微信资料在电脑上怎么打印?
- SQLServer2000 安装时文件挂起问题