声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1341|回复: 0

[共享资源] 一个遗传算法的程序

[复制链接]
发表于 2007-6-20 22:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
不知道为什么,明明设置了迭代次数为100,但图象却表明迭代了200次,下面是程序,帮忙看看
%标准遗传算法
%优化函数为f=x1+x2+x3+x4+x5+Y1+Y2+Y3+Y4+Y5+1000*(266-Y(10))^2,其中,90<=x<=143
%编码长度为10位,编码精度为0.0518
%种群规模设为20,遗传算子分别为比例选择,单点交叉和单点变异。交叉概率0.7,变异概率0.1
%最大进化代数为100代,保优操作。
main.m

initial;
global G;
for G=1:100
    crossover;
    mutation;
    adapting;
    keepbest;
    selection;
end
result;

%初始化函数,随机形成规模为40初始种群
initial.m

pop(20,10)=0;
best_individual(10)=0;  %最优个体
adapt_ave(100)=0;   %种群平均适应值

for i=1:20
    for j=1:10
        if rand>0.5
            pop(i,j)=1;
        else
            pop(i,j)=0;
        end
    end
end
% pop
clear i;
clear j;

%交叉操作,概率为0.7,单点交叉
crossover.m

for i=1:2:19
    cross_P=rand;   %随机产生一个数,以比较交叉概率
    if cross_P<0.7  %交叉概率为0.7
        cross_pos=round(10*rand);   %交叉位置为0~9,若位置为0或1,则不进行交叉操作
        if or(cross_pos==0,cross_pos==1)
            continue;
        end

        for j=cross_pos:10
            temp=pop(i,j);
            pop(i,j)=pop(i+1,j);
            pop(i+1,j)=temp;
        end
    end
end

clear i;
clear j;
clear temp;
clear cross_P;
clear cross_pos;

%变异操作,单点变异,变异概率为0.1
mutation.m

for i=1:20
    if rand<0.1 %通过变异概率
        M_pos=round(10*rand);
        if M_pos~=0 %若变异位为0则无意义
            pop(i,M_pos)=1-pop(i,M_pos);
        end
    end
end

clear M_pos;
clear i;

%计算适应值
adapting.m

for i=1:20
    adapt(i)=0;
end

for i=1:20
    for j=1:10
        if pop(i,j)==1
            adapt(i)=adapt(i)+2^(10-j);
        end
    end
    adapt(i)=adapt(i)*0.0518+90;

end
x=[adapt(1,1:5)]';
Y=sim(net,x);

global adapt_best;
global best_pos;
adapt_best=0;   %最佳个体
best_pos=0;     %最佳个体在种群中的位置
% adapt_ave=0;

for i=1:20
    adapt_ave(G)=adapt_ave(G)+adapt(i)+sum(Y(1:5,1))+1000*(265-Y(10))^2;
    if adapt_best<adapt(i)
        adapt_best=adapt(i);
        best_pos=i;
    end
end

adapt_ave(G)=adapt_ave(G)/4;

clear i;
clear j;

%保优操作
keepbest.m

for i=1:10
    best_individual(i)=pop(best_pos,i);
end


% The select oprator function
selection.m

ada_sum=0;
ada_temp=0;
r=0;
i=0;j=0;
for i=1:20
    ada_sum=ada_sum+adapt(i);
end

for i=1:19      %选择39次,最后一个个体留给历代最优解
    r=rand*ada_sum;  %随机产生一个数
    ada_temp=0;      %初始化累加值为0
    j=0;
    while(ada_temp<r)
        j=j+1;
        ada_temp=ada_temp+adapt(j);        
    end
    %退出循环时的j值即为被选择的个体序号
%     if j>20
%         j=20;
%     end

    for k=1:10
        new_pop(i,k)=pop(j,k);
    end

end

% 最优解复制
for i=1:10
    new_pop(20,i)=best_individual(i);
end

%将选择产生的新群体复制给pop种群
for i=1:20
    for j=1:10
        pop(i,j)=new_pop(i,j);
    end
end

clear i;
clear j;
clear k;
clear r;
clear ada_temp;

%结果统计函数
result.m

plot(adapt_ave);
best=0;aa(1)=0;
for i=1:5
for j=1:10
    if best_individual(j)==1
        best=best+2^(10-j);
      
    end

end
best=best*0.0518+90;
aa(i)=best;
end
'最优个体为'
best=aa
'最优解为'
best=adapt_ave(G);
best

评分

1

查看全部评分

回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-16 20:10 , Processed in 0.052875 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表