简单的遗传算法,计算函数最值.
function ga_main()
% 遗传算法程序
% n-- 种群规模% ger-- 迭代次数% pc--- 交叉概率% pm-- 变异概率
% v-- 初始种群(规模为n)% f-- 目标函数值% fit-- 适应度向量
% vx-- 最优适应度值向量% vmfit-- 平均适应度值向量
clear all;
close all;
clc;%清屏
tic;%计时器开始计时
n=20;ger=100;pc=0.65;pm=0.05;%初始化参数
%以上为经验值,可以更改。
% 生成初始种群
v=init_population(n,22); %得到初始种群,22串长,生成20*22的0-1矩阵
[N,L]=size(v); %得到初始规模行,列
disp(sprintf('Number of generations:%d',ger));
disp(sprintf('Population size:%d',N));
disp(sprintf('Crossover probability:%.3f',pc));
disp(sprintf('Mutation probability:%.3f',pm)); %sprintf可以控制输出格式
% 待优化问题
xmin=0;xmax=9; %变量X范围
f='x+10*sin(x.*5)+7*cos(x.*4)';
% 计算适应度,并画出初始种群图形
x=decode(v(:,1:22),xmin,xmax);"位二进制换成十进制,%冒号表示对所有行进行操作。
fit=eval(f);%eval转化成数值型的 %计算适应度
figure(1);%打开第一个窗口
fplot(f,[xmin,xmax]);%隐函数画图
grid on;hold on;
plot(x,fit,'k*');%作图,画初始种群的适应度图像
title('(a)染色体的初始位置');%标题
xlabel('x');ylabel('f(x)');%标记轴
% 迭代前的初始化
vmfit=[];%平均适应度
vx=[]; %最优适应度
it=1; % 迭代计数器
% 开始进化
while it<=ger %迭代次数 0代
%Reproduction(Bi-classist Selection)
vtemp=roulette(v,fit);%复制算子
%Crossover
v=crossover(vtemp,pc);%交叉算子
%Mutation变异算子
M=rand(N,L)<=pm;%这里的作用找到比0.05小的分量
%M(1,:)=zeros(1,L);
v=v-2.*(v.*M)+M;%两个0-1矩阵相乘后M是1的地方V就不变,再乘以2. NICE!!确实好!!!把M中为1的位置上的地方的值变反
%这里是点乘 %变异
%Results
x=decode(v(:,1:22),xmin,xmax);%解码,求目标函数值
fit=eval(f); %计算数值
[sol,indb]=max(fit);% 每次迭代中最优目标函数值,包括位置
v(1,:)=v(indb,:); %用最大值代替
fit_mean=mean(fit); % 每次迭代中目标函数值的平均值。mean求均值
vx=[vx sol]; %最优适应度值
vmfit=[vmfit fit_mean];%适应度均值
it=it+1; %迭代次数计数器增加
end
2019-12-21 22:20:15
4KB
遗传算法
1