基本遗传算法(SGA)的MATLAB实现
来源:互联网 发布:网络平台 三方支付协议 编辑:程序博客网 时间:2024/05/20 12:48
Simple Genetic Algorithm的MATLAB实现
用两个测试用例,直观地阐述基本遗传算法的原理,具体原理参考:http://blog.csdn.net/begtostudy/article/details/4136492
对于上述课件(讲得很透彻,适合对遗传算法的入门)中提出的一个问题进行了实现,并通过MATLAB作图直接观察到算法搜索的过程。闲言少叙,Show me the Code!
% Date:2015年6月1日 14:01:35% Author:heartsuit% Function:基本遗传算法(Simple Genetic Algorithm, SGA)的实现% 用于求解一元函数在某个区间内的最值,并作图反映寻优过程;% Description:编写该程序的目的主要是了解SGA的基本原理以及整体流程% 通过解决两个小问题,更直观深刻地理解SGA;% Instruction:若需要添加新的问题,只需在评估函数:% function evaluateValue = f(x)% 添加目标函数表达式即可;% GeneticAlgo(encodingBits, left, right)输入参数:% encodingBits:编码位数;根据实际问题确定% left:左区间端点% right:右区间端点% Note:% numbleOfSample:样本个数;建议范围:20~100% maxIteration:最大迭代次数;建议范围:100~500% 对于测试的两个问题可以采用以下方式调用函数:% Q1: GeneticAlgo(8, -2, 3)% Q2: GeneticAlgo(22, -1, 2)function GeneticAlgo(encodingBits, left, right)% 设置默认值(可以改动)numbleOfSample = 50; % 默认样本数为50maxIteration = 100; % 默认最大迭代次数为100;mutationProbability = 0.007; % 变异概率:建议范围:0.001~0.01iteration = 1; % 迭代次数初始化currentIndividual = -1; bestIndividual = zeros(maxIteration, 1); % 用以保存每次找到的最佳样本值% 二进制编码(表现型->基因型)sample = randi(2, numbleOfSample, encodingBits) - 1; % 初始化种群figure(1);while (iteration < maxIteration) % 遗传迭代 % 计算评估值 [evaluateValue, evaluateX, evaluateIndividual] = evaluate(sample, left, right, encodingBits); if (evaluateIndividual > currentIndividual) currentX = evaluateX; % 更新最佳个体的横坐标 currentIndividual = evaluateIndividual; % 更新最佳个体 end; bestIndividual(iteration) = currentIndividual; % 保存当前最佳个体 plot(bestIndividual(1:iteration)); grid on; pause(0.1); sample = select(sample, evaluateValue); % 选择 sample = cross(sample, encodingBits); % 交叉 sample = mutate(sample, mutationProbability); % 变异 iteration = iteration + 1;end;% 输出disp(currentIndividual); disp(iteration); disp(currentX);% 变异(基本位变异)function sampleGenetic = mutate(sample, mutationProbability)[numbleOfSample, encodingBits] = size(sample);sampleGenetic = sample;for kn = 1:numbleOfSample, for km = 1:encodingBits r = rand(1); if (r < mutationProbability) sampleGenetic(kn, km) = double(~ sampleGenetic(kn, km)); end; end;end;% 交叉(单点交叉)function sampleGenetic = cross(sample, encodingBits)numbleOfSample = size(sample, 1); sampleGenetic = sample;M2 = floor(numbleOfSample/2);for k = 1:M2 r1 = randi(numbleOfSample, 1); r2 = randi(numbleOfSample, 1); Y1 = sample(r1, :); Y2 = sample(r2, :); % 交叉概率建议范围:0.4~0.9 r = randi(encodingBits-1, 1); % 随机生成交叉位置 Y11 = [Y1(1:r), Y2((r+1):encodingBits)]; Y21 = [Y2(1:r), Y1((r+1):encodingBits)]; sampleGenetic(r1, :) = Y11; sampleGenetic(r2, :) = Y21;end;% 选择(轮盘赌)function sampleGenetic = select(sample, evaluateValue)numbleOfSample = size(sample, 1); evaluateValue = cumsum(evaluateValue);sampleGenetic = zeros(size(sample));for k = 1:numbleOfSample r = rand(1); I = 1; for kr = 2:numbleOfSample if ((r<evaluateValue(kr)) && (r>=evaluateValue(kr-1))) I = kr; break; end; end; sampleGenetic(k, :) = sample(I, :);end;% 解码 2->10进制, bin2dec()function [evaluateValue, evaluateX, evaluateIndividual] = evaluate(sample, left, right, encodingBits)evaluateValue = zeros(size(sample, 1), 1);evaluateIndividual = -1;evaluateX = left; % 既然evaluateX作为返回值,就要保证对其赋值,此处初始化为左边界for k = 1:size(sample, 1) s = num2str(sample(k, :)); s = strrep(s, ' ', ''); % 找到s中的空格并替换为空,即删除字符串中的空格 x = left + (right-left)/(2^encodingBits-1) * bin2dec(s); % 解码(基因型->表现型) evaluateValue(k) = f(x); if (evaluateValue(k) > evaluateIndividual) evaluateX = x; evaluateIndividual = evaluateValue(k); end;end;evaluateValue = evaluateValue/sum(evaluateValue); % 归一化% 适应度函数(可在此处添加要求解的目标函数)function evaluateValue = f(x)% Test1:% % Q1: f(x) = 10*x/sin(10*x); 在[-2, 3]的最小值% Note:由于这里的遗传算法处理的都是求最大值,所以取上述函数的倒数% 学过高数的同学都知道这个函数的极限值为1,在x = 0处取得% 下面作图验证:% x = -2:.01:3;% f = sin(10 * x)./(10 * x);% plot(x, f); grid on;% evaluateValue = sin(10*x+eps)./(10*x+eps);% Test2:% % Q2: f(x) = x*sin(10*pi*x)+2.0; 在[-1, 2]的最大值(结果精确到6位小数)% Note:% 此处虽然要求精确到6为小数,但是其实MATLAB已经保留了15为双精度% 可通过vpa(num, 6)实现% 查看f的图像,可知,在[-1, 2]上f的最大值在x = 1.85处取得,值为3.85% x = -1:.01:2;% f = x .* sin(10*pi*x) + 2.0;% plot(x, f); grid on;evaluateValue = x .* sin(10*pi*x) + 2.0;
以上只是遗传算法的基本原理,由于今后还要用到这个算法,所以还会对其进行改进。update见Github
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!
0 0
- 基本遗传算法(SGA)的MATLAB实现
- 遗传算法(一)基本遗传算法(SGA)及MATLAB源码
- 遗传算法-SGA代码实现
- 遗传算法(GA)的matlab实现
- 遗传算法的matlab实现(续 )
- 遗传算法的matlab实现
- 遗传算法的matlab实现
- 遗传算法的matlab实现
- 遗传算法的matlab实现
- Python 完整实现的简单遗传算法(SGA)
- Matlab实现遗传算法
- 使用matlab实现简单的遗传算法(一)
- 遗传算法的基本原理和matlab实现
- 遗传算法的基本原理和matlab实现
- 基本遗传算法(GA)的算法原理、步骤、及Matlab实现
- 简单遗传算法实现(MATLAB)
- 简单遗传算法MATLAB实现
- 简单遗传算法MATLAB实现
- 【android】初步学习日期选择器的使用
- JAVA堆算法,基于数组实现
- linux网络编程学习之一网络字节序
- 黑马程序员——Java基础---语法<二>
- Longest Palindromic Substring
- 基本遗传算法(SGA)的MATLAB实现
- UILabel自适应高度和自动换行
- Nginx负载均衡
- Notification Centers 通知中心
- 【C语言】巴斯卡三角问题
- with...as...
- 欢迎使用CSDN-markdown编辑器
- wordpress 自己创建插件怎么创建
- iOS开发的一些奇巧淫技...