【PSO运输优化】基于MATLAB的PSO运输优化算法的仿真

article/2025/10/26 3:36:13

1.软件版本

matlab2013b

2.本算法理论知识

        问题是,假设我有一个收集轨道,上面有5个采集堆,这5个采集堆分别被看作一个4*20的矩阵(下面只有4*10),每个模块(比如:A31和A32的元素含量不同),为了达到采集物品数量和元素含量的要求(比如:需采集5吨和某元素单位质量在65与62之间),求出在每个4*20的矩阵中哪个模块被拿出可以达到要求并找出最优化的轨道?

已知数据:

1.每个采集堆的元素含量(在excel表格的 sheet 1)

2.每个采集堆里面模块的坐标,长宽高(米为单位)(在excel表格的 sheet 1)

3.元素含量和采集物品数量的要求 (在excel 表格的 sheet 2), 分别有五种不同含量的最大值和最小值, 还有采集数量的要求,以及误差。

4.在轨道左侧的两个采集堆分别是C型号和A型号的,两个采集堆只见距离30m; 轨道右侧的三个采集堆按照顺序分别是B型号,B型号和C型号,同样每个采集堆之间相距20m。5.采集堆形状附在附录1

附录1 采集对侧视图

高: 10m(A.BC)

每一层宽度和长度不一样,具体数据在excel表格

所以第一行就是三角体体积,剩下的就是梯行体积。

       这里其实是一个最优化问题,即满足采集物品的需求,需要对3个类型的5个集散地进行装货,且每次只能取最上面的,如果对于当前位置的物品,如果最少面没有取走,那么只能先取最上面的物品,然后统计装货轨迹的距离,通过优化计算最短距离。

        那么,这里解题的关键是计算目标函数,然后使用优化算法对目标函数进行优化处理。本算法的主要目标就是目标函数的设计,这个也是该课题的难点。

        首先我们根据上面的需求,建立如下的数学模型:

       

        这里,dj表示每一次从一个模块移动到另外一个模块的距离,如果是从一个采集堆移动到另外一个采集堆中,那么则在另外一堆中计算所采集的模块之间的间距。

        所以上面的公式为:

      

      即在不同的采集堆的所有距离之和。这里,需要通过优化考虑不同采集堆之间的移动,以及在每个采集上如何进行模块的采集两个因素。

我们的目标就是使得上面的函数值最小,从而得到采集路线轨迹。

这里,需要考虑的难点有如下几点:

第一:空间轨迹是三维,这个比二维的复杂。

第二:约束条件的建立,我们根据课题的需求,建立如下的约束条件。

2.1 采集规则约束。

即每次只能采集最上面的,如果最上面的没有被取走,那么不能直接采集下面的。

这里,我们使用是数学公式表示如下:

        分别对四层的模块进行标记,最上面的为4,如果取走了则直接赋值0,这样,而每次我们只能去标号最大的那个。如果取走了,那么被取走的赋值为0,那么在判断的时候,可以取下面的,如果全部被取走了,则为全0,如果为全零,则这列就不能取值了。即全零表示空。

2.2 满足采集物品数量和元素含量的约束

       根据所提供的数据,物品数量的最大值为60000t,误差为1.

而元素含量为得约束条件为:

元素1

元素2

元素3

元素4

元素5

65

6

4

0.077

0.1

最大值

62

0

0

0

0

最小值

通过课题所给出的约束条件可知,我们需要通过采集模块,使得最后的总重量为60000,而所采集的物品中的各个元素的所含比例影响满足上面的约束条件。

        即上面的约束条件是通过物品的采集,使得总量满足要求,且五个元素的单位质量满足上面的约束,最后使得采集轨迹最短。

       所以,通过上面的综合分析,我们所要的数学公式为:

        

        为了方便,我们将所需要的数据,在excel中整理下,将里面一些你用公式编辑的转换为真实的数据。修改的excel文件见新发你的数据,而约束条件则直接在程序中进行设置。

        这里,我们假设,设备从一个端点移动到另外一个端点的时候,是逐渐向前移动的,而不是来回移动的。即,设备是一次从轨道的一个端点移动到另外一个端点的(事实上,规定都是依次向运动的)

       根据这个假设,我们设计的思路为当每次运动到一堆的时候,首先在这一堆物品上进行采集,由于每堆物品之间的间距远大于每堆内部的各个模块之间的间隔,所以在实际中也不可能在两个不同的堆之间来回切换的抓取模块,这也符合我们上面的假设。

        根据上面的假设,我们抓取的顺序为B堆,C堆,A堆,A堆,B堆。

3.核心代码

%根据这个假设,我们设计的思路为当每次运动到一堆的时候,首先在这一堆物品上进行采集,由于
%每堆物品之间的间距远大于每堆内部的各个模块之间的间隔,所以在实际中也不可能在两个不同的
%堆之间来回切换的抓取模块,这也符合我们上面的假设。
%根据上面的假设,我们抓取的顺序为B堆,C堆,A堆,A堆,B堆。
%这里,我们所使用的算法是局部PSO优化,然后再整体PSO优化的算法,即首先通过再每一堆的采集
%的时候进行PSO优化,并使的各个元素含量满足约束的条件下,得到路径最短的采集轨迹,然后通过
%后面三堆重复相同的优化算法,最后第五堆的时候,在做相同的优化前提下,同时检测总量是否满足
%条件,如果不满足进入下一次大迭代循环,然后重复上面的操作,最后得到满足条件的总的采集轨迹。clc;
clear;
close all;
warning off;
pack;
addpath 'func\'%**********************************************************************************
%步骤一:调用数据
%步骤一:调用数据
Dat = xlsread('Dat\datas.xlsx');%分成ABC三组
A_set = Dat( 1:40 ,:);
B_set = Dat(41:80 ,:);
C_set = Dat(81:120,:);%A相关数据
%坐标
A_POS = A_set(:,1:3);
%元素含量
A_FAC = A_set(:,4:8);
%体积长宽高
A_VUM = A_set(:,9:11);%B相关数据
%坐标
B_POS = B_set(:,1:3);
%元素含量
B_FAC = B_set(:,4:8);
%体积长宽高
B_VUM = B_set(:,9:11);%C相关数据
%坐标
C_POS = C_set(:,1:3);
%元素含量
C_FAC = C_set(:,4:8);
%体积长宽高
C_VUM = C_set(:,9:11);%**************************************************************************
%**************************************************************************%**********************************************************************************
%步骤二:参数初始化
%步骤二:参数初始化
%约束参数
%59999 ~ 60001
Mass_all = 60000;
Mass_err = 1;
%元素1
Mass1_max= 65;
Mass1_min= 62;
%元素2
Mass2_max= 6;
Mass2_min= 0;
%元素3
Mass3_max= 4;
Mass3_min= 0;
%元素4
Mass4_max= 0.077;
Mass4_min= 0;
%元素5
Mass5_max= 0.1;
Mass5_min= 0;%优化算法参数
%优化算法参数
%迭代次数
Iteration_all = 1;
Iteration_sub = 10000;
%粒子数目
Num_x     = 200;%密度
P         = 2.1;
%计算各个模块的质量,单位t
%注意,本课题一个堆中有个四个形状的模块,即三角形,三种梯形,所以我们根据长宽高以及对应的形状计算体积,从而计算质量
A_Vulome = func_cal_volume(A_VUM);
B_Vulome = func_cal_volume(B_VUM);
C_Vulome = func_cal_volume(C_VUM);
%计算每个采集堆的各个模块的质量
A_mass   = P*A_Vulome;
B_mass   = P*B_Vulome;
C_mass   = P*C_Vulome;%以下根据实际轨迹上的堆的分布来设置
maxs_sets = [B_mass;C_mass;A_mass;A_mass;B_mass];
FAC_sets  = [B_FAC;C_FAC;A_FAC;A_FAC;B_FAC];%**************************************************************************
%**************************************************************************%**********************************************************************************
%步骤三:开始优化运算
%步骤三:开始优化运算
X_pos{1} = B_POS(:,1);
Y_pos{1} = B_POS(:,2);
Z_pos{1} = B_POS(:,3);X_pos{2} = C_POS(:,1);
Y_pos{2} = C_POS(:,2);
Z_pos{2} = C_POS(:,3);X_pos{3} = A_POS(:,1);
Y_pos{3} = A_POS(:,2);
Z_pos{3} = A_POS(:,3);X_pos{4} = A_POS(:,1);
Y_pos{4} = A_POS(:,2);
Z_pos{4} = A_POS(:,3);X_pos{5} = B_POS(:,1);
Y_pos{5} = B_POS(:,2);
Z_pos{5} = B_POS(:,3);%先通过PSO优化需求模型
for Num_pso = 4:40%这里没有必要设置太大,设置大了需求量肯定会超过60000,因此,这个值得大小根据需求量来确定,大概范围即可Num_psox = zeros(Num_x,Num_pso);i = 0;%产生能够满足采集规则的随机粒子数据for jj = 1:Num_x%产生随机数的时候,必须是先采集第一层,然后才采集第二层,依次类推%第1层index1 = [1:10,41:50,81:90,121:130,161:170];%第2层index2 = [1:10,41:50,81:90,121:130,161:170]+10;%第3层index3 = [1:10,41:50,81:90,121:130,161:170]+20;%第4层index4 = [1:10,41:50,81:90,121:130,161:170]+30;%根据采集规则产生随机数%根据采集规则产生随机数%根据采集规则产生随机数index  = [index1;index2;index3;index4];i = 0;while i < Num_psoi = i + 1;if i> 1for j = 1:50;index(IS(j),ind(1)) = 9999;endendfor j = 1:50;[VS,IS(j)] = min(index(:,j));tmps(1,j)  = index(IS(j),j);endind  = randperm(40);a(i) = tmps(ind(1));if a(i) == 9999i = i-1;endendx(jj,:) = a; endn             = Num_pso;  F             = fitness_mass(x,maxs_sets,Mass_all);Fitness_tmps1 = F(1);Fitness_tmps2 = 1;for i=1:Num_xif Fitness_tmps1 >= F(i)Fitness_tmps1 =  F(i);Fitness_tmps2 =  i;endendxuhao      = Fitness_tmps2;Tour_pbest = x;                        %当前个体最优Tour_gbest = x(xuhao,:) ;              %当前全局最优路径Pb         = inf*ones(1,Num_x);        %个体最优记录Gb         = F(Fitness_tmps2);         %群体最优记录xnew1      = x;N          = 1;while N <= Iteration_sub%计算适应度 F = fitness_mass(x,maxs_sets,Mass_all);for i=1:Num_xif F(i)<Pb(i)%将当前值赋给新的最佳值Pb(i)=F(i);      Tour_pbest(i,:)=x(i,:);endif F(i)<GbGb=F(i);Tour_gbest=x(i,:);endendFitness_tmps1 = Pb(1);Fitness_tmps2 = 1;for i=1:Num_xif Fitness_tmps1>=Pb(i)Fitness_tmps1=Pb(i);Fitness_tmps2=i;endendnummin = Fitness_tmps2;%当前群体最优需求量差Gb(N)  = Pb(nummin);   for i=1:Num_x%与个体最优进行交叉c1 = round(rand*(n-2))+1;  c2 = round(rand*(n-2))+1;while c1==c2c1 = round(rand*(n-2))+1;c2 = round(rand*(n-2))+1;end   chb1 = min(c1,c2);chb2 = max(c1,c2);cros = Tour_pbest(i,chb1:chb2); %交叉区域元素个数ncros= size(cros,2);       %删除与交叉区域相同元素for j=1:ncrosfor k=1:nif xnew1(i,k)==cros(j)xnew1(i,k)=0;for t=1:n-ktemp=xnew1(i,k+t-1);xnew1(i,k+t-1)=xnew1(i,k+t);xnew1(i,k+t)=temp;endendendendxnew = xnew1;%插入交叉区域for j=1:ncrosxnew1(i,n-ncros+j) = cros(j);end%判断产生需求量差是否变小masses=0;masses = sum(maxs_sets(xnew1(i,:)));if F(i)>massesx(i,:) = xnew1(i,:);end%与全体最优进行交叉c1 = round(rand*(n-2))+1;  c2 = round(rand*(n-2))+1;while c1==c2c1=round(rand*(n-2))+1; c2=round(rand*(n-2))+1;end   chb1 = min(c1,c2);chb2 = max(c1,c2);%交叉区域矩阵cros = Tour_gbest(chb1:chb2); %交叉区域元素个数ncros= size(cros,2);       %删除与交叉区域相同元素for j=1:ncrosfor k=1:nif xnew1(i,k)==cros(j)xnew1(i,k)=0;for t=1:n-ktemp=xnew1(i,k+t-1);xnew1(i,k+t-1)=xnew1(i,k+t);xnew1(i,k+t)=temp;end                 endendendxnew = xnew1;%插入交叉区域for j=1:ncrosxnew1(i,n-ncros+j) = cros(j);end%判断产生需求量差是否变小masses=0;masses = sum(maxs_sets(xnew1(i,:)));if F(i)>massesx(i,:)=xnew1(i,:);end%进行变异操作c1          = round(rand*(n-1))+1;  c2          = round(rand*(n-1))+1;temp        = xnew1(i,c1);xnew1(i,c1) = xnew1(i,c2);xnew1(i,c2) = temp;%判断产生需求量差是否变小masses=0;masses = sum(maxs_sets(xnew1(i,:)));if F(i)>massesx(i,:)=xnew1(i,:);endendFitness_tmps1=F(1);Fitness_tmps2=1;for i=1:Num_xif Fitness_tmps1>=F(i)Fitness_tmps1=F(i);Fitness_tmps2=i;endendxuhao      = Fitness_tmps2;L_best(N)  = min(F);%当前全局最优需求量Tour_gbest = x(xuhao,:);     N          = N + 1;end%判断含量是否满足要求for ii = 1:5Fac_tmps(ii) = sum(FAC_sets(Tour_gbest,ii)'.*maxs_sets(Tour_gbest))/sum(maxs_sets(Tour_gbest));endif (Fac_tmps(1) >= Mass1_min & Fac_tmps(1) <= Mass1_max) &...(Fac_tmps(2) >= Mass2_min & Fac_tmps(2) <= Mass2_max) &...(Fac_tmps(3) >= Mass3_min & Fac_tmps(3) <= Mass3_max) &...(Fac_tmps(4) >= Mass4_min & Fac_tmps(4) <= Mass4_max) &... (Fac_tmps(5) >= Mass5_min & Fac_tmps(5) <= Mass5_max)flag(Num_pso-3) = 1;elseflag(Num_pso-3) = 0; endMass_fig(Num_pso-3)  = min(L_best);Mass_Index{Num_pso-3}= Tour_gbest ;
endfigure;
plot(Mass_fig,'b-o');
xlabel('采集模块个数');
ylabel('需求量计算值和标准需求量的差值关系图');save temp\result1.mat Mass_fig Mass_Index flag

4.操作步骤与仿真结论

        首先,运行程序run_first.m,搜索所有采集方法得到的需求量为59999~60001之间的采集组合。并保存仿真结果。

        这个步骤仿真结果如下所示:

      通过这个步骤将优化出符合采集规则且符合元素含量,并满足需求量的模块集合,然后运行run_second.m,进行轨迹优化。

最后得到的优化记过,即满足条件下的最短轨迹长度

5.参考文献

A06-10

6.完整源码获得方式

方式1:微信或者QQ联系博主

方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码


http://chatgpt.dhexx.cn/article/YWbN7wHN.shtml

相关文章

粒子群算法(PSO)

理论&#xff1a; 粒子群优化算法&#xff08;PSO&#xff09;是一种智能优化算法&#xff0c;也是一种元启发式算法&#xff0c;最初是由Eberhart和Kennedy提出的&#xff0c;其模拟了鸟群捕食行为&#xff0c;通过一定的搜索策略&#xff0c;使得多个粒子在多维搜索空间中寻…

粒子群算法(PSO)简介及Python实现

一、概述 粒子群算法&#xff0c;也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization) &#xff0c;缩写为PSO.粒子群优化算法是一种进化计算技术(evolutionary computation)&#xff0c;1995年由Eberhart博士和kennedy 博士提出&#xff0c;源于对鸟群捕食的行为研…

mac中如何在PS中使用Cutterman工具快速切图

简介 cutterman是安装在PS软件中的一款智能自动切图插件&#xff0c;用法简单方便&#xff0c;很受设计者们喜欢&#xff0c;导出的图片格式有多种选择&#xff0c;而且还可以针对不同机型选择如苹果系统、安卓系统或电脑端使用。 工具/原料 Photoshoppsd格式图层图片 方法/…

sketch android 切图,Sketch如何快速切图?三分钟教你掌握切图方案

相信有相当一部分的设计同行在工作中碰到各种各样切图尺寸大小的问题&#xff0c;针对Sketch如何快速切图这个问题&#xff0c;今天小编特意出了一篇有关sketch切图尺寸教程的文章&#xff0c;学会了包你三分钟之内掌握设置切图方案的技巧&#xff0c;然后更安心的把剩余时间花…

切图教程,app切图命名总结

再根据自己的习惯对APP切图命名进行整理总结。 结语&#xff1a; 作为一个有强迫症的设计师&#xff0c;希望产出是有缜密的思维逻辑&#xff0c;当然包括细节。 文字有的部分参考其它文章&#xff0c;整理后根据自己的工作经验作出的总结。 自己也还在不断的摸索与学习。 声明…

PS切图方法

方法一&#xff1a;直接右击选中图层&#xff0c;另存为.png文件 方法二&#xff1a;对于分离的几个图层&#xff0c;右击shift选中&#xff0c;ctrE合并图层&#xff0c;再用方法一 方法三&#xff1a;利用切片工具进行切图&#xff1a; 方法四&#xff1a;PS插件切图&#…

PS中的切图

文章目录 图层切图切片切图PS插件切图附&#xff1a;常见的图片格式 PS 有很多的切图方式&#xff1a;图层切图、切片切图、PS 插件切图等。 图层切图 最简单的切图方式&#xff1a;右击图层 --> 导出 PNG 切片。 如果发现某张图片它的文字和背景是分离的&#xff0c;那么…

真正的ps切图方法(前端必看)

看了很多ps切图方法&#xff0c;真的感觉都不是很满意&#xff0c;可能说不是很合适我们前端的用法&#xff0c;毕竟我们要获取的是某一个图层里面的小图片&#xff0c;不需要获取全部切图&#xff0c;好了&#xff0c;废话不多说&#xff0c;看方法。 1.选中所在的图层&#x…

ps 快速切图

前端实战系列之---两种快速切图的方法 今天给大家分享一下我自己在前端工作中的一些切图小技巧&#xff0c;虽然好的UI会给我们把图切好&#xff0c;但是他们切的图不一定百分之百符合我们的需求&#xff0c;所以还是自己动手丰衣足食嘛&#xff0c;看本教程之前希望大家能先看…

切图工具:又一个处理大图的例子

工具下载 有些同学对处理大图还是不太明白&#xff0c;这里再仔细写一个例子&#xff0c;希望能有所帮助。 基本情况&#xff1a; 1、使用高德地图&#xff1b; 2、朋友使用12级地图截屏做底图&#xff0c;制作的源图为17级&#xff0c;分辨率为40960*40960&#xff1b; 由于…

地图切图工具:初步实现顺序法批量切图处理,用于处理大图

工具&#xff1a;https://blog.csdn.net/bq_cui/article/details/47372005 &#xff08;20190504&#xff09; 由于技术限制&#xff0c;本工具无法打开超级大图。切图时如果遇到一个很大的源图片&#xff0c;工具会难以处理&#xff0c;一般是跳出内存溢出提示&#xff0c;点击…

houdini 之copy to points

将第一个输入中的几何图形复制到第二个输入的点上。 属性备注Source Group几何体来源Target Points要复制到的目标点集合Show Guide Geometry是否显示该操作预览流程Pack and Instance在复制之前将输入几何体打包到嵌入式打包图元中。这导致输入几何被每个副本共享&#xff08;…

如何利用Photoshop进行快速切图

在UI设计中我们常常使用Ai来进行矢量图的绘制&#xff0c;然后导入Ps中进行设计、排版和导出。 在以前的版本中&#xff0c;切图一直是个很麻烦的事情&#xff0c;要么依托于脚本&#xff0c;要么手动一张张导出&#xff0c;很不方便&#xff0c;这种窘况在Photoshop CC 2015…

图像分割之图割(Graph Cut)

基本概念 这里介绍一种用于n维图像数据的边界优化和区域分割的分割技术。该分割算法来自论文&#xff1a;Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images。该方法通过交互式的或自动的定位一个或多个代表“物体”的点以及一…

4. PS切图

4.1常见的图片格式 jpg图像格式: JPEG ( .JPG )对色彩的信息保留较好,高清,颜色较多,我们产品类的图片经常用jpg格式的gif图像格式 : GIF格式最多只能储存256色,所以通常用来显示简单图形及字体,但是可以保存透明背景和动画效果,实际经常用于一些图片小动画效果png图像格式&am…

Photoshop 实时切图功能 Generate

大家好&#xff0c;我是笨笨&#xff0c;笨笨的笨&#xff0c;笨笨的笨&#xff0c;谢谢!!! 本文发表在【湖边的小屋遗址】 转载请注明出处 Generate web assets in Photoshop CC 貌似就是以前的 Ctrl Shift Alt s 升级。并不只是操作上&#xff0c;感觉是要优化输出资源的…

IOS切图直接作为Android切图使用

跳槽到新公司之后&#xff0c;发现工作真心挺坑的&#xff0c;基本没什么流程规范&#xff0c;职责分工也不明确&#xff0c;整天瞎折腾。。。&#xff0c;慢慢的开始怀念起老东家了。 在新公司UI只提供ios的切图给开发&#xff0c;其实他们不会做android切图。。。&#xff0c…

Group Convolution与Depthwise Convolution

转自&#xff1a;Group Convolution分组卷积&#xff0c;以及Depthwise Convolution和Global Depthwise Convolution - 云社区 - 腾讯云 写在前面 Group Convolution分组卷积&#xff0c;最早见于AlexNet——2012年Imagenet的冠军方法&#xff0c;Group Convolution被用来切分…

Graph Cut(图割)详解

原文地址&#xff1a;http://blog.csdn.net/zouxy09/article/details/8532111 Graph cuts是一种十分有用和流行的能量优化算法&#xff0c;在计算机视觉领域普遍应用于前背景分割&#xff08;Image segmentation&#xff09;、立体视觉&#xff08;stereo vision&#xff09;、…

sketch的切图技巧总结:如何批量切出固定大小的切图并保留透明部分?

原文来自公众号&#xff1a;希音的设计笔记 获取方式 关注公众号&#xff1a;希音的设计笔记&#xff0c;后台回复 切图插件 &#x1f447;&#x1f447; 限时免费扫码进群&#xff0c;交流行业设计 添加小编微信一起见证彼此成长 最近有刚转战sketch的同学问到两个问题&am…