查看: 87|回复: 0|关注: 0

[未答复] 求大神帮忙看看?遗传算法

[复制链接]

新手

5 麦片

财富积分


050


1

主题

1

帖子

0

最佳答案
发表于 6 天前 | 显示全部楼层 |阅读模式
问题(1)给一个父本母本让他们杂交看能生成多少后代,打印处它所生成的后代;
   (2)然后再其后代里面随机选择10个个体。
问题(1)不知道怎么实现,我只是给他固定了生成个数。下面是我写的代码,有问题我找不出来,我写的代码生成的后代很多都是重复的。不知道怎么解决。
代码:
(1)%初始化种群大小
%输入变量:
%popsize:种群大小
%chromlength:染色体长度
%输出变量:
%pop:种群
function pop=initpop(popsize,chromlength)
popsize=2;            
chromlength=34;   
pop =round(rand(popsize,chromlength));
(2)%变异
%函数说明
%输入变量:
pop:二进制种群
pm:变异概率
%输出变量:
%newpop变异以后的种群
function [newpop] = mutation(pop,pm)
[px,py] = size(pop);
newpop = ones(size(pop));
for i = 1:px
    if(rand<pm)
        mpoint = round(rand*py);
        if mpoint <= 0;
            mpoint = 1;
        end
        newpop(i,:) = pop(i,:);
        if newpop(i,mpoint) == 0
            newpop(i,mpoint) = 1;
        elsenewpop(i,mpoint) == 1
            newpop(i,mpoint) = 0;
        end
    else newpop(i,:) = pop(i,:);
    end
end
(3)%交叉
%函数说明
%输入变量:
pop:二进制父代种群
pc:交叉概率
%输出变量:
%newpop:变异以后的种群
function [newpop] = crossover(pop,pc)
[px,py] = size(pop);
newpop = ones(size(pop));
for i = 1:2:px-1
    if(rand<pc)
        cpoint = round(rand*py);
        newpop(i,:) =[pop(i,1:cpoint),pop(i+1,cpoint+1:py)];
        newpop(i+1,:) =[pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
    else
        newpop(i,:) = pop(i,:);
        newpop(i+1,:) = pop(i+1,:);
    end
end
(4)%主函数
function main()
clear;
clc;
popsize=10;         
chromlength=34;  
pc = 0.6;         
pm = 0.01;              
x1='0000001100010000010001110010010101';
x2='0000101001110010110001110010010101';
savepop=ones(0,34);
    fprintf('杂交生成的个体\n');
    for  i=1:100;                       
        pop =initpop(popsize,chromlength);         
        pop(1,:)=x1;
        pop(2,:)=x2;
        newpop = crossover(pop,pc);           
        newpop = mutation(newpop,pm);   
        pop = newpop;                                 
        fprintf('y1=%s\n%s\n',pop(1,:));
        savepop(end+1,:)=pop(1,:);
        fprintf('y2=%s\n%s\n',pop(2,:));
        savepop(end+1,:)=pop(2,:);
        pops(2*i-1,:)=pop(1,:);
        pops(2*i,:)=pop(2,:);
    end
pop_=ones(10,34);   
        for i=1:10
            k=ceil(rand()*200);     
            pop_(i,:) = pops(round(k),:);
        end
        disp(strcat('随机选取的10个个体:'));
        for i=1:10
            fprintf('%s\n',pop_(i,:));
        end
end

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

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