装船准确率和装船效率是衡量一个集装箱码头服务质量的主要指标。在一些集装箱码头的装船作业中存在着两者较难兼顾的问题。导致装船准确率和装船效率冲突的因素有很多,其中要装船的集装箱在堆场中放置次序不合理是一个重要的影响因素。一个装船的完整过程大致为:船到码头前几天先传送船图(即要在船上的哪些位置放什么类型的集装箱的模型图)给码头;码头配载部门根据船图对堆场中要装船的集装箱进行配载,即确定把堆场中的哪个集装箱放到船上的哪个位置;最后是中控部门按照配载图指挥堆场中的机械设备进行装船。由于集装箱在堆场中是分层堆放的,所以会出现要先装船的集装箱被压在后装船的集装箱下面的情况。这将导致实际装船时要进行大量的翻箱,从而影响装船的效率和准确率。所以进行预翻箱对提高装船准确率和装船效率很有必要,而对翻箱过程的优化对提高企业的生产效率和经济效益起到至关重要的作用。
一、翻箱问题的描述
本文结合某一著名集装箱码头集装箱管理现状和条件,作了一定的抽象和概括,力求解决的方法具有普适性。
一般码头堆放集装箱以钱为单位,每个校有六列共放21个集装箱,每列最多放4个,其中第一列和第六列的第五个位置在翻箱过程中可用。如下图:
|
5层 |
* |
不可用区域 |
* |
|||
|
4层 |
a |
b |
c |
|
|
|
|
3层 |
a |
b |
c |
d |
a |
b |
|
2层 |
a |
b |
c |
d |
a |
b |
|
1层 |
a |
b |
c |
d |
a |
b |
|
|
1列 |
2列 |
3列 |
4列 |
5列 |
6列 |
由于集装箱有所属港口、重量、箱型等属性,所以集装箱可被分为若干个种类(本文以a、b、c、d...表示)。不同种类的集装箱装船的次序可能不一样(a最优先,其次b、c、d...),所以装船前应进行预翻箱,以保证先要装船的集装箱能够先出梭,这样符合装船条件的栈状态称为目标状态。21个集装箱在26个位置的每一种分布(不能悬空)都为一个钱状态。如果有两个状态在0<k≤21个位置上对应的集装箱不一样,但这k个位置上对应的集装箱种类相同,而在其余21-k个位置上对应的集装箱相同,则这两个状态等价,即属于同一等价类。翻箱的过程就是寻找从初始状态到目标状态的一系列状态。
二、目标状态的判断
正常序:同一列中的集装箱符合先装船的都在后装船的上面条件的放置顺序。
列复杂度:栈A中的第i(l≤i≤6)列Ai的复杂度δ(Ai):表示使栈A中的第i(l≤i≤6)列Ai成为一个正常序且|Ai|≤4至少需要从上面移去的集装箱数目。
栈复杂度:用δ(A)表示,
如下例:
|
4层 |
a |
b |
c |
|
|
|
|
3层 |
a |
b |
c |
a |
d |
c |
|
2层 |
a |
a |
b |
a |
c |
d |
|
1层 |
b |
a |
a |
b |
c |
c |
|
|
1列 |
2列 |
3列 |
4列 |
5列 |
6列 |
δ(A1)=0,δ(A2)=2,δ(A3)=3,δ(A4)=0,δ(A5)=1,δ(A6)=2,
δ(A)=δ(Ai)=+2+3+0+1+2=8
目标状态:符合下列条件的钱状态可视为目标状态,
(1)栈复杂度为0;
(2)任何一列至多只能有四个集装箱;
(3)同一等级的箱子尽可能放在相同的列。
对(3)同一等级的箱子尽可能放在相同的列的解释:由码头的多年生产经验总结可知:相同种类的集装箱放在校中的相同的列更便于码头机械的操作。所以判断目标状态需要先统计出校中各类集装箱的数目、需要占的列数和需要混放的列数。例如:上面的图为一个初始状态的枝,里边有a、b、c三类集装箱,根据上述原则:a类有8个集装箱,要分布在两列中;b类有6个集装箱,其中四个分布在一列,还剩余两个集装箱分布在另一列;c类有7个集装箱,其中四个一列,还剩余3个集装箱分布在另一列;c类的3个集装箱可分布在一列。有些情况只通过简单统计分析得到的数据是不能实现的,程序中还有另外的判断。
三、翻箱问题的模型化
在自然界和人类社会的实际生活中,用图形来描述某些对象(或事物)之间具有某种特定关系常常感到特别方便。例如用工艺流程图来描述某项工程中各个工序之间的先后关系,用竞赛图来描述循环比赛中各个选手之间的胜负关系,用网络图来描述某通讯系统中各通讯站之间信息传递关系等等。图形中点表示对象,两点之间的有向或无向连线表示两对象之间具有某种特定的关系,所以图论提供了一个自然的结构。
在翻箱问题中,我们把每种楼状态视为无向图中的一个顶点叭,如果两个栈状态vi和vj可以通过移动一个表层的集装箱相互转化,那么vi和vj间就存在一条边eij。这样全部的栈状态和它们之间的转化关系就被抽象化为一个无向图G。值得注意的是这个元向图的顶点数order(G)范围是:
P2121<order(G)<P2621
无向图中包含一个初始状态对应的顶点u,和目标状态类对应的顶点v,w,…,这时翻箱过程的两个任务是:一,从目标状态类中找出一个目标状态s,使得distance(u,s)最小,即最短路问题:二,跟踪搜索过程,记录搜索路线u,vi,vi+1,vi+2…s,给出翻箱步骤。流程图如下:
四、翻箱问题的求解
广度优先搜索(breadth-first search):简称BFS,BFS是一种寻找特定顶点的遍历过程。假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发广度优先遍历图直到找到特定的顶点自图中所有的顶点都被访问到为止。广度优先搜索遍历图的过程是以v为起始点,由近至远,依次可问和v有路径相通且路径长度为1,2, …的顶点。
考虑到要从图中找一点到另一点的最短路和广度优先搜索的特点,所以采用广度优先搜索的方法求解。首先创建一个队列用来存放栈状态(即图中的顶点),把初始栈状态作为队列的第一个元素。具体过程如下:
第一步:取出队列的第一个未处理的元素作为当前栈状态,移动校中表层的一个集装箱产生出可能的一个新的栈状态。转第二步。
第二步:判断新产生的栈状态是否符合目标状态的要求,如符合则搜索停止,进行输出,否则包该校状态从队列尾部加进队列。转第三步。
第三步:由当前栈状态产生出下一个可能的状态,如有新的栈状态产生则转第二步,否则转第一步。
理论上通过这样的搜索可把目标状态搜索出来,然而实际实验中面临一个数据量大、计算时间长的问题。所以需要对以上的搜索加以限制和优化。
五、翻箱问题的优化
原则一:搬动一次集装箱栈复杂度减小不超过1。
说明:分四种情况:
情况一:从正常序的列移箱到正常序的列,如果移箱后增加箱的列仍为正常序的列,栈复杂度不变,否则栈复杂度增加1;
情况二:从正常序的列移箱到非正常序的列,栈复杂度增加1;
情况三:从非正常序的列移箱到正常序的列,如果移箱后正常序的列仍为正常序的列,则栈复杂度减小1,否则栈复杂度不变;
情况四:从非正常序的列移箱到非正常序的列,栈复杂度不变。
原则二:定义最少翻箱次数为M(A),则M(A)≥δ(A)。
说明:由原则一知,要使栈复杂度减小1需要翻箱的次数大于等于1,所以要使栈复杂度减则最少翻箱次数M(A)≥δ(A)。
原则三:A翻9次以后得到B,满足δ(A)<δ(B)的路径中一定有最优路径。
说明:要使δ(A)减少1所需步骤最多的极限状态是A状态中只要交换Ai和Aj列的最下面两个集装箱就可得到栈复杂度为0的状态,这时只需要交换Ai和Aj列的最下面两个集装箱,所需要的翻箱步骤是9步,所以A翻9次以后得到B,满足δ(A)<δ(B)的路径中一定有最优路径。
原则四:A→A1→A2→A3→A4,如果
δ(A)= δ(A1)= δ(A2)= δ(A3)= δ(A4)
且没有空列,则此路径不再搜索。
原则五:集装箱的最大等级为k,又设在所有列最底下一层没有k的集装箱,则一定要将某列清空。
(一)根据栈复杂度淘汰无用状态
搜索过程中计算每介新得到的栈状态的复杂度,根据原则三可以把那些栈复杂度不符合要求的栈状态进行剪去,即不把这样的状态放入队列中,这样可以使搜索树的规模减小。
(二)阻止已有状态的重复产生
最简单的一种情况:一个集装箱连续搬两个位置产生的状态会和只搬一次产生的某个状态完全一样。如下图:从A的第二列移箱到第五列产生栈状态A1,从A的第二列移箱到第四列产生栈状态A2,然后从A2的第四列移箱到第五列产生栈状态A3,则A3是和A1重复的栈状态。这样的状态需要阻止它的产生。具体阻止办法:每个栈状态里都有这个状态是由其父状态的哪一列(columnfrom)移箱到哪一列(columnto)而得到的记录columnfrom和columnto。如A2中columnfrom=2,columnto=4,当从状态A2产生状态A3时要移动的箱在第四列等于A2的columnto,此时的新状态不需要产生。即当一个状态选取的要移箱的列等于它的~columnto时不需要移箱。
普遍情况:一个状态要移动的集装箱所牵涉到要变化的两个列和这个状态的父状态中对应的两个列中的集装箱摆放完全相同,这样产生的状态会和其某个兄弟状态所产生的状态相同。如下图:从A的第二列移箱到第五列产生A1(columnfrom=2,columnto=5),从A的第三列移箱到第六列产生A2(columnfrom=3,columnto=6);然后从A1的第三列移箱到第六列产生的A11(columnfrom=3,columnto=6)和从A2的第二列移箱到第五列产生的A21(columnfrom=2,columnto=5)是重复的状态。因为A11和A21我们必须允许一个产生,所以我们要控制好使A1产生那样的新状态还是使A2产生那样的新状态。我们的控制办法:如果一个状态将要移的箱所在的列小于等于这个状态的columnfrom则不需考虑任何因素移箱;如果一个状态将要移的箱所在的列大于这个状态的columnfrom则进行以下比较:假设这个状态要把一个箱从x列移到y列,把这个状态的x列和y列分别与其父状态的x列和y列进行比较,如果完全一样不用移箱,否则移箱。如下图中,A1将要移的箱在第三列大于其columnfrom=2,所以把A1的第三列和第六列与其父状态A的第三列和第六列进行比较,结果完全一样,所以不需产生A11;A2将要移的箱在第二列小于其columnfrom=3,所以移箱产生A21。
本算法的程序代码的编写已经完成,经过在码头用实际数据的测试,其运行状况良好,可实时地计算出翻箱的最佳步骤,节省大量的人力劳动和机械的设备的劳动,很好地解决了集装箱翻箱问题,从而大大地提高工作效率和经济效益。
