人工蜂群算法求解货位优化问题

2024-06-13 09:58

本文主要是介绍人工蜂群算法求解货位优化问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

人工蜂群算法求解货位优化问题

【标签】 ABC TSP Matlab

data:2018-10-19 author:怡宝2号

【总起】利用人工蜂群算法(Artificial Bee Colony Algorithm, 简称ABC算法)求解TSP问题,语言:matlab

1. 算法简介

人工蜂群算法(Artificial Bee Colony Algorithm, 简称ABC算法)是一个由蜂群行为启发的算法,在2005年由Karaboga小组为优化代数问题而提出。其主要是为了解决多变量函数优化问题。

2. 算法原理

标准的ABC算法通过模拟实际蜜蜂的采蜜机制将人工蜂群分为3类: 采蜜蜂、观察蜂和侦察蜂。整个蜂群的目标是寻找花蜜量最大的蜜源。在标准的ABC算法中,采蜜蜂利用先前的蜜源信息寻找新的蜜源并与观察蜂分享蜜源信息;观察蜂在蜂房中等待并依据采蜜蜂分享的信息寻找新的蜜源;侦查蜂的任务是寻找一个新的有价值的蜜源,它们在蜂房附近随机地寻找蜜源。所以算法总体分为3个部分。
假设问题的解空间是D维的,采蜜蜂与观察蜂的个数都是S,采蜜蜂的个数或观察蜂的个数与蜜源的数量相等。则标准的ABC算法将优化问题的求解过程看成是在D维搜索空间中进行搜索。每个蜜源的位置代表问题的一个可能解,蜜源的花蜜量对应于相应的解的适应度。一个采蜜蜂与一个蜜源是相对应的。与第i个蜜源相对应的采蜜蜂依据如下公式寻找新的蜜源:
在这里插入图片描述
其中,i=1,2,···,S,表示蜜源、采蜜蜂、观察蜂的个数,D=1,2,···,D,表示优化变量的个数。Φid为[-1,1]之间的随机数,k≠i。
将新生成的可能解{Xi1’,Xi2’,···,XiD’}与原来的解{Xi1,Xi2,···,XiD}做比较,采用贪婪选择策略保留较好的解。
在这里插入图片描述
对每个采蜜蜂按上式对每个采蜜蜂计算一个概率。观察蜂以上面计算的概率接受采蜜蜂,并利用采蜜蜂更新的公式进行更新,再进行贪婪选择。
当所有的采蜜蜂和观察蜂都搜索完整个搜索空间时,如果一个蜜源的适应值在给定的步骤内(定义为控制参数“limit”) 没有被提高, 则丢弃该蜜源,而与该蜜源相对应的采蜜蜂变成侦查蜂,侦查蜂通过已下公式搜索新的可能解。
在这里插入图片描述
其中,r是[0,1]的随机数,xmin和xmax是第d个变量空间的下界和上界。

3. 模型

3.1 模型假设
根据已知条件,可作出以下假设:
(1)立体货架模型被定义为一个标准的长方体的点集合(x,y,z),以理想模型进行考虑,并将(0,0,0)作为出口坐标;
(2)商品有销售记录;
(3)堆垛机按直线运行;
(4)只考虑商品出库;
(5)堆垛机取货时间不计,只考虑堆垛机的运行速度;
(6)每个巷道只有一个堆垛机;
(7)货物体积完全相同,质量不同;
(8)货架长宽高均为1m,货物体积均为1m3。

3.2 符号规定
在这里插入图片描述

货位优化的多目标数学模型是建立以出库效率作为主要目标,货架稳定性作为次要目标的基础上。如下所示:
在这里插入图片描述

4. 总结

  • 人工蜂群算法主要分:采蜜、观察、侦察三个阶段;
  • 整个原理和遗传算法的原理很类似,采蜜蜂就相当于初始化父代chrom,观察蜂相当于轮盘赌选择之后的子代,侦察蜂就是在limit次中没能找到更优秀的解时,舍弃该解,再随机初始化。

5. 程序和结果

%     Author:    怡宝2号        博士猿工作室
%     淘宝链接: https://shop437222340.taobao.com/index.htm?spm=2013.1.w5002-16262391244.6.733e1fb4LF2f58%     Use:       基于人工蜂群算法的三维货位优化/基于坐标点的编码方式
%                输入变量(可修改量):     TurnOver:每个货物的周转率
%                                         Weight:每个货物的重量
%                                         runtime:运行的次数
%                                         numgoods:货物的个数
%                              
%                输出:                   res:最优结果记录
%     Remark:   本人qq:778961303,如有疑问请咨询clc;clear all;close all;format compact% 参数初始化
[parameter] = initialtwo();% 画出初始货位位置
initialDraw(parameter);% 所有空货位的集合
[CHROM] = TotalGoods(parameter.X, parameter.Y, parameter.Z);for r = 1:parameter.runtime% 随机生成初始种群for i=1:parameter.foodnumbertemp = randperm(parameter.totaltray);Foods(i,:) = temp;end% 计算目标函数和种群适应度[ Fitness, fitval] = calculatefitness(Foods, parameter, CHROM);% 初始化搜索次数,用于和Limit比较trial=zeros(1,parameter.foodnumber);%找出适应度函数值的最小值BestInd=find(Fitness==min(Fitness));BestInd=BestInd(end);       %避免有两个相同的位置,只取其一GlobalMin=Fitness(BestInd);GlobalParams=Foods(BestInd,:);%迭代开始iter=1;     %初始化迭代次数while((iter <= parameter.maxCycle))%% 采蜜蜂for i=1:parameter.foodnumber%计算新蜜源的适应度函数值[FitnessSol, ~]=calculatefitness(Sol, parameter, CHROM);%使用贪婪准则,寻找最优蜜源if (FitnessSol<Fitness(i)) %若找到更好的蜜源,搜索次数清零Foods(i,:)=Sol;Fitness(i)=FitnessSol;trial(i)=0;elsetrial(i)=trial(i)+1;  %不能找到更优解超过设定的Limit次,则该蜂成为侦察蜂/重新初始化endend%计算采蜜蜂被选出的概率prob=(0.9.*Fitness./max(Fitness))+0.1;%% 观察蜂i=1;      %要跟随的采蜜蜂t=0;      %标记观察蜂while(t<parameter.foodnumber)if (rand<prob(i))   %按概率选择要跟随的采蜜蜂t=t+1;%计算新蜜源的适应度函数值[FitnessSol, ~]=calculatefitness(Sol, parameter, CHROM);%使用贪婪准则,保留优秀的蜜蜂if (FitnessSol<Fitness(i))		%若找到更好的蜜源,搜索次数清零Foods(i,:)=Sol;Fitness(i)=FitnessSol;trial(i)=0;elsetrial(i)=trial(i)+1;		%超过设定的Limit次,则该蜂成为侦察蜂//重新初始化endendi=i+1;                      		%要跟随的下一个采蜜蜂if (i==(parameter.foodnumber)+1)i=1;endend% 记录最优解ind=find(Fitness==min(Fitness));ind=ind(end);if (Fitness(ind)<GlobalMin)GlobalMin=Fitness(ind);GlobalParams=Foods(ind,:);end%% 侦查蜂ind=find(trial==max(trial));ind=ind(end);if (trial(ind) > parameter.Limit)   %若搜索次数超过极限值,则进行随机搜索产生新解end%%记录每代的最优解trace(iter) = GlobalMin;	% 最小值bestABC(iter,:) = GlobalParams;		% 最优参数iter=iter+1;endres{r}.min = GlobalMin;res{r}.trace = trace;res{r}.param = GlobalParams;disp(['第',num2str(r),'次运行得到的参数为:',num2str(GlobalParams(1:parameter.numgoods) ),',此参数对应的目标函数最小值为:',num2str(GlobalMin)])endminnumber = res{1}.min;
index = 1;
for i=2:parameter.runtimeif minnumber > res{i}.minminnumber = res{i}.min;index = iendend
%% 画出迭代图
figure(2);
plot(res{index}.trace,'b');
xlabel('迭代次数');
ylabel('目标值');%% 画出优化后的货位分配情况图
%解码染色体
result = res{index}.param(1:parameter.numgoods);
p = [];
for i=1:length(result)p = [p CHROM(result(i),:)];coordinate(i,:) = CHROM(result(i),:);
end
% disp(['优化前目标函数为:',num2str(max(trace))]);
disp(['优化后目标函数为:',num2str(res{index}.min)]);
disp(['优化后货物分配的货位为:',num2str(p)]);
coordinatefigure()
%%画出优化后的货位分配
finalDraw(coordinate, parameter);

结果:
在这里插入图片描述

这篇关于人工蜂群算法求解货位优化问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056976

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementui--$message提示框被dialog遮罩层挡住问题解决

最近碰到一个先执行this.$message提示内容,然后接着弹出dialog带遮罩层弹框。那么问题来了,message提示框会默认被dialog遮罩层挡住,现在就是要解决这个问题。 由于都是弹框,问题肯定是出在z-index比重问题。由于用$message方式是写在js中而不是写在html中所以不是很好直接去改样式。 不过好在message组件中提供了customClass 属性,我们可以利用