基本粒子群算法的matlab源程序
粒子群算法和蚁群算法优化路径问题MATLAB程序源代码

c1=round(rand*(n-2))+1;
c2=round(rand*(n-2))+1;
end
chb1=min(c1,c2);
chb2=max(c1,c2);
ylabel('km','fontsize',12)
%ylim([min(cityCoor(:,2))-1 max(cityCoor(:,2))+1])
grid on
%% 计算城市间距离
n=size(cityCoor,1); %城市数目
cityDist=zeros(n,n); %城市距离矩阵
%^初始化粒子位置
for i=1:indiNumber
individual(i,:)=randperm(n);
end
%% 计算种群适应度
indiFit=fitness(individual,cityCoor,cityDist);
[value,index]=min(indiFit);
粒子群算法和蚁群算法优化路径问题程序源代码---以旅行商问题(TSP)为例
代码用MATLAB编写,两种算法分开编写,读者可以混合编写!
一、
%% 该文件演示基于TSP-PSO(粒子群)算法
clc;clear
%% 下载数据
data=load('pr76.txt');
cityCoor=[data(:,2) data(:,3)];%城市坐标矩阵
grid on
figure
hold on
plot([cityCoor(tourGbest(1),1),cityCoor(tourGbest(n),1)],[cityCoor(tourGbest(1),2),...
粒子群算法求解约束优化问题matlab

粒子群算法求解约束优化问题matlab粒子群算法(Particle Swarm Optimization,PSO)是一种常用的启发式优化算法,适用于求解约束优化问题。
在MATLAB 中,可以使用现成的工具箱或自己编写代码来实现PSO算法。
PSO算法的核心思想是模拟鸟群觅食的行为,每个粒子代表一个候选解,并通过不断更新自身位置和速度来搜索最优解。
下面是一个基本的PSO算法的MATLAB代码框架:```matlabfunction [bestSolution, bestFitness] = PSO()% 初始化粒子群numParticles = 50;numDimensions = 10;particles = rand(numParticles, numDimensions);velocities = zeros(numParticles, numDimensions);personalBests = particles;personalBestFitnesses = zeros(numParticles, 1);% 设置参数w = 0.7; % 惯性权重c1 = 1.49; % 自我学习因子c2 = 1.49; % 社会学习因子numIterations = 100;% 开始迭代for iter = 1:numIterations% 更新粒子的速度和位置for i = 1:numParticlesr1 = rand(1, numDimensions);r2 = rand(1, numDimensions);velocities(i,:) = w*velocities(i,:) +c1*r1.*(personalBests(i,:) - particles(i,:)) + c2*r2.*(globalBest - particles(i,:));particles(i,:) = particles(i,:) + velocities(i,:);end% 更新个体最优解和适应度for i = 1:numParticlesfitness = evaluateFitness(particles(i,:));if fitness < personalBestFitnesses(i)personalBests(i,:) = particles(i,:);personalBestFitnesses(i) = fitness;endend% 更新全局最优解和适应度[bestFitness, bestIndex] = min(personalBestFitnesses);bestSolution = personalBests(bestIndex,:);% 输出当前迭代的结果fprintf('Iteration %d: Best fitness = %f\n', iter, bestFitness); endend```以上多个代码块来自上面的核心框架。
(完整word版)基本粒子群算法的原理和matlab程序.doc

基本粒子群算法的原理和matlab 程序作者—— niewei120 (nuaa)一、粒子群算法的基本原理粒子群优化算法源自对鸟群捕食行为的研究,最初由Kennedy 和 Eberhart 提出,是一种通用的启发式搜索技术。
一群鸟在区域中随机搜索食物,所有鸟知道自己当前位置离食物多远,那么搜索的最简单有效的策略就是搜寻目前离食物最近的鸟的周围区域。
PSO 算法利用这种模型得到启示并应用于解决优化问题。
PSO 算法中,每个优化问题的解都是粒子在搜索空间中的位置,所有的粒子都有一个被优化的目标函数所决定的适应值,粒子还有一个速度值决定它们飞翔的方向和距离,然后粒子群就追随当前的最优粒子在解空间中搜索。
PSO 算法首先在给定的解空间中随机初始化粒子群,待优化问题的变量数决定了解空间的维数。
每个粒子有了初始位置与初始速度。
然后通过迭代寻优。
在每一次迭代中,每个粒子通过跟踪两个“极值”来更新自己在解空间中的空间位置与飞翔速度。
第一个极值就是单个粒子本身在迭代过程中找到的最优解粒子,这个粒子叫做个体极值。
另一个极值是种群所有粒子在迭代过程中所找到的最优解粒子,这个粒子是全局极值。
上述的方法叫全局粒子群算法。
如果不用种群所有粒子而只用其中一部分作为该粒子的邻居粒子,那么在所有邻居粒子中的极值就是局部极值,该方法称为局部PSO 算法。
速度、位置的更新方程表示为:每个粒子自身搜索到的历史最优值p i,p i=(p i1 ,p i2 ,....,p iQ ), i=1,2,3,....,n 。
所有粒子搜索到的最优值p g, p g=(p g1 ,p g2,....,p gQ ),注意这里的p g只有一个。
是保持原来速度的系数,所以叫做惯性权重。
是粒子跟踪自己历史最优值的权重系数,它表示粒子自身的认识,所以叫“认知”。
通常设置为 2 。
是粒子跟踪群体最优值的权重系数,它表示粒子对整个群体知识的认识,所以叫做“社会知识”,经常叫做“社会”。
粒子群算法matlab程序

粒子群算法matlab程序粒子群算法(PSO)是一种基于群体智能的求解优化问题的算法。
其通过模拟鸟群等大规模群体行为,实现全局搜索和基于群体协作的局部搜索。
在PSO中,通过一组粒子(每个粒子代表一个解)来搜索问题的解空间,在搜索过程中,粒子的位置表示该解在解空间中的位置,速度表示该解在该方向(即属性)上的变化速率,最终达到全局最优解或局部最优解。
PSO算法有着简单易懂、实现简便、计算速度快以及易于与其他算法结合等优点。
下面我将介绍一下如何使用matlab编写简单的粒子群算法程序。
程序主要分为以下步骤:1.初始化在程序开始之前需要对粒子进行初始化操作,其中需要确定粒子群的大小、每个粒子的位置、速度等初始参数。
2.计算适应值计算每个粒子的适应值,即根据当前位置计算该解的适应值。
适应值可以根据实际问题进行定义,如最小化目标函数或最大化收益等。
3.更新粒子速度和位置这一步是PSO算法的核心步骤,通过改变粒子的速度和位置来找到更优的解。
其核心公式为:v(t+1) = w * v(t) + c1 * rand() * (pbest - x(t)) + c2 * rand() * (gbest - x(t)) x(t+1) = x(t) + v(t+1)其中w是惯性权重,c1、c2是学习因子,pbest是该粒子的历史最优解,gbest 是当前全局最优解。
4.更新pbest和gbest在每次更新位置之后需要更新每个粒子自己的历史最优解以及全局最优解。
5.停止条件判断设定停止条件,如最小适应值误差、迭代次数、最大迭代次数等,如果达到了停止条件,则程序结束,输出全局最优解。
下面是一份简单的PSO算法的matlab代码:function [best_fit, best_x] = pso(func, dim, lb, ub, max_iter, swarm_size, w, c1, c2)%初始化粒子v = zeros(swarm_size, dim);x = repmat(lb, swarm_size, 1) + repmat(ub - lb, swarm_size, 1) .* rand(swarm_size, dim);pbest = x;[best_fit, best_idx] = min(func(x));gbest = x(best_idx,:);%开始迭代for iter = 1 : max_iter%更新速度和位置v = w * v + c1 * rand(swarm_size, dim) .* (pbest - x) + c2 * rand(swarm_size, dim) .* repmat(gbest, swarm_size, 1) - x;x = x + v;%边界处理x = max(x, repmat(lb, swarm_size, 1));x = min(x, repmat(ub, swarm_size, 1));%更新pbest和gbestidx = func(x) < func(pbest);pbest(idx,:) = x(idx,:);[min_fit, min_idx] = min(func(pbest));if min_fit < best_fitbest_fit = min_fit;best_x = pbest(min_idx,:);endendend在使用上述代码时,需要定义适应值函数(func)、解空间维度(dim)、每个维度的上界(ub)与下界(lb)、最大迭代次数(max_iter)、粒子群大小(swarm_size)、惯性权重(w)、学习因子(c1、c2)等参数。
matlab调用粒子群算法

matlab调用粒子群算法
在MATLAB中调用粒子群算法可以通过以下步骤实现:
1. 导入数据,首先,你需要准备好你的数据,包括目标函数、约束条件等。
这些数据将作为粒子群算法的输入。
2. 编写目标函数,在MATLAB中,你需要编写你的目标函数,这是粒子群算法的核心。
目标函数的设计应该能够评估给定参数下的解的质量。
3. 设置粒子群算法参数,在MATLAB中,你需要设置粒子群算法的参数,包括种群大小、迭代次数、惯性权重等。
这些参数的选择会影响算法的性能和收敛速度。
4. 调用粒子群算法函数,MATLAB提供了内置的粒子群算法函数,如“particleswarm”。
你可以直接调用这些函数,并将目标函数和参数传递给它们。
5. 运行算法并获取结果,一旦调用了粒子群算法函数,你就可以运行算法并获取优化后的结果。
你可以分析结果,比较不同参数
设置下的性能,以及对算法进行调优。
总的来说,在MATLAB中调用粒子群算法涉及到准备数据、编写目标函数、设置参数、调用算法函数以及分析结果等步骤。
通过这些步骤,你可以利用MATLAB中的粒子群算法来解决优化问题。
希望这些信息能够帮助到你。
12QoS路由问题的粒子群算法MATLAB源代码

QoS路由问题的粒子群算法MATLAB源代码粒子群算法在离散优化领域的应用比较少见,为了将粒子群算法应用在QoS 路由领域,而又不偏离粒子群算法的基本思想,定义并设计了一种“⊕算子”,并且设计了一种“随机游动算子”,将基于路径的变异算子引入算法,增强算法的全局搜索能力。
%% 第一步:产生网络拓扑结构BorderLength=10; %正方形区域的边长,单位:kmNodeAmount=30; %网络节点的个数Alpha=10; %网络特征参数,Alpha越大,短边相对长边的比例越大Beta=5; %网络特征参数,Beta越大,边的密度越大PlotIf=1; %是否画网络拓扑图,如果为1则画图,否则不画FlagIf=0; %是否标注参数,如果为1则将标注边的参数,否则不标注[Sxy,AM,Cost,Delay,DelayJitter,PacketLoss]=NetCreate(BorderLength,NodeAmount,Alpha,Beta, PlotIf,FlagIf);%% 第二步:使用粒子群算法搜索最优路径,存储数据,输出最优结果和收敛曲线% GreenSim团队——专业级算法设计&代写程序% 欢迎访问GreenSim团队主页→/greensimS=[2,4]; %源节点的集合,用向量存储T=[25,27,29]; %目的节点的几何,用向量存储Alpha=1; %适应值计算式中费用的系数Beta=5e5; %适应值计算式中延时的系数Gamma=3e6; %适应值计算式中延时抖动的系数Delta=1000; %适应值计算式中丢包率的系数QoSD=100e-6; %延时的QoS约束QoSDJ=100e-6; %延时抖动的QoS约束QoSPL=0.02; %丢包率的QoS约束r1=0.1; %单个粒子的历史最优个体对当前粒子的影响系数,0<r1<=1r2=0.3; %粒子群的全局最优个体对当前粒子的影响系数,0<r2<=1r3=0.2; %粒子随机游动的影响系数,0<=r3<=1,r3可以为0,这时将关闭随机游动功能P=10; %粒子的个数Q=20; %迭代次数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%m=length(S);n=length(T);AllRoutes=cell(m,n);%各粒子经过的全部路径AllFitness=cell(m,n);HistoryBestRoutes=cell(m,n);%各粒子的历史最优路径HistoryBestFitness=cell(m,n);AllBestRoutes=cell(m,n);%全局最优路径AllBestFitness=cell(m,n);for i=1:mfor j=1:ns=S(i);t=T(j);[ROUTEst,FitFlag,HR,HFF,AR,AFF]=PSOUC(s,t,r1,r2,r3,P,Q,AM,Cost,Delay,DelayJitter,Packet Loss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Gamma,Delta);AllRoutes{i,j}=ROUTEst;AllFitness{i,j}=FitFlag;HistoryBestRoutes{i,j}=HR;HistoryBestFitness{i,j}=HFF;AllBestRoutes{i,j}=AR;AllBestFitness{i,j}=AFF;endend%下面整理最优结果SYZ=Inf;FinalRoute=[];%最终的最优路由FinalFitness=[];%最终的最优路由对应的参数LearnCurve1=zeros(1,Q);%收敛曲线LearnCurve2=zeros(1,Q);%收敛曲线for q=1:QTT=[];for i=1:mfor j=1:nABR=HistoryBestRoutes{i,j};ABF=HistoryBestFitness{i,j};for p=1:PABRq=ABR{p,q};ABFq=ABF{p,q};TT=[TT,ABFq(1,1)];if ABFq(1,1)<SYZFinalRoute=ABRq;FinalFitness=ABFq;SYZ=ABFq(1,1);endendendendLearnCurve1(q)=mean(TT);LearnCurve2(q)=min(TT);endfigure(2)plot(LearnCurve1,'bs-')xlabel('迭代次数')ylabel('平均适应值')figure(3)plot(LearnCurve2,'bs-')xlabel('迭代次数')ylabel('最优粒子适应值')function[ROUTEst,FitFlag,HR,HFF,AR,AFF]=PSOUC(s,t,r1,r2,r3,P,Q,AM,Cost,Delay,DelayJitter,Packet Loss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Gamma,Delta)%% 使用粒子群算法求源节点s到目的节点t的满足QoS约束的最小费用路径,将这些路径及其参数记录下来% GreenSim团队——专业级算法设计&代写程序% 欢迎访问GreenSim团队主页→/greensim%% 输入参数列表% s 单个的源节点% t 单个的目的节点% r1 单个粒子的历史最优个体对当前粒子的影响系数,0<r1<=1% r2 粒子群的全局最优个体对当前粒子的影响系数,0<r2<=1% r3 粒子随机游动的影响系数,0<=r3<=1,r3可以为0,这时将关闭随机游动功能% P 粒子的个数% Q 迭代次数% AM 01形式存储的邻接矩阵% Cost 边的费用邻接矩阵% Delay 边的时延邻接矩阵% DelayJitter 边的延时抖动邻接矩阵% PacketLoss 边的丢包率邻接矩阵% QoSD 延时的QoS约束% QoSDJ 延时抖动的QoS约束% QoSPL 丢包率的QoS约束% Alpha 适应值计算式中费用的系数% Beta 适应值计算式中延时的系数% Gamma 适应值计算式中延时抖动的系数% Delta 适应值计算式中丢包率的系数%% 输出参数列表% ROUTEst P×Q的细胞结构,存储所有粒子经历过的从s到t的路径% FitFlag P×Q的细胞结构,存储与ROUTEst对应的Fitness和Flag数据% HR P×Q的细胞结构,存储所有粒子的历史最优路径% HFF P×Q的细胞结构,存储所有粒子的历史最优路径对应的参数% AR 1×Q的细胞结构,存储全局最优路径% AR 1×Q的细胞结构,存储全局最优路径对应的参数%% 粒子群初始化ROUTEst=cell(P,Q);FitFlag=cell(P,Q);HR=cell(P,Q);%各粒子的历史最优路径HFF=cell(P,Q);%各粒子的历史最优路径对应的参数AR=cell(1,Q);%全局最优路径AFF=cell(1,Q);%全局最优路径对应的参数TRACK=Initialize(AM,s,P);for p=1:PRoute=TRACK{p};pos=find(Route==t);Route=Route(1:pos(1));Route=Fresh(Route);ROUTEst{p,1}=Route;HR{p,1}=Route;[Fitness,Flag]=Fit(Route,Cost,Delay,DelayJitter,PacketLoss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Ga mma,Delta);FitFlag{p,1}=[Fitness;Flag];HFF{p,1}=[Fitness;Flag];endSYZ=Inf;for p=1:PRoute=HR{p,1};FF=HFF{p,1};if FF(1,1)<SYZAR{1}=Route;SYZ=FF(1,1);AFF{1}=FF;endend%%for q=2:Q%按照粒子群迭代公式计算各个粒子的下一个位置for p=1:PRoute=ROUTEst{p,q-1};OptRoute1=HR{p,q-1};OptRoute2=AR{1,q-1};Route=SpecialAdd(Route,OptRoute1,r1,Cost);%向自己的历史最优位置靠近Route=SpecialAdd(Route,OptRoute2,r2,Cost);%向全局历史最优位置靠近Route=RandMove(Route,r3,AM);%随机游动[Fitness,Flag]=Fit(Route,Cost,Delay,DelayJitter,PacketLoss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Ga mma,Delta);ROUTEst{p,q}=Route;FitFlag{p,q}=[Fitness;Flag];end%更新各粒子的历史最优位置for p=1:PF1=HFF{p,q-1};F2=FitFlag{p,q};if F2(1,1)<F1(1,1)HR{p,q}=ROUTEst{p,q};HFF{p,q}=FitFlag{p,q};elseHR{p,q}=HR{p,q-1};HFF{p,q}=HFF{p,q-1};endend%更新全局历史最优位置for p=1:PRoute=HR{p,q};FF=HFF{p,q};if FF(1,1)<SYZ&&FF(2,1)==1AR{q}=Route;SYZ=FF(1,1);AFF{q}=FF;elseAR{q}=AR{q-1};AFF{q}=AFF{q-1};endendend。
粒子群算法源程序

粒子群算法源程序二维粒子群matlab源程序%function [pso F] = pso_2D()% FUNCTION PSO --------USE Particle Swarm OptimizationAlgorithm% global present;% close all;clc;clear all;pop_size = 10; % pop_size 种群大小 ///粒子数量 part_size = 2; % part_size 粒子大小 ///粒子的维数 gbest = zeros(1,part_size+1); % gbest 当前搜索到的最小的值 max_gen = 200; % max_gen 最大迭代次数%best=zeros(part_size,pop_size*part_size);%xuanregion=zeros(part_size,2); % 设定搜索空间范围->解空间 region=10*[-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3]; %每一维设定不同范围(称之为解空间,不是可行域空间)rand('state',sum(100*clock)); % 重置随机数发生器状态 %当前种群的信息矩阵,逐代进化的群体 % 当前位置,随机初始化 % 一个10*3的随机的矩阵(初始化所有粒子的所有维数的位置值),其中最后一列为arr_present = ini_pos(pop_size,part_size);% 初始化当前速度% 一个10*2的随机的矩阵(初始化所有粒子的所有维数的速度值)v=ini_v(pop_size,part_size);%不是当前种群,可看作是一个外部的记忆体,存储每个粒子历史最优值(2维数值):根据适应度更新~%注意:pbest数组10*3 最后一列保存的是适应度pbest = zeros(pop_size,part_size+1); % pbest:粒子以前搜索到的最优值,最后一列包括这些值的适应度% 1*80 保存每代的最优值best_record = zeros(part_size+1,max_gen); % best_record数组:记录每一代的最好的粒子的适应度w_max = 0.9; % w_max权系数最大值w_min = 0.2; % w_min权系数最小值v_max = 2; % 最大速度,为粒子的范围宽度c1 = 2; % 学习因子1c2 = 2; % 学习因子2% ————————————————————————% 计算原始种群的适应度,及初始化% ————————————————————————% 注意:传入的第一个参数是当前的粒子群体,ini_fit函数计算每个粒子的适应度% arr_present(:,end)是最后一列,保存每个粒子的适应值,是这样的~xuan arr_present(:,end)= ini_fit( arr_present, pop_size, part_size );% 数组赋值,初始化每个粒子个体的历史最优值,以后会更新的 pbest = arr_present; % 初始化各个粒子最优值% 找到当前群体中适应度最小的(在最后一列中寻找),best_value % 改为max,表示关联度最大[best_value best_index] = max(arr_present(:,end)); %初始化全局最优,即适应度为全局最小的值,根据需要也可以选取为最大值% 唯一的全局最优值,是当前代所有粒子中最好的一个 gbest =arr_present(best_index,:);% 因为是多目标,因此这个-----------------% 只是示意性的画出3维的%x=[-3:0.01:3];%y=[-3:0.01:3];%[X,Y]=meshgrid(x,y);%Z1=(-10)*exp((-0.2)*sqrt(X^2+Y^2));%Z2=(abs(X))^0.8+abs(Y)^0.8+5*sin(X^3)+5*sin(Y^3);%z1=@(x,y)(-10)*exp((-0.2)*sqrt(x^2+y^2));%z2=@(x,y)(abs(x))^0.8+abs(y)^0.8+5*sin(x^3)+5*sin(y^3);%ezmeshc(z1);grid on;%ezmeshc(z2);grid on;%开始进化,直到最大代数截至for i=1:max_gen%grid on;%三维图象 %多维图象是画不出来的%ezmesh(z),hold on,grid on;%画出粒子群%plot3(arr_present(:,1),arr_present(:,2),arr_present(:,3),'*'),h old off;%drawnow%flush%pause(0.01);w = w_max-(w_max-w_min)*i/max_gen; % 线形递减权重% 当前进化代数:对于每个粒子进行更新和评价----->>>>>>>for j=1:pop_sizev(j,:) =w.*v(j,:)+c1.*rand.*(pbest(j,1:part_size)-arr_present(j,1:part_size ))...+c2.*rand.*(gbest(1:part_size)-arr_present(j,1:part_size)); % 粒子速度更新 (a)% 判断v的大小,限制v的绝对值小于20———————————————————for k=1:part_sizeif abs(v(j,k))>20rand('state',sum(100*clock));v(j,k)=20*rand();endend%前几列是位置信息arr_present(j,1:part_size) =arr_present(j,1:part_size)+v(j,1:part_size);% 粒子位置更新(b) %最后一列是适应度arr_present(j,end) =fitness(part_size,arr_present(j,1:part_size)); % 适应度更新 (保存至最后一列)% 适应度评价与可行域限制if(arr_present(j,end)>pbest(j,end))&(Region_in(arr_present(j,:),regi on)) % 根据条件更新pbest,如果是最小的值为小于号,相反则为大于号pbest(j,:) = arr_present(j,:); % 更新个体的历史极值endend% 以下更新全局的极值[best best_index] = max(arr_present(:,end)); % 如果是最小的值为min,相反则为maxif best>gbest(end) & ( Region_in(arr_present(best_index,:),region) ) % 如果当前最好的结果比以前的好,则更新最优值gbest,如果是最小的值为小于号,相反则为大于号gbest = arr_present(best_index,:); % 全局的极值end%------------混沌---------------------------------xlhd = gbest(1:part_size);if(1)for p=1:25 %次数%1生成cxl=rand(1,part_size);for j=1:part_sizeif cxl(j)==0cxl(j)=0.1;endif cxl(j)==0.25cxl(j)=0.26;endif cxl(j)==0.5cxl(j)=0.51;endif cxl(j)==0.75cxl(j)=0.76;endif cxl(j)==1cxl(j)=0.9;endend%2映射al=-30;bl=30;rxl=al+(bl-al)*cxl;%3搜索bate = 0.1;xlhd=xlhd+bate*rxl;if fitness(part_size,xlhd)>gbest(end) gbest(1:part_size)=xlhd;gbest(end)=fitness(part_size,xlhd);end%4更新for j=1:part_sizecxl(j)=4*cxl(j)*(1-cxl(j));endendend%-------------混沌-------------------------------- %当前代的最优粒子的适应度(取自)保存best_record(:,i) = gbest; % gbest:一个行向量 end pso = gbest; % 最优个体display(gbest);figure;plot(best_record(end,:));% 最优解与代数的进化关系图best=zeros(part_size,max_gen); for i=1:part_size-1 best(i,:)=best_record(i,:);endpareto1= zeros(1,max_gen);pareto2= zeros(1,max_gen);for i=1:max_genpareto1(i)=f1(part_size, best(:,i) );pareto2(i)=f2(part_size, best(:,i) ); endfigure;i=1:max_gen;%plot(i,pareto1(i),'r*',i,pareto2(i),'g*');plot(pareto1(i),pareto2(i),'r+'); xlabel('f1');ylabel('f2');title('Pareto曲线');%figure;%plot(,f2(best_record),);% movie2avi(F,'pso_2D1.avi','compression','MSVC');%子函数%------------------------------------------------------------------------- %------------------------------------------------------------------------- %返回随机的位置function ini_present=ini_pos(pop_size,part_size)ini_present = 10*3*rand(pop_size,part_size+1); %初始化当前粒子位置,使其随机的分布在工作空间%返回一个随机的矩阵,10*(2+1),最后一列将用来保存适应度%返回随机的速度function ini_velocity=ini_v(pop_size,part_size)ini_velocity =20*(rand(pop_size,part_size)); %初始化当前粒子速度,使其随机的分布在速度范围内%判断是否处于范围内function flag = Region_in(pos_present,region)[m n]=size(pos_present); % 1*11 n返回解的维数10 flag=1;for j=1:n-1flag = flag & ( pos_present(1,j)>=region(j,1) ) &( pos_present(1,j)<=region(j,2) );end%初始化适应度function arr_fitness = ini_fit(pos_present,pop_size,part_size) for k=1:pop_sizearr_fitness(k,1) =fitness(part_size,pos_present(k,1:part_size)); %计算原始种群的适应度end%***************************************************************************% 计算适应度%***************************************************************************function fit = fitness(n,xp)%需要求极值的函数,本例即peaks函数%y0=[-85.4974,-29.9217]; % 注意:这是基准序列,也就是单个最优的极值y0=[-9.9907,-7.7507];%y0=[-39.6162,-18.4561];% y0=[-86.8312,-29.9217];y1=[f1(n,xp),f2(n,xp)]; % n为粒子维数fit=graydegree(2,y0,y1); % 关联度在某种意义上就是适应度%目标函数1function r=f1(n,x)r=0;for i=1:n-1r=r+(-10)*exp((-0.2)*sqrt(x(i)^2+x(i+1)^2)); end%目标函数2function r=f2(n,x)r=0;for i=1:nr=r+(abs(x(i)))^0.8+5*sin(x(i)^3);end%约束函数1function r=g1(n,x)r=0;for i=1:nr=0;end%约束函数2function r=g2(n,x)r=0;for i=1:nr=0;end% 灰色关联度计算函数 ( 越大相似性越好 )% tn目标函数个数 x0基准序列(一组值) x1贷检(一组值) function gama = graydegree( tn,y0,y1 )gama=0;rou =0.5;kesa= zeros(tn,1);m1= abs(y0(1)-y1(1)) ; m2= abs(y0(1)-y1(1)) ; for i=1:tnif( abs(y0(i)-y1(i))>m2 ) %------------------应该取大于呢还是小于m2= abs(y0(i)-y1(i));endendfor i=1:tnkesa(i) = ( m1+rou*m2)/( abs(y0(i)-y1(i)) +rou*m2 );gama = gama + kesa(i); endgama = gama/tn;% 可行解的判决函数 gn为约束条件的个数(暂时未用) n为解(粒子)的维数function bool = feasible( x,n ) r=0;%for i=1:gnr=max( 0, g1(n,x), g2(n,x) );%判断约束条件%endif(r>0)bool=0; %不可行解elsebool=1; %可行解endPSO粒子群算法解决旅行商问题的MATLAB源码PSO粒子群算法解决旅行商问题的MATLAB源码 %粒子群算法求解旅行商问题% By lReijclose all;clear all;PopSize=500;%种群大小CityNum = 14;%城市数OldBestFitness=0;%旧的最优适应度值Iteration=0;%迭代次数MaxIteration =2000;%最大迭代次数IsStop=0;%程序停止标志Num=0;%取得相同适应度值的迭代次数c1=0.5;%认知系数c2=0.7;%社会学习系数w=0.96-Iteration/MaxIteration;%惯性系数,随迭代次数增加而递减%节点坐标node=[16.47 96.10; 16.47 94.44; 20.09 92.54; 22.39 93.37; 25.2397.24;...22.00 96.05; 20.47 97.02; 17.20 96.29; 16.30 97.38; 14.05 98.12;...16.53 97.38; 21.52 95.59; 19.41 97.13; 20.09 94.55];%初始化各粒子,即产生路径种群Group=ones(CityNum,PopSize);for i=1:PopSizeGroup(:,i)=randperm(CityNum)';endGroup=Arrange(Group);%初始化粒子速度(即交换序)Velocity =zeros(CityNum,PopSize); for i=1:PopSizeVelocity(:,i)=round(rand(1,CityNum)'*CityNum); %round取整end%计算每个城市之间的距离CityBetweenDistance=zeros(CityNum,CityNum); for i=1:CityNumfor j=1:CityNumCityBetweenDistance(i,j)=sqrt((node(i,1)-node(j,1))^2+(node(i,2)-node(j,2))^2);endend%计算每条路径的距离for i=1:PopSizeEachPathDis(i) = PathDistance(Group(:,i)',CityBetweenDistance);endIndivdualBest=Group;%记录各粒子的个体极值点位置,即个体找到的最短路径IndivdualBestFitness=EachPathDis;%记录最佳适应度值,即个体找到的最短路径的长度 [GlobalBestFitness,index]=min(EachPathDis);%找出全局最优值和相应序号%初始随机解figure;subplot(2,2,1);PathPlot(node,CityNum,index,IndivdualBest); title('随机解');%寻优while(IsStop == 0) & (Iteration < MaxIteration)%迭代次数递增Iteration = Iteration +1;%更新全局极值点位置,这里指路径for i=1:PopSizeGlobalBest(:,i) = Group(:,index);end%求pij-xij ,pgj-xij交换序,并以概率c1,c2的保留交换序pij_xij=GenerateChangeNums(Group,IndivdualBest);pij_xij=HoldByOdds(pij_xij,c1);pgj_xij=GenerateChangeNums(Group,GlobalBest);pgj_xij=HoldByOdds(pgj_xij,c2);%以概率w保留上一代交换序Velocity=HoldByOdds(Velocity,w);Group = PathExchange(Group,Velocity); %根据交换序进行路径交换Group = PathExchange(Group,pij_xij);Group = PathExchange(Group,pgj_xij);for i = 1:PopSize % 更新各路径总距离EachPathDis(i) = PathDistance(Group(:,i)',CityBetweenDistance);endIsChange = EachPathDis<IndivdualBestFitness;%更新后的距离优于更新前的,记录序号IndivdualBest(:, find(IsChange)) = Group(:, find(IsChange));%更新个体最佳路径IndivdualBestFitness = IndivdualBestFitness.*( ~IsChange) + EachPathDis.*IsChange;%更新个体最佳路径距离[GlobalBestFitness, index] = min(EachPathDis);%更新全局最佳路径,记录相应的序号if GlobalBestFitness==OldBestFitness %比较更新前和更新后的适应度值;Num=Num+1; %相等时记录加一;elseOldBestFitness=GlobalBestFitness;%不相等时更新适应度值,并记录清零;Num=0;endif Num >= 20 %多次迭代的适应度值相近时程序停止IsStop=1;endBestFitness(Iteration) =GlobalBestFitness;%每一代的最优适应度end%最优解subplot(2,2,2);PathPlot(node,CityNum,index,IndivdualBest);title('优化解');%进化曲线subplot(2,2,3);plot((1:Iteration),BestFitness(1:Iteration));grid on;title('进化曲线');%最小路径值GlobalBestFitnessfunction Group=Arrange(Group)[x y]=size(Group);[NO1,index]=min(Group',[],2); %找到最小值1for i=1:ypop=Group(:,i);temp1=pop([1: index(i)-1]);temp2=pop([index(i): x]);Group(:,i)=[temp2' temp1']';endfunction ChangeNums=GenerateChangeNums(Group,BestVar);[x y]=size(Group);ChangeNums=zeros(x,y);for i=1:ypop=BestVar(:,i);%从BestVar取出一个顺序pop1=Group(:,i);%从粒子群中取出对应的顺序for j=1:x %从BestVar的顺序中取出一个序号NoFromBestVar=pop(j);for k=1:x %从对应的粒子顺序中取出一个序号NoFromGroup=pop1(k);if (NoFromBestVar==NoFromGroup) && (j~=k) %两序号同且不在同一位置ChangeNums(j,i)=k; %交换子pop1(k)=pop1(j);pop1(j)=NoFromGroup;endendendendfunction Hold=HoldByOdds(Hold,Odds) [x,y]=size(Hold);for i=1:xfor j=1:yif rand>OddsHold(i,j)=0;endendendfunction SumDistance=PathDistance(path,CityBetweenDistance)L=length(path); %path为一个循环的节点顺序SumDistance=0;for i=1:L-1SumDistance=SumDistance+CityBetweenDistance(path(i),path(i+1));endSumDistance=SumDistance+CityBetweenDistance(path(1),path(L)); %加上首尾节点的距离function Group=PathExchange(Group,Index)[x y]=size(Group);for i=1:ya=Index(:,i); %取出其中一组交换序pop=Group(:,i); %取出对应的粒子for j=1:x %取出其中一个交换算子作交换if a(j)~=0pop1=pop(j);pop(j)=pop(a(j));pop(a(j))=pop1;endendGroup(:,i)=pop;endfunction PathPlot(node,CityNum,index,EachBest);for i=1:CityNumNowBest(i,:)=node((EachBest(i,index)),:);endNowBest(CityNum+1,:)=NowBest(1,:); plot(node(:,1),node(:,2),'*'); line(NowBest(:,1),NowBest(:,2)); grid on;。
Matlab中的粒子群优化算法详解

Matlab中的粒子群优化算法详解引言:粒子群优化算法(Particle Swarm Optimization, PSO)是一种模拟鸟群觅食行为的优化算法,具有简单易实现、无需求导和全局搜索能力强等特点。
该算法在解决多种问题中得到广泛应用,特别是在机器学习、智能优化等领域。
本文将详细介绍Matlab中粒子群优化算法的实现过程及应用。
一、粒子群优化算法原理粒子群优化算法源自于对鸟群觅食行为的模拟。
假设一个鸟群中的每个个体被称为粒子,所有粒子共同组成了一个搜索空间,每个粒子会根据自身的当前位置和历史最佳位置进行搜索,并且受到其邻近粒子的信息影响。
通过不断的迭代运算,粒子们逐渐收敛到全局最优解或局部最优解。
具体算法流程如下:1. 初始化粒子群的位置和速度。
2. 计算每个粒子的适应度值,并更新个体最优位置。
3. 根据全局最优位置调整粒子的速度和位置。
4. 重复执行第2步和第3步,直到满足终止条件。
二、Matlab中粒子群优化算法实现步骤在Matlab中,可以通过以下步骤来实现粒子群优化算法:1. 初始化粒子群的位置和速度。
首先需要确定粒子群的大小,即粒子的个数。
对于每个粒子,需要随机生成一个初始位置和速度。
可以使用Matlab中的rand函数来生成指定范围内的随机数。
问题优劣的指标,因此需要根据具体问题来确定。
对于更新个体最优位置,可以通过比较当前适应度值和历史最佳适应度值的大小,选择适应度更优的位置进行更新。
3. 根据全局最优位置调整粒子的速度和位置。
粒子的速度和位置的更新是通过以下公式实现的:V(i,j) = w * V(i,j) + c1 * rand() * (P(i,j) - X(i,j)) + c2 * rand() * (G(j) - X(i,j))X(i,j) = X(i,j) + V(i,j)其中,V(i,j)表示第i个粒子在第j个维度上的速度,X(i,j)表示第i个粒子在第j个维度上的位置,P(i,j)表示第i个粒子的历史最佳位置,G(j)表示全局最佳位置,w、c1和c2分别表示惯性权重、个体学习因子和社会学习因子。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主函数源程序(main.m)
%------基本粒子群优化算法(Particle Swarm Optimization)----------- %------名称:基本粒子群优化算法(PSO)
%------作用:求解优化问题
%------说明:全局性,并行性,高效的群体智能算法
%------初始格式化-------------------------------------------------- clear all;
clc;
format long;
%------给定初始化条件----------------------------------------------
c1=1.4962; %学习因子1
c2=1.4962; %学习因子2
w=0.7298; %惯性权重
MaxDT=1000; %最大迭代次数
D=10; %搜索空间维数(未知数个数)
N=40; %初始化群体个体数目
eps=10^(-6); %设置精度(在已知最小值时候用)
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------ for i=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg---------------------- for i=1:N
p(i)=fitness(x(i,:),D);
y(i,:)=x(i,:);
end
pg=x(1,:); %Pg为全局最优
for i=2:N
if fitness(x(i,:),D)<FITNESS(PG,D)< span>
pg=x(i,:);
end
end
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------ for t=1:MaxDT
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:),D)<P(I)< span>
p(i)=fitness(x(i,:),D);
y(i,:)=x(i,:);
end
if p(i)<FITNESS(PG,D)< span>
pg=y(i,:);
end
end
Pbest(t)=fitness(pg,D);
end
%------最后给出计算结果
disp('*************************************************************') disp('函数的全局最优位置为:')
Solution=pg'
disp('最后得到的优化极值为:')
Result=fitness(pg,D)
disp('*************************************************************') %------算法结束---DreamSun GL & HF-----------------------------------
适应度函数源程序(fitness.m)
function result=fitness(x,D)
sum=0;
for i=1:D
sum=sum+x(i)^2;
end
result=sum;。