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种规范:

  1. 完备性(completeness):问题空间中的所有点(候选解)都能作为GA空间中的染色体表现
  2. 健全性(soundness):GA空间中的染色体能对应所有问题空间中的候选解
  3. 非冗余性(nonredundancy):染色体和候选解一一对应

目前常用的编码方式有二进制编码,浮点数编码,字符编码和编程编码等。

初始群体

随机产生NNN个初始串结构数据,其中每个串数据为一个个体,NNN个个体构成一个群体,参数NNN的选择需要根据问题的规模而确定。

杂交

杂交是GA中的主要遗传操作,由交换概率挑选的每两个父代通过将相异的部分信息进行交换,从而产生新的个体。

适应度值评估检测

适应度是用来度量种群中个体优劣的指标,适应度是特征组合的判据的值,该判据的选取是遗传算法的关键。GA在搜索进化的过程中一般不需要外部信息,仅用评估函数来评估个体或者解的优劣,并作为之后遗传的依据。在GA中,适应度函数需要进行比较排序并在此基础上计算选择概率。
适应度函数的设计需要满足以下条件:

  1. 单值、连续、非负、最大化
  2. 合理、一致性
  3. 计算量小
  4. 通用性强

选择

选择的目的是为了从交换后的群体中选出优良的个体,使得适应性强的个体为下一代贡献的概率变大。

变异

变异首先会在群体中随机选择一定数量的个体,对于选中的个体以一定的概率随机改变串结构数据中的某个基因值。

中止

中止的条件一般有3种:

  1. 给定一个最大的遗传代数,算法迭代到最大数时停止
  2. 给定问题一个下界计算方法,当进化中达到要求的偏差ε\varepsilonε时,算法中止
  3. 当发现算法进化到无法改进解的性能时停止算法

GA Demo

求解如下线性规划
min⁡5x1+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. 基于果蝇优化算法的函数寻优算法

    文章目录 一.理论基础 二.算法步骤 1.启发 2.方向和距离 3.气味浓度判断值 4.适应度评估 5.寻找最优个体 6.飞行 7.迭代优化 三.案例背景 问题描述 四.MATLAB程序实现 1.清空 ...

  2. dijkstra算法c++_Matlab 二维模拟退火算法最优路径(主程序)

    这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线), 之后把经过的每个虚线段分成1000份,它们的基准点分别是b1.b2等 随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火 ...

  3. 模拟退火算法_Matlab 二维模拟退火算法最优路径(主程序)

    这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线), 之后把经过的每个虚线段分成1000份,它们的基准点分别是b1.b2等 随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火 ...

  4. 【超参数寻优】遗传算法(GA) 超参数寻优的python实现

    [超参数寻优]遗传算法(GA) 超参数寻优的python实现 一.遗传算法简介 1.遗传算法由来 2.遗传算法名词概念 3.遗传算法中对染色体的操作 3.1.选择 3.2.交叉 3.3.变异 二.遗传 ...

  5. 【超参数寻优】粒子群算法(PSO) 超参数寻优的python实现

    [超参数寻优]粒子群算法(PSO) 超参数寻优的python实现 一.算法原理 1.粒子群算法的名词解释 2.粒子更新 二.PSO算法参数寻优的python实现 参考资料 粒子群优化算法(Partic ...

  6. python路线寻优_基于DEAP库的Python进化算法从入门到入土 --(四)遗传算法的改进...

    前言 前面一节我们尝试了用GA求解TSP问题,简单遗传算法总是不能很好收敛到一个较优的解,在用时和求解精度上都被贪心算法吊打.在末尾我们总结了三个可能的改进方向,这次我们想要沿着这三个方向试着改进简单 ...

  7. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  8. 计算智能——粒子群算法的寻优算法

    文章目录 粒子群算法的寻优算法 1.简介 2.基本原理 3.代码实现 4.参数调试记录 4.1默认参数下的运行结果 4.2关于惯性权重w 4.2.1最大权重ws=0.9,最小权重we=0.4 4.2. ...

  9. 粒子群算法中的罚函数matlab,第18章基于罚函数的粒子群算法的函数寻优范例.ppt...

    第十八章 MATLAB优化算法案例分析与应用 第18章 基于罚函数的粒子群算法的函数寻优 第十八章 MATLAB优化算法案例分析与应用 18.1 粒子群算法概述 自20世纪50年代中期创立了仿生学,许 ...

最新文章

  1. FromBottomToTop团队项目总结
  2. VTK:Points之ExtractPointsDemo
  3. 集成Swagger(API)---SpringBoot
  4. 【转】ABP源码分析二十七:ABP.Entity Framework
  5. JSP和Tag之文件上传
  6. python分解word文档为多个_用python批量处理word文档
  7. 永大电梯小键盘服务器显示黑色条杠,永大电梯小键盘操作手顺
  8. 整数的二进制表示中 1 的个数
  9. 如何一次为 Safari 中的所有标签添加书签?
  10. java 车牌号 正则_正则验证车牌号码,包括新能源车牌
  11. webgl漫反射公式物理原理猜测
  12. [YYOJ]LZY喜欢的数字
  13. eclipse常用搜索快捷键
  14. FastReport打印标签
  15. uniapp实现生成海报功能
  16. Java8 Stream流式操作接口详解
  17. 心跳信号分类 ---参数调整
  18. Vue 使用高德地图,精确定位ip定位,获取城市、地区位置
  19. 批量识别图片大致不相同图片_批量图片识别文字软件
  20. 如何构建一个神经网络以使用TensorFlow识别手写数字

热门文章

  1. win10开机自启应用的设置
  2. Flex swc swz swf RSL
  3. 轻松看懂CCRC信息安全服务资质认证
  4. Matlab子图绘制subplot函数快速入门
  5. 厦大AI研究院今日揭牌成立:数学系校友陈纯院士领衔,最亮眼的是「交叉」研究思路...
  6. 百度之星-1001 调查问卷
  7. flex vue 垂直居中居上_CSS3 Flex实现元素的水平居中和垂直居中
  8. CISA Cert Prep: 3 Information Technology Life Cycle for IS Auditors CISA证书准备3:信息技术审计员的信息技术生命周期 Lynd
  9. 微信资料在电脑上怎么打印?
  10. SQLServer2000 安装时文件挂起问题