HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    粒子群算法实例(粒子群算法实例复现)

    发布时间:2023-04-14 10:02:49     稿源: 创意岭    阅读: 137        

    大家好!今天让创意岭的小编来大家介绍下关于粒子群算法实例的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008

    本文目录:

    粒子群算法实例(粒子群算法实例复现)

    一、求粒子群算法MATLAB完整代码

    %% 清空环境

    clear

    clc

    tic

    %% 参数初始化

    % 粒子群算法中的两个参数

    c1 = 1.49445;

    c2 = 1.49445;

    maxgen = 200; % 进化次数

    sizepop = 20; % 种群规模

    Vmax = 1;

    Vmin = -1;

    popmax = 5;

    popmin = -5;

    %% 产生初始粒子和速度

    for i = 1:sizepop

    % 随机产生一个种群

    pop(i,:) = 5 * rands(1,2); % 初始种群

    V(i,:) = rands(1,2); % 初始化速度

    % 计算适应度

    fitness(i) = fun(pop(i,:)); % 染色体的适应度

    end

    % 找最好的染色体

    [bestfitness bestindex] = min(fitness);

    zbest = pop(bestindex,:); % 全局最佳

    gbest = pop; % 个体最佳

    fitnessgbest = fitness; % 个体最佳适应度值

    fitnesszbest = bestfitness; % 全局最佳适应度值

    %% 迭代寻优

    for i = 1:maxgen

    for j = 1:sizepop

    % 速度更新

    V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));

    V(j,find(V(j,:)>Vmax)) = Vmax;

    V(j,find(V(j,:)<Vmin)) = Vmin;

    %种群更新

    pop(j,:) = pop(j,:) + 0.5*V(j,:);

    pop(j,find(pop(j,:)>popmax)) = popmax;

    pop(j,find(pop(j,:)<popmin)) = popmin;

    % 自适应变异

    if rand > 0.8

    k = ceil(2*rand);

    pop(j,k) = rand;

    end

    % 适应度值

    fitness(j) = fun(pop(j,:));

    end

    % 个体最优更新

    if fitness(j) < fitnessgbest(j)

    gbest(j,:) = pop(j,:);

    fitnessgbest(j) = fitness(j);

    end

    % 群体最优更新

    if fitness(j) < fitnesszbest

    zbest = pop(j,:);

    fitnesszbest = fitness(j);

    end

    yy(i) = fitnesszbest;

    end

    toc

    %% 结果分析

    plot(yy);

    title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);

    xlabel('进化代数');

    ylabel('适应度');

    fun函数如下

    function y = fun(x)

    y = -20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2)) - exp((cos(2*pi*x(1))+ cos(2*pi*x(2)))/2) + 20 + 2.71289;

    二、粒子群优化算法(PSO)的matlab运行程序~~谢谢大家啦!

    %不知道你具体的问题是什么,下面是一个最基本的pso算法解决函数极值问题,如果是一些大型的问题,需要对速度、惯性常数、和自适应变异做进一步优化,希望对你有帮助

    function y = fun(x)

    y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289;

    %下面是主程序

    %% 清空环境

    clc

    clear

    %% 参数初始化

    %粒子群算法中的两个参数

    c1 = 1.49445;

    c2 = 1.49445;

    maxgen=200; % 进化次数

    sizepop=20; %种群规模

    Vmax=1;%速度限制

    Vmin=-1;

    popmax=5;%种群限制

    popmin=-5;

    %% 产生初始粒子和速度

    for i=1:sizepop

    %随机产生一个种群

    pop(i,:)=5*rands(1,2); %初始种群

    V(i,:)=rands(1,2); %初始化速度

    %计算适应度

    fitness(i)=fun(pop(i,:)); %染色体的适应度

    end

    %找最好的染色体

    [bestfitness bestindex]=min(fitness);

    zbest=pop(bestindex,:); %全局最佳

    gbest=pop; %个体最佳

    fitnessgbest=fitness; %个体最佳适应度值

    fitnesszbest=bestfitness; %全局最佳适应度值

    %% 迭代寻优

    for i=1:maxgen

    for j=1:sizepop

    %速度更新

    V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));

    V(j,find(V(j,:)>Vmax))=Vmax;

    V(j,find(V(j,:)<Vmin))=Vmin;

    %种群更新

    pop(j,:)=pop(j,:)+0.5*V(j,:);

    pop(j,find(pop(j,:)>popmax))=popmax;

    pop(j,find(pop(j,:)<popmin))=popmin;

    %自适应变异(避免粒子群算法陷入局部最优)

    if rand>0.8

    k=ceil(2*rand);%ceil朝正无穷大方向取整

    pop(j,k)=rand;

    end

    %适应度值

    fitness(j)=fun(pop(j,:));

    %个体最优更新

    if fitness(j) < fitnessgbest(j)

    gbest(j,:) = pop(j,:);

    fitnessgbest(j) = fitness(j);

    end

    %群体最优更新

    if fitness(j) < fitnesszbest

    zbest = pop(j,:);

    fitnesszbest = fitness(j);

    end

    end

    yy(i)=fitnesszbest;

    end

    %% 结果分析

    plot(yy)

    title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);

    xlabel('进化代数');ylabel('适应度');

    三、粒子群算法的参数设置

    从上面的例子我们可以看到应用PSO解决优化问题的过程中有两个重要的步骤: 问题解的编码和适应度函数 不需要像遗传算法一样是二进制编码(或者采用针对实数的遗传操作.例如对于问题 f(x) = x1^2 + x2^2+x3^2 求解, 粒子可以直接编码为 (x1, x2, x3), 而适应度函数就是f(x). 接着我们就可以利用前面的过程去寻优.这个寻优过程是一个叠代过程, 中止条件一般为设置为达到最大循环数或者最小错误

    PSO中并没有许多需要调节的参数,下面列出了这些参数以及经验设置

    粒子数: 一般取 20 – 40. 其实对于大部分的问题10个粒子已经足够可以取得好的结果, 不过对于比较难的问题或者特定类别的问题, 粒子数可以取到100 或 200

    粒子的长度: 这是由优化问题决定, 就是问题解的长度

    粒子的范围: 由优化问题决定,每一维可以设定不同的范围

    Vmax: 最大速度,决定粒子在一个循环中最大的移动距离,通常设定为粒子的范围宽度,例如上面的例子里,粒子 (x1, x2, x3) x1 属于 [-10, 10], 那么 Vmax 的大小就是 20

    学习因子: c1 和 c2 通常等于 2. 不过在文献中也有其他的取值. 但是一般 c1 等于 c2 并且范围在0和4之间

    中止条件: 最大循环数以及最小错误要求. 例如, 在上面的神经网络训练例子中, 最小错误可以设定为1个错误分类, 最大循环设定为2000, 这个中止条件由具体的问题确定.

    全局PSO和局部PSO: 我们介绍了两种版本的粒子群优化算法: 全局版和局部版. 前者速度快不过有时会陷入局部最优. 后者收敛速度慢一点不过很难陷入局部最优. 在实际应用中, 可以先用全局PSO找到大致的结果,再用局部PSO进行搜索. 代码来自2008年数学建模东北赛区B题, #includestdaf(x).h#include<math.h>#include<time.h>#include<iostream>#include<fstream>usingnamespacestd;intc1=2;//加速因子intc2=2;//加速因子doublew=1;//惯性权重doubleWmax=1;//最大惯性权重doubleWmin=0.6;//最小惯性权重intKmax=110;//迭代次数intGdsCnt;//物资总数intconstDim=10;//粒子维数intconstPNum=50;//粒子个数intGBIndex=0;//最优粒子索引doublea=0.6;//适应度调整因子doubleb=0.5;//适应度调整因子intXup[Dim];//粒子位置上界数组intXdown[Dim]=;//粒子位置下界数组intValue[Dim];//初始急需度数组intVmax[Dim];//最大速度数组classPARTICLE;//申明粒子节点voidCheck(PARTICLE&,int);//约束函数voidInput(ifstream&);//输入变量voidInitial();//初始化相关变量doubleGetFit(PARTICLE&);//计算适应度voidCalculateFit();//计算适应度voidBirdsFly();//粒子飞翔voidRun(ofstream&,int=2000);//运行函数classPARTICLE//微粒类{public:intX[Dim];//微粒的坐标数组intXBest[Dim];//微粒的最好位置数组intV[Dim];//粒子速度数组doubleFit;//微粒适合度doubleFitBest;//微粒最好位置适合度};PARTICLEParr[PNum];//粒子数组intmain()//主函数{ofstreamoutf(out.txt);ifstreaminf(data.txt);//关联输入文件inf>>GdsCnt;//输入物资总数Input(inf);Initial();Run(outf,100);system(pause);return0;}voidCheck(PARTICLE&p,intcount)//参数:p粒子对象,count物资数量{srand((unsigned)time(NULL));intsum=0;for(inti=0;i<Dim;i++){if(p.X>Xup)p.X=Xup;elseif(p.X<Xdown)p.X=Xdown;if(p.V>Vmax)p.V=Vmax;elseif(p.V<0)p.V=0;sum+=p.X;}while(sum>count){p.X[rand()%Dim]--;sum=0;for(inti=0;i<Dim;i++){if(p.X>Xup)p.X=Xup;elseif(p.X<Xdown)p.X=Xdown;if(p.V>Vmax)p.V=Vmax;elseif(p.V<0)p.V=0;sum+=p.X;}}voidInput(ifstream&inf)//以inf为对象输入数据{for(inti=0;i<Dim;i++)inf>>Xup;for(inti=0;i<Dim;i++)inf>>Value;}voidInitial()//初始化数据{GBIndex=0;srand((unsigned)time(NULL));//初始化随机函数发生器for(inti=0;i<Dim;i++)Vmax=(int)((Xup-Xdown)*0.035);for(inti=0;i{for(intj=0;j<Dim;j++){Parr.X[j]=(int)(rand()/(double)RAND_MAX*(Xup[j]-Xdown[j])-Xdown[j]+0.5);Parr.XBest[j]=Parr.X[j];Parr.V[j]=(int)(rand()/(double)RAND_MAX*(Vmax[j]-Vmax[j]/2));}Parr.Fit=GetFit(Parr);Parr.FitBest=Parr.Fit;if(Parr.Fit>Parr[GBIndex].Fit)GBIndex=i;}}doubleGetFit(PARTICLE&p)//计算对象适应度{doublesum=0;for(inti=0;i<Dim;i++)for(intj=1;j<=p.X;j++)sum+=(1-(j-1)*a/(Xup-b))*Value;returnsum;}voidCalculateFit()//计算数组内各粒子的适应度{for(inti=0;i{Parr.Fit=GetFit(Parr);}}voidBirdsFly()//粒子飞行寻找最优解{srand((unsigned)time(NULL));staticintk=10;w=Wmax-k*(Wmax-Wmin)/Kmax;k++;for(inti=0;i{for(intj=0;j<Dim;j++){Parr.V[j]=(int)(w*Parr.V[j]);Parr.V[j]+=(int)(c1*rand()/(double)RAND_MAX*(Parr.XBest[j]-Parr.X[j]);Parr.V[j]+=c2*rand()/(double)RAND_MAX*(Parr[GBIndex].XBest[j]-Parr.X[j]));}}Check(Parr,GdsCnt);for(intj=0;j<Dim;j++){Parr.X[j]+=Parr.V[j];Check(Parr,GdsCnt);}CalculateFit();for(inti=0;i{if(Parr.Fit>=Parr.FitBest){Parr.FitBest=Parr.Fit;for(intj=0;j<Dim;j++)Parr.XBest[j]=Parr.X[j];}}GBIndex=0;for(inti=0;i{if(Parr.FitBest>Parr[GBIndex].FitBest&&i!=GBIndex)GBIndex=i;}}voidRun(ofstream&outf,intnum)//令粒子以规定次数num飞行{for(inti=0;i<num;i++){BirdsFly();outf<<(i+1)<<ends<for(intj=0;j<Dim;j++)outf<outf<<endl;}cout<<Done!<<endl;}

    粒子群算法实例(粒子群算法实例复现)

    四、什么是粒子群算法

    粒子群算法,也称粒子群优化算法,是近年来发展起来的一种新的进化算法,粒子群算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质;

    但它比遗传算法规则更为简单,它没有遗传算法的交叉和变异操作,它通过追随当前搜索到的最优值来寻找全局最优,这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性,粒子群算法是一种并行算法。

    以上就是关于粒子群算法实例相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    光子的粒子符号(光子的粒子符号怎么写)

    物质的微观粒子模型(物质的微观粒子模型教案)

    标准模型61种粒子(标准模型61种粒子有哪些)

    杭州主城区域划分(杭州主城区域划分图最新)

    用包装盒做的创意作品(用包装盒做的创意作品图片)