遗传算法GA求解函数极值

更新时间:2024-02-26 07:52:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

主程序

%% GA clc % 清屏

clear all; % 删除workplace变量 close all; % 关掉显示图形窗口 warning off

%% 参数初始化

popsize=100; %种群规模 lenchrom=7; %变量字串长度

pc=0.7; %设置交叉概率,本例中交叉概率是定值,若想设置变化的交叉概率可用表达式表示,或从写一个交叉概率函数,例如用神经网络训练得到的值作为交叉概率 pm=0.3; %设置变异概率,同理也可设置为变化的

maxgen=100; % 进化次数

%种群

popmax=50; popmin=0;

bound=[popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax]; %变量范围

%% 产生初始粒子和速度 fori=1:popsize

%随机产生一个种群

GApop(i,:)=Code(lenchrom,bound); %随机产生个体 %计算适应度

fitness(i)=fun(GApop(i,:)); %染色体的适应度 end

%找最好的染色体

[bestfitnessbestindex]=min(fitness);

zbest=GApop(bestindex,:); %全局最佳 gbest=GApop; %个体最佳

fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值

%% 迭代寻优 fori=1:maxgen i

%种群更新 GA选择更新 GApop=Select2(GApop,fitness,popsize);

% 交叉操作 GA

GApop=Cross(pc,lenchrom,GApop,popsize,bound);

% 变异操作 GA变异

GApop=Mutation(pm,lenchrom,GApop,popsize,[imaxgen],bound);

pop=GApop;

for j=1:popsize

%适应度值 if

0.072*pop(j,1)+0.063*pop(j,2)+0.057*pop(j,3)+0.05*pop(j,4)+0.032*pop(j,5)+0.0442*pop(j,6)+0.0675*pop(j,7)<=264.4

if

128*pop(j,1)+78.1*pop(j,2)+64.1*pop(j,3)+43*pop(j,4)+58.1*pop(j,5)+36.9*pop(j,6)+50.5*pop(j,7)<=69719 fitness(j)=fun(pop(j,:)); end end

%个体最优更新 if fitness(j)

fitnessgbest(j) = fitness(j); end

%群体最优更新 if fitness(j)

fitnesszbest = fitness(j); end end

yy(i)=fitnesszbest; end

%% 结果

disp '*************best particle number****************' zbest %%

plot(yy,'linewidth',2);

title(['适应度曲线 ' '终止代数=' num2str(maxgen)]); xlabel('进化代数');ylabel('适应度'); grid on

子程序

fun

function y = fun(x)

y=0.072*x(1)+0.063*x(2)+0.057*x(3)+0.05*x(4)+0.032*x(5)+0.0442*x(6)+0.0675*x(7);

Mutation

function ret=Mutation(pmutation,lenchrom,chrom,sizepop,pop,bound) % 本函数完成变异操作

% pcorss input : 变异概率 % lenchrom input : 染色体长度 % chrom input : 染色体群 % sizepop input : 种群规模

% pop input : 当前种群的进化代数和最大的进化代数信息 % ret output : 变异后的染色体

fori=1:sizepop

% 随机选择一个染色体进行变异 pick=rand; while pick==0 pick=rand; end

index=ceil(pick*sizepop);

% 变异概率决定该轮循环是否进行变异 pick=rand;

if pick>pmutation continue; end flag=0;

while flag==0

% 变异位置 pick=rand; while pick==0 pick=rand; end

pos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异 v=chrom(i,pos); v1=v-bound(pos,1); v2=bound(pos,2)-v; pick=rand; %变异开始 if pick>0.5

delta=v2*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v+delta; else

delta=v1*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v-delta;

end %变异结束

flag=test(lenchrom,bound,chrom(i,:)); %检验染色体的可行性 end end

ret=chrom;

Cross

function ret=Cross(pcross,lenchrom,chrom,sizepop,bound) %本函数完成交叉操作

% pcorss input : 交叉概率

% lenchrom input : 染色体的长度 % chrom input : 染色体群 % sizepop input : 种群规模

% ret output : 交叉后的染色体

fori=1:sizepop

% 随机选择两个染色体进行交叉 pick=rand(1,2); while prod(pick)==0 pick=rand(1,2); end

index=ceil(pick.*sizepop);

% 交叉概率决定是否进行交叉 pick=rand; while pick==0 pick=rand; end

if pick>pcross continue; end flag=0;

while flag==0

% 随机选择交叉位置 pick=rand; while pick==0 pick=rand; end

pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同

pick=rand; %交叉开始 v1=chrom(index(1),pos);

v2=chrom(index(2),pos);

chrom(index(1),pos)=pick*v2+(1-pick)*v1;

chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束

flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性 flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性 if flag1*flag2==0 flag=0; else flag=1;

end %如果两个染色体不是都可行,则重新交叉 end end

ret=chrom;

Code

function ret=Code(lenchrom,bound)

%本函数将变量编码成染色体,用于随机初始化一个种群 % lenchrom input : 染色体长度

% bound input : 变量的取值范围 % ret output: 染色体的编码值

flag=0;

while flag==0

pick=rand(1,lenchrom);

ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值

flag=test(lenchrom,bound,ret); %检验染色体的可行性 end

Select2

function ret=Select(individuals,fitness,sizepop)

% 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异 % individuals input : 种群信息 % fitness input : 适应度

% sizepop input : 种群规模

% opts input : 选择方法的选择 % ret output : 经过选择后的种群

fitness= 1./(fitness);

sumfitness=sum(fitness); sumf=fitness./sumfitness; index=[];

for i=1:sizepop %转sizepop次轮盘 pick=rand;

while pick==0 pick=rand; end

for j=1:sizepop pick=pick-sumf(j); if pick<0

index=[index j];

break; %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体 end end end

individuals=individuals(index,:); fitness=fitness(index); ret=individuals;

test

function flag=test(lenchrom,bound,code) % lenchrom input : 染色体长度

% bound input : 变量的取值范围 % code output: 染色体的编码值

flag=1;

[n,m]=size(code);

fori=1:n

if code(i)bound(i,2) flag=0; end end

while pick==0 pick=rand; end

for j=1:sizepop pick=pick-sumf(j); if pick<0

index=[index j];

break; %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体 end end end

individuals=individuals(index,:); fitness=fitness(index); ret=individuals;

test

function flag=test(lenchrom,bound,code) % lenchrom input : 染色体长度

% bound input : 变量的取值范围 % code output: 染色体的编码值

flag=1;

[n,m]=size(code);

fori=1:n

if code(i)bound(i,2) flag=0; end end

本文来源:https://www.bwwdw.com/article/vvka.html

Top