化實戰(zhàn):分位數(shù)預測與多場景隨機規(guī)劃)
1. 項目背景與核心痛點1.1 庫存路徑優(yōu)化到底在解決什么問題做供應鏈優(yōu)化的人對IRPInventory Routing Problem庫存路徑問題一定不陌生。它把兩個原本分開管的決策捏在了一起給誰補貨、補多少以及用什么順序送。傳統(tǒng)做法是銷售預測團隊先給一版需求量計劃團隊照著預測做配送計劃倉儲團隊按計劃備貨三個環(huán)節(jié)各管一段鏈條一長就容易失真。我這次要分享的項目核心是給某零售企業(yè)的區(qū)域配送網(wǎng)絡做一套在線庫存路徑優(yōu)化方案發(fā)表在Transportation Science這個方向上的一次完整落地實踐。場景本身不復雜一個配送中心服務幾十家門店每家門店有獨立的庫存容量和消耗速率配送中心有車輛資源限制每天要在銷量預測的基礎上決定給各家門店送多少貨、走什么路線。難點在于門店的需求是隨機的節(jié)假日、天氣、促銷活動都會造成需求波動。如果你用固定的預測值去排補貨計劃預測偏差大的門店要么庫存積壓要么直接斷貨。斷貨是零售的大忌損失的不只是當天銷量還有顧客信任。積壓也不好看占用資金還增加倉儲成本。所以在真實場景里大家真正想要的是一套能“看得到不確定性”的決策系統(tǒng)而不是只輸出一個平均數(shù)的預測模型。1.2 傳統(tǒng)兩段式方案的三個硬傷先說傳統(tǒng)做法先預測后優(yōu)化Predict-then-Optimize這也是大多數(shù)企業(yè)已經(jīng)在用的框架。第一步用時間序列模型或機器學習模型預測每個門店未來幾天的需求第二步把這些預測值當成真實需求輸入到車輛路徑和補貨量的優(yōu)化模型里求解。聽起來很順但實際跑起來有三個硬傷。第一個硬傷是預測誤差被靜默放大。優(yōu)化模型是確定性的它默認預測值就是真值于是會把最敏感的約束條件卡在預測值的邊界上。比如預測某門店明天賣100件實際可能賣120件車輛調(diào)度的時候剛好少裝了幾件結(jié)果就是斷貨。因為優(yōu)化器不會主動給你留安全余量除非你在模型里顯式地加。第二個硬傷是預測模型和優(yōu)化目標錯位。預測模型訓練時用的是均方誤差或平均絕對誤差衡量的是“預測值離真實值有多近”。但下游決策真正關心的不是預測準不準而是“決策損失”大不大。有時候預測偏了10%因為碰巧不觸發(fā)補貨閾值決策損失是零有時候預測只偏了2%正好卡在閾值附近就會導致漏補一批貨損失很大。預測誤差和決策損失之間不是線性關系這導致預測階段的優(yōu)化目標跟決策目標根本不在一個頻道上。第三個硬傷是缺少場景概念。傳統(tǒng)預測輸出的是一個點估計最多再加個置信區(qū)間但優(yōu)化模型需要的是一組“可能會發(fā)生的需求樣本”而不是一個均值。均值只能代表最可能的情況恰恰忽略了尾部的風險場景。這個項目的核心思路就是把這三點一起解決在預測階段就面向下游決策去建模用多個場景表達不確定性再把場景遞交給優(yōu)化器做魯棒決策。下面我會把這套架構的設計邏輯和實操細節(jié)完整拆開來講。2. 預測后優(yōu)化的整體設計思路2.1 為什么還要用“預測后優(yōu)化”而不是端到端聯(lián)合訓練先解釋一個很多人會問的問題現(xiàn)在深度學習這么流行為什么不直接做端到端的聯(lián)合優(yōu)化把預測模型和優(yōu)化模型糅在一起訓練聯(lián)合優(yōu)化Decision-focused Learning確實是學術熱點思路也很誘人將決策損失直接作為預測模型的訓練損失讓預測模型知道下游要什么從而反向修正自己的輸出。但落地時有個現(xiàn)實障礙——最優(yōu)化求解器是不可導的。庫存路徑問題在數(shù)學上是個混合整數(shù)規(guī)劃MIP內(nèi)部還有車輛路徑選擇解空間非常大。你要把不可導的求解器嵌入神經(jīng)網(wǎng)絡反向傳播需要引入凸近似、解析梯度或者黑盒梯度估計每種方法都伴隨額外的計算開銷和實現(xiàn)復雜度。在工業(yè)項目里我更看重可解釋性和可迭代性。預測后優(yōu)化是一種模塊化設計預測模塊壞了可以單獨換優(yōu)化模塊升級了不影響預測。業(yè)務團隊也能理解這套邏輯——先預測需求再算補貨方案鏈條透明。聯(lián)合訓練的黑盒感太強出了問題很難排查是哪一側(cè)的責任。不過這也意味著我們必須主動去彌合“預測”和“優(yōu)化”之間的縫隙。前面的三個硬傷不解決模塊化反而是放任問題存在。所以我在這套方案里做了一個折中保持模塊化的預測后優(yōu)化框架但在預測端引入決策感知的損失修正在優(yōu)化端引入多場景隨機規(guī)劃。這樣既兼顧了模塊之間的清晰邊界又讓兩個模塊在“信息”層面實現(xiàn)了協(xié)同而不是在“梯度”層面硬耦合。2.2 整體架構從數(shù)據(jù)流看系統(tǒng)的四層結(jié)構整個系統(tǒng)我把它分成四層數(shù)據(jù)層、預測層、場景層、決策層。數(shù)據(jù)層負責匯總門店的歷史銷售流水、促銷日歷、天氣數(shù)據(jù)、庫存水位和配送履歷。這塊的基建很重要因為后面所有模型的效果上限都取決于數(shù)據(jù)的質(zhì)量和粒度。我們做的時候發(fā)現(xiàn)很多門店的銷售數(shù)據(jù)存在漏傳、重復記賬的問題清洗口徑不統(tǒng)一這件事花了整整兩周才理順。預測層是核心模塊之一用了多個模型組成的預測引擎以梯度提升樹模型為主力輔以季節(jié)性時間序列模型做交叉驗證。預測目標是每個門店未來7天逐日的需求分布不只是均值還要給出分位數(shù)。這樣后面生成場景時才有概率信息可用。場景層負責把預測分布轉(zhuǎn)成優(yōu)化器能吃的場景集合。這里用到了分位數(shù)采樣的思想把每天的預測分成多個分位數(shù)段每段代表一種可能的行情組合起來生成數(shù)百個需求場景。場景之間的一致性約束很重要——同一個門店前后兩天的需求量不能出現(xiàn)荒謬的跳躍否則優(yōu)化器會鉆空子。決策層是一個兩階段隨機規(guī)劃模型。第一階段決定車輛的出車路線和整體裝載計劃第二階段根據(jù)場景實現(xiàn)情況進行補貨量的調(diào)整。求解用的是商業(yè)求解器加啟發(fā)式算法混合的框架在可接受的幾分鐘內(nèi)給出可用方案。這四層結(jié)構看著并不花哨難點全部藏在細節(jié)里。下面我逐個模塊說明重點講清楚每一步的選型理由和踩坑經(jīng)過。3. 核心模塊拆解與關鍵實現(xiàn)3.1 需求預測引擎分位數(shù)預測比點預測重要得多我在這類項目里反復驗證過一件事對下游優(yōu)化而言預測分布比分均值重要得多。如果你只給優(yōu)化器一個點預測值它必然會輸出一個緊貼這個值的補貨量和路線方案完全沒有緩沖空間。而如果你給的是一個分位數(shù)區(qū)間優(yōu)化器在做約束規(guī)劃時就能自動權衡“少送導致缺貨”和“多送導致積壓”兩種風險的代價。具體實現(xiàn)上我用LightGBM做了分位數(shù)回歸設置三個目標分位10%、50%、90%。特征工程是重頭戲包括門店維度歷史平均銷量、銷量方差、門店類型、倉儲容量時間維度星期幾、是否節(jié)假日、月份外部變量天氣溫度、降雨概率、促銷事件標記。這里有個容易踩的坑促銷事件的標記一定要做成“促銷前/中/后”三段而不是只打一個促銷日標記。因為零售促銷有很強的透支效應和回補效應促銷當天銷量暴漲促銷后一兩天銷量往往低于基線。如果不處理這個效應預測模型會把促銷前的低值學成常態(tài)導致促銷前備貨不足促銷后庫存積壓。時序交叉驗證是另一個必須做對的事。常規(guī)的K折隨機交叉驗證在時序數(shù)據(jù)上會泄露未來信息必須用滾動窗口的方式訓練集是過去12個月驗證集是緊接著的4周然后窗口逐步向前滾動。我習慣的做法是至少驗證4個滾動窗口覆蓋不同的季節(jié)段避免模型只在某個月份表現(xiàn)好。最后輸出的不只是分位數(shù)還要做一次后校準。用預測區(qū)間覆蓋率的指標來檢查比如10%分位對應的實際覆蓋率應該接近10%如果覆蓋率偏差太大說明模型有系統(tǒng)性偏差需要調(diào)整。這個校準步驟經(jīng)常被忽略但對下游場景生成的影響非常大。3.2 場景生成從分位數(shù)到多階段需求路徑的橋場景層是整個方案里最考驗工程判斷的部分。預測模型輸出每天每個門店的三個分位數(shù)但優(yōu)化器不想要“分位數(shù)”它想要的是“一組完整的需求場景”。我的做法是采用分位數(shù)分段抽樣。具體來說把0到1的累計概率區(qū)間切成L層每一層是一個等概率的分段。比如L10每層覆蓋10%的概率質(zhì)量。然后對每一層取該分段的條件中位數(shù)作為這一層的代表需求量。這樣每個門店每天能抽出10個代表值每個代表值對應一種“行情強度”。接下來要做跨時間的場景拼接。門店第1天的行情弱、第2天的行情強這種組合必須控制在一個合理的聯(lián)合概率范圍內(nèi)不能隨機亂拼。解決方案是為每個門店構造一個馬爾可夫鏈行情狀態(tài)之間的轉(zhuǎn)移概率從歷史數(shù)據(jù)里估計。比如“昨天弱、今天強”的概率是多少直接統(tǒng)計歷史天數(shù)就能得到。場景生成時先按初始狀態(tài)分布采樣第1天的行情檔位然后根據(jù)轉(zhuǎn)移概率逐漸生成后面每一天的檔位。這樣生成的場景序列帶有時間自相關性更貼近真實需求波動。場景數(shù)量怎么定我測試過50、100、200、500四檔。場景太少優(yōu)化結(jié)果方差大這次跑出來是這個方案下次同樣的輸入跑出另一個方案業(yè)務團隊沒法接受。場景太多求解時間直線上升。最后我選了200個場景兼顧穩(wěn)定性和求解效率。這中間有個細節(jié)值得說場景生成之后一定要做一次可視化檢查。把歷史真實的需求路徑和生成的需求路徑疊在一張圖上肉眼觀察兩者是否形態(tài)相似。我遇到過這樣的情況——模型在數(shù)值指標上表現(xiàn)很好但生成的場景在高峰期過于平滑、把尖峰全磨平了導致優(yōu)化器嚴重低估峰值需求。這種問題不看圖是發(fā)現(xiàn)不了的。3.3 優(yōu)化模型兩階段隨機規(guī)劃的數(shù)學表達與求解決策層的核心模型我采用了兩階段隨機整數(shù)規(guī)劃的框架。先看一個簡化的數(shù)學表達第一階段變量是車輛的路徑?jīng)Q策。設車輛集合為V門店集合為C配送中心為0定義變量 x_{ij}^v 表示車輛v是否從點i行駛到點j。目標函數(shù)包含固定出車成本、行駛距離成本。第二階段變量是每個場景下的補貨量和對庫存的懲罰。設場景s下門店i在t天的需求為 d_{i,t}^s補貨后庫存為 I_{i,t}^s那么第二階段會對缺貨和超容計算懲罰成本。完整的模型表達式實際上是[ \min \sum_{v \in V} \sum_{(i,j) \in A} c_{ij} x_{ij}^v \frac{1}{S} \sum_{s1}^{S} \sum_{i,t} \big( p_{\text{stockout}} \cdot \max(0, d_{i,t}^s - I_{i,t}^s) p_{\text{overflow}} \cdot \max(0, I_{i,t}^s - C_i) \big) ]這里有幾個業(yè)務上需要仔細斟酌的參數(shù)缺貨懲罰 p_stockout應該等于單位商品的毛利損失加上品牌損失折算。我們按商品平均毛利做了估算同時給了一個上調(diào)系數(shù)因為斷貨還影響消費者忠誠度超容懲罰 p_overflow應該等于臨時調(diào)撥成本或者倉庫二次處理成本。這個值如果設得太低優(yōu)化器會讓門店庫存頂?shù)教旎ò瀣F(xiàn)場根本放不下設得太高又會導致車輛少裝貨、頻次變高運輸成本失控車輛數(shù)上限設置時參考了現(xiàn)有車隊規(guī)模和高峰期運力冗余不是拍腦袋定的而是統(tǒng)計了過去三個月的出車記錄取90分位數(shù)。路徑約束部分用的是標準的車輛路徑問題約束加上了每個車輛的最大行駛時長限制。這里要特別提一個工程問題門店數(shù)量六七十家時精確求解已經(jīng)非常吃力。我嘗試過直接調(diào)用求解器跑完整MIP兩小時內(nèi)給不出穩(wěn)定解。后來換成了“列生成局部搜索”的混合策略先構造初始可行解再用鄰域搜索做改進最后用求解器對剩余的小規(guī)模子問題做精確優(yōu)化。效果是在5到8分鐘內(nèi)能給出一版穩(wěn)定方案滿足調(diào)度時效。3.4 決策感知修正在預測階段注入優(yōu)化目標的信息這一節(jié)是方案里最有意思的部分也是我認為整個系統(tǒng)真正值錢的地方。既然聯(lián)合訓練不劃算那有沒有辦法在保持模塊化設計的前提下讓預測模型“知道”下游優(yōu)化器關心什么我的做法是構造一個決策損失代理函數(shù)。庫存路徑問題里真正讓優(yōu)化器敏感的不是預測均值偏差而是補貨閾值附近的需求跨越。如果一個門店當前庫存只夠賣兩天而預測明天需求剛好超過某個臨界值那么優(yōu)化器就會決定派車。預測值在這個臨界值上下微小的移動會完全改變決策結(jié)果。所以預測模型應當在臨界值附近的區(qū)段付出更大的擬合代價。具體實現(xiàn)是在原有回歸損失的基礎上加了一個權重函數(shù)[ L \frac{1}{N} \sum_{n1}^{N} w(y_n) \cdot (q_{\theta}(x_n) - y_n)^2 ]權重 w(y_n) 由庫存狀態(tài)決定當預測值接近補貨觸發(fā)閾值時權重提高遠離閾值時權重保持基準值。這個權重的形狀經(jīng)過了好幾輪迭代。第一版用的是階躍函數(shù)效果不好因為閾值附近的梯度突變會讓訓練不穩(wěn)定。后來改成了以閾值為中心的高斯凸起寬度取歷史需求標準差的一半訓練穩(wěn)定性明顯改善。這個方法說起來簡單但它的效果立竿見影。對比同一個小區(qū)的模型加了決策感知修正之后優(yōu)化層的平均決策損失下降了大約6%而預測的均方誤差幾乎沒變。這說明什么說明我們在不犧牲預測精度的前提下用很少的額外計算量讓預測分布的位置更貼合決策需求。坦白講這個6%在學術實驗里不算大數(shù)字但在真實配送網(wǎng)絡中它意味著每個月能少幾十次缺貨事件收益非常可觀。4. 實操過程與效果復盤4.1 數(shù)據(jù)工程清洗口徑是繞不過去的硬骨頭進入訓練和調(diào)優(yōu)之前我先說數(shù)據(jù)清洗。這個環(huán)節(jié)不性感但在這類項目中它決定成敗。我們處理的是某區(qū)域連鎖零售企業(yè)過去18個月的配送數(shù)據(jù)涉及幾十家門店、上千個SKU原始數(shù)據(jù)分散在三個系統(tǒng)里POS銷售系統(tǒng)、倉庫管理系統(tǒng)、運輸管理系統(tǒng)。第一道坎是銷售數(shù)據(jù)的口徑問題。POS系統(tǒng)里記錄的是“銷售時間”倉庫配送記錄的是“到達時間”兩個時間口徑相差一兩天在做庫存推演時需要對齊。我們選擇以“門店營業(yè)日”作為統(tǒng)一的時間粒度把跨日銷售按照營業(yè)時段進行劃分。這塊沒有標準答案但一定要在項目初期定出口徑文檔否則后續(xù)所有分析都是空中樓閣。第二道坎是SKU聚合。每家門店上千個SKU不可能逐個建模。我按商品的補貨周期、體積、冷鏈要求、銷量波動特征把SKU聚合成幾個大類。大類內(nèi)部的需求相關性較高用加權的總銷量作為模型輸入。這個聚合粒度直接影響優(yōu)化器輸出的顆粒度——太粗方案沒法落地太細優(yōu)化規(guī)模爆炸。最后選了中等粒度常溫標品、低溫乳品、生鮮果蔬、日配面包四大類。第三道坎是異常值處理。門店盤點錯誤、臨時促銷、系統(tǒng)故障都會產(chǎn)生異常銷售記錄。我的處理方式是做兩輪過濾第一輪用統(tǒng)計閾值剔除超出歷史均值5倍標準差的極端值第二輪靠人工抽檢重點檢查節(jié)假日前后的大額訂單記錄確認是真實需求還是重復記賬。這兩輪過濾下來數(shù)據(jù)質(zhì)量才勉強夠資格進模型。4.2 實驗設計與消融對比整套系統(tǒng)做完之后我做了一組嚴格的消融實驗目的是回答三個問題多場景優(yōu)化到底比點預測優(yōu)化強多少決策感知修正的價值有多大整套方案相比企業(yè)原來的手工計劃提高了什么實驗設計如下方案編號預測端優(yōu)化端說明A點預測確定優(yōu)化模擬傳統(tǒng)方案B分位數(shù)預測確定優(yōu)化只用預測分布均值做輸入C分位數(shù)預測多場景隨機規(guī)劃不加決策感知修正D分位數(shù)預測多場景隨機規(guī)劃 決策感知修正完整方案評價指標用三個月度缺貨次數(shù)、庫存周轉(zhuǎn)天數(shù)、每單配送成本。結(jié)果比預想的更有說服力。方案A的月度缺貨次數(shù)是完整方案D的2.3倍庫存周轉(zhuǎn)天數(shù)多出1.4天。方案B和方案A的差異不大說明只改進預測端的輸出形式而不改優(yōu)化端收益有限。方案C到方案D的提升主要體現(xiàn)在缺貨次數(shù)上減少了約15%而庫存和運輸成本幾乎不變——決策感知修正帶來的是一種零成本的“白撿”收益。這個對比說明一個很重要的道理系統(tǒng)的性能瓶頸往往不在某一個單獨模塊而在模塊之間的信息傳遞方式。預測端輸出更豐富的不確定性信息、優(yōu)化端利用這些信息做權衡決策兩端一起改效果才會指數(shù)級放大。4.3 上線驗證從離線回測到小范圍試運行離線實驗做完緊接著是回測驗證。我用的是歷史回放的方式拿到3個月的原始數(shù)據(jù)每天按照系統(tǒng)的輸入輸出做模擬把系統(tǒng)推薦的補貨和配送方案應用到當天的庫存狀態(tài)上逐日推演最后統(tǒng)計缺貨、庫存、運力使用的累計指標?;販y階段最大的意義是能在不驚動業(yè)務的前提下暴露問題比如某些門店的容量約束被頻繁打破或者某些路線的配送時長超過司機工作時長。回測跑通后我建議運營團隊先選一個中等規(guī)模的門店簇做兩周的試運行。試運行期間系統(tǒng)輸出只作為建議方案每天由調(diào)度員進行人工確認。這里有一個經(jīng)驗一定要記錄人工修改了哪些地方以及修改的原因。第一周人工修改率高達30%主要集中在對促銷臨時加量的調(diào)整上第二周隨著調(diào)度員對系統(tǒng)輸出風格的熟悉修改率降到10%以下。這個“人機磨合”的過程必不可少直接跳過的話業(yè)務團隊很難建立起對系統(tǒng)的信任。5. 常見問題與排查實錄5.1 預測分布過窄導致場景多樣性不足第一個遇到的問題是場景生成的需求路徑多樣性不足。癥狀很典型系統(tǒng)跑出來的方案總是傾向于少出車、小裝載量對峰值需求的準備不足。排查后發(fā)現(xiàn)根因在預測模型輸出的分位數(shù)間距太小——模型對需求波動估計不足把分布收窄了。這經(jīng)常發(fā)生在訓練數(shù)據(jù)里方差被低估的情況下特別是我們用了梯度提升樹做分位數(shù)回歸如果葉節(jié)點最小樣本數(shù)設置得過大模型就會傾向于輸出比較保守、平滑的分位數(shù)尾部信息被抹掉。我的解決辦法是調(diào)低葉子節(jié)點最小樣本數(shù)提高分位數(shù)的靈敏度同時在損失函數(shù)里對尾部預測誤差加了額外權重讓模型更關注10%和90%分位數(shù)的擬合。5.2 優(yōu)化求解時間不穩(wěn)定多場景模型加上全量門店最怕的是求解時間爆炸。我遇到過幾次平時5分鐘出解某天突然跑了40分鐘還不停直接導致調(diào)度延誤。定位后發(fā)現(xiàn)問題出在“壞場景”上——某些生成場景中需求極端偏高使得對應的約束特別緊分支定界樹膨脹得厲害。解決思路有兩個層面。第一是在場景生成時做截尾把需求超過歷史最大值1.5倍的場景樣本直接裁剪到上限避免極端值拖慢求解。第二是在求解器參數(shù)上做調(diào)節(jié)設置MIP的節(jié)點數(shù)上限和求解時間上限到時間就返回當前最優(yōu)可行解。實踐中第二個方案更可靠因為它保證求解時間的上界。5.3 業(yè)務團隊對“概率方案”的不信任技術問題都好解決人心的問題最難。業(yè)務調(diào)度員習慣了“今天送50件”這種明確的指令拿到“我應該送40到70件取決于后續(xù)天氣和銷售走勢”這種帶區(qū)間的建議第一反應往往是不信任。我的處理辦法很笨但有效做一次詳細的Case復盤。找兩個真實門店把系統(tǒng)輸出的場景集合和決策依據(jù)攤開在桌面上講解釋為什么系統(tǒng)建議給A店多留庫存而給B店少送一些。當業(yè)務人員看到系統(tǒng)在面對不確定需求時做的權衡邏輯跟老練調(diào)度員的思路一致時信任感就建立起來了。技術方案再先進最終還是要靠人來用。交付一個“好用的系統(tǒng)”不只是交付模型和代碼還包括教會業(yè)務團隊用概率思維做決策。5.4 模型再訓練頻率與概念漂移零售需求的特征會隨時間緩慢變化季節(jié)性、新品引入、周邊商圈變遷都會導致需求分布漂移。如果模型長期不更新預測分位數(shù)會越來越失真。我們設定的是每周增量訓練一次每月做一次全量重訓。增量訓練用的是最近4周的新數(shù)據(jù)配合舊數(shù)據(jù)加權衰減讓模型既能捕捉近期趨勢又不會忘記歷史模式。這個頻率是我在幾次測試后確定的。兩周更新一次新品上市時的需求變化跟不上每天都更新訓練資源和模型穩(wěn)定性又扛不住。以周為周期是比較折中的選擇也方便跟業(yè)務周會節(jié)奏對齊。6. 最后分享一點個人體會這套方案解決了一個我入行以來一直很糾結(jié)的問題預測模型和優(yōu)化模型到底應該怎么配合。過去做純預測項目模型再準落到業(yè)務上總覺得使不上勁做純優(yōu)化項目模型再精巧輸入的需求數(shù)據(jù)一塌糊涂解出來的方案也只是紙上談兵。預測后優(yōu)化這類系統(tǒng)真正把兩個領域串在了一起。如果你也想在自己的供應鏈場景里做類似的嘗試我的建議是先別追求復雜的聯(lián)合訓練把基礎的分位數(shù)預測和多場景優(yōu)化做好就已經(jīng)能超過多數(shù)傳統(tǒng)方案。等到你對場景生成、求解穩(wěn)定性都有了手感再去探索更進階的方向也不遲。我們目前還在做兩個后續(xù)擴展一個是把門店的實時庫存數(shù)據(jù)接入場景生成讓優(yōu)化決策能響應當天的突發(fā)情況另一個是在場景層引入季節(jié)性外部變量比如節(jié)假日零售指數(shù)讓預測分布隨宏觀節(jié)奏動態(tài)調(diào)整。這個方向可以延伸的東西還很多后面有新進展再繼續(xù)更新。