基于matlab的遗传算法简单示例

问题:利用遗传算法求法f(x)=x*sin(10*pi*x)+2,-1<=x<=2时的最大值

大概步骤就是:

1.随机生成种群,就是-1到2之间的数,只关注保留了小数点后的4位,本来以为是matlab只保留4位小数然而并不是。(问题不大)

2.通过适应度进行选择,就是适应度越高越容易保留下来。这里通过轮盘赌的方式来确定哪些种群留下来。其实是有些个体增加了一下,有些不要啦。比如开始种群为三个个体:0.1111,1.2222,- 0.1111,经过选择后可能变成了:0.1111,1.2222,1.2222。只是可能变成这样额,还有可能是其他情况额。

3.交叉,相当于就是两个个体互相交换基因啦。比如有两个个体:0.1111,1.2222;经过交叉后可能变成:0.1211,1.2122。也仅仅其中可能的一种情况额,到底是哪一位进行交叉是随机的,而且交叉也不定一定进行,只是有一定概率进行而已;

4.变异,这个就是只作用与单个个体;比如有个个体:0.1111,变异后:0.1211。这个变异规则应该有好多种,看自己设吧。下面程序中就是让原来的数加上0.0001当作是变异,当然也可以把+0.01当作变异。变异也只是有可能进行额,它也有可能不进行。

5.变异完后,就是所有的个体就组成新的种群了。就又可以重复1.中的操作啦。

遗传算法,直接贴代码啦。

%%%%%%利用遗传算法求法f(x)=x*sin(10*pi*x)+2,-1<=x<=2时的最大值
%程序问题太多啦,说不定x就跑到定义域外去了,还会找到最小值
%如果定义变异时,是加0.1结果就很奇怪,反正还有好多值得改进的地方,但是用来理解GA算法应该足够啦,感觉也可以把十进制变成2进制来进行操作
clc;close all;clear;
a = -1;%求解区间下界
b = 2;%求解区间上界
cAccuracy = 0.01;%计算精度
NP = 100;%种群的个体数,也就是开始随机生成-1到2上的数的个数
NG = 100;%进化的代数generation
Pc = 0.1;%交叉概率
Pm = 0.5;%变异概率

%%  
population = a+(b-a)*rand(1,NP);%随机产生种群,就是-1到2之间的随机数
for generation = 1:NG%大循环,表示经过的代数
    %% 选择
    fitness = population.*sin(10*pi*population)+2;    %适应度函数,因为算出的适应度都是正的,所以可以直接用fx作适应度,但如果有负的,应该就不可以啊
    Pfit = fitness/sum(fitness);
    for i = 1:NP
        disk(i) = sum(Pfit(1:i));   %通过fitness弄出一个(0,1]的轮盘,来进行轮盘赌
    end
       disknum = rand(1,NP) ;
    populationIndex = zeros(1,NP);
    for i = 1:NP
        for j = 1:NP

            if (disknum(i)<=disk(j))           
               populationChosed(i) = population(j);      %通过轮盘赌选择种群population中那些被淘汰,哪些增加啦。可以产生产生新的种群
               break;
            end


        end
    end
    %% 交叉
    for i = 1:NP
        for j = 1:6 %这里因为matlab保留了小数点后4位数,加上个位和符号,所以选择了6,应该可以改成任意位数,
            populationtemp(i,j)=floor(mod((abs(populationChosed(i)))/10^(-j+1),10)); %将populationChosed的个位,10^-1位..分别存到矩阵中好进行交叉变异
            if(populationChosed(i)<0)
               populationtemp(i,6)=-1;%存储符号
            else
                populationtemp(i,6)=1;
            end
        end
    end%%%%上面就是把数的个位,十位(虽然没十位)分别放到数组里用来进行交叉和变异操作
    randindex = randperm(NP);%任意两组组合
    crossbit = ceil(5*rand(1,NP/2));%交叉的位
    for i = 1:2:NP-1
        if(rand()<Pc)%交叉是可能发生也可能不发生,满足一定的概率Pc
            temp = populationtemp(i,crossbit((i+1)/2));
            populationtemp(randindex(i),crossbit((i+1)/2)) = populationtemp(2,crossbit((i+1)/2));%%交叉过程
            populationtemp(randindex(i+1),crossbit((i+1)/2)) = temp;
        end
    end 
    populaitonCrossed=zeros(NP,1);
    for j=1:5
        populaitonCrossed = populationtemp(:,j)*10^(-j+1)+populaitonCrossed;%将交叉后的数组重新变成正常的数
    end
    populaitonCrossed = populaitonCrossed.*populationtemp(:,6);%还要保证正负和交叉以前一样,其实感觉正负也可以当作交叉位的
    %% 变异

    for i = 1:NP
       if(rand()<Pm)%变异发生的概率是Pm
          populationmeta(i) = populaitonCrossed(i)+0.0001;%变异就是加0.0001
       else
           populationmeta(i) = populaitonCrossed(i);       %不变异保持原样
       end
    end
    population=populationmeta;


figure;
x=-1:0.011:2;
fx=x.*sin(10*pi*x)+2;
plot(x,fx);
hold on
fxpop = population.*sin(10*pi*population)+2;
stem(population,fxpop);
hold off
saveas(gca,['figure_',num2str(generation),'.jpg']);
end

再附一张gif图吧

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用MATLAB遗传算法工具箱可以实现基于遗传算法的布局优化。下面是一个MATLAB代码示例: ```matlab PopulationSize = 50; FitnessFcn = @my_fitness_function; nGenes = 100; LBounds = zeros(1, nGenes); UBounds = ones(1, nGenes); options = gaoptimset('PopulationSize', PopulationSize,... 'Generations', 100,... 'PlotFcns',{@gaplotbestf,@gaplotscores},... 'Display','iter'); [x,fval,exitflag,output = ga(FitnessFcn,nGenes,[],[],[],[],LBounds,UBounds,[],options); function [fitness = my_fitness_function(x) % 计算个体的适应度 fitness = sum(x); % 举例子,此处为示例函数,实际需根据具体问题定制 end ``` 以上代码示例中,我们定义了遗传算法的相关参数,如种群大小、迭代代数等。同时,我们定义了适应度函数`my_fitness_function`来评估个体的适应度。在这个示例中,适应度函数简单地将个体的基因值相加作为适应度评估,具体问题中需要根据实际情况定制适应度函数。最后,我们使用MATLAB的`ga`函数来执行遗传算法,得到最优解`x`、最优目标函数值`fval`以及其他相关输出。 车间布局优化是一个重要的工业优化问题,通过合理的车间布局可以提高生产效率、降低物流成本、改善工作环境等。遗传算法是一种基于自然界进化原理的优化算法,在解决车间布局优化问题上具有很好的应用潜力。 此外,我们还可以结合可视化技术,将优化结果以直观的方式展示出来,帮助决策者更好地理解和评估优化方案。 总结起来,使用MATLAB编写遗传算法可以解决带出入点的车间布局优化问题。通过合理地定义问题目标函数和遗传算法的相关操作,我们可以在较短的时间内找到一个相对较优的车间布局方案。然而,需要注意的是,遗传算法是一种启发式算法,得到的结果可能是局部最优解,仍需根据实际情况进行进一步调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值