本文是个人学习过程中记录一下笔记,借鉴了各位大佬的内容,仅供学习使用,如果侵一定删!

目录

1、根据求平面中物体重心的方法求配送中心坐标点(模拟重心法)

2、精确重心法(基于MATLAB实现迭代过程)

3、粒子群算法(Particle Swarm Optimization)的基本原理

3.1PSO算法流程

3.2 PSO的流程图和伪代码

3.3全局模式PSO与局部模式 PSO

4.PSO算法的MATLAB编码过程

选址问题: 设在某计划区域内有n个需求点,它们各自的坐标为,各点的需求量为,配送中心到需求点的运费率是,设该配送中心的坐标是(x,y)。

1、根据求平面中物体重心的方法求配送中心坐标点(模拟重心法)

模拟重心法公式

代入数值,实际求得的值,即为所求得配送中心位置的坐标。

2、精确重心法(基于MATLAB实现迭代过程)

假设配送中心到各需求点的运费为 ,总的运费用为 D,则有:

要想使求得总费用D最小的方法是根据 一阶偏导数为零的原理求解的,计算公式如下:

精确重心法公式

如果从两个方程式的右边完全消除,计算将变得很复杂,计算量也很大。因此,可以采用迭代的方法进行计算,迭代过程如下:

  1. 可用模拟重心公式计算得出的结果作为初始解代入
  2. 利用方程式(1-4)和(2-1)计算该重心点与需求点的总运费
  3. 把分别代入方程式(1-4)和(2-2)中,计算配送中心的改善坐标

计算相对应的总的运输费用C,并与上一次总运费进行比较,如果,则说明为最优解;如果,则说明计算结果得到改善,并且有待更进一步优化,于是返回第三步进行迭代计算。

利用MATLAB对上面的迭代计算进行演示,本例的基础是共有33个需求点,选择一个配送中心使得配送费用最低。为了简便计算,将运费率和需求量均设置为1。

%%精确重心法迭代计算过程
%% 输入各需求点坐标
clc;clear all; %清屏
KnownPoint=[23.58961883    34.50001618;14.04321388 70.08361889;128.643594  56.9705404749.94811626  54.10749291;64.12058384 40.96510475;182.5604304 17.99404973135.2960124  14.13726843;170.6347982 51.45892853;84.3409894  99.43543245180.8850119  17.10261255;15.78952671 61.96977021;30.75658012 33.64912783179.6510086  66.71733882;13.76432092 44.74775586;65.34921128 26.6297391740.3213122   12.65279543;187.4120223 25.49512307;137.8455491 74.1746768985.64481108  22.74382151;121.6057362 81.17053312;68.78676629 79.27644001113.1183539  57.04987996;40.18263065 99.81085283;37.24769422 34.50411952158.8958357  57.79362356;80.95579814 52.59104834;164.6554548 69.93213962185.7131125  49.19363862;140.2637087 89.34146483]; %各需求点坐标
w=ones(1,size(KnownPoint,1)); %各需求点的需求量
r=ones(1,size(KnownPoint,1)); %配送中心到需求点的运费率
num=1;
%% 计算初始重心坐标及运费
[x0,y0,C0,distance]=chushi(KnownPoint,w,r); %用重心公式计算得出的结果作为初始解
disp(['初始重心点坐标为:(',num2str(x0),',',num2str(y0),')']); %输出初始重心点坐标
LsatCost=C0; %上一次计算的运费
NextCost=0; %迭代后计算的运费
%% 开始迭代,根据初始重心点计算迭代后的改善坐标和运费
while 1[xi,yi,C,dis_diedai]=diedai(KnownPoint,w,r,distance,num);disp(['第',num2str(num),'次迭代重心点坐标为:(',num2str(xi),',',num2str(yi),')']);NextCost=C;num=num+1;distance=dis_diedai;%%%判断是否满足终止条件%%%if (NextCost>LsatCost) %把下一次迭代费用与上次费用作比较break;endLsatCost=NextCost;
end%%%%%%%%计算初始坐标函数(模拟重心法)%%%%%%%%
%模拟重心法函数:xo=sum(ri*wi*xi)/sum(ri*wi)
%               yo=sum(ri*wi*yi)/sum(ri*wi)
%% 模拟重心公式计算初始重心坐标
function [x0,y0,C0,distance]=chushi(KnownPoint,w,r) %用重心公式计算得出的结果作为初始解代入
%%初始化参数
n=size(KnownPoint,1);
z1=zeros(n,1);
z2=zeros(n,1);
z3=zeros(n,1);
distance=zeros(n,1);
C=zeros(n,1);
%%计算初始位置坐标
for i=1:nz1(i)=r(i)*w(i)*KnownPoint(i,1);z2(i)=r(i)*w(i);z3(i)=r(i)*w(i)*KnownPoint(i,2);
end
x0=sum(z1)/sum(z2);
y0=sum(z3)/sum(z2);
%%计算各需求点到重心的距离和相应的总的运输费用
for i=1:ndistance(i)=sqrt((x0-KnownPoint(i,1))^2+(y0-KnownPoint(i,2))^2);C(i)=r(i)*w(i)*distance(i);disp(['第',num2str(i),'个地点的初始距离:',num2str(distance(i))]);
end
C0=sum(C); %计算初始重心点到各需求点的总运费
disp(['初始运费:',num2str(C0)]);
end%%%%%%%%%%%精确重心法函数%%%%%%%%%
%目标函数x=sum(ri*wi*xi)/di除以sum(ri*wi)/di
%       y=sum(ri*wi*yi)/di除以sum(ri*wi)/di
%% 开始迭代
function [xi,yi,C,dis_diedai]=diedai(KnownPoint,w,r,distance,num)
%%初始化参数
n=size(KnownPoint,1);
z1=zeros(n,1);
z2=zeros(n,1);
z3=zeros(n,1);
dis_diedai=zeros(n,1);
TotalCost=zeros(n,1);
%%计算配送中心的改善坐标
for i=1:nz1(i)=r(i)*w(i)*KnownPoint(i,1)/distance(i);z2(i)=r(i)*w(i)/distance(i);z3(i)=r(i)*w(i)*KnownPoint(i,2)/distance(i);
end
xi=sum(z1)/sum(z2);%采用迭代的方法进行计算配送中心的改善地点
yi=sum(z3)/sum(z2);
%%计算各需求点到改善重心点的距离以及运费
for j=1:ndis_diedai(j)=sqrt((xi-KnownPoint(j,1))^2+(yi-KnownPoint(j,2))^2);TotalCost(j)=r(j)*w(j)*dis_diedai(j);disp(['第',num2str(j),'个地点第',num2str(num),'次迭代距离:',num2str(dis_diedai(j))]);
end
C=sum(TotalCost); %累加改善后配送中心到各需求点的总运费
disp(['第',num2str(num),'次迭代运费:',num2str(C)]);
end

3、粒子群算法(Particle Swarm Optimization)的基本原理

粒子群算法(particle swarm optimization,PSO)是由Kennedy和Eberhart提出的全局优化算法,基于群体智能理论的优化算法,通过群体中粒子间的合作与竞争产生的群体智能优化搜索。PSO    采取速度-位移模型,可以动态跟踪当前的搜索情况从而调整搜索策略,具有“自我学习”和“向他人学习”的优点,从而能在较少迭代次数内寻找最优解。

3.1PSO算法流程

  1. 初始化PSO参数

初始化粒子群算法的基本参数:问题维度(dimension)、种群规模(population)、迭代次数(interaction)、粒子位置Xi、粒子速度Vi 、个体历史最优位置(pbest)、群体全局最优位置(gbest)、位置限制范围(Xlimit)、速度限制范围(Vlimit)、学习因子(自我学习因子C1;社会学习因子C2)、惯性权重w

  • 2.产生粒子群,根据以下公式初始化每个粒子的初始位置和速度
 %进入for循环,随机生成一个种群
for i=1:pop for d=1:Dimensionx(i,d)=Lb(d)+(Ub(d)-Lb(d))*rand(1);V(i,d)=Vmin(d)+(Vmax(d)-Vmin(d))*rand(1);end
end
  • 3.开始迭代,计算每个粒子的适应度
  • 4.更新粒子的历史最优值和全局最优值

本式以最小化问题为例:

if fit(xi)<fit(pbesti)

pesti=xi

if fit(pbesti)< fit (gbesti)

gbesti=pbesti

  • 5.根据以下公式更新粒子的速度和位置(pso的重点公式)

速度更新:

位置更新:

  • 5.边界处理

在迭代过程中,如果粒子i的位置超过了位置和速度的边界,就将该粒子i的位置和速度设置为边界值。if Vi > Vmax,则Vi=Vmax;if Vi<-Vmax,则Vi =- Vmax

  • 6.判断是否达到终止条件(迭代次数),若达到最大迭代次数,则输出全局最优解

3.2 PSO的流程图和伪代码

(2)伪代码

%%本例以求最小值为目标

procedure PSO

for each particle(i)

Initialize position(Xi) and velocity(Vi) for each particle

Evaluate particle(i) and set pbest=Xi

end for

gbest=min{pbest}

while not stop

for i=1to pop

Update the position and velocity of each particle

Evaluate particle(i)

if fitness(Xi)<fitness(pbest)

pbest=Xi

if fitness(gbest)< fitness(pbest)

gbest=pbest;

end for

end while

print gbest

end procedure

3.3全局模式PSO与局部模式 PSO

全局模式(Global Version PSO):每个粒子的运动轨迹受群体中所有粒子状态的影响,粒子追寻自身极值和种群全局极值。全局模式的收敛速度相对较快,但是

局部模式(Local Version PSO):每个粒子只收自身的认识和临近的粒子状态影响,不是被种群中所有粒子的状态影响,只追寻自身极值和临近粒子中的局部极值。局部模式具有较高的鲁棒性,但收敛速度相对较慢。

局部模式的速度更新公式:

3.4粒子群算法的特点

粒子群算法和其他进化算法都是用种群表示一组解空间中的个体集合,采用随机初始化种群方法,使用适应度评价个体,然后进行一定的随机搜素,故不能保障一定能找到最优解;

具有一定的选择性。PSO通过不同代种群之间的竞争实现种群的进化过程,具有一定的选择机制;

算法具有并行性。搜索过程从一个解集开始的,不容易陷入局部最小值,这个并行性在计算机上易于实现 ,提高了算法的性能和效率。

算法收敛更快。PSO进化过程中同时具有记忆位置和速度更新,在全局模式中只有全局最优粒子提供信息给其他粒子,整个搜索过程是跟随当前最优解的过程,因此所有粒子很可能较快收敛于最优解。

4.PSO算法的MATLAB编码过程

%%     I.粒子群算法应用重心法选址问题
clear all;%清除工作区所有变量
close all;%关闭所有图形窗口
clc;%清屏
%% II.输入已知仓库地点坐标(x,y)
KnownPoint=[23.58961883    34.5000161814.04321388  70.08361889128.643594   56.9705404749.94811626  54.1074929164.12058384  40.96510475182.5604304  17.99404973135.2960124  14.13726843170.6347982  51.4589285384.3409894   99.43543245180.8850119  17.1026125515.78952671  61.9697702130.75658012  33.64912783179.6510086  66.7173388213.76432092  44.7477558665.34921128  26.6297391740.3213122   12.65279543187.4120223  25.49512307137.8455491  74.1746768985.64481108  22.74382151121.6057362  81.1705331268.78676629  79.27644001113.1183539  57.0498799640.18263065  99.8108528337.24769422  34.50411952158.8958357  57.7936235680.95579814  52.59104834164.6554548  69.93213962185.7131125  49.19363862140.2637087  89.34146483];%需求点坐标
%% III.参数初始化
c1=2; %自我认知学习因子
c2=2; %社会认知学习因子
w=0.5; %慣性权重
MaxInteration=500; %最大迭代次数
Sizepop=30; %种群规模
Dimension=2; %问题维度
Ub =[300 300]; %搜索范围的上界
Lb=[-200 -200];%搜索范围的下界
Vmax =0.009*Ub; %[100 100];%粒子速度的上界
Vmin=0.009*Lb; %[-100 -100];%粒子速度的下界
%%%%给矩阵分配内存%%%%
x=zeros(Sizepop,Dimension);%%初始化种群的位置;
V=zeros(Sizepop,Dimension);%%初始化种群的速度;
ObjectiveValue=zeros(1,Sizepop);%%初始化目标函数值;
FitnessValue=zeros(1,Sizepop);%%初始化适应度值;
PBestPos=zeros(Sizepop,Dimension);%%历史最优位置;
PBestObj=zeros(1,Sizepop);%%历史最优目标函数值;
PBestFit=zeros(1,Sizepop);%%历史最优适应度值;
GBestPos=zeros(1,Dimension);%%全局最优位置;
GBestObj=0;%%全局最优目标函数值;
GBestFit=0;%%全局最优适应度值;
Curvalue=zeros(MaxInteration);%%绘制收敛曲线;
%% IV.产生初始粒子和速度
for i=1:Sizepop  %进入for循环,随机生成一个种群for d=1:Dimensionx(i,d)=Lb(d)+(Ub(d)-Lb(d))*rand(1);V(i,d)=Vmin(d)+(Vmax(d)-Vmin(d))*rand(1);end
end
%% V.开始迭代
for t=1:MaxInterationfor i=1:SizepopObjectiveValue(1,i)=fun(KnownPoint,x(i,1),x(i,2)); %计算目标函数值;FitnessValue(1,i)=fitness(ObjectiveValue(1,i)); %计算适应度值;if(FitnessValue(1,i)>PBestFit(1,i)) %如果适应度值大于历史最优;PBestFit(1,i)=FitnessValue(1,i); %更新历史最优适应度值;PBestObj(1,i)=ObjectiveValue(1,i); %更新历史最优目标;PBestPos(i,:)=x(i,:); %更新历史最优位置;endif(FitnessValue(1,i)>GBestFit) %如果适应度值大于全局最优;GBestFit=FitnessValue(1,i); %更新全局最优适应度值;GBestObj=ObjectiveValue(1,i); %更新全局最优目标;GBestPos=x(i,:); %更新全局最优位置;endendfor i=1:Sizepop %更新每个粒子的速度和位置V(i,:)=w*V(i,:)+c1*rand()*(PBestPos(i,:)-x(i,:))+c2*rand()*(GBestPos-x(i,:)); %速度更新for d=1:Dimension %速度越界处理if(V(i,d)>Vmax(d))V(i,d)=Vmax(d);endif(V(i,d)<Vmin(d))V(i,d)=Vmin(d);endendx(i,:)=x(i,:)+V(i,:); %位置更新for d=1:Dimension %位置越界处理if(x(i,d)>Ub(d))x(i,d)=Ub(d);endif(x(i,d)<Lb(d))x(i,d)=Lb(d);endendendCurvalue(t)=GBestObj;
end
%% VI.输出结果
disp ("最低运输费用C="+GBestObj); %输出全局最优目标函数值
disp("配送中心位置坐标:"+"("+GBestPos(1,1)+"," +GBestPos(1,Dimension)+")"); %输出配送中心位置坐标
semilogy(Curvalue); %创建绘图
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%目标函数f(x)=((xi-x)^2+(yi-y)^2)^0.5
function TotalCost=fun(KnownPoint,x,y)
TotalCost=0;
j=size(KnownPoint,1);%返回矩阵KnownPoint的行数
for i=1:j %利用for循环对配送中心到各个仓库的费用进行累加求和
Distance= sqrt((KnownPoint(i,1)-x)^2+(KnownPoint(i,2)-y)^2); %配送中心到仓库的距离
TotalCost= TotalCost+Distance; %计算所选配送中心到各仓库的总费用
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 计算目标函数的适应度值
function fitnessValue=fitness(x)
fitnessValue=1./(x+0.0001);
end

粒子群算法应用于重心法选址问题-基于MATLAB实现相关推荐

  1. 【选址优化】基于粒子群算法求解配电网抢修选址优化问题含Matlab源码

    1 简介 基于粒子群算法求解配电网抢修选址优化问题​. 2 部分代码 function DrawCircle(Circle1, Circle2, r, 3600, s)​plot(model.trou ...

  2. 粒子群算法,分布式电源选址定容。 以IEEE33节点系统为算例,对分布式电源最佳接入位置及接入容量进行选取

    粒子群算法,分布式电源选址定容. 以IEEE33节点系统为算例,对分布式电源最佳接入位置及接入容量进行选取,以电压越限惩罚和网损为目标,利用粒子群算法进行优化设计,得到最佳接入位置和接入容量,完成选址 ...

  3. 基于多目标粒子群算法的配电网储能选址定容(含MATLAB程序)

    一.主要内容 程序是对文章<基于多目标粒子群算法的配电网储能选址定容>的方法复现,具体内容如下: 以系统节点电压水平(电网脆弱性).网络损耗以及储能系统总容量为目标建立了储能选址定容优化模 ...

  4. 基于多目标粒子群算法在分布式电源选址和定容中的应用matlab程序

    基于多目标粒子群算法在分布式电源选址和定容中的应用matlab程序 摘 要: 为更好地解决分布式电源选址定容问题,提出一种改进的多目标粒子群算法.考虑投资成本.网损以及电压稳定性三因素建立了一个三目标 ...

  5. 【布局优化】基于改进粒子群算法实现充电桩选址优化问题附matlab代码

    1 简介 当前世界环境污染和能源危机问题凸显,电动汽车以零排放和低耗能的优势得到各国的大力关注和支持.以电动汽车为代表新能源汽车产业,成为国家七大战略性新兴产业之一.电动汽车具有良好的发展前景,市场规 ...

  6. 【优化选址】基于粒子群算法实现无线传感器网络覆盖优化附matlab代码

    1 简介 无线传感器网络是将大量的传感器感知节点散布在监测区域中,通过节点之间的无线信息传输形成的自组网.由于无线传感器网络工作环境复杂,传感器节点更换电源不便,网络的覆盖控制问题成为研究核心,它决定 ...

  7. 【ELM预测】基于粒子群算法PSO优化极限学习机预测含Matlab源码

    1 模型 为了提高空气质量预测精度,提出一种基于粒子群算法优化极限学习机的空气质量预测模型.运用粒子群算法优化极限学习机的初始权值和偏置,在保证预测误差最小的情况下实现空气质量最优预测.选择平均绝对百 ...

  8. 【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

    1 内容介绍 风电功率预测为电网规划提供重要的依据,研究风电功率预测方法对确保电网在安全稳定运行下接纳更多的风电具有重要的意义.针对极限学习机(ELM)回归模型预测结果受输入参数影响的问题,现将粒子群 ...

  9. 【PSO三维路径规划】基于matlab粒子群算法无人机三维路径规划【含Matlab源码 192期】

    ⛄一.无人机简介 无人机的航迹规划是指在综合考虑无人机飞行油耗.威胁.飞行区域以及自身物理条件限制等因素的前提下, 为飞行器在飞行区域内规划出从初始点到目标点最优或者满意的飞行航迹, 其本质是一个多约 ...

最新文章

  1. 机器人进攻民用市场:踏实做好小优美
  2. 测试JdbcTemplate执行SQL语句和存储过程
  3. 漫步者蓝牙只有一边有声音_漫步者Dreampods新品体验,蓝牙耳机黑科技来了
  4. find与grep命令简介及正则表达式(转)
  5. 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地
  6. mysql cluster 外键_Mysql外键约束
  7. oracle打开当前表的编辑,oracle sqlplus常用命令
  8. plotplay恢复默认设置_手把手解答win10系统potplayer经常弹出自动更新提示的还原技巧...
  9. groupby索引有效吗_SQL IN 一定走索引吗?
  10. opencv_modules.hpp 头文件
  11. 文件传送,如此简单--ESFramework 4.0 快速上手(13)
  12. Material Design(九)--CoordinatorLayout和App Bar
  13. Windows下用CMake编译JsonCpp及配置(适合新手)
  14. 值得学习的100个网站推广方法。新站推广必备
  15. Vue基础知识总结(一)
  16. Ansible之playbook的使用总结 - 运维笔记
  17. C#学习之IntPtr类型
  18. 转载:与其亡羊补牢,不如血战群狼。——2005年中兴针对华为将展开全面攻击的预测
  19. Opengl ES系列学习--莫比乌斯带
  20. 黑盒测试比白盒测试技术要求更高吗?

热门文章

  1. 网络渗透作业之 wireshark抓包校园网
  2. 搜索引擎优化:常用的SEO六个指标
  3. ERP系统和进销存系统的区别
  4. 台式计算机usb口不识别鼠标,如何解决计算机无法识别鼠标的问题
  5. 电脑语音设置修复计算机,一键修复电脑没声音的解决办法
  6. 财务扫描发票,提示缺少颜色校正文件AV210.ICC
  7. matplotlib模块的pyplot子模块绘制余切函数
  8. 如何用计算机得出十三分之一,单片机原理及应用期末考试题试卷大全
  9. 基于51单片机数字频率计的设计
  10. 根据身份证推算出年龄