1.初始化种群
function Init_pop = Initial_pop( pop_num,range_l,range_r )
%%
% 目的:初始化种群
% 输入:种群个数
% 初始化的种群应该在[range_l,range_r]之间
% 输出:初始化之后的种群
%%
for i=1:pop_num
Init_pop(:,i) = range_l + (range_r - range_l)*rand;
end
end
2.目标函数
function y = f_x( x )
%% 目标函数
y=x.*sin(3*pi.*x);
end
3.适应度函数
function fit_value = Fitness(Init_pop)
%% 目的;计算适应度
% 输入:初始种群
% 目标函数:y=x^2
% 所以我们取适应度函数为fit_value=1/y,值最小的时候,即为最优解
% 输出:适应度值
for i=1:size(Init_pop,2)
fit_value(i) = 1/(2-f_x(Init_pop(:,i)));
end
end
4.选择函数
function New_pop = Option( pop,pop_num,Fit_value )
%% 选择适应度高的个体
% 输入:pop 初始化种群
% pop_num 种群中的个体数目
% Fit_value 适应度矩阵
% 输出:New_pop 选择新的种群
%%
% 对适应度求和
Total = sum(Fit_value,2);
% 选择概率
P_Selection = Fit_value/Total;
% 求累计概率
P_Accum = cumsum( P_Selection);
for i=1:pop_num
% 找到比随机数大的累计概率
Index_mat = find(P_Accum>rand);
if isempty(Index_mat)
continue
end
% 将首个比随机数大的累积概率位置的个体遗传下去
New_pop(:,i) = pop(:,Index_mat(1));
end
end
5.二进制编码
function bin_pop = encoding( opt_pop,range_l)
%% 目标:对选择后的新种群进行二进制编码
% 输入:opt 选择后的种群
% pop_lenth 编码长度
% 处理过程: 进行二进制编码
% 输入:bin_pop 二进制种群
%%
pop =round((opt_pop-range_l)*10^6); % 10^6精确度
bin_pop = [];
%dec2bin将整数转换为二进制
bin_pop = dec2bin( pop);
end
6.交叉函数
function new_pop = crossovers(bin_pop,P_cross)
%% 目的:进行交叉
% 输入:bin_pop 二进制编码
% P_cross 交叉概率
% 输出:new_popbin 新的二进制种群
%%
[r,c] = size(bin_pop);
for i = 1:2:r-1
if(rand<P_cross)
location = round(rand*c);
len = length(bin_pop(i,:));
pop_parent = bin_pop(i,:);
pop_mother = bin_pop(i+1,:);
temp_parent = pop_parent(1,location+1:c);
temp_mother = pop_mother(1,location+1:c);
new_pop(i,:) = [ pop_parent(1,1:location),temp_mother];
new_pop(i+1,:) = [pop_mother(1,1:location),temp_parent];
else
new_pop(i,:) = bin_pop(i,:);
new_pop(i+1,:) = bin_pop(i+1,:)
end
end
end
7.变异函数
function New_pop = Mutation( cross_group,P_mutation,pop_num)
%% 变异算法
% 输入变量: cross_group 交叉后的二进制种群
% 重点问题: 利用什么方法寻找变异位置
% P_mutation 变异概率
% 输出变量: Mutated_group 变异后的二进制种群
%%
for i = 1:pop_num
if(rand<P_mutation)
temp = cross_group(i,:);
location = ceil(rand*length(temp));
if temp(1,location) =='0'
temp(1,location) =='1';
else temp(1,location) =='1'
temp(1,location) ='0';
end
else
New_pop(i,:) = cross_group(i,:);
end
end
end
8.二进制解码
function pop = decoding(pop_bin,range_l,pop_num)
%% 目的:解码
% 输入:pop_bin 二进制种群
% range_l 区间左端点
% 输出:pop 实数种群
%%
[r,c] = size(pop_bin);
pop = ones(1,pop_num);
for i=1:r
kid_str = pop_bin(i,:);
kid_dec = bin2dec(kid_str);
kid = kid_dec/10^6+range_l;
pop(:,i) = kid;
end
end
9.主函数
%% 清理窗口和变量
clc
clear all
%% 遗传参数设置
NUMPOP=100; %初始种群大小
range_l=-1; %问题解区间
range_r=2;
LENGTH=22; %二进制编码长度
ITERATION = 10000; %迭代次数
CROSSOVERRATE = 0.7; %杂交率
VARIATIONRATE = 0.001; %变异率
%%
%初始化种群
pop=Initial_pop(NUMPOP,range_l,range_r);
%绘制初始种群分布
x=linspace(-1,2,1000);
y=f_x(x);
plot(x,y);
hold on
for i=1:size(pop,2)
plot(pop(i),f_x(pop(i)),'ro');
end
hold off
title('初始种群图像');
%%
%开始迭代
for time=1:ITERATION
%计算初始种群的适应度
fitness=Fitness(pop);
%选择
pop= Option(pop,NUMPOP,fitness);
%编码
binpop=encoding(pop,range_l);
%交叉
kidPop = crossovers(binpop,CROSSOVERRATE);
%变异
kidsPop = Mutation(kidPop,VARIATIONRATE,NUMPOP);
%解码
kid_Pop=decoding(kidsPop,range_l,NUMPOP);
%更新种群
pop=kid_Pop;
end
figure
x=linspace(-1,2,1000);
y=f_x(x);
plot(x,y);
hold on
for i=1:size(pop,2)
plot(pop(i),f_x(pop(i)),'ro');
end
hold off
title('终止种群');
%
disp(['最优解:' num2str(max(f_x(pop)))]);
disp(['最大适应度:' num2str(max(f_x(pop)))]);