步骤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在站点链表的表头,可以调度,路径完成。
部分代码如下:
有问题请私信