本發(fā)明涉及分揀小車路徑規(guī)劃領(lǐng)域,尤其是一種適用于矩陣式倉庫的分揀小車的路徑規(guī)劃方法。
背景技術(shù):
隨著電商業(yè)以及物流業(yè)的迅猛發(fā)展,快遞的分揀已經(jīng)成為限制物流發(fā)展的一個(gè)重要環(huán)節(jié)。傳統(tǒng)的快遞分揀采用人工分揀的模式,但是人工分揀存在成本高、錯(cuò)誤率高,以及效率低等問題。因此,采用新型的快遞分揀方式,提高快遞分揀效率已經(jīng)成為具有較強(qiáng)學(xué)術(shù)意義和實(shí)際應(yīng)用價(jià)值的研究問題。
為了解決上述問題,孟超在論文《具備自動(dòng)優(yōu)化揀貨路徑功能的倉庫管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》中,介紹了一種有自動(dòng)分揀貨物功能的倉庫模型,并對揀貨路徑的優(yōu)化作了相關(guān)研究。文生平等人在論文《基于遺傳算法的分揀機(jī)器人最優(yōu)路徑規(guī)劃》中,采用遺傳算法對分揀機(jī)器人的路徑進(jìn)行了優(yōu)化。記者錢童心在第一財(cái)經(jīng)日報(bào)《進(jìn)擊的“小橙人”》一文中,報(bào)道了一種能夠在矩陣式倉庫中自動(dòng)分揀貨物的機(jī)器人。禹鑫燚等人在專利《適用于倉庫環(huán)境的改進(jìn)a*機(jī)器人最優(yōu)路徑規(guī)劃方法》中,通過引入改進(jìn)的a*算法對機(jī)器人的路徑進(jìn)行了優(yōu)化。李江抒在論文《多移動(dòng)機(jī)器人路徑規(guī)劃算法與導(dǎo)航系統(tǒng)研究》中,研究了多移動(dòng)機(jī)器人路徑規(guī)劃算法。吳曉雨在論文《物流系統(tǒng)中agv路徑規(guī)劃算法的研究》中,對多agv路徑規(guī)劃算法進(jìn)行了研究。顏波在論文《車載自主導(dǎo)航系統(tǒng)中的動(dòng)態(tài)最優(yōu)路徑規(guī)劃》中,對地圖模型的建立方法以及小車的動(dòng)態(tài)最優(yōu)路徑規(guī)劃方法進(jìn)行了研究。史恩秀等人在論文《基于蟻群算法的移動(dòng)機(jī)器人全局路徑規(guī)劃方法研究》中,采用蟻群算法對分揀機(jī)器人的路徑進(jìn)行了規(guī)劃。朱大奇等人在論文《移動(dòng)機(jī)器人路徑規(guī)劃技術(shù)綜述》中,介紹了模版匹配路徑規(guī)劃技術(shù)、人工勢場路徑規(guī)劃技術(shù)、地圖構(gòu)建路徑規(guī)劃技術(shù)等路徑規(guī)劃方法。
經(jīng)文獻(xiàn)調(diào)研分析,目前已提出的分揀機(jī)器人的行進(jìn)路徑主要通過a*算法、蟻群算法、遺傳算法等來進(jìn)行優(yōu)化。但是在大量分揀機(jī)器人同時(shí)行進(jìn)的過程中,通過以上算法優(yōu)化出的路徑并沒有充分考慮其他分揀機(jī)器人行進(jìn)路徑對當(dāng)前機(jī)器人路徑規(guī)劃產(chǎn)生的影響,從而增加了分揀機(jī)器人行進(jìn)過程出現(xiàn)擁堵現(xiàn)象的概率,造成分揀效率的降低。
技術(shù)實(shí)現(xiàn)要素:
為了克服現(xiàn)有機(jī)器人路徑規(guī)劃算法引起機(jī)器人行進(jìn)過程出現(xiàn)擁堵現(xiàn)象,從而造成分揀效率降低的不足,本發(fā)明抽象了含有時(shí)間項(xiàng)t的矩陣式倉庫模型,提出了一種分揀效率較高的適用于該倉庫的分揀小車路徑的規(guī)劃方法。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
一種適用于矩陣式倉庫的分揀小車路徑規(guī)劃方法,所述方法包括如下步驟:
步驟1、建立倉庫模型a[m,n,k,t],所述a[m,n,k,t]為一四維數(shù)組;
所述a[m,n,k,t]中的m,n分別代表實(shí)際矩陣式倉庫的橫向維度和縱向維度,所述a[m,n,k,t]中k代表每個(gè)網(wǎng)格節(jié)點(diǎn)上的子節(jié)點(diǎn)數(shù),所述a[m,n,k,t]中t代表時(shí)間項(xiàng);
步驟2、小車路線信息導(dǎo)入倉庫模型a[m,n,k,t],過程如下:
步驟2.1、接收小車路線信息,所述小車路線信息用一結(jié)構(gòu)體數(shù)組r[p_n]表示;
結(jié)構(gòu)體r中包含m、n、k、t四個(gè)數(shù)據(jù),所述p_n表示小車路線中經(jīng)過的網(wǎng)格節(jié)點(diǎn)數(shù);所述結(jié)構(gòu)體r中的m表示橫向坐標(biāo),所述結(jié)構(gòu)體r中的n表示縱向坐標(biāo),所述結(jié)構(gòu)體r中的t表示到達(dá)節(jié)點(diǎn)時(shí)間,所述結(jié)構(gòu)體r中的k表示轉(zhuǎn)向信息,當(dāng)小車由西轉(zhuǎn)向南或由北轉(zhuǎn)向東時(shí),k取1;當(dāng)小車由南轉(zhuǎn)向東或由北轉(zhuǎn)向西時(shí),k取2;當(dāng)小車由北轉(zhuǎn)向西或由東轉(zhuǎn)向南時(shí),k取3;當(dāng)小車由東轉(zhuǎn)向北或由南轉(zhuǎn)向西時(shí),k取4;
步驟2.2、導(dǎo)入小車路線信息到倉庫數(shù)學(xué)模型中,過程如下:
步驟2.2.1、取一臨時(shí)變量tp=0;
步驟2.2.2、判斷tp<p_n是否成立,若不成立則結(jié)束步驟2,若成立則向下執(zhí)行;
步驟2.2.3、取一臨時(shí)變量i,從0開始以增量1遞增取值,依次執(zhí)行公式(1),直到i的值等于a[r[tp].m,r[tp].n,r[tp].k,r[tp].t];公式(1)如下:
a[r[tp].m,r[tp].n,r[tp].k,r[tp].t+i]=a[r[tp].m,r[tp].n,r[tp].k,r[tp].t]+1-i(1)
步驟2.2.4、臨時(shí)變量tp自增1,跳轉(zhuǎn)到步驟2.2.2;
步驟3、搜索小車路徑,具體過程如下:
步驟3.1、確定分揀小車的起點(diǎn)坐標(biāo)q(x_q,y_q)和終點(diǎn)坐標(biāo)e(x_e,y_e);
步驟3.2、建立兩個(gè)列表j、y,所述列表j存放將要訪問的節(jié)點(diǎn),所述列表y存放已經(jīng)訪問過的節(jié)點(diǎn);
步驟3.3、將起點(diǎn)存入列表j,并將所述起點(diǎn)的到達(dá)時(shí)間t以及平均速度v設(shè)為0,將所述起點(diǎn)的方向設(shè)為向東;
步驟3.4、取列表j中平均速度v最大的節(jié)點(diǎn)m(x_m,y_m);
步驟3.5、以節(jié)點(diǎn)m(x_m,y_m)為中心,取其水平以及垂直方向上的滿足條件(2)或條件(3)并且不包含在列表y中的鄰點(diǎn)n(x_n,y_n),條件(2)和條件(3)的公式如下:
上式中,x_q和y_q分別為起點(diǎn)的橫、縱坐標(biāo),x_n和y_n分別為鄰點(diǎn)的橫、縱坐標(biāo),x_e和y_e分別為終點(diǎn)的橫、縱坐標(biāo);
步驟3.6、設(shè)定鄰點(diǎn)n的方向,所述鄰點(diǎn)n的方向具體表示鄰點(diǎn)n相對于節(jié)點(diǎn)m的方向;
步驟3.7、依次計(jì)算鄰點(diǎn)的到達(dá)時(shí)間t_n。鄰點(diǎn)到達(dá)時(shí)間t_n的具體計(jì)算公式如下:
上式中,t_m為節(jié)點(diǎn)m的到達(dá)時(shí)間,四維數(shù)組值a[x_m,y_m,k_1,int(t_m)]和a[x_m,y_m,k_2,int(t_m+a[x_m,y_m,k_1,int(t_m)]+t_a/t_z)]為倉庫數(shù)學(xué)模型a[m,n,k,t]中指定坐標(biāo)的值,k_3為轉(zhuǎn)向因子,當(dāng)鄰點(diǎn)n的方向與節(jié)點(diǎn)m的方向相同、相反或相垂直時(shí),k_3分別取0、2、1;t_z為分揀小車旋轉(zhuǎn)90°所花的時(shí)間,t_a為分揀小車在不出現(xiàn)擁堵的情況下向前行進(jìn)一個(gè)節(jié)點(diǎn)所花的時(shí)間;
所述a[x_m,y_m,k_1,int(t_m)]和a[x_m,y_m,k_2,int(...)]中的x_m和y_m為節(jié)點(diǎn)m的橫縱坐標(biāo),int()表示取整運(yùn)算,k_1和k_2根據(jù)節(jié)點(diǎn)m和鄰點(diǎn)n的方向取值;當(dāng)節(jié)點(diǎn)m向東或者向南,并且鄰點(diǎn)n向北或向東時(shí),k_1和k_2取1和2;當(dāng)節(jié)點(diǎn)m向西或者向北,并且鄰點(diǎn)n向南或向西時(shí),k_1和k_2取4和3;當(dāng)節(jié)點(diǎn)m向南,并且鄰點(diǎn)n向南或向西時(shí),k_1和k_2取1和3;當(dāng)節(jié)點(diǎn)m向北,并且鄰點(diǎn)n向北或向東時(shí),k_1和k_2取4和2;
步驟3.8、依次計(jì)算鄰點(diǎn)的到達(dá)平均速度,平均速度具體計(jì)算公式如下:
n_v=t_n/(|x_q-x_e|+|y_q-y_e|)(5)
步驟3.9、將鄰點(diǎn)n的父節(jié)點(diǎn)設(shè)為節(jié)點(diǎn)m;
步驟3.10、判斷鄰點(diǎn)n是否為終點(diǎn)e,若是則結(jié)束步驟3,并得到路徑;
步驟3.11、遍歷列表j,若列表j中沒有包含鄰點(diǎn)n,或者列表j中已經(jīng)包含鄰點(diǎn)n并且列表j中鄰點(diǎn)n的平均速度比新計(jì)算的鄰點(diǎn)n的平均速度小,則添加新計(jì)算的鄰點(diǎn)n到列表j中,若列表j中以及包含鄰點(diǎn)n,則覆蓋原列表j中的鄰點(diǎn)n;
步驟3.12、將節(jié)點(diǎn)m存入列表y中并跳轉(zhuǎn)到步驟3.4;
步驟4、更新倉庫模型a[m,n,k,t],所述倉庫模型a[m,n,k,t]每隔時(shí)間t_z更新一次,所述t_z為小車實(shí)際轉(zhuǎn)向所花時(shí)間,處理公式如下:
a[m,n,k,0]=0(6)
a[m,n,k,t]=a[m,n,k,t+1](7)
以上兩式中,m依次取0到m,n依次取0到n,k依次取0到k,t依次取0到t;
步驟5、將小車路線信息存入結(jié)構(gòu)體數(shù)組r[p_n]中,并返回至步驟2;
步驟6、輸出小車路徑信息。
本發(fā)明的技術(shù)構(gòu)思為:首先抽象出矩陣式倉庫的數(shù)學(xué)模型,在該數(shù)學(xué)模型中標(biāo)明了各個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)在特定時(shí)間的轉(zhuǎn)向車輛數(shù)。在規(guī)劃路徑的過程中,考慮小車轉(zhuǎn)向、直線行進(jìn)所花的時(shí)間以及小車等待其他車輛轉(zhuǎn)向所花的時(shí)間,優(yōu)先搜索所花時(shí)間少,行進(jìn)速度快的路線。搜索出路徑后,將路徑信息導(dǎo)入倉庫的數(shù)學(xué)模型中,并進(jìn)行下一輪的路徑規(guī)劃。
本發(fā)明的有益效果主要表現(xiàn)在:本發(fā)明的技術(shù)方案提出的路徑規(guī)劃方法能夠有效的減少小車在行進(jìn)過程中轉(zhuǎn)向所花的時(shí)間以及等待其他車輛轉(zhuǎn)向所花的時(shí)間,降低小車的擁堵概率,提高小車的分揀效率。
附圖說明
圖1是矩陣式倉庫模型示意圖。
圖2是一種適用于矩陣式倉庫的分揀小車路徑規(guī)劃方法示意圖。
圖3是小車路徑搜索的流程圖。
具體實(shí)施方式
下面結(jié)合附圖對本發(fā)明作進(jìn)一步描述。
參照圖1~圖3,一種適用于矩陣式倉庫的分揀小車路徑規(guī)劃方法,所述方法包括如下步驟:
步驟1、建立倉庫模型a[m,n,k,t],所述a[m,n,k,t]為一四維數(shù)組。
進(jìn)一步,所述a[m,n,k,t]中的m,n分別代表實(shí)際矩陣式倉庫的橫向維度和縱向維度。所述a[m,n,k,t]中k代表每個(gè)網(wǎng)格節(jié)點(diǎn)上的子節(jié)點(diǎn)數(shù),k取4。所訴a[m,n,k,t]中t代表時(shí)間項(xiàng),t取[30,120]間的整數(shù)。
本實(shí)施例中,m和n為20和15,k為4,t為120,倉庫模型為a[20,15,4,120]。
步驟2、小車路線信息導(dǎo)入倉庫模型a[m,n,k,t],過程如下:
步驟2.1、接收小車路線信息,所述小車路線信息用一結(jié)構(gòu)體數(shù)組r[p_n]表示。
進(jìn)一步,結(jié)構(gòu)體r中包含m、n、k、t四個(gè)數(shù)據(jù),所述p_n表示小車路線中經(jīng)過的網(wǎng)格節(jié)點(diǎn)數(shù)。
更進(jìn)一步,所述結(jié)構(gòu)體r中的m表示橫向坐標(biāo),所述結(jié)構(gòu)體r中的n表示縱向坐標(biāo),所述結(jié)構(gòu)體r中的t表示到達(dá)節(jié)點(diǎn)時(shí)間,所述結(jié)構(gòu)體r中的k表示轉(zhuǎn)向信息。當(dāng)小車由西轉(zhuǎn)向南或由北轉(zhuǎn)向東時(shí),k取1。當(dāng)小車由南轉(zhuǎn)向東或由北轉(zhuǎn)向西時(shí),k取2。當(dāng)小車由北轉(zhuǎn)向西或由東轉(zhuǎn)向南時(shí),k取3。當(dāng)小車由東轉(zhuǎn)向北或由南轉(zhuǎn)向西時(shí),k取4。
步驟2.2、導(dǎo)入小車路線信息到倉庫數(shù)學(xué)模型中,過程如下:
步驟2.2.1、取一臨時(shí)變量tp=0。
步驟2.2.2、判斷tp<p_n是否成立,若不成立則結(jié)束步驟2,若成立則向下執(zhí)行。
步驟2.2.3、取一臨時(shí)變量i,從0開始以增量1遞增取值,依次執(zhí)行公式(1),直到i的值等于a[r[tp].m,r[tp].n,r[tp].k,r[tp].t];
公式(1)如下:
a[r[tp].m,r[tp].n,r[tp].k,r[tp].t+i]=a[r[tp].m,r[tp].n,r[tp].k,r[tp].t]+1-i(1)
步驟2.2.4、臨時(shí)變量tp自增1,跳轉(zhuǎn)到步驟2.2.2。
步驟3、搜索小車路徑,具體過程如下:
步驟3.1、確定分揀小車的起點(diǎn)坐標(biāo)q(x_q,y_q)和終點(diǎn)坐標(biāo)e(x_e,y_e)。
步驟3.2、建立兩個(gè)列表j、y,所述列表j存放將要訪問的節(jié)點(diǎn),所述列表y存放已經(jīng)訪問過的節(jié)點(diǎn)。
本實(shí)施例中計(jì)算三輛小車的路徑,三輛小車的發(fā)車時(shí)間緊挨,起點(diǎn)都為q(0,0),終點(diǎn)為e(7,8)。
步驟3.3、將起點(diǎn)存入列表j,并將所述起點(diǎn)的到達(dá)時(shí)間t以及平均速度v設(shè)為0,將所述起點(diǎn)的方向設(shè)為向東。
步驟3.4、取列表j中平均速度v最大的節(jié)點(diǎn)m(x_m,y_m)。
步驟3.5、以節(jié)點(diǎn)m(x_m,y_m)為中心,取其水平以及垂直方向上的滿足條件(2)或條件(3)并且不包含在列表y中的鄰點(diǎn)n(x_n,y_n),條件(2)和條件(3)的公式如下:
上式中,x_q和y_q分別為起點(diǎn)的橫、縱坐標(biāo),x_n和y_n分別為鄰點(diǎn)的橫、縱坐標(biāo),x_e和y_e分別為終點(diǎn)的橫、縱坐標(biāo)。
步驟3.6、設(shè)定鄰點(diǎn)n的方向,所述鄰點(diǎn)n的方向具體表示鄰點(diǎn)n相對于節(jié)點(diǎn)m的方向。
步驟3.7、依次計(jì)算鄰點(diǎn)的到達(dá)時(shí)間t_n,鄰點(diǎn)到達(dá)時(shí)間t_n的計(jì)算公式如下:
上式中,t_m為節(jié)點(diǎn)m的到達(dá)時(shí)間,四維數(shù)組值a[x_m,y_m,k_1,int(t_m)]和a[x_m,y_m,k_2,int(t_m+a[x_m,y_m,k_1,int(t_m)]+t_a/t_z)]為倉庫數(shù)學(xué)模型a[m,n,k,t]中指定坐標(biāo)的值,k_3為轉(zhuǎn)向因子,當(dāng)鄰點(diǎn)n的方向與節(jié)點(diǎn)m的方向相同、相反或相垂直時(shí),k_3分別取0、2、1。t_z為分揀小車旋轉(zhuǎn)90°所花的時(shí)間,t_a為分揀小車在不出現(xiàn)擁堵的情況下向前行進(jìn)一個(gè)節(jié)點(diǎn)所花的時(shí)間。
進(jìn)一步,所訴a[x_m,y_m,k_1,int(t_m)]和a[x_m,y_m,k_2,int(...)]中的x_m和y_m為節(jié)點(diǎn)m的橫縱坐標(biāo),int()表示取整運(yùn)算,k_1和k_2根據(jù)節(jié)點(diǎn)m和鄰點(diǎn)n的方向取值。當(dāng)節(jié)點(diǎn)m向東或者向南,并且鄰點(diǎn)n向北或向東時(shí),k_1和k_2取1和2。當(dāng)節(jié)點(diǎn)m向西或者向北,并且鄰點(diǎn)n向南或向西時(shí),k_1和k_2取4和3。當(dāng)節(jié)點(diǎn)m向南,并且鄰點(diǎn)n向南或向西時(shí),k_1和k_2取1和3。當(dāng)節(jié)點(diǎn)m向北,并且鄰點(diǎn)n向北或向東時(shí),k_1和k_2取4和2。
步驟3.8、依次計(jì)算鄰點(diǎn)的到達(dá)平均速度,平均速度計(jì)算公式如下:
n_v=t_n/(|x_q-x_e|+|y_q-y_e|)(5)
步驟3.9、將鄰點(diǎn)n的父節(jié)點(diǎn)設(shè)為節(jié)點(diǎn)m。
步驟3.10、判斷鄰點(diǎn)n是否為終點(diǎn)e,若是則結(jié)束步驟3,并得到路徑。
步驟3.11、遍歷列表j,若列表j中沒有包含鄰點(diǎn)n,或者列表j中已經(jīng)包含鄰點(diǎn)n并且列表j中鄰點(diǎn)n的平均速度比新計(jì)算的鄰點(diǎn)n的平均速度小,則添加新計(jì)算的鄰點(diǎn)n到列表j中,若列表j中以及包含鄰點(diǎn)n,則覆蓋原列表j中的鄰點(diǎn)n。
步驟3.12、將節(jié)點(diǎn)m存入列表y中并跳轉(zhuǎn)到步驟3.4。
步驟4、更新倉庫模型a[m,n,k,t],所述倉庫模型a[m,n,k,t]每隔時(shí)間t_z更新一次,所述t_z為小車實(shí)際轉(zhuǎn)向所花時(shí)間,體處理公式如下:
a[m,n,k,0]=0(6)
a[m,n,k,t]=a[m,n,k,t+1](7)
以上兩式中,m依次取0到m,n依次取0到n,k依次取0到k,t依次取0到t。
步驟5、將小車路線信息存入結(jié)構(gòu)體數(shù)組r[p_n]中,并返回至步驟2。
步驟6、輸出小車路徑信息。
在本實(shí)施例中,一號小車的路徑信息為(0,0)—>(1,0)—>(2,0)—>(3,0)—>(4,0)—>(5,0)—>(6,0)—>(7,0)—>(7,1)—>(7,2)—>(7,3)—>(7,4)—>(7,5)—>(7,6)—>(7,7)—>(7,8)。二號小車的路徑信息為(0,0)—>(1,0)—>(2,0)—>(3,0)—>(4,0)—>(5,0)—>(6,0)—>(7,0)—>(7,1)—>(7,2)—>(7,3)—>(7,4)—>(7,5)—>(7,6)—>(7,7)—>(7,8)。三號小車的路徑信息為(0,0)—>(0,1)—>(0,2)—>(0,3)—>(0,4)—>(0,5)—>(0,6)—>(0,7)—>(0,8)—>(1,8)—>(2,8)—>(3,8)—>(4,8)—>(5,8)—>(6,8)—>(7,8)。一號小車和二號小車的路徑信息相同,二號小車在節(jié)點(diǎn)(7,0)上等待了一號小車轉(zhuǎn)向,發(fā)生了輕度擁堵。所以當(dāng)三號小車規(guī)劃路徑時(shí),選擇了與一號小車和二號小車不同的路徑,避開了擁堵節(jié)點(diǎn),減輕了道路擁堵。