遗传算法(GA)例题实现

目录

一、实验要求

二、算法详解

三、结果输出和分析

完整程序:


一、实验要求

二、算法详解

步骤一:定义初始各元素的初始值

种群规模:NP=?
编码长度:L=?
杂交概率:Pc=?
变异概率:Pm=?
最大迭代次数:G=?
初始种群:f = randi ([区间下限,区间上限],种群规模,编码长度)

 步骤二适应值计算

for j 1:种群规模
	计算每个种群的适应度函数值
结束 for 循环
记录最大的适应度函数
记录最小的适应度函数
记录每次迭代最优个体的编码

步骤三轮盘赌

for i 1: 最大迭代次数
随机生成NP个[0,1]的随机概率
对生成的随机数进行升序排序
定义初始值 n1=1,n2=1
	while j 1:种群规模
		if 随机概率(n2) < 种群选择概率(n1)
			新种群的第n2行=此次选择的种群
			n2 + 1
		else n1+1
		结束 for 循环
结束 while 循环
结束 for 循环

步骤四杂交过程

for i 1: 最大迭代次数
	for j 1:种群规模-1
		随机生成一个[0,1]的概率p
		if p < Pc
			随机生成一组L长的编码f
			for k 1:L
				if 此点f中值为 1
					记录此时选择过程中的新种群第i+1行,k列的值
					新种群第i+1行,k列的值=新种群第i行,k列的值
					新种群第i行,k列的值=上面记录的值
				结束 if 语句
			结束 for 循环
结束 for 循环
结束 for 循环

步骤五变异操作

for i 1:种群规模
	for j1:编码长度
		随机生成一个[0,1]的随机数作为概率r
		if r<Pm
			新种群第i行,j列的值进行变异
		结束 if 语句
	结束 for 循环
结束 for 循环

步骤六得到最优个体,最优值,最差值,平均适应值

for i 1:迭代次数
	记录最优个体的编码
	记录每次迭代的最优值
	记录每次迭代的最差值
	记录每次迭代的平均适应值
结束 for 循环

三、结果输出和分析

最优个体编码:

1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1       1     1     1     1     1     1

每次迭代的最优值:

18   20   20   20   21   23   23   23   23   23   23   23   23   24   24   24   24   24   24       24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24       24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24       24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24   24       25   25   25   25   25   25   25   25   25   25   25   25   25   25   25   25   25   25   25       25   25   25   25   25

每次迭代的最差值:

8     6     8     9     9     10   9     8     10   9     9     9     9     12   11   12   11   11   12       11   9     11   12   10   10   11   11   11   13   12   11   12   10   10   12   10   8     10       12   11   11   11   9     10   10   10   11   12   9     9     12   12   12   12   7     11   11       12   11   11   11   11   12   12   11   12   10   12   11   11   11   12   11   10   11   11       13   11   10   11   13   13   12   14   14   13   11   11   11   12   12   10   12   12   11       13   10   12   9     13

每次迭代的平均适度值:

12.6800000000000    13.5900000000000    14.3500000000000       14.7300000000000    14.8900000000000    14.9300000000000       14.9100000000000    15.0200000000000    15.6600000000000       16.1200000000000    16.3700000000000    16.6600000000000       16.8600000000000    17.1300000000000    16.6700000000000       17.0600000000000    17.1500000000000    17.3600000000000       17.5200000000000    17.1200000000000    16.9400000000000       17.1100000000000    16.7900000000000    16.5600000000000       16.8700000000000    16.7100000000000    16.3300000000000       16.4300000000000    17.1000000000000    16.8900000000000       16.8200000000000    16.8500000000000    16.7100000000000       16.4400000000000    16.4200000000000    16.2200000000000       16.1100000000000    16.2400000000000    16.1500000000000       16.0300000000000    16.4900000000000    16.7000000000000       16.6000000000000    16.4200000000000    16.5800000000000       16.5500000000000    16.6900000000000    17.0800000000000       16.9200000000000    17.1400000000000    16.9000000000000       17.0400000000000    17.1500000000000    17.0100000000000       17.2300000000000    17.1900000000000    17.1500000000000       17.3600000000000    17.2100000000000    17.0200000000000       16.9000000000000    16.6500000000000    16.8100000000000       16.5900000000000    16.9100000000000    16.8600000000000       17.2800000000000    17.3900000000000    17.1000000000000       17.2700000000000    17.4500000000000    17.5800000000000       17.3800000000000    17.4100000000000    17.6200000000000       18.1900000000000    18.5600000000000    18.3100000000000       18.2700000000000    18.4400000000000    18.3800000000000       18.3800000000000    18.5000000000000    18.5200000000000       18.2900000000000    18.0200000000000    17.7200000000000       17.0700000000000    16.7100000000000    17.3600000000000       17.0500000000000    17.1500000000000    16.9600000000000       16.9800000000000    17.2400000000000    17.2800000000000       17.2100000000000    17.3900000000000    17.2400000000000       17.4700000000000

对结果进行绘图

完整程序:

%%%%%%%%%%%%% max sum(x) %%%%%%%%%%%
close all;clear;clc;

NP = 100 ; %种群规模
L = 25 ; %编码长度
Pc = 0.7 ; %杂交概率
Pm = 0.04 ; %变异概率
G = 100; %最大迭代次数
f = randi([0,1],NP,L); %随机获得初始种群
%% 遗传算法循环
for i = 1:G
%% 适应度计算
    for j = 1:NP
        Fit(j) = sum(f(j,:));
    end
    maxFit = max(Fit); %最大值
    minFit = min(Fit);%最大小值
    rr = find(Fit==maxFit);
    fbest = f(rr(1,1),:); %历代最优个体
%% 轮盘赌 %%%%%%%%%%
    sum_Fit = sum(Fit) ; 
    fitvalue = Fit/sum_Fit;
    fitvalue = cumsum(fitvalue);
    ms = sort(rand(NP,1));
    fiti = 1;
    newi = 1;
    while newi <= NP
        if (ms(newi)) < fitvalue(fiti)
            nf(newi,:) = f(fiti,:);
            newi = newi + 1;
        else
            fiti = fiti + 1;
        end
    end
%% 基于概率的交叉操作 %%%%%
    for k = 1:NP-1
        p = rand;
        if p < Pc;
            q = randi([0,1],1,L);
            for j = 1:L
                if q(j) == 1;
                    temp = nf(k+1,j);
                    nf(k+1,j) = nf(k,j);
                    nf(k,j) = temp;
                end
            end
        end
    end
%% 基于概率的变异操作 %%%%%%
    for m = 1:NP
        for n = 1:L
            r = rand;
            if r < Pm;
                nf(m,n) = ~nf(m,n);
            end
        end
    end
    f = nf;
    f(1,:) = fbest;
    trace1(i) = maxFit; %最大值
    trace2(i) = mean(Fit); %平均适度值
    trace3(i) = minFit; %最小值
    %% 动态图输出
    hold on
    plot(1:i,trace1(1:i),'r')
    plot(1:i,trace2(1:i),'b')
plot(1:i,trace3(1:i),'g')
    title('最优个体适应度','fontsize',12);
    xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
    legend('最大值','平均适应值','最小值');
    drawnow;
    %下面是保存为GIF的程序
    frame=getframe(gcf);
    imind=frame2im(frame);
    [imind,cm] = rgb2ind(imind,256);
    if i==1
         imwrite(imind,cm,'Z1.gif','gif', 'Loopcount',inf,'DelayTime',0);
    else
         % 默认使用追加模型
%          imwrite(imind,cm,'Z1.gif','gif','WriteMode','append','DelayTime',0);
         % 如果使用上面这行代码报错,可以用下面这行代码先执行一遍,再换上面代码
         imwrite(imind,cm,'Z1.gif','gif','WriteMode','overwrite','DelayTime',0);
    end
end
%% 最优个体
fprintf('最优个体编码:\n') 
disp(fbest)
%% 每次迭代的最优值
fprintf('每次迭代的最优值:\n') 
disp(trace1)
%% 每次迭代的平均适度值
fprintf('每次迭代的平均适应值:\n') 
disp(trace2)
%% 每次迭代的最差值
fprintf('每次迭代的最差值:\n') 
disp(trace3)

猜你喜欢

转载自blog.csdn.net/qq_25990967/article/details/128800178