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)))]);