GA의 전체 프레임 워크
선택 연산자 (룰렛 휠 선택)
크로스 오버 (단일 - 포인트 크로스 오버)
돌연변이 연산자
코드 유전자 알고리즘을 달성하기 위해
GA를 부호화 및 복호화 방법
- 코드 : 개인 유전 정보의 특성이된다
- 디코딩 : 유전 정보를 문자로
- 예 코딩 : 변수 x에 대하여, x의 가변 범위가 가정된다 : - 1,12]을, 구간 길이가 12가 (-1) 13 =, 우리는 네 소수점에 필요한 정밀도, 이진 변환을 행하는 것으로 우리 이진 코드 길이는 17
- 디코딩에있어서, X는 구간 [A, B]가있는 경우는, x는 이진 코드 된 (a_0는 A_1는 ... a_n-1 a_n)는 + 다음 십진 숫자의 길이가 N
초기 인구
%% 初始化种群
Num_pop = 200;
Num_gen = 1000;
Binary_lenth = 32;
P_c=0.8;
P_m=0.02;
pop = round(rand(Num_pop,Binary_lenth)); %表示将矩阵元素全都四舍五入取整
%又因为rand函数生成的是(0,1)之间的随机数
%所以取整之后,pop得到了天然的二进制01编码
x1 = decode_x1(pop(:,1:17)); %x1是一个40行17列的矩阵,用来存放所有个体的第一个染色体
x2 = decode_x2(pop(:,18:end)); %x2是一个40行15列的矩阵,用来存放所有个体的第二个染色体
%% 计算适应度值
fitness = x1.*sin(pi*x1) + x2.*sin(exp(x2));
[max_fit,spot]=max(fitness);
디코딩
decode_x1
% date:2019年3月5日
% Author: Chauncy_xu
function [a] = decode_x1(binary_code)
%该函数把二进制编码进行解码
% input x1的二进制编码,是一个40行17列的01矩阵
% output 一个40行1列的实数矩阵
[M,N] = size(binary_code);%这里面M应该为40,N为17
sum = zeros(M,1);%产生一个M行1列的零矩阵,用于存放实数值
for i = 1:M %开始遍历01编码矩阵
%行遍历,也就是按照个体遍历
for j = 1:N %列遍历
sum(i) = sum(i)+binary_code(i,j)*2^(N-j);
end
a(i) = -1.0 + sum(i)*(12.0-(-1.0))/(2^N-1);
end
decode_x2
% date:2019年3月5日
% Author: Chauncy_xu
function [b] = decode_x2(binary_code)
%该函数把二进制编码进行解码
% input x1的二进制编码,是一个40行17列的01矩阵
% output 一个40行1列的实数矩阵
[M,N] = size(binary_code);%这里面M应该为40,N为17
sum = zeros(M,1);%产生一个M行1列的零矩阵,用于存放实数值
for i = 1:M %开始遍历01编码矩阵
%行遍历,也就是按照个体遍历
for j = 1:N %列遍历
sum(i) = sum(i)+binary_code(i,j)*2^(N-j);
end
b(i) = 4.0 + sum(i)*(6.0-(4.0))/(2^N-1);
end
선택 (룰렛 휠 선택 방법)
% date:2019年3月5日
% Author: Chauncy_xu
function [new_pop] = Select(fitness,pop)
% 该函数是一个轮盘赌选择函数,选择好的个体进入交配池
% Input 适应度值
% Input 矩阵A
% Output 交配池,也可以说是中间的新的种群
[M,N]=size(pop);
for i=1:M %把每个个体的适应度值转化为被选择的概率
prob(i)=fitness(i)/sum(fitness); %sum函数可以直接获得fitness的总和
end
for i=2:M %把每个个体的被选择概率转化为累加概率
prob(i)=prob(i)+prob(i-1);
end
for j=1:M
p=rand();
i=1;
while p>prob(i)
i=i+1;
end
new_pop(j,:)=pop(i,:);
end
크로스 오버 (단일 - 포인트 크로스 오버)
% date:2019年3月5日
% Author: Chauncy_xu
function [Cross_pop] = Crossover(P_c,pop)
% 该函数实现交配池中的交叉,基本思想是两两配对,根据交叉概率选择是否交叉,
% 这里进行的交叉是单点交叉
% Input P_c 交叉概率
% Input pop 交配池,也可以说是中间种群
% Output Cross_poop 进行交叉运算之后的种群
Cross_pop=pop;
[M,N]=size(pop);
for i=1:2:M-1
p=rand();
q=rand();
if p<P_c
spot = ceil(q*N); %随机选择交叉点
for j=spot:N
temp = pop(i,j);
Cross_pop(i,j) = pop(i+1,j);
Cross_pop(i+1,j) = temp;
end
end
end
end
변화
% date:2019年3月5日
% Author: Chauncy_xu
function [Mut_pop] = Mutation(P_m,pop)
% 该函数进行遗传算法中的变异操作,具体为随机选择变异位值,对该点的二进制编码取反
% Input P_m 变异概率
% Iutput pop 刚刚进行过交叉的中间种群
% Output Mut_pop 变异之后的种群
[M,N] = size(pop);
Mut_pop = pop;
flag = (rand(M,N)<P_m);
for i=1:M
for j=1:N
if flag(i,j)==1
if pop(i,j)==1
Mut_pop(i,j)=0;
else
Mut_pop(i,j)=1;
end
end
end
end
end
반복적 인 과정
% date:2019年3月5日
% Author: Chauncy_xu
for gen=1:Num_gen
%% 进行选择操作
[pop] = Select(fitness,pop);
%% 进行交叉操作
[pop] = Crossover(P_c,pop);
%% 进行变异操作
[pop] = Mutation(P_m,pop);
pop=pop;
%解码
x1 = decode_x1(pop(:,1:17));
x2 = decode_x2(pop(:,18:end));
fitness = x1.*sin(pi*x1) + x2.*sin(exp(x2));
%存储该代的最优个体适应值
[best_fit,index] = max(fitness);
%更新全局最优值
if best_fit >= max_fit
max_fit = best_fit;
spot = pop(index,:);
x_1 = decode_x1(spot(1:17));
x_2 = decode_x2(spot(18:end));
end
num(gen) = max_fit;
end
결과는 보여
% date:2019年3月5日
% Author: Chauncy_xu
%% 绘图显示结果
disp(sprintf('%.6f',num(gen)));
disp(sprintf('x=%.5f,y=%.5f',x_1,x_2));
figure
plot(num,'k');