一种路径规划之后的AGV调度方法,避免死锁发生

步骤S1:

基于图论对多AGV运行地图进行数学建模,将AGV的路径抽象为图形的边,AGV经过的站点抽象为节点,则运行环境抽象为一个由节点和边构成的图G=(V,E),V={1,v2,…,vn)是所有节点的集合,E=(e1,e2,…,em)是所有边的集合,n为节点数,m为边数,如果<vi,vj>∈E,则<vi,vj>表示两个节点之间的一条边,图形的存储结构通过邻接矩阵或邻接表来实现。

步骤S2:

初始化地图、AGV小车列表、站点列表。

步骤S3:

遍历每一辆AGV。

步骤S4:

判断当前AGV的站点序列siteSet是否为空;如果为空,表示当前AGV空闲,进入步骤S5;如果不为空,表示当前AGV忙,进入步骤S6。

步骤S5:

判断任务队列是否为空,如果为空,回到步骤S3;如果不为空,从任务队列中取出任务T,通过最短路径搜索算法获得最短路径的站点序列R=(P1,P2,…PK),Pk的值为当前AGV将要经过的具体站点,将站点序列R分配给当前AGV,并将当前AGV写入站点序列R经过的所有站点的站点链表ListK,站点链表数据结构表示每个站点对应各自的一个链表,链表中元素表示要经过当前站点的AGV顺序,然后回到步骤S3。

步骤S6:

获取当前AGV的站点序列siteSet的头元素P1和次元素P2,根据头元素P1和次元素P2的值寻找相应站点的站点链表ListK。

步骤S7:判断相应站点的站点链表LstK的头元素是否均为当前AGV;如是,则执行调度,并删除P1对应的站点链表LstK的头元素,更新当前AGV的站点序列siteet,回到步骤S3;否则等待,不执行调度,回到步骤S3。

从地图运行角度,以下详细阐述本方案:
通过计算机编程语言构建地图相关的图数据结构、站点链表数据结构、任务队列数据结构,图数据结构表示当前地图中各个站点的连接关系;站点链表数据结构表示每个站点对应各自的一个链表,链表中元素表示要经过当前站点的AGV顺序;任务队列数据结构表示存储任务的数据结构,任务队列中元素的排列顺序即为任务的先后到达顺席。

假设两台AGV的分配顺序是agvA>agvB,第一个任务序列为(0,3,4,8),第二个任务序列为(2,3,4,5)。agvA首先被分配任务,如图2所示的浅色路径序列将第二个任务分配给agvB,如图2所示的深色路径序列,由于agvA的(3,4)路径和aqvB的(3,4)路径是重罍路径,因此存在路径覆善,即在调度过程中发生冲突因此深色线条放置在浅色线条下方,表示agvB优先级低于agvA,允许agvA先通过。绘图之后,路线图如图2所示,为了方便理解,每个路径都标记了通过它的所有AGV调度顺序,例如,路径(3,4)上方的字符串“AB表示路径(3,4)存在路径覆盖,agvA先通过agvB后通过。接下来开始使用本方案进行调度,调度系统的初始状态及每一步调度后的路径状态如图2所示。
开始调度,每个AGV依次遍历,对于agA,下一个调度路径为(0,3),没有路径覆盖,可以调度agvA,对于agvB,下一个调度路径为(2,3),3号站点被agvA占用,等待调度。继续遍历每个AGV,对于agvA,下一个调度路径为(3,4),标记字符串为“AB,存在路径覆盖,但agvA在站点链表的表头,仍然可以调度agvA,调度完agvA后,3号站点链表的表头变为agvB,对于agvB,下一个调度路径为(2,3),agvB在站点链表的表头,可以调度,
继续遍历每个AGV,对于agvA,下一个调度路径为(4,8),无路径覆盖,可以调度agvA,调度完agVA后,4号站点链表的表头变为agvB。对于agvB,下一个调度路径为(3,4),无路径覆盖,aqvB在站点链表的表头,可以调度。
继续遍历每个AGV,agvA空闲,对于agvB,下一个调度路径为(4,5),无路径覆盖,aqvB在站点链表的表头,可以调度,路径完成。

部分代码如下:

有问题请私信

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值