1、初始化种群
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);
end
二进制编码方式,生成父代种群。
2、选择、交叉、变异
这三步操作都是在父代种群上实现后生成子代种群,所有需要先创建子代种群存放结构体。
% 子代种群结果存放数组
Offspring = repmat(template, nC/2, 2);
2.1、选择
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
选择的方法有多种,比如锦标赛选择、轮盘赌选择。
锦标赛选择:随机选择两个父代,比较适应度值,更接近目标的被选中。
轮盘赌选择:将所有父代的适应度值除以父代适应度值的和,得出每个父代的被选中的概率。
2.2、交叉
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
被选择出来的父代进行交叉,交叉的方式也有多种,单点交叉、均匀交叉等。
单点交叉:在父代的染色体中选择一个位置,该位置后面的染色体与另一条被选择的染色体交叉。
多点交叉:选择两个点,两个点中间的位置进行交叉。
均匀交叉:随机生成一条与父代同样长度的染色体alpha。然后与被选择的两条染色体进行均匀交叉。公式如下:。
2.3、变异
function p = mutatePop(x, mu)
% 单点变异
if rand <= mu
n = numel(x);
s = randi([1, n]);
if x(s) == 0
x(s) = 1;
elseif x(s) == 1
x(s) = 0;
end
end
p = x;
end
同样,有单点变异和多点变异。
最后,将生成的子代与父代合并,根据适应度值筛选出新的父代。