|
遗传算法定义可以参考百度百科资料遗传算法_百度百科,具体步骤如图所示:
此案例主要是使用matlab进行遗传算法简单案例编写,其中选择操作使用“锦标赛选择法”,交叉操作使用“单点交叉法”,变异操作使用“单点变异法”。
源码下载路径:链接:https://pan.baidu.com/s/1ITu5imiXSLg2YJLc5-6fvA?pwd=1234 提取码:1234
具体代码如下:
计算适应度fun()函数:
function y=fun(x)
y=sum(x);
end
锦标赛选择法selectPop()函数:
function p=selectPop(Parent)
%锦标赛选择法
n=numel(Parent);
index=randperm(n);
p1=Parent(index(1));
p2=Parent(index(2));
if p1.y<=p2.y
p=p1;
else
p=p2;
end
end
单点交叉法crossPop()函数:
function [y1,y2]=crossPop(x1,x2)
%单点交叉
n=numel(x1);
s=randi([1,n-1]); %交换点位置
y1=[x1(1:s) x2(s+1:end)];
y2=[x2(1:s) x1(s+1:end)];
end
单点变异法mutatePop()函数:
function p=mutatePop(x,mu)
%单点变异
if rand<=mu
n=numel(x);
s=randi([1,n]); %变异点
%将0变为1,将1变为0
if x(s)==0
x(s)=1;
else
x(s)=0;
end
end
p=x;
end
运行文件main.m:
clc;clear
nVar=100;
%初始化种群
nPop=30;
maxIt=2000; %最大迭代次数
nPc=0.8; %交叉比例
nC=round(nPop*nPc/2)*2; %子代规模大小
nMu=0.01; %变异概率
template.x=[];
template.y=[];
Parent=repmat(template,nPop,1);
for i=1:nPop
Parent(i).x=randi([0,1],1,nVar);
Parent(i).y=fun(Parent(i).x); %计算适应度值y
end
for It=1:maxIt
%定义子代数据存放模板
Offspring=repmat(template,nC/2,2);
%生成子代种群
for j=1:nC/2
p1=selectPop(Parent);
p2=selectPop(Parent);
[Offspring(j,1).x,Offspring(j,2).x]=crossPop(p1.x,p2.x);
end
Offspring=Offspring(:); %转置
for k=1:nC
Offspring(k).x=mutatePop(Offspring(k).x,nMu);
Offspring(k).y=fun(Offspring(k).x);
end
%种群筛选
newPop=[Parent;Offspring];
[~,so]=sort([newPop.y],&#39;ascend&#39;);
newPop=newPop(so);
Parent=newPop(1:nPop);
disp([&#39;迭代次数:&#39;,num2str(It),&#39;,最小值为:&#39;,num2str(Parent(1).y)]);
end |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|