【 MATLAB 】遗传算法程序

网友投稿 1157 2022-05-28

有段时间,一直用为知笔记记笔记,可是后来使用了csdn博客后,就不太喜欢用为知笔记了,可惜了我的会员。笔记里的一些东西,例如公式什么的,都不能直接复制过来,很是遗憾。

准备弃用为知笔记了,把这个遗传算法的程序粘过来吧,即使对我可能没什么用了,但也可能有需要用的人。

程序很详细,当时上课的时候就是用这个程序编的一篇小报告。程序很详细。

function main()

%% -------------主函数-----------------------------------

% 用遗传算法求:

% max: f(x1,x2) = 21.5+x1*sin(4*pi*x1)+x2*sin(20*pi*x2)

% s.t: -3.0 <= x1 <= 12.1

% 4.1 <= x2 <= 5.8

%---------------------------------------------------------------

clear

clc

close all

popsize = 100; %种群大小

x1_length = 18; %x1长度为18

x2_length = 15; %x2长度为15

chromlength = 33; %二进制编码长度

pc = 0.25; %交叉概率

pm = 0.01; %变异概率

pop = initpop(popsize,chromlength); %初始种群

for i = 1:1000 % 迭代1000次

[objvalue] = cal_objvalue(pop);%计算计算函数值

fitvalue = objvalue; %令适应度等于函数值

[newpop] = selection(pop,fitvalue); %选择操作

[newpop] = crossover(newpop,pc); %交叉操作

[newpop] = mutation(newpop,pm); %变异操作

pop = newpop; %更新种群

% 将种群的每个个体表示出来

[A B] = binary2decimal(newpop);

[y] = cal_objvalue(newpop);

figure(1);

set(1, 'unit', 'normalized', 'position', [0.1,0.1,0.7,0.7]);

if i<=100&mod(i,10)==0 %每迭代10次做一次图,画100次以内的图

j = floor(i/10);

%画3d图

X = -3.0:0.1:12.1;

Y = 4.1:0.1:5.8;

subplot(2,5,j);

[X, Y] = meshgrid(X,Y);

Z = 21.5 + X.*sin(4*pi*X) + Y.*sin(20*pi*Y);

mesh(X,Y,Z);

hold on;

title(['迭代次数为 n=' num2str(i)]);

plot3(A,B,y,'*');

end

[bestindividual,bestfit]=best(pop,fitvalue);%寻找最优解

[x1 x2] = binary2decimal(bestindividual); %将二进制值转换为十进制

BEST(i) = bestfit;

X1(i) = x1;

X2(i) = x2;

end

[max_value,index] = max(BEST');

best_x1 = X1(index);

best_x2 = X2(index);

figure(2);

set(2, 'unit', 'normalized', 'position', [0.1,0.1,0.7,0.7]);

i = 1:1000;

plot(i,BEST);

axis([0,1000,0,40]);

xlabel('进化代数');

ylabel('函数值');

text(100,10,'交叉概率pc = 0.6 变异概率pm = 0.01 进化代数1000次');

text(100,8,['After ',num2str(index),' generations,',...

' the max value was got.']);

text(100,6,[' x1 = ',num2str(best_x1),' x2= ',num2str(best_x2),...

' max value= ', num2str(max_value)]);

fprintf('After %.0f times iterations, max_value was got.\n',index);

fprintf('the best x1 is --->> %5.2f\n',best_x1);

fprintf('the best x2 is --->> %5.2f\n',best_x2);

fprintf('the best y is --->> %5.2f\n',max_value);

fprintf('\n');

fprintf('After %.0f times iterations, final_value was got.\n',1000);

fprintf('the final x1 is --->> %5.2f\n',x1);

fprintf('the final x2 is --->> %5.2f\n',x2);

fprintf('the final y is --->> %5.2f\n',bestfit);

function pop = initpop(popsize,chromlength)

%% -------------初始化种群函数----------------

% 初始化种群大小

% 输入变量:

% popsize:种群大小

% chromlength:染色体长度--》转化的二进制长度

% 输出变量:

% pop:种群

%---------------------------------------

pop = round(rand(popsize,chromlength)); %随机产生一个矩阵,每一行是一个长33位染色体;

function [pop1 pop2] = binary2decimal(pop)

%% -----------解码函数---------------------

% 二进制转化为十进制数

% 输入变量:

% 二进制种群

% 输出变量:

% 十进制数值

%-----------------------------------------

for i = 1:18

pop_x1(:,i) = 2.^(18 - i).*pop(:,i);

end

for j = 1:15

pop_x2(:,j) = 2.^(15 - j).*pop(:,j+18);

end

%sum(.,2)对行求和,得到列向量

temp1 = sum(pop_x1,2);

temp2 = sum(pop_x2,2);

pop1 = -3.0 + temp1*15.1/(2^18-1); %pop1表示输出x1的十进制数

【 MATLAB 】遗传算法程序

pop2 = 4.1 + temp2*1.7/(2^15-1); %pop2表示输出的x2的十进制数

function [objvalue] = cal_objvalue(pop)

%% --------------计算函数值函数----------------------

% 计算函数目标值

%输入变量:二进制数值

%输出变量:目标函数值

%---------------------------------------------

[x1 x2] = binary2decimal(pop);

objvalue = 21.5 + x1.*sin(4*pi*x1) + x2.*sin(20*pi*x2);

function [newpop] = selection(pop,fitvalue)

%% -----------------根据适应度选择函数-------------------

% 输入变量 :pop:二进制种群

% fitvalue: 适应度

%输出变量: newpop: 选择以后的二进制种群

% -------------------------------------------

%构造轮盘

[px,py] = size(pop);

totalfit = sum(fitvalue);

p_fitvalue = fitvalue/totalfit;

p_fitvalue = cumsum(p_fitvalue);%概率求和后排序

ms = sort(rand(px,1)); %产生一列随机数,从小到大排列,相当于转转盘10次

fitin = 1;

newin = 1;

while newin <= px

if(ms(newin)) < p_fitvalue(fitin) % 转盘转到 fitin 的位置

newpop(newin,:) = pop(fitin,:); %新种群的第 newin 个体为pop中的第fitin 个体

newin = newin + 1;

else

fitin = fitin +1; %相当于每次都从第一个比较起,依次加1,直至比较完,看转到的是哪一个

end

end

function [newpop] = crossover(pop,pc)

%% ----------交叉函数--------------------

% 输入变量:pop:二进制的父代种群数

% pc :交叉概率

% 输出变量:newpop: 交叉后的种群数

%---------------------------------------

[px,py] = size(pop);

newpop = ones(size(pop));

for i = 1:2:px-1 % 1与2交叉。3与4交叉。。。。。每次隔一个,因此步子为2

if (rand

cpoint = round(rand*py); %交叉点随机选取,互换交叉点以后的值

if cpoint <= 0

% cpoint = 1;

continue;

end

newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];%交叉后的第i个个体

newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];

else % 40%的机会不交叉

newpop(i,:) = pop(i,:);

newpop(i+1,:) = pop(i+1,:);

end

end

function [newpop] = mutation(pop,pm)

%% ------------变异函数---------------------------

% 输入变量 pop: 二进制种群

% pm : 变异概率

% 输出变量: newpop : 变异以后的种群

%-----------------------------------------------

[px,py] = size(pop);

newpop = ones(size(pop)); %只是起到提前声明的作用,提高运算速度

for i = 1:px

if(rand

mpoint = round(rand*py);

if mpoint<=0

mpoint = 1;

end

newpop(i,:) = pop(i,:);

if newpop(i,mpoint) == 0

newpop(i,mpoint) = 1;

else

newpop(i,mpoint) = 0;

end

else

newpop(i,:) = pop(i,:);

end

end

function [bestindividual,bestfit] = best(pop,fitvalue)

%% --------------选出最优个体函数-----------------------

% 输入变量: pop :种群

% fitvalue : 种群适应度

% 输出变量: bestindividual : 最佳个体(二进制)

% bestfit : 最佳适应度值

% ---------------------------------------------

[px,py] = size(pop);

bestindividual = pop(1,:);

bestfit = fitvalue(1);

for i = 2:px

if fitvalue(i)>bestfit

bestindividual = pop(i,:);

bestfit = fitvalue(i);

end

end

matlab

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PG数据库HOT链简介
下一篇:Android之使用IDA Pro静态分析so文件
相关文章