結合有趣的實際案例講解:網約車的派單、調度

26 評論 30858 瀏覽 292 收藏 21 分鐘

希望講的不要太像數學課,enjoy~

派單流程

首先整體看一下司乘及背后的派單邏輯:

我們把乘客打車分成了 3 類場景:

  • 立即叫車(A 流程):用車時間距當前時間小于等于 N 分鐘;
  • 非高峰預約用車(B 流程):用車時間距當前時間大于 N 分鐘,但用車時間非高峰時間段;
  • 高峰預約用車(C 流程):用車時間距當前時間大于 N 分鐘,且用車時間在高峰時間段。

A 流程

用車時間距當前時間小于等于 N 分鐘的用車,會采取「立即派單」的方式:

  1. 找到所有符合條件的司機:上班狀態、服務狀態、距離、司機類型等;
  2. 司機排序:熱區圍欄號碼、配置距離等;
  3. 派單:對于自營司機采取派單制,對于非自營司機采取搶單制。

B 流程

用車時間距當前時間大于 N 分鐘,但用車時間處于非高峰時間段,會采取「叫車成功,到時再派司機」的方式:

  1. 是否超出該時段該圍欄的預約上限,若超過會走超預約上限派單流程;
  2. 司機篩選、排序同 A 流程;
  3. 非當時分配司機的預約單,會有一個失敗后每隔兩分鐘的輪詢機制;
  4. 經過三輪輪詢后仍未成功的訂單,會轉進人工處理。

C 流程

用車時間距當前時間大于 N 分鐘,且用車時間在高峰時間段,會采取「預約單,立即派司機」的方式:

  1. 司機篩選:除與 B 流程相同的規則外,司機可以選擇是否接聽此類訂單(風險較高);
  2. 高峰訂單主要集中在早、晚、凌晨,所以篩選司機是按照距司機家庭住址距離,而不是距當前位置距離;
  3. 也會采取 3 輪的派單輪詢,與 B 流程不同的是,如果無人接單,派單會立即失敗,不會進入人工派單。

熱區排隊

還有一個不得不提的流程是,針對機場火車站這類單大人多的圍欄,這一區域的派單有兩個最大的問題:

  • 大家距離都差不多,為啥先派給他,不派給我?
  • 司機都希望去撈一票大的,排很久接個小單會很不爽。

  1. 首先需要配置若干熱區圍欄,以便于后續規則的設計;
  2. 觸發排隊規則包含 3 種場景:空駛入隊、服務入隊、上班入隊;
  3. 針對每個圍欄會有圍欄上限,超過上限時僅能排隊,但不能切換到接單狀態(防止司機在圍欄等待過長時間);
  4. 排隊基本按照司機的入隊時間,派單時的司機順序與上述流程大致類似;
  5. 接單超時時長:司機主動駛處、接單成功等情況下會駛出熱區,其中針對接單出隊這種情況會設置一個接單超時時長,若司機在此時間范圍內歸隊,則仍能保留原有排號,這樣就解決了司機對接小單的抱怨。

當然,派單中遇到的問題遠不只此,如超出預約上線就不派了么?車型降級怎么兼容?不同城市道路的限行問題 等等就不在此贅述,有時間可以另起一個話題來聊~

調度流程

1. 空車調度系統介紹

系統自動預測當前城市未來半小時之內的車輛與訂單的分布情況,以系統六邊形格子為單位,將缺車區域與富余車輛區域相匹配,將富裕的車調往缺車區域,使該城市的訂單需求能更好地被滿足。

同時司機接到系統發起的空車調度單并按要求到達目的地后,可快速地接到訂單,更好地完成自己的績效。另外,系統調度無需人工干預,由系統經過一系列預測和計算之后,智能的、精準的匹配供需。

2. 調度目標

對每個格子,我們可以預測出其30分鐘后的成功訂單數succOrder,空閑車輛數freeCar。

我們定義:

  • 當succOrder大于freeCar時,本格子是需求格子(S),需求數量為succOrder-freeCar。
  • 當succOrder小于freeCar時,本格子是供給格子(D),供給數量為freeCar- succOrder。

我們的目標就是從D向S調度車,使得全城的需求格子的需求數盡量變為0,即,我們乘客的需求盡量被滿足。在實際問題上,這并不容易,主要是因為以下三個問題。

3. 調度問題

調度主要遇到以下3個問題:

(1)派單距離會大于格子距離,一些調度不需要

六邊形格子相對于傳統的人工圍欄來說,單位面積更小,反映城市的供需情況更加精確,然而帶來的一個問題是,專車下單時,派單半徑較大,可能會覆蓋到周圍的六邊形格子,如圖:

圖中紅色的a塊是缺車區域,鄰近的α、β是多車區域,如果直接按照簡單的調度算法,就可能將α、β塊的車輛調入a塊。但a塊在下單時向周圍輻射的派單半徑將α、β塊都囊括其中,α、β塊中的車輛能夠接到a塊的訂單,所以沒有必要發起空車調度。

我們需要界定,哪些供給與需求之間需要調車,而哪些不需要。

(2)真實的需求,真實的供給

例如,下圖的三個連續的格子,經過預測,我們得知A區域是需求區域,需要3輛車:D(3),B區域是供給區域S(4),C是D(3)。A的派單距離只能看到B,看不到C。

那么,從A看來,自身的需求可以被派單區域內的B滿足,整體看來應該是S(1)。但是如果我們多看一步,就會發現,B區域還要去滿足C,使得B不能同時滿足A和C。而如果我們“再多看一步”,也許C的旁邊還有個供給區域S(4),也許沒有。

為了計算A區域是否真的“不缺車”,我們“連鎖反應的”考察了其相鄰的相鄰的格子,我們甚至可能要掃描全城的格子。

我們需要找出,如果經過全盤考慮后,那些格子是真實的供給,那些是真實的需求。

(3)最后的供給與需求如何做匹配

假如我們找到了真實的供給和需求后,如何找到一種匹配方法,使得最后供給與需求之間的調度代價(調度距離總和)最小。

例如在下面的例子中,我們的調度應該是(a2-γ1 、b1-δ1)還是(a2-δ1 、b1-γ1)?

4. 調度算法

針對問題1、2,我們使用了抹平算法;針對問題3,我們使用了km匹配算法。

六邊形調度算法的流程可概括如下:預測30分鐘之后的供需分布 → 抹平算法抵消不必要的空車調度 → KM算法計算最小調車成本 → 發起調度。

(1)抹平算法

1)概述

抹平算法的目的是將鄰近六邊形塊的供給和需求相互抵消,避免不必要的空車調度。抹平算法利用了二分圖最大匹配的思想,將供給和需求單位看作左右子圖進行配對,并利用匈牙利算法得到最大匹配。匹配完成后,二分圖里所有邊兩端的頂點視為相互抵消,剩余的頂點即為真正的缺車和多車

2)例子

舉例說明:

假設上圖中,紅色的a、b塊是某城市所有的缺車區域,數字-3、-2代表a塊缺3輛車,b塊缺2輛車。藍色的α、β、γ、δ為多車區域,分別富余2、1、1、1輛車。

對于a、b兩個缺車區域而言,假設派單半徑能夠覆蓋周圍一圈六邊形,那么α能夠直接滿足a塊的訂單需求,β塊能直接滿足b塊的用車需求,所以α塊無需發起向a塊的空車調度,β塊也無需發起對b塊的空車調度,需要進行抹平計算。

給該城市所有缺車需求和富余車輛進行編號,如下圖:

由六邊形塊的鄰近關系得知,α1、α2可直接滿足a塊的用車需求,β1可直接滿足b塊的用車需求,根據這個關系,可以得出一個二分圖如下:

圖中虛線代表了可能的匹配關系,基于以上前提,可以計算一個最大匹配(即盡可能多地將左右子圖兩兩匹配)。利用匈牙利算法,可以求得一個最大匹配,如:

匹配完成后,我們發現左圖剩下了a2、b1,右圖剩下了γ1、δ1 。也就是說a塊和b塊都還有一個需求沒有被滿足,γ和δ塊仍然有多余的車輛:

到此,可以得出a塊和b塊真正的缺車數量為都為1,接下來可對于a、b和γ、δ進行下一步的匹配,生成空車調度單。

3)總結

抹平算法利用了二分圖最大匹配的思想,將全城所有的供給和需求構建二分圖,以六邊形鄰近關系做為二分圖可能的匹配,并計算一個最大匹配來抵消鄰近的供需。匹配完成后,剩余的頂點可視為真正的需求和供給,下一步再利用KM算法,計算調車成本最小的匹配關系。

(2)KM算法

1)概述

空車調度中,利用KM算法的核心目的是,對于多個需求和供給,尋求一種最優匹配,使調度的總成本(行駛距離)最小。

2)例子

上一步抹平算法的例子中,全城的供需分布經過抹平后,剩余a2、b1和γ1、δ1是真正的需求和供給。下一步計算時,就會產生兩種匹配結果,(a2-γ1 、b1-δ1) 和(a2-δ1 、b1-γ1),這兩種結果哪種是最優的呢?

假設他們之間的距離如下圖:

a2距γ1為6km,b1距δ1為7km,a2距δ1為3km,b1距γ1為5km。

如果按照(a2-γ1 、b1-δ1)進行匹配,距離總和為6+7=13km。

如果按照(a2-δ1 、b1-γ1)進行匹配,距離總和為3+5=8km。

所以第二種匹配方案距離總和最低,成本最小。利用km算法可快速計算出距離總和最低的匹配方案。

實操中解的一些有趣的 case

1. 搶單失敗的提示

事情是這樣,在搶單列表中,司機可以點擊搶單按鈕進行搶單,但是,會有多種情況導致搶單失敗,其中有兩類:

  1. 點擊搶單時,訂單已經被別人搶走;
  2. 點擊搶單時,訂單已經超時(系統有自動派單機制兜底,訂單在 N 分鐘內沒人搶單判定為超時,系統會自動派單)。

對于這樣的情況,在一開始都給司機做出了明確的反饋:

  • 訂單已被搶
  • 訂單已超時

但是,上線后反饋卻很不好:「明明已經超時了,為什么還要顯示在頁面上讓我們搶,搶又搶不到!」確實,這樣的做法很不好。搶單是一個對效率要求很高的環節,在這樣的反復搶單失敗中,嚴重損害了司機搶單的積極性。

不得已,只能在待搶單列表中增加了定時刷新的機制,每隔1分鐘刷新列表。這樣可以過濾掉部分已經被搶或已經超時的訂單,但還是有部分訂單因為超時而搶單失敗。最后只能做了一個小小的欺騙:將訂單已超時和訂單已被搶的提示都統一成了「手慢了,訂單已被搶」。上線后客服收到的此類反饋驟降,但其實搶單結果上沒有任何差別~

從心理學來說:人們在歸因的時候,更容易得出自己想得到的結論,而不一定是真實的結論。并且出于心理上的自我保護,人們會將導致失敗的外界原因放大,而將自己個人的原因淡化。

當因為訂單超時導致搶單失敗時,司機會抱怨產品的設計問題(外部因素),但是同樣的結果(問題本質并沒有得到改善),“欺騙”司機是因為自己手速慢了,導致訂單被搶,卻沒人再抱怨了(個人因素)。不但沒有抱怨了,反而看到訂單的時候都及時去搶單了,不再挑三揀四,訂單處理的整體效率還得到了提升……

2. 如何在拼車定價時做到大家都滿意

機場火車站是一個任何時候都需求旺盛的地方,在網約車政策越來越收緊的情況下,供給越來越跟不上需求,因此在非專車品類也推出了拼車這種形式。

但是,拼車天然會有一個問題,那就是拼車的人該如何分擔拼車費用呢?舉個栗子大家就明白啦~

熊大、熊二和光頭強都下了飛機打車回家,按照三者的目的地,計算出拼車總價是 18 元,如果不拼車,熊大需要 6 元、熊二需要 11 元、光頭強需要 15 元。

光頭強說:咱們各出 6 塊吧!

熊大聽了怒了:我自己打車回家就 6 塊,跟你倆貨拼還是 6 塊,憑啥!

熊大琢磨了一會:要不這樣吧,第一段的錢咱們 3 個人平分,第二段的錢你們兩個人平分,最后一段就光頭強自己掏了吧。

熊二和光頭強一聽笑了:我倆為了你繞道,居然還要幫你平分你那部分的錢,不拼啦!不拼啦!

熊二說:用我清華池學的博弈論給一個方案吧,假設熊大打車回家途中先后遇到我和光頭強,當然也有可能先遇到光頭強,再遇到我,可能出現的情況如下:

補充一下,從熊大家到光頭強家直線距離的價格為 11 元。

這里的計算思路是:誰先來的誰付錢,后來的補上多出來的錢。

那么以 Case 2 來舉例:

熊大先要回家,所以熊大要付 6 元;這時光頭強加入了,就要補上從熊大家到光頭強家的 11 元;最后熊二只要付 18 -(6+11)= 1 元。

同理可以推導出 6 種情況下每個人的支付金額:

因為每一種情況出現的概率都是相等的,所以平均計算后,熊大需要支付 2.83 元、熊二需要支付5.33 元、光頭強需要支付 9.83 元。

熊二講完,大家都服了~

這個理論其實是博弈論三位大神之一 Shapley 的經典理論,稱為沙普利值(Shapley value),通過考慮各個代理(agent)做出的貢獻,來公平的分配合作收益。代理 i 的沙普利值是 i 對于一個合作項目所期望的貢獻量的平均值。

具體來說,一個合作項目 C=<Ag,v> 是由一些代理(Ag={1,2,…,n},n≥2),和每個代理在這個合作項目中所做的貢獻量的特征方程 v(C)=k((∑i∈C) xi)表示。

3. 派單 or 搶單,哪種才是對平臺司機乘客更好的方式

與滴滴相反,我們是經歷了一個先是全部走平臺派單,后來部分改為搶單的過程。

因為早期,全部是自營司機,領取的是基本工資+績效,他們的每天的工作都是按照拼臺的安排來進行,采取派單能將平臺的效率最大化。

后來,接入了兼職、優駕、出租車等非自營司機,這部分司機習慣于多平臺聽單,如果還是強制派單,很容造成流失,所以針對這一部分采取的搶單。

相較而言,滴滴早期切入市場時,采取的搶單,具有絕對話語權,就改為派單了~

 

作者:小明,不入流產品汪。寫文章是為了督促自己獨立思考,也想看看自己能堅持多久。

本文由 @小明 原創發布于人人都是產品經理。未經許可,禁止轉載。

題圖來自unsplash,基于CC0協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 請問這是自營平臺的派單模式還是可以同理得聚合平臺的派單模式呀

    來自江蘇 回復
  2. 干貨滿滿,算是我看人人都是PM以來,最有價值的一篇了.

    來自上海 回復
  3. 干貨,收藏

    來自上海 回復
  4. 寫的很好,很受啟發,大贊

    來自山東 回復
  5. 還有一個核心問題,如何評價調度做的好還是不好。
    核心評價指標會是什么?

    來自北京 回復
  6. 【派單距離會大于格子距離,一些調度不需要】
    這個場景可能有些問題吧,如果當前是預測中間區域會產生呼單,也應該預先調度?
    通過預先調度縮短接駕時長?提高車輛完成訂單的總時長以提高翻臺率?

    來自北京 回復
  7. 大受啟發

    回復
  8. 看君一席文 勝讀十年書~

    來自浙江 回復
  9. 大神,加你微信可以嗎?

    回復
  10. 不錯,感覺里面還有些老的邏輯,不管怎樣,拜大神受教了

    來自上海 回復
  11. 大佬牛逼啊

    來自浙江 回復
  12. 大佬能否加個微信?

    來自山東 回復
    1. L871750580

      回復
  13. 認真看了一遍有個問題,拼車定價這塊,case3和case4為什么價格順序一樣,case5,6里的1元2元怎么得來的?

    來自天津 回復
    1. case3 熊二先下單付 11 元,然后熊大上車付 6 6-11=1元,光頭強最后下單則是付 18-11-1=6元
      case4 熊二還是付11元,光頭強第二個上車付最后一段的6元,熊大最后下單,付18-11-6=1元

      回復
  14. visio圖太小了看不清楚,有原圖不?

    來自浙江 回復
  15. 既然是寫文章面向大眾的,還希望能夠對專業名詞比如圍欄有個釋義呢

    回復
    1. 這不用拿來主義了吧?百度不會用嗎

      來自廣東 回復
    2. 好的之后注意,簡單的詞可以自己查一下哈~

      回復
  16. 認真看完了
    但是關于最后面講關于拼車,在考慮實際場景的時候有一些疑問:
    拼車都是確定好價格的,但是在火車站機場等地,或者說在高峰時段,如果塞車的話,對于司機來說選擇拼車的積極性就會降低;
    但是如果預估會塞車導致一開始讓乘客支付的價格上漲,但實際上可能又不塞車的話,乘客也會有意見,
    不知道關于這塊作者是怎么處理的

    來自廣東 回復
    1. 1 當時還并不是完全的一口價,還是在一定范圍內浮動的
      2 在供給極度不足的情況下,只能夠通過拼車給司機帶來更高的收益
      3 這要依賴于未來訂單預測足夠準確

      回復
  17. 沒的說,大贊

    來自天津 回復
  18. 高手

    回復
  19. visio圖太小了看不清楚,有大圖嗎

    來自廣東 回復
  20. 很詳細

    回復
  21. 這。。。。

    來自北京 回復