数学建模(1)——遗传算法(GA)
来源:互联网 发布:大富豪棋牌免费源码 编辑:程序博客网 时间:2024/06/06 01:04
基本原理
遗传算法是是一种全局寻优算法,进行群体搜索技术,且不易陷入局部最优点
基本思想:以编码空间代替问题参数空间,从代表问题可能有潜在解集的一个种群出发,按照生物进化过程中适者生存、优胜略汰的原理,以适应度作为评价个体优劣的依据,重复使用选择、交叉、变异算子作用于群体,使之不断进化,逐渐接近最优解
生物遗传概念在遗传算法中的对应关系
基本步骤
- 在一定编码方案下,随机产生一个初始群组
- 用相应的编码方法,将编码后的个体转换成问题空间的决策变量,并求出个体的适应值
- 按照一定选择方式(即适者生存的原则),从中选择部分个体构成交配池
- 由交叉和变异这两个遗传算子对交配池中随机两两配对的个体进行操作,并形成新一代的种群
- 从所有的目前现存的父代与子代中选取最为优良的某些个体作为新的父代,反复执行步骤2~4,使之逐代进化,直至满足收敛判断依据
遗传操作三大基本算子
选择
选择用来实施适者生存的原则,即把当前的群体中的个体按照一定方法,挑选出一部分个体,用于构建交配池
选择算子的作用效果是提高了群体的平均适应度。由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因为选择操作而有所改变
交叉
交叉,首先使交配池中的个体随机两两配对,然后按照某种方式选择出交叉点,互换交叉点后的全部基因
交叉算子是产生新个体的主要方法,他决定了遗传算法的全局搜索能力
变异
变异是对个体的某一个或者某一些基因值按照某一提前设定好的较小概率进行改变
变异算子只是产生新个体的辅助方法,它决定了遗传算法的局部搜索能力
编码策略
遗传算法不对优化问题的实际决策变量进行操 作 ,所以应用遗传算法首要的问题是通过编码将决策 变量表示成串结构数据。
二进制编码
将问题空间的参数表示为基于字符集{0,1}构成的染色体位串
如求二元函数最大值
f(x1,x2)=x1^2+x2^2
x1={1,2,3,4,5,6,7}
x2={1,2,3,4,5,6,7}
遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种符号串。本题中,用无符号二进制整数来表示。因 x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。
例如,基因型 X=101110 所对应的表现型是:x=[ 5,6 ]。
个体的表现型x和基因型X之间可通过编码和解码程序相互转换。
实数编码
实数编码[5] 中,个体的每个基因值用某一范 围内的一个实数来表示,个体的编码长度等于其 决策变量的个数.若某一个优化问题含有 5 个变 量,则即
{7.10 5.35 3.20 4.12 2.73}为一个个体的基因型,对应表现性为
x=[7.10,5.35,3.20,4.12,2.73]
十进制编码
十进制编码将待处理的参数数值(实数) 逐位数字地转化为一定长度的数字字符并形成 字符串.若每个参数取值范围均在 [0 , 10) 内,对 前面实数编码中所举例子进行十进制数编码,该个体可表示为:
{7 1 0 5 3 5 3 2 0 4 1 2 2 7 3}
应用举例
以《数学建模算法与应用(第二版)》中例题为例
(此处数据截取一部分,之后会将数据保存至纯文本文件,挂载下载链接)
参数设定:
- 种群大小:M=50
- 最大代数:G=1000
- 交叉率:Pc=1 可保证种群的充分进化
- 变异率:Pm=0.1 一般而言,变异发生的可能性较小
编码策略
使用w1w2…w102序列作为染色体,其中0<=wi<=1(i=2,3,…,101),w1=0,w102=1,每一个序列都与种群中一个个体相对应。
例如(102个基因太多,此处以9个基因为代表),一个个体的染色体序列为
【0.23 0.82 0.45 0.74 0.87 0.11 0.56 0.69 0.78】
式中,w1w2…w9表示1-9目标的适应度值,将其升序排列后,即可得到本题中的顺序
6-1-3-7-8-4-9-2-5
这就是按照编码方案将基因转化为可行解的过程
初始种群
先利用典型的近似算法——改良圈算法得到一个较好的初始种群
目标函数
目标函数为侦查所有目标的路径长度,即从基地开始侦查100个敌军目标最后再飞回基地的路径长度,适度值函数就取为目标函数
min f (π1,π2,…π102)=Σdπiπi+1
交叉算子
对于配对的两个父代个体 f1 f2 ,随机地选择第t个基因处作为交叉点,将 f1 的前t个基因和f2 的后102-t个基因组成s1,将 f2 的前t个基因和f1 的后102-t个基因组成s2,如图所示
交叉方式很多,应该尽可能的选取好的交叉方式,保证子代能继承父代的优良特性
变异算子
变异是实现群体多样性的一种手段,同时也是全局寻优的保证。
按照给定的变异率,对选定变异的个体,随机选取三个整数,满足1
选择算子
在父代种群和子代种群中选择目标函数值最小的M个个体进化到下一代
MATLAB代码
clear,clcload sj.txt;x=sj(:,1:2:8);x=x(:);%将25*4矩阵变为100*1矩阵y=sj(:,2:2:8);y=y(:);sj=[x,y];d1=[70,40];%初始起飞基地sj0=[d1;sj;d1];%102个基地%计算距离矩阵dsj=sj0*pi/180; d=zeros(102); for i=1:101 for j=i+1:102 temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2)); d(i,j)=6370*acos(temp); endendd=d+d';%对称矩阵L=102;w=50;dai=100;%通过改良圈算法选取优良父代Afor k=1:w c=randperm(100);%把1到100这些数随机打乱得到的一个数字序列 c1=[1,c+1,102];%染色体 flag=1; while flag>0 flag=0; for m=1:L-3 for n=m+2:L-1 if(d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1))) flag=1; c1(m+1:n)=c1(n:-1:m+1); end end end end J(k,c1)=1:102;endJ=J/102;J(:,1)=0;J(:,102)=1;rand('state',sum(clock));%遗传算法实现过程A=J; for k=1:dai %产生 0~1 间随机数列进行编码 %交配产生子代 B B=A; c=randperm(w); %产生1~50随机数 for i=1:2:w %从1到50依次两两配对,即i与(i+1)配对 F=2+floor(100*rand(1)); %随机产生交叉点 temp=B(c(i),F:102); B(c(i),F:102)=B(c(i+1),F:102); B(c(i+1),F:102)=temp; %交叉更换完毕 end %变异产生子代 C by=find(rand(1,w)<0.1); %返回随机数<0.1的位置 if length(by)==0 %如果上一步找不到,则随机产生一个变异点 by=floor(w*rand(1))+1; end C=A(by,:); L3=length(by); for j=1:L3 bw=2+floor(100*rand(1,3)); %随机选取三个整数 bw=sort(bw); %满足1<u<v<w<102 C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]); %把u,v之间(包括u和v)的基因段插到w后面 end G=[A;B;C]; %获得父代、交叉子代、变异子代合集G %在父代和子代中选择优良品种作为新的父代 TL=size(G,1); [dd,IX]=sort(G,2);%dd为升序后的G,IX为索引 temp(1:TL)=0; for j=1:TL for i=1:101 temp(j)=temp(j)+d(IX(j,i),IX(j,i+1)); %按照新的序列重新获得距离矩阵 end end [DZ,IZ]=sort(temp); A=G(IZ(1:w),:); %选择目标函数值最小的w个个体进化到下一代endpath=IX(IZ(1),:) ;long=DZ(1) ;%toc xx=sj0(path,1);yy=sj0(path,2); plot(xx,yy,'-o');
sj.txt+源码.m下载
- 数学建模(1)——遗传算法(GA)
- 数学建模(2)——改进的遗传算法(GA)
- 《Matlab在数学建模中的应用》笔记4-遗传算法(GA)
- 遗传算法(GA)
- 机器学习基础—— 遗传算法(GA)
- 遗传算法(GA)干货
- 遗传算法(GA)的matlab实现
- 机器学习基础(四十六)—— 遗传算法(GA)
- MATLAB数学建模(9)-遗传算法工具
- 遗传算法(GA)的C语言实现
- 遗传算法(GA)
- GA遗传算法解析
- 遗传算法GA
- 遗传算法GA
- GA遗传算法
- 数学建模(5)——改良圈算法
- 数学建模(6)——蚁群算法
- 数学建模(7)——蒙特卡罗算法(Monte Carlo)
- WIN10 简繁切换
- 神奇的C语言++运算符
- Leetcode-Linked List Cycle-Python
- JavaScript实现-截断字符串-Truncate a string
- 机器学习:支持向量机(SVM)与Python实现第(一)篇
- 数学建模(1)——遗传算法(GA)
- 关注国情民情,从身边做起
- uploadifive demo
- Ubuntu Server 命令行下显示中文乱码(菱形)解决办法
- DedeCMS:数据库密码和数据库连接失败解决方法
- hdu 6165 FFF at Valentine
- 基数排序
- Git SSH 连接phacility服务器
- 关注民生民情