Matlab实例测验

求解下面图形中的问题在这里插入图片描述

在这里插入图片描述

%%%%%%%%%%%%%%%%%f(x,y)=(1+((x+y+1)^2)*(19-14*x+3*x*x-14*y+6*x*y+3*y*y))*(30+((2*x-3*y)^2)*(18-32*x+12*x*x+48*y-*x*y+27*y*y))%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%用GA算法求解问题%%%%%%%%%%%
clear all;
clc;
x=-2:0.01:2;
y=-2:0.01:2;
N=size(x,2);
for i = 1:N
    for j = 1:N
        z(i,j)=(1+((x(i)+y(j)+1).^2)*(19-14*x(i)+3*x(i)*x(i)-14*y(j)+6*x(i)*y(j)+3*y(j)*y(j)))*(30+((2*x(i)-3*y(j)).^2)*(18-32*x(i)+12*x(i)*x(i)+48*y(j)-36*x(i)*y(j)+27*y(j)*y(j)));
    end
end
mesh(x,y,z)
xlabel('x')
ylabel('y')

采用君主法遗传算法进行求解

%%%%%%%%%%%%%用GA算法求解问题%%%%%%%%%%%
%%%%%%%%%%%%%%%%%f(x,y)=(1+((x+y+1)^2)*(19-14*x+3*x*x-14*y+6*x*y+3*y*y))*(30+((2*x-3*y)^2)*(18-32*x+12*x*x+48*y-*x*y+27*y*y))%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
NP=100;
D=2;
Xs=2;
Xx=-2;
G=1000;
f=zeros(D,NP);
nf=zeros(D,NP);
Pc=0.8;
Pm=0.1;
f=rand(D,NP)*(Xs-Xx)+Xx;

for np=1:NP
    MSLL(np)=func(f(:,np));
end
[SortMSLL,Index] = sort(MSLL);
Sortf=f(:,Index);
for gen = 1:G
    Emper = Sortf(:,1);%君主染色体
    NoPoint = round(D*Pc);
    PoPoint=randi([1 D],NoPoint,NP/2);
    nf = Sortf;
    for i = 1:NP/2
        nf(:,2*i-1)=Emper;
        nf(:,2*i)=Sortf(:,2*i);
        for k = 1:NoPoint
            nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
            nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
        end
    end
    for m = 1:NP
        for n = 1:D
            r = rand(1,1);
            if r<Pm
                nf(n,m)=rand(1,1)*(Xs-Xx)+Xx;
            end
        end
    end
    for np = 1:NP
        NMSLL(np)=func(nf(:,np));
    end
    [NSortMSLL,Index]=sort(NMSLL);
    NSortf=nf(:,Index);
    f1 = [Sortf,NSortf];
    MSLL1=[SortMSLL,NSortMSLL];
    [SortMSLL1,Index]=sort(MSLL1);
    Sortf1=f1(:,Index);
    SortMSLL=SortMSLL1(1:NP);
    Sortf=Sortf1(:,1:NP);
    trace(gen)=SortMSLL(1);
end
Bestf=Sortf(:,1)
trace(end)
figure
plot(trace)
xlabel('迭代次数   m')
ylabel('目标函数值')
title('适应度进化曲线')


结果如图所示
在这里插入图片描述
在这里插入图片描述

采用PSO算法编程求解问题

%%%%%%%%%%%%%采用PSO算法编程求解问题%%%%%%%%%%%%%
clear all;
close all;
clc;
N=100;
D=2;
T=200;
c1=1.5;
c2=1.5;
w=0.8;
Xmax=2;
Xmin=-2;
Vmax=1;
Vmin=-1;

%%%%%%%%%%%%%%%%%%%初始化种群个体%%%%%%%%%%%%%%%%%%%
x=rand(N,D)*(Xmax-Xmin)+Xmin;
v=rand(N,D)*(Vmax-Vmin)+Vmin;
%%%%%%%%%%%%%%%初始化个体最优位置和最优解%%%%%%%%%%%
p=x;
pbest=ones(N,1);
for i = 1:N
    pbest(i) = func(x(i,:));
end
%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%%%%%
g=ones(1,D);
gbest=inf;
for i = 1:N
    if (pbest(i) < gbest)
        g=p(i,:);
        gbest=pbest(i);
    end
end
gb=ones(1,T);
%%%%%%%%%%%%按照公式依次迭代直到满足精度或者迭代次数
for i = 1:T
    for j = 1:N
        %%%%%%%%%%%更新个体最优位置和最优解%%%%%%%
        if(func(x(j,:))<pbest(j))
            p(j,:)=x(j,:);
            pbest(j)=func(x(j,:));
        end
        %%%%%%%%%%%%更新全局最优位置和最优值%%%%%%%
        if(pbest(j)<gbest)
            g=p(j,:);
            gbest=pbest(j);
        end
        %%%%%%%%%%更新位置和速度值%%%%%%%%%%%%%%%%
        v(j,:)=w*v(j,:)+c1*rand*(p(j,:)-x(j,:))+c2*rand*(g-x(j,:));
        x(j,:)=x(j,:)+v(j,:);
        %%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%%
        for ii = 1:D
            if (v(j,ii)>Vmax)|(v(j,ii)<Vmin)
                v(j,ii)=rand*(Vmax-Vmin)+Vmin;
            end
            if(x(j,ii)>Xmax)|(x(j,ii)<Xmin)
                x(j,ii)=rand*(Xmax-Xmin)+Xmin;
            end
        end
    end
    %%%%%%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%
    gb(i)=gbest;
end
g;

figure
plot(gb)
xlabel('迭代次数')
ylabel('适应度值')
title('适应度进化曲线2')

结果如下:

在这里插入图片描述
在这里插入图片描述

用IA算法编程求解问题

%%%%%%%%使用IA算法解决问题%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
D=2;
NP=100;
Xs=2;
Xx=-2;
G=500;
pm=0.7;
alfa=1;
belta=1;
detas=0.2;
gen=0;
Nc1=10;
deta0=1*Xs;
%%%%%%%%%%%%%%%%%%%%%初始种群%%%%%%%%%%%%%%%
f=rand(D,NP)*(Xs-Xx)+Xx;
for np = 1:NP
    MSLL(np) = func(f(:,np));
end
%%%%%%%%%%%%计算个体浓度和激励度%%%%%%%%%%%%%%%%%%
for np = 1:NP
    for j = 1:NP
        nd(j)=sum(sqrt((f(:,np)-f(:,j)).^2));
        if nd(j)<detas
            nd(j)=1;
        else 
            nd(j)=0;
        end
    end
    ND(np)=sum(nd)/NP;
end
MSLL = alfa*MSLL-belta*ND;
%%%%%%%%%%%%%%%%%%激励度按升序排列%%%%%%%%%%%%%%%%%%%%%%%%%
[SortMSLL,Index]=sort(MSLL);
Sortf=f(:,Index);
%%%%%%%%%%%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen <G
    for i = 1:NP/2
        %%%%%%%%%%%%%选激励前NP/2的个体进行免疫%%%%%%%%%%%%
        a=Sortf(:,i);
        Na=repmat(a,1,Nc1);
        deta = deta0/gen;
        for j =1:Nc1
            for ii = 1:D
                %%%%%%%%%%%%%%变异%%%%%%%%%%%%%%%%
                if rand < pm
                    Na(ii,j)=Na(ii,j)+(rand-0.5)*deta;
                end
                %%%%%%%%%%边界条件处理%%%%%%%%%%%
                if (Na(ii,j)>Xs)|(Na(ii,j)<Xx)
                    Na(ii,j)=rand*(Xs-Xx)+Xx;
                end
            end
        end
        Na(:,1)=Sortf(:,i);
        %%%%%%%%%%%%克隆抑制,保留亲和度最高的个体%%%%%%%%%
        for j=1:Nc1
            NaMSLL(j)=func(Na(:,j));
        end
        [NaSortMSLL,Index]=sort(NaMSLL);
        aMSLL(i)=NaSortMSLL(1);
        NaSortf=Na(:,Index);
        af(:,i)=NaSortf(:,1);
    end
    %%%%%%%%%%免疫种群激励度%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    for np=1:NP/2
        for j = 1:NP/2
            nda(j) = sum(sqrt((af(:,np)-af(:,j)).^2));
            if nda(j) < detas
                nda(j)=1;
            else 
                nda(j)=0;
            end
        end
        aND(np)=sum(nda)/NP/2;
    end
    aMSLL = alfa * aMSLL - belta*aND;
    %%%%%%%%%%%%%%%种群刷新%%%%%%%%%%%%%%%%%%%%%%%%%%
    bf = rand(D,NP/2)*(Xs-Xx)+Xx;
    for np = 1:NP/2
        bMSLL(np) = func(bf(:,np));
    end
    %%%%%%%%%%%%%%新生成种群激励度%%%%%%%%%%%%%%%%
    for np = 1:NP/2
        for j = 1:NP/2
            ndc(j)=sum(sqrt((bf(:,np)-bf(:,j)).^2));
            if ndc(j) < detas
                ndc(j) =1;
            else 
                ndc(j) = 0 ;
            end
        end
        bND(np) = sum(ndc)/NP/2;
    end
    bMSLL=alfa*bMSLL-belta*bND;
    %%%%%%%%%%%%免疫种群与新生种群合并%%%%%%%%%%%%%%%
    f1=[af,bf];
    MSLL1=[aMSLL,bMSLL];
    [SortMSLL,Index]=sort(MSLL1);
    Sortf=f1(:,Index);
    gen = gen+1;
    trace(gen)=func(Sortf(:,1));
end
%%%%%%%%%%%%%%%输出优化结果%%%%%%%%%%%%%%%%%%%%%%
Bestf=Sortf(:,1);
trace(end);
figure,plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('亲和度进化曲线')

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值