matlab实践(三):智能优化算法拟合曲线

1.题目

其中

x=[0.0221911365005748	0.0151331609473779	0.0122589338442028	0.00896321217501718	0.0115736574045548	0.00961340045180030	0.00770704215908083	0.00832454657016513];
y=[150	310	590	910	1800	4030	11500	36500];

2.思路

运用智能算法,关键是要注意其适应度函数的选择,还有注意其是否有约束条件,以及要问的问题是什么。这里以预测值和真实值的误差平方作为适应度函数。且其有约束条件。

3.代码实现

3.1遗传算法


%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
%初始化
clear all;                           %清除所有变量
close all;                           %清图
clc;                                 %清屏
D=4;                                %单染色体上的基因数(即4个变量)(每个基因采用4进制)
NP=100;                              %染色体数目(初始化种群的数目)
Xs=[0.1 0 1 0]';                              %变量上限
Xx=[0 -2 0 -5]';                                 %变量下限
G=1000;                              %最大遗传代数
f=zeros(D,NP);                       %初始种群赋空间 创建一个4*100的0矩阵
nf=zeros(D,NP);                      %子种群赋空间   创建一个4*100的0矩阵
Pc=0.8;                              %交叉概率
Pm=0.1;                              %变异概率
f=rand(D,NP).*(Xs-Xx)+Xx;             %随机获得初始种群(4进制的种群),维数4*100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%按适应度升序排列
for np=1:NP
    MSLL(np)=shiyingdu(f(:,np));         %计算个染色体的适应度
end
[SortMSLL,Index]=sort(MSLL);         %sort对数组元素按升序排列 SortMSLL放排序后的数 Index放排序后的位置
Sortf=f(:,Index);                    %将适应度按升序排列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%遗传算法循环
for gen=1:G
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %采用君主方案进行选择交叉操作
    Emper=Sortf(:,1);                      %君主染色体(即最好的一个)
    NoPoint=round(D*Pc);                   %每次交叉点的个数   round取整函数
    PoPoint=randi([1 D],NoPoint,NP/2);     %交叉基因的位置   
    nf=Sortf;
    %%%50个个体交叉
    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(:,m)=rand(1,1).*(Xs-Xx)+Xx; %变异操作
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %子种群按适应度升序排列
    for np=1:NP
        NMSLL(np)=shiyingdu(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);         %取前NP个适应度值(这个地方有子代变为父代了)
    Sortf=Sortf1(:,1:NP);             %取前NP个个体
    trace(gen)=SortMSLL(1);           %历代最优适应度值
end
Bestf=Sortf(:,1)                      %最后最优个体
trace(end)                            %最优值 end为取最后一个值
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
figure(2);
b=[150,310,590,910,1800,4030,11500,36500];
x=Bestf(1).*b.^(Bestf(2))+Bestf(3).*b.^(Bestf(4));
plot(b,x,'b-.');
hold on;
a=[0.0221911365005748,0.0151331609473779,0.0122589338442028,0.00896321217501718,0.0115736574045548,0.00961340045180030,0.00770704215908083,0.00832454657016513];
plot(b,a,'k-*');
legend('拟合值','真实值');
xlabel('y');
ylabel('x');

适应度进化曲线为 

拟合值与真实值为

 

最终结果为

 

3.2蚁群算法

close all;               %清图
clc;                     %清屏
m=20;                    %蚂蚁个数
minX_max=200;               %最大迭代次数
Rho=0.9;                 %信息素蒸发系数
P0=0.2;                  %转移概率常数
S=[0.1 0 1 0]; 
L=[0 -2 0 -5]; 
%%%%%%%%%%%%%%%%%随机设置蚂蚁初始位置%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
    X(i,:)=(L+(S-L)*rand);
    Tau(i)=shiyingdu(X(i,:));
end
step=0.1;                %局部搜索步长
for NC=1:minX_max
    lamda=1/NC;
    [Tau_best,BestIndex]=min(Tau);
    %%%%%%%%%%%%%%%%%%计算状态转移概率%%%%%%%%%%%%%%%%%%%%
    for i=1:m
        P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);
    end
    %%%%%%%%%%%%%%%%%%%%%%位置更新%%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:m
        %%%%%%%%%%%%%%%%%局部搜索%%%%%%%%%%%%%%%%%%%%%%
        if P(NC,i)<P0
            temp=X(i,:)+(2*rand-1)*step*lamda;
        else
            %%%%%%%%%%%%%%%%全局搜索%%%%%%%%%%%%%%%%%%%%%%%
            temp=X(i,:)+(S-L)*(rand-0.5);
        end
        %%%%%%%%%%%%%%%%%%%%%边界处理%%%%%%%%%%%%%%%%%%%%%%%
%         if temp1<XMIN
%             temp1=XMIN;
%         end
%         if temp1>XMAX
%             temp1=XMAX;
%         end
%         if temp2<YMIN
%             temp2=YMIN;
%         end
%         if temp2>YMAX
%             temp2=YMAX;
%         end
        %%%%%%%%%%%%%%%%%%蚂蚁判断是否移动%%%%%%%%%%%%%%%%%%
        if shiyingdu(temp)<shiyingdu(X(i,:))
            X(i,:)=temp;
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%更新信息素%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:m
        Tau(i)=(1-Rho)*Tau(i)+shiyingdu(X(i,:));
    end
    [value,index]=min(Tau);
    trace(NC)=shiyingdu(X(index,:));
end
[min_value,min_index]=min(Tau);
minX=X(min_index,:)                           %最优变量                       
minValue=shiyingdu(X(min_index,:))  %最优值
figure
plot(trace)
xlabel('搜索次数');
ylabel('适应度值');
title('适应度进化曲线')
figure(2);
b=[150,310,590,910,1800,4030,11500,36500];
x=minX(1).*b.^(minX(2))+minX(3).*b.^(minX(4));
plot(b,x,'b-.');
hold on;
a=[0.0221911365005748,0.0151331609473779,0.0122589338442028,0.00896321217501718,0.0115736574045548,0.00961340045180030,0.00770704215908083,0.00832454657016513];
plot(b,a,'k-*');
legend('拟合值','真实值');
xlabel('y');
ylabel('x');
 

适应度进化曲线为:

结果:

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零开始的奋豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值