⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maea_total.m

📁 基于MATLAB的遗传算法的源程序,有需要的可以参考下
💻 M
📖 第 1 页 / 共 2 页
字号:
% 目标函数:f(x1,x2)=100*(x1^2-x2^2)^2+(1-x1)^2
% 其中:-2.048<=x1<=2.048,-2.048<=x2<=2.048
%%%%% 初始化智能体网格L %%%%%
% 网格规模Lsize*Lsize,维数dim
clc
clear all
Lsize=input('请输入智能体网格行列数目(整数)以确定其规模: ');
num=input('请输入参与负荷分配的机组数目(整数): ');
code=input('请输入编码位数: ');
dim=code*num;
Tmax=30;%设置进化代数
L=rand(Lsize,Lsize,dim);
for i=1:Lsize
    for j=1:Lsize
        for k=1:dim
            if L(i,j,k)<=0.5
                L(i,j,k)=0;
            else
                L(i,j,k)=1;
            end
        end
    end
end
clear i;
clear j;
clear k;
for T=1:Tmax
    %%%%% 竞争行为 %%%%%
    % 设定参数:竞争感知范围Rs,本次参考点坐标I、J
    Rs=1;
    for I=1:Lsize
        for J=1:Lsize
            R1a=0;
            R2a=0;
    % 计算参考点的目标函数值
            for i=1:dim
                A(i)=L(I,J,i);
            end
            for j=1:code
                R1a=R1a+A(j)*2^(code-j);
            end
            for j=(code+1):(2*code)
                R2a=R2a+A(j)*2^(2*code-j);
            end
            R1=R1a*4.096/(2^code-1)-2.048;
            R2=R2a*4.096/(2^code-1)-2.048;
            RefTag=100*(R1^2-R2^2)^2+(1-R1)^2;
            clear i;
            clear j;
            % 循环求取竞争邻域坐标
            for i=(I-Rs):(I+Rs)
                for j=(J-Rs):(J+Rs)
                    if i<1
                        i=i+Lsize;
                    end
                    if i>Lsize
                        i=i-Lsize;
                    end                
                    if j<1
                        j=j+Lsize;
                    end
                    if j>Lsize
                        j=j-Lsize;
                    end
                    % 计算某一竞争邻域元素值
                    N1a=0;
                    N2a=0;
                    for k=1:dim
                        B(k)=L(i,j,k);
                    end
                    % 计算某一竞争邻域元素的目标函数值
                    % 解码:前10位为x1,后10位为x2
                    for l=1:code
                        N1a=N1a+B(l)*2^(code-l);
                    end
                    for l=(code+1):(2*code)
                        N2a=N2a+B(l)*2^(2*code-l);
                    end                    
                    N1=N1a*4.096/(2^code-1)-2.048;
                    N2=N2a*4.096/(2^code-1)-2.048;
                    % 目标值
                    NeibTag=100*(N1^2-N2^2)^2+(1-N1)^2;
                    % 比较参考点与该竞争邻域元素的目标值大小,确定大能量智能体的坐标
                    if RefTag<NeibTag
                        RefTag=NeibTag;
                        imax=i;% 能量较大智能体的i坐标
                        jmax=j;% 能量较大智能体的j坐标
                    else
                        imax=I;
                        jmax=J;
                    end
                end
            end
            clear h;
            clear i;
            clear j;
            clear k;
            clear l;
            % 竞争行为的子代的产生
            if imax~=I|jmax~=J
                for i=1:dim
                    C(i)=L(I,J,i);% 参考点第三维向量
                end
                for j=1:dim
                    D(j)=L(imax,jmax,j);% 最大竞争邻域智能体第三维向量
                end
                % 引入参数Dh,确定采用何种竞争方式
                Dh=0.5;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PROBLEM
                HD=0;% 向量C和D的海明距离
                for h=1:dim
                    if C(h)~=D(h)
                        HD=HD+1;
                    end
                end
                if HD/dim>Dh
                    % 第一种竞争方式
                    for k=1:dim
                        Rdm1=randint;
                        if C(k)==D(k)
                            L(I,J,k)=L(imax,jmax,k);
                        elseif Rdm1==0
                            L(I,J,k)=L(imax,jmax,k);
                        else
                            L(I,J,k)=1-L(imax,jmax,k);
                        end
                    end
                else
                    % 第二种竞争方式
                    for l=1:dim
                        Rdm2=rand;
                        if Rdm2>1/dim
                            L(I,J,l)=L(imax,jmax,l);
                        else
                            L(I,J,l)=1-L(imax,jmax,l);
                        end
                    end
                end
            else
                for m=1:dim
                    L(I,J,m)=L(I,J,m);
                end
            end
        end
    end
    clear h;
    clear i;
    clear j;
    clear k;
    clear l;
    clear m;
    clear imax;
    clear jmax;
    %%%%% 自学习行为 %%%%%
    % 构造总学习表
    LL=zeros(dim*(dim+1)/2,2);
    h=0;
    for i=1:dim
        for j=i:dim
            h=h+1;
            LL(h,1)=i;
            LL(h,2)=j;
        end
    end
    clear h;
    clear i;
    clear j;
    % 设定参数:自学习感知范围LRs,本次参考点坐标LI、LJ
    LRs=2;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PROBLEM
    for LI=1:Lsize
        for LJ=1:Lsize
            LR1a=0;
            LR2a=0;
    % 计算参考点的目标函数值
            for i=1:dim
                E(i)=L(LI,LJ,i);
            end
            for j=1:code
                LR1a=LR1a+E(j)*2^(code-j);
            end
            for j=(code+1):(2*code)
                LR2a=LR2a+E(j)*2^(2*code-j);
            end
            LR1=LR1a*4.096/(2^code-1)-2.048;
            LR2=LR2a*4.096/(2^code-1)-2.048;
            % 目标值
            LRefTag=100*(LR1^2-LR2^2)^2+(1-LR1)^2;
            clear i;
            clear j;
            % 循环求取自学习邻域目标函数值
            LNeibTag=zeros(1,(1+2*LRs)^2);% 自学习邻域目标函数值向量
            h=0;
            for i=(LI-LRs):(LI+LRs)
                for j=(LJ-LRs):(LJ+LRs)
                    h=h+1;
                    if i<1
                        i=i+Lsize;
                    end
                    if i>Lsize
                        i=i-Lsize;
                    end                
                    if j<1
                        j=j+Lsize;
                    end
                    if j>Lsize
                        j=j-Lsize;
                    end
                    % 计算某一自学习邻域元素值
                    LN1a=0;
                    LN2a=0;
                    for k=1:dim
                        F(k)=L(i,j,k);
                    end
                    for l=1:code
                        LN1a=LN1a+F(l)*2^(code-l);
                    end
                    for l=(code+1):(2*code)
                        LN2a=LN2a+F(l)*2^(2*code-l);
                    end                
                    % 计算某一自学习邻域元素的目标函数值
                    % 解码:前10位为x1,后10位为x2
                    LN1=LN1a*4.096/(2^code-1)-2.048;
                    LN2=LN2a*4.096/(2^code-1)-2.048;
                    % 目标值
                    LNeibTag(h)=100*(LN1^2-LN2^2)^2+(1-LN1)^2;
                end
            end
            clear h;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -