智能 RGV 的动态调度模型
摘要
本文通过建立智能 RGV 的贪心算法动态调度模型,利用 C++编程进行模型模
拟,给出了智能 RGV 在三种不同的具体情况下的调度策略和系统的作业效率。
针对第一种具体情况,我们利用 C++中类的抽象特性把 RVG 以及 CNC 抽象为不
同的类,每种类含有常量、变量(如位置量,时间量等)、行为函数(如 RGV
的移动行为,上下料行为,等待行为,CNC 的工作行为)。各种类的常量、变量
与行为函数会发生改变,在智能 RGV 的状态改变上(即动态调度),我们采用
了基于 ERD 算法(尽可能早地调度先到达的作业)和 SPT 算法(尽可能早地调度
作业长度短的作业)的智能 RGV 动态调度贪心算法模型。与此同时我们发现在
第一种具体情况的第一组数据中,是存在循环规律的,我们通过该循环规律得到
了第一种具体情况下的第一组数据的运行规律。随后,我们利用构建的智能 RGV
动态调度贪心算法模型进行编程处理。将题中所给的表 1 中系统作业参数的 3
组数据代入程序,求解出了程序模型下的 RGV 的调度策略和系统的作业效率。
最后我们用程序代码运行出的结果与循环规律得出的结果进行比较,从而验证了
程序的正确性。
针对第二种具体情况,我们把基于贪心算法的智能 RGV 动态调度模型进行了
改进,加入了加工两道工序所必须的常量、变量和行为函数,保证了贪心算法的
每步最优性。在建模的过程中,我们发现在第二种具体情况中各台 CNC 的刀具
类型对智能调度系统的工作效率有影响。因此为了得到更优的结果,我们讨论了
各台 CNC 的刀具类型的选择策略,得到了刀具类型分配的选择模型。针对得到
的新模型,我们进行了 C++程序编译并利用题中所给数据求解出了第二种具体情
况下智能 RGV 的调度策略和系统工作效率。
针对第三种具体情况,我们在第一种和第二种情况的基础上运用对 CNC 加入
了故障和维修的行为,当贪心算法进行最优解判断时,我们对其进行了一次最优
解故障判断,从而让 RGV 避开故障 CNC。此外,当 CNC 开始工作时,我们用基
于随机函数的算法对 CNC 进行了一次判断,判断 CNC 是否故障,故障以后我们
设置了参数使 CNC 会发生维修的行为,接着我们利用题中所给数据求解出了第
三种具体情况下的单次智能 RGV 的调度策略和系统工作效率,以及故障发生数,
故障发生的节点。除了依照 RGV 和 CNC 的动态行为得到的改进模型,我们还讨
论了一种基于固定故障序号的静态改进模型,这种模型提前确定会发生故障的物
料序号,能够制定不同故障发生情况下的应急调度,具有较特别的理论价值。
最后,我们给出了模型的优缺点,还给出了模型的评价和展望。
关键词:RGV 贪心算法 单机调度 ERD 算法 SPT 算法 C++
1 / 42
1.问题重述
问题给出了一个智能加工系统的示意图,该智能加工系统由 8 台计算机数控
机床、1 辆轨道式自动引导车、1 条 RGV 直线轨道、1 条上料传送带、1 条下料
传送带等附属设备组成。RGV 是一种无人驾驶、能在固定轨道上自由运行的智能
车。它能够根据指令自动控制移动方向和距离,并能够完成上下料以及清洗物料
等任务作业。针对三种具体情况:
(1)一道工序的物料加工作业情况,每台 CNC 安装同样的刀具,物料可以
(2)两道工序的物料加工作业情况,每个物料的第一和第二道工序分别由
在任一台 CNC 上加工完成;
两台不同的 CNC 依次加工完成;
(3)CNC 在加工过程中可能发生故障(据统计:故障的发生概率约为 1%)
的情况,每次故障排除(人工处理,未完成的物料报废)时间介于 10~20 分钟之
间,故障排除后即刻加入作业序列。要求分别考虑一道工序和两道工序的物料加
工作业情况。
完成两项任务:
任务 1:对一般问题进行研究,给出 RGV 动态调度模型和相应的求解算法;
任务 2:利用表 1 中系统作业参数的 3 组数据分别效检验模型的实用性和算法的
有性,给出 RGV 的调度策略和系统的作业效率,并将具体的结果分别填入附件
2 的 EXCEL 表中。
2.模型假设与约定
1)将轨道分为四个位置,CNC1 与 CNC2 位于轨道位置 0 处,CNC3 与 CNC4
位于轨道位置 1 处,CNC5 与 CNC6 位于轨道位置 2 处,CNC7 与 CNC8 位于轨
道 3 处;
(2)时间的最短间隔为 1S;
(3)除了第三种具体情况中的 CNC 会发生故障以外,其它具体情况中智
能加工系统的其余部件均运行正常;
(4)开始时刻 RGV 在轨道位置 0 处,且开始时刻所有的 CNC 都处于空闲
状态,没有装载任何物料;
(5)假设第三种具体情况中 CNC 发生故障的概率是 1%,且维修的时间服
从均匀分布;
(6)每一个 CNC 发生故障的概率都是相同的,没有差异和记忆性
(7)若 CNC 在这一次作业中会发生故障,则故障发生时刻为开始工作的
时刻
(8)约定在第一轮上料过程中,CNC 不会发生故障
2 / 42
3.符号说明及名词定义
符号
单位
含义
position
now cnc
_
rgv
_
flag
posCalculate
n
1
STEP
STEP
2
STEP
3
CLEAN
move
load
clean
wait
::
CNC n
count
number
-
-
-
s
-
s
s
s
s
-
-
-
-
-
s
-
RVG 当前位置
RVG 当前目标
RGV 有无熟料的判断参数
RGV 的移动时间
加工物序列号
RGV 移动一步的时间
RGV 移动两步的时间
RGV 移动三步的时间
RGV 进行清洗操作的时间
RGV 移动
RGV 上下料
RGV 清洗
RGV 等待
加工物序列号
CNC 剩余工作时间
CNC 编号
3 / 42
CNC position
::
CNC WORKTIME
_
1CNC
CNC
0
CNCNUMBER
countdown
-
s
s
s
-
CNC 位置
CNC 加工一道工序的时间
奇数 CNC 的上下料操作时间
偶数 CNC 的上下料操作时间
CNC 的数量
- 为了让 CNC 和 RGV 的时间同步的函数
P
M
iM
v
U
1q
2q
1T
2T
%
s
s
-
-
-
-
-
-
RGV 的调度系统的作业效率
各台 CNC 的总空闲时间之和
编号为 i 的 CNC 总空闲时间
效率平衡系数
效率平衡残数
装有第二种刀具类型的 CNC 数量
装有第二种刀具类型的 CNC 数量
CNC 加工第一道工序的时间
CNC 加工第二道工序的时间
4 / 42
4.模型的建立与求解
4.1 针对第一种具体情况的建模以及算法求解
因为智能加工系统的每班次作业时间固定,为 8 小时,而所有的熟料均由 CNC
加工而成,若各台 CNC 的空闲时间总和 M 越小,则系统的作业效率的工作效率
越高,且工作效率为
P
100%
M
8 *8
h
(4.1-1)
因而我们的智能加工系统建模算法的目标函数记为
min(
f
) min(
M
) min(
M
)i
4.1.1 智能加工系统的抽象量化
为了建立第一种具体情况的模型,我们对 RGV 和 CNC#进行了必要的抽象量化
(1) RGV 的抽象量化
符号类型
符号
说明
position
now cnc
_
RVG 当前位置
RVG 当前目标
变量
rgv
_
flag
RGV 有无熟料的判断参数
posCalculate
RGV 的移动时间
RGV
常量
行为函数
n
1
STEP
STEP
2
STEP
3
CLEAN
move
load
5 / 42
加工物序列号
RGV 移动一步的时间
RGV 移动两步的时间
RGV 移动三步的时间
RGV 进行清洗操作的时间
RGV 移动
RGV 上下料
clean
wait
RGV 清洗
RGV 等待
(2)CNC 的抽象量化
符号类型
符号
说明
变量
CNC position
::
count
number
CNC position
::
加工物序列号
CNC 剩余工作时间
CNC 编号
CNC 位置
常量
CNC
CNC WORKTIME
_
CNC 加工一道工序的时间
1CNC
CNC
0
奇数 CNC 的上下料操作时间
偶数 CNC 的上下料操作时间
CNCNUMBER
CNC 的数量
行为函数 countdown 为了让 CNC 和 RGV 的时间同步
4.1.2 RGV 的行为函数的详细解释
RGV RGV
:
:
(
)
(1)
RGV 类构造函数,定义 RGV 类对象时实现成员变量的初始化。
具体成员变量初始化情况:RGV 初始位置 Position=0,初始最优解(RGV 当前操
flag 空闲,加工总耗时
now cnc =1,RGV 初始状态 _
rgv
_
作 CNC 台的编号)
为 0,加工熟料总数为 0。
6 / 42
void RGV Init CNC p
*
::
RGV 第一轮作业情况特殊,仅需考虑 RGV“移动”和“上料”动作。
int RGV posCalculate int pos
::
1,
int pos
2
(2)
(3)
该函数返回 RGV 从位置 1pos1 移动到位置 2pos2 需要的时间。主要由函数
RGV::move 调用。
void RGV move CNC p
*
::
(4)
_
next cnc ; ② 比 较 当 前 对 象
该函数抽象 RGV 类的“运动”作业。①先用“贪心算法”找到 RGV 下一
now cnc 和 最 优 对 象
移 动 目 标 的 最 优 解
next cnc ,如果当前对象不是最优对象,则移动向最优对象;③判断是否需要
等待,如果最优 CNC 工作台当前忙碌(CNC 工作剩余时间 count 不为 0),则等
待。
_
_
void RGV load CNC p
*
::
(5)
该函数抽象 RGV 类的“上下料”作业。①判断当前 CNC 工作台编号的奇偶性,
选择奇数号上下料时间 CNC1 还是偶数号上下料时间 CNC2;②完成“上下料”
作业的同时,将此时 RGV 中的“加工物序列总数 RGV::n”和“CNC 加工完成一
CNC WORKTIME ”赋给当前 CNC 工作台的“加工
个一道工序的物料所需时间
_
物序号
CNC n ”和“加工剩余时间
::
CNC count ”。
::
*
void RGV clean CNC p
::
(6)
该函数抽象 RGV 类的“清洗”作业。将“完成清洗时间 CLEAN”同步到“总
时间”和所有 CNC“加工剩余时间
*
void RGV wait CNC p
::
CNC count ”。
::
(7)
该函数抽象 RGV 类的“等待”作业。将“完成清洗时间 CLEAN”同步到“总时
间”和所有 CNC“加工剩余时间
CNC count ”。
::
4.1.3 CNC 的行为函数的详细解释
(8) RGV::RGV()
RGV 类构造函数,定义 RGV 类对象时实现成员变量的初始化。
具体成员变量初始化情况:RGV 初始位置 Position=0,初始最优解(RGV 当前操
7 / 42
作 CNC 台的编号)now_cnc=1,RGV 初始状态 rgv_flag 空闲,加工总耗时为 0,
加工熟料总数为 0。
(9)void RGV::Init(CNC *p)
RGV 第一轮作业情况特殊,仅需考虑 RGV“移动”和“上料”动作。
(10)int RGV::posCalculate(int pos1, int pos2)
该函数返回 RGV 从位置 1pos1 移动到位置 2pos2 需要的时间。主要由函数
RGV::move 调用。
(11)void RGV::move(CNC *p)
该函数抽象 RGV 类的“运动”作业。①先用“贪心算法”找到 RGV 下一
移动目标的最优解 next_cnc;②比较当前对象 now_cnc 和最优对象 next_cnc,如
果当前对象不是最优对象,则移动向最优对象;③判断是否需要等待,如果最优
CNC 工作台当前忙碌(CNC 工作剩余时间 count 不为 0),则等待。
(12)void RGV::load(CNC *p)
该函数抽象 RGV 类的“上下料”作业。①判断当前 CNC 工作台编号的奇偶性,
选择奇数号上下料时间 CNC1 还是偶数号上下料时间 CNC2;②完成“上下料”
作业的同时,将此时 RGV 中的“加工物序列总数 RGV::n”和“CNC 加工完成一
个一道工序的物料所需时间 CNC_WORKTIME”赋给当前 CNC 工作台的“加工物
序号 CNC::n”和“加工剩余时间 CNC::count”。
(13)void RGV::clean(CNC* p)
该函数抽象 RGV 类的“清洗”作业。将“完成清洗时间 CLEAN”同步到“总
时间”和所有 CNC“加工剩余时间 CNC::count”。
(14)void RGV::wait(CNC* p)
该函数抽象 RGV 类的“等待”作业。将“完成清洗时间 CLEAN”同步到“总时
间”和所有 CNC“加工剩余时间 CNC::count”。
4.1.4 智能 RGV 的动态调度策略与算法
对于智能 RGV 的动态调动策略,我们选择采用基于 ERD 算法和 SPT 算法的
贪心算法求取智能 RGV 动态调度策略的局部最优解。
当 RGV 空闲时,选择判断当前的目标
CNC 是否为局部最优解,即判断 当
m
前的 iM 是否为最小值,判断情况根据基于 ERD 算法和 SPT 算法的贪心算法有两
种抽象情况
(1)先来先服务法(ERD 算法)
尽可能早地调度先到达的作业, 以充分利用各作业到达
时刻之间的时间段。
m
如:当前目标
CNC 的工作剩余时间为
count ,我们选择工作剩余时间为
为
(2)短作业优先法(SPT 算法)
j
m
count
,比较目标
min count count
,m
j
j
CNC 的工作剩余时间
的目标。
尽可能早地调度作业长度短的作业(简称短作业), 使得其完成时间对后续
8 / 42