淺談滴滴派單算法(轉(zhuǎn)載)
2020-04-01 11:06:46 行業(yè)資訊說(shuō)到滴滴的派單算法,大家可能感覺(jué)到既神秘又好奇,從出租車(chē)揚(yáng)召到司機(jī)在滴滴平臺(tái)搶單最后到平臺(tái)派單,大家今天的出行體驗(yàn)已經(jīng)發(fā)生了翻天覆地的變化,面對(duì)著每天數(shù)千萬(wàn)的呼叫,滴滴的派單算法一直在持續(xù)努力讓更多人打到車(chē),本篇文章會(huì)著重介紹我們是如何分析和建模這個(gè)問(wèn)題,并且這其中面臨了怎樣的算法挑戰(zhàn),以及介紹一些我們常用的派單算法,這些算法能夠讓我們不斷的提升用戶(hù)的打車(chē)確定性。
1.為什么我們需要更好的派單算法
說(shuō)到滴滴的派單算法,大家可能感覺(jué)到既神秘又好奇,從揚(yáng)召到搶單到派單,我們又是如何演進(jìn)到今天大家的打車(chē)體驗(yàn)的呢,我們首先來(lái)看一看,好的派單算法為什么是出行行業(yè)不可或缺的能力?
回想幾年前,當(dāng)我們還沒(méi)有滴滴的時(shí)候,只能在寒風(fēng)或者酷暑中等待可能有、可能沒(méi)有的揚(yáng)招出租車(chē),到后來(lái)可以從滴滴上呼叫一輛出租車(chē),乘客可以在室內(nèi)相對(duì)舒適的等待車(chē)輛的到達(dá),從線上到線下,乘客的確定性得到第一次的提升,然而這還不夠,搶單的模式注定我們的應(yīng)答率天花板不會(huì)太高,在15年,滴滴上線快車(chē)業(yè)務(wù),我們從搶單演進(jìn)到了派單模式,乘客的應(yīng)答率有了20個(gè)點(diǎn)以上的提升,很多時(shí)候能夠全天能夠高達(dá)90+(高峰&局部供需緊張應(yīng)答率會(huì)相對(duì)吃緊),乘客確定性再一次得到大幅的提升,由此可見(jiàn),派單模式為滴滴創(chuàng)造了巨大用戶(hù)價(jià)值。
再看近年來(lái)不斷興起的O2O業(yè)務(wù),從國(guó)內(nèi)外的網(wǎng)約車(chē)公司,包括我們的友商Uber、Lyft都基于派單的產(chǎn)品形態(tài)進(jìn)行司機(jī)和乘客之間的交易撮合,Uber上市的時(shí)候把派單引擎也作為核心技術(shù)能力放在了招股書(shū)中;再看我們的國(guó)內(nèi)的外賣(mài)平臺(tái),核心派單系統(tǒng)的優(yōu)劣也決定了整個(gè)平臺(tái)的交易效率(單均配送成本)和用戶(hù)體驗(yàn)(配送時(shí)長(zhǎng));最后,整個(gè)大物流行業(yè)近年來(lái)也不斷在進(jìn)行線上化的改造,如何撮合貨物和司機(jī),以及更好的拼單能力也是整個(gè)交易環(huán)節(jié)的關(guān)鍵和商業(yè)模式是否成立的前提。從運(yùn)人到運(yùn)物,派單引擎目前越來(lái)越多的被應(yīng)用在現(xiàn)實(shí)的商業(yè)和生活中。
2.派單問(wèn)題初探
言歸正傳,這里我們也來(lái)看一下,滴滴網(wǎng)約車(chē)平臺(tái)到底是怎么派單的。首先,我們來(lái)看下我們面對(duì)的是什么樣的問(wèn)題?
“訂單分配 即是在派單系統(tǒng)中將 乘客發(fā)出的訂單 分配給 在線司機(jī) 的過(guò)程”
這是一個(gè)看似簡(jiǎn)單的,但實(shí)際上非常復(fù)雜的問(wèn)題。說(shuō)到這,可能有很多人就會(huì)問(wèn),能否就把 我的訂單分配給離我最近的司機(jī)就好了?
的確啊,實(shí)際上目前滴滴的派單算法最大的原則就是 “就近分配” (70%~80%的訂單就是分配給了最近的司機(jī)),據(jù)我所知,目前世界上其他的競(jìng)品公司(包括Uber),也均是基于這個(gè)原則分單的。
我們進(jìn)一步來(lái)看這個(gè)問(wèn)題,如果我們只按照就近分配,先到先得的貪心策略,是不是能最好的滿足平臺(tái)所有乘客和司機(jī)的訴求呢?答案是否定的,原因就在于,如果我們只基于當(dāng)前時(shí)刻和當(dāng)前局部的訂單來(lái)進(jìn)行決策,忽視了未來(lái)新的訂單&司機(jī)的變化,還忽視了和你相鄰的其他區(qū)域甚至整個(gè)城市的需求(注:在時(shí)序上來(lái)看,新的司機(jī)&訂單的出現(xiàn)會(huì)導(dǎo)致,貪心策略反而違背了就近分配的目標(biāo))。這就是為什么這個(gè)問(wèn)題依然是非常復(fù)雜的原因。
這里稍微有點(diǎn)抽象了,不過(guò)沒(méi)關(guān)系,我們?cè)賮?lái)一步一步的拆解一下訂單分配的問(wèn)題,讓大家有個(gè)更好的理解:
簡(jiǎn)單看,在我們的平臺(tái)上,每一個(gè)時(shí)刻,都有N個(gè)訂單在被乘客創(chuàng)建,同時(shí)有M個(gè)司機(jī)可以被我們用來(lái)進(jìn)行分配,我們強(qiáng)大的平臺(tái)能夠?yàn)榕蓡嗡惴ńo出司機(jī)的實(shí)時(shí)的地理位置坐標(biāo),以及所有訂單的起終點(diǎn)位置,并且告訴我們每一個(gè)司機(jī)接到訂單的實(shí)時(shí)導(dǎo)航距離。
▍如果是1個(gè)訂單、1個(gè)司機(jī)
看上去似乎就非常簡(jiǎn)單了,我們直接把這個(gè)訂單指派給這個(gè)司機(jī)就好了嘛。
“那么為什么有時(shí)候附近有輛空車(chē)卻不能指派給你呢?”
實(shí)際線上的系統(tǒng)會(huì)比這里稍微復(fù)雜一點(diǎn),原因一方面有可能是司機(jī)正好網(wǎng)絡(luò)出現(xiàn)故障,或者正在和客服溝通等等導(dǎo)致司機(jī)無(wú)法聽(tīng)單,另一方面的原因是并不是所有的車(chē)都能夠符合服務(wù)你訂單的要求,最基本的策略其實(shí)是人工設(shè)定的規(guī)則過(guò)濾。舉幾個(gè)最基礎(chǔ)的例子:
規(guī)則A:快車(chē)司機(jī)不能接專(zhuān)車(chē)訂單
規(guī)則B:保證司機(jī)接單后不會(huì)通過(guò)限行限號(hào)區(qū)域
規(guī)則C:為設(shè)定實(shí)時(shí)目的地的司機(jī)過(guò)濾不順路區(qū)域
規(guī)則D:為只聽(tīng)預(yù)約單司機(jī)過(guò)濾實(shí)時(shí)訂單
規(guī)則E:同一個(gè)訂單只會(huì)發(fā)給一個(gè)司機(jī)一次
......
必須澄清的一點(diǎn)是這里的規(guī)則并不會(huì)造成分單時(shí)不公平的效果,而完全是為了業(yè)務(wù)能正常運(yùn)行而設(shè)立的,這些策略承擔(dān)著保證業(yè)務(wù)正確性的重要職責(zé)。
▍如果是1個(gè)訂單和2個(gè)司機(jī)
假設(shè)這兩個(gè)司機(jī)都能夠分配給這個(gè)訂單,那么我們來(lái)看系統(tǒng)應(yīng)該是如何分配的。
首先第一種情況是,同一時(shí)刻下,這兩個(gè)司機(jī)和訂單的距離都完全一樣的情況下,系統(tǒng)應(yīng)該如何分配?
剛才也說(shuō)到,我們平臺(tái)訂單分配最大的原則是就近分配,當(dāng)距離完全一樣的情況下,當(dāng)前我們系統(tǒng)上會(huì)主要考慮司機(jī)的服務(wù)分的優(yōu)劣,服務(wù)分較高的司機(jī)會(huì)獲取到這個(gè)訂單(注:服務(wù)分對(duì)分單的影響,簡(jiǎn)單的理解可以換算為多少分可以換成多少米距離的優(yōu)勢(shì),這塊不是今天的重點(diǎn)就不展開(kāi)介紹),再說(shuō)明一下,系統(tǒng)用到的是地圖的導(dǎo)航距離,而非人直觀看到的直線距離,有時(shí)候差一個(gè)路口就會(huì)因?yàn)樾枰纛^導(dǎo)致距離差異很大;并且如果司機(jī)的定位出現(xiàn)問(wèn)題,也會(huì)出現(xiàn)分單過(guò)遠(yuǎn)的情況。
那么我們來(lái)看第二種情況,如果A司機(jī)離的近,B司機(jī)離的遠(yuǎn),系統(tǒng)怎么派?
這就簡(jiǎn)單了,根據(jù)就近分配的原則,我們會(huì)把A司機(jī)分配給這個(gè)訂單。嘿嘿~~,假設(shè)我們?cè)侔褑?wèn)題設(shè)置的更加實(shí)際一點(diǎn),當(dāng)訂單發(fā)出時(shí),B司機(jī)已經(jīng)在線并空閑,但是A司機(jī)還沒(méi)有出現(xiàn)(沒(méi)有上線,或者還在送乘客),但再過(guò)1s,離得更近的A司機(jī)突然出現(xiàn)可被分單了,假設(shè)我們使用先到先得的貪心策略,那么B司機(jī)就會(huì)被分給這個(gè)訂單,那就違背我們希望就近分單的目標(biāo)了:(。所以看上去簡(jiǎn)單,但實(shí)際情況下,算法還需要變的更好一些,這個(gè)問(wèn)題我們把它叫做派單中的時(shí)序問(wèn)題,我們后面再來(lái)看怎么解決。
▍如果有N個(gè)乘客、M個(gè)司機(jī)
最后我們來(lái)考慮最復(fù)雜的多對(duì)多的情況,這也是線上系統(tǒng)每天高峰期都需要面對(duì)的挑戰(zhàn),我們一般把這種情況會(huì)形式化為一個(gè)二部圖的匹配問(wèn)題,在運(yùn)籌領(lǐng)域也叫做matching的問(wèn)題,如圖所示:
我們?cè)侔堰@個(gè)問(wèn)題具象一點(diǎn),假設(shè)這個(gè)時(shí)候我們有20個(gè)乘客,有20個(gè)司機(jī),這些乘客都可以被這20個(gè)司機(jī)中的一個(gè)接駕,我們的系統(tǒng)需要把這20個(gè)乘客都分配出去,并且讓大家的總體接駕的時(shí)長(zhǎng)最短。聽(tīng)上去是不是有點(diǎn)復(fù)雜?我們套用下組合數(shù)學(xué)的知識(shí),這其中可能的解法存在20的階乘那么多,20的階乘是什么概念呢?20*19*18*…*1= 2432902008176640000,這個(gè)數(shù)巨大無(wú)比,想要完全的暴力搜索是絕對(duì)不可能的。這里需要更聰明的辦法。
▍如果有N個(gè)乘客、M個(gè)司機(jī),一會(huì)再來(lái)幾個(gè)乘客和司機(jī)?
這就是派單問(wèn)題最大的挑戰(zhàn),我們不僅僅需要當(dāng)前這個(gè)時(shí)刻的最優(yōu),我們要考慮未來(lái)一段時(shí)間整體的最優(yōu),新來(lái)的司機(jī)和乘客會(huì)在整個(gè)分配的網(wǎng)絡(luò)中實(shí)時(shí)插入新的節(jié)點(diǎn),如何更好的進(jìn)行分配也就發(fā)生了新的變化,所以如何考慮時(shí)序?qū)ξ覀兎浅V匾?,這個(gè)問(wèn)題在業(yè)內(nèi)也被稱(chēng)為Dynamic VRP問(wèn)題,這個(gè)Dynamic也就是隨時(shí)間時(shí)序變化的意思,這也就是為什么,滴滴的派單問(wèn)題遠(yuǎn)復(fù)雜于物流行業(yè)的相對(duì)靜態(tài)的貨物和路線的規(guī)劃問(wèn)題。假設(shè)我們知道了未來(lái)供需的完全真實(shí)的變化,仿真告訴我們,我們的系統(tǒng)有可能可以利用同樣的運(yùn)力完成1.2~1.5倍的需求量,這也是派單算法的同學(xué)持續(xù)為之努力的方向。
想起前段時(shí)間的吐槽大會(huì),大家提到文嵩曾說(shuō)我們的派單問(wèn)題比alpha go還要難,其實(shí)這兩個(gè)問(wèn)題還確實(shí)有點(diǎn)相似,都是在超大的搜索空間中找到一個(gè)近似最優(yōu)的解,而alpha go則會(huì)在一個(gè)更加明確的游戲規(guī)則和環(huán)境中進(jìn)行求解,它的難點(diǎn)在于博弈,而我們的派單問(wèn)題難點(diǎn)在于未來(lái)供需不確定性&用戶(hù)行為的不確定性。近年來(lái)在學(xué)界,已經(jīng)有不少?lài)L試在利用類(lèi)似alpha go的技術(shù)進(jìn)行VRP&TSP等方向的探索,強(qiáng)化學(xué)習(xí)結(jié)合運(yùn)籌理論是未來(lái)運(yùn)籌界非常前沿的方向之一(非技術(shù)同學(xué)可以跳過(guò)此處:))
3.派單算法簡(jiǎn)介
上面我們已經(jīng)描述了什么是訂單分配問(wèn)題,并且它所面臨的各種挑戰(zhàn),那么在這里我們來(lái)聊一聊我們線上的派單策略是如何解決其中一部分問(wèn)題的。
在介紹具體策略之前,首先我們來(lái)說(shuō)一下派單算法大的原則,目前派單策略主要的原則是:站在全局視角,盡量去滿足盡可能多的出行需求,保證乘客的每一個(gè)叫車(chē)需求都可以更快更確定的被滿足,并同時(shí)盡力去提升每一個(gè)司機(jī)的接單效率,讓總的接駕距離和時(shí)間最短。
如何理解這個(gè)原則呢?我們說(shuō)策略會(huì)站在全局的角度去達(dá)成全局最優(yōu),這樣對(duì)于每一個(gè)獨(dú)立的需求來(lái)看,派單可能就不是“局部最優(yōu) ”,不過(guò)可以告訴大家的是,就算在這個(gè)策略下,仍然有70%~80%的需求也是符合當(dāng)前距離最近的貪心派單結(jié)果的。
接下來(lái),這里會(huì)拿兩個(gè)重要的派單策略的來(lái)進(jìn)行介紹。(這里的內(nèi)容主要是講清楚策略的motivation為主哈,細(xì)節(jié)不再展開(kāi))
▍批量匹配(全局最優(yōu))
派單策略中最為基礎(chǔ)的部分,就是為了解決上一節(jié)所提到的時(shí)序問(wèn)題。這個(gè)算法幾乎是所有類(lèi)似派單系統(tǒng)為了解決這個(gè)問(wèn)題的最基礎(chǔ)模型,在Uber叫做Batching Matching,我們內(nèi)部也叫做“全局最優(yōu)” 或者 “延遲集中分單”。
這個(gè)Idea其實(shí)也非常直觀,由于用戶(hù)訂單的產(chǎn)生和司機(jī)的出現(xiàn)往往并不在同一時(shí)間點(diǎn),在時(shí)間維度上貪婪的分單方式(即每個(gè)訂單出現(xiàn)時(shí)即選擇附近最近的司機(jī)派單)并不能獲得全局最優(yōu)的效果。一個(gè)自然的想法就是先讓乘客和司機(jī)稍等一會(huì),待收集了一段時(shí)間的訂單和司機(jī)信息后,再集中分配。這樣,有了相對(duì)較多、較密集的訂單、司機(jī)后,派單策略即可找到更近更合理的派單方式了。
找尋司機(jī)和訂單分配的全局最優(yōu)是一個(gè) 二分圖匹配問(wèn)題 (bipartite graph matching) ,一邊是乘客、一邊是司機(jī),可用運(yùn)籌優(yōu)化中各種解決Matching問(wèn)題的方法進(jìn)行求解。
和再大家澄清一下,我們所采用的批量匹配的模式和大家所希望的,“把離我最近的司機(jī)派給我”的「就近派單模式」并不矛盾,我們也是尋求“乘客接駕時(shí)長(zhǎng)最短”的最優(yōu)解,大多數(shù)情況下也是指派離你最近的司機(jī),但充分滿足每一個(gè)乘客的“把離我最近的司機(jī)派給我”的個(gè)體需求, 有些時(shí)候反而會(huì)導(dǎo)致部分乘客的需求無(wú)法得到滿足,比如說(shuō)下面這種情況:
當(dāng)編號(hào)1和2兩個(gè)乘客同時(shí)叫車(chē), 如果完全按照“就近派單”的模式, 雖然可以讓1號(hào)乘客先被接單, 但是2號(hào)乘客會(huì)因?yàn)榻玉{距離較遠(yuǎn), 導(dǎo)致等待時(shí)間變長(zhǎng), 甚至因?yàn)樽罱乃緳C(jī)超出平臺(tái)派單距離, 導(dǎo)致2號(hào)乘客叫不到車(chē)。1、2號(hào)乘客總等待時(shí)長(zhǎng)15分鐘, 平均等待時(shí)長(zhǎng)7.5分鐘。
我們采取的做法是, 把距離較遠(yuǎn)的2號(hào)車(chē)派給1號(hào)乘客。
把1號(hào)車(chē)派給2號(hào)乘客, 這樣一來(lái), 1號(hào)乘客和2號(hào)乘客, 平均等待時(shí)長(zhǎng)縮短為5分鐘, 比就近派單,縮短了2.5分鐘, 總等待時(shí)長(zhǎng)縮短為10分鐘, 比就近派單, 縮短了足足5分鐘。
通過(guò)提升全局的效率,才能轉(zhuǎn)化為讓更多乘客的需求得到滿足。
▍基于供需預(yù)測(cè)的分單
“如果有先知告訴我們未來(lái)每一個(gè)訂單的生成時(shí)間&地點(diǎn),每一個(gè)司機(jī)的上線時(shí)間&地點(diǎn),派單就會(huì)變成非常輕松的一件事”
剛才所說(shuō)的批量匹配的方法,理論上能夠保證那一個(gè)批次的匹配是最優(yōu)的。但是這樣就夠了嗎?
很遺憾,以上所述的延遲集中分單的策略只能解決部分的問(wèn)題,仍不是一個(gè)完全的方案。其最大的問(wèn)題,在于用戶(hù)對(duì)系統(tǒng)派單的 響應(yīng)時(shí)間 容忍度有限,很多情況下短短的幾秒鐘即會(huì)使用戶(hù)對(duì)平臺(tái)喪失信心,從而取消訂單。故實(shí)際線上我們只累積了幾秒鐘的訂單和司機(jī)信息進(jìn)行集中分單,而這在大局上來(lái)說(shuō)仍可近似看做時(shí)間維度上的貪婪策略。
若想即時(shí)的獲得最優(yōu)派單結(jié)果,唯一的方法是利用對(duì)未來(lái)的預(yù)測(cè),即進(jìn)行基于供需預(yù)測(cè)的分單。這種想法說(shuō)來(lái)玄妙,其實(shí)核心內(nèi)容也很簡(jiǎn)單:如果我們預(yù)測(cè)出未來(lái)一個(gè)區(qū)域更有可能有更多的訂單/司機(jī),那么匹配的時(shí)候就讓這個(gè)區(qū)域的司機(jī)/訂單更多去等待匹配這同一個(gè)區(qū)域的訂單/司機(jī)。
▍連環(huán)派單
基于供需預(yù)測(cè)的分單有很大意義,但由于預(yù)測(cè)的不確定性,其實(shí)際效果很難得到保證。為此,我們使用了一種更有確定性的預(yù)測(cè)方式來(lái)進(jìn)行派單,即 連環(huán)派單。
“連環(huán)派單,即將訂單指派給 即將結(jié)束服務(wù) 的司機(jī),條件為如果司機(jī)的終點(diǎn)與訂單位置很相近”
與預(yù)測(cè)訂單的分布相反,連環(huán)派單預(yù)測(cè)的是下一時(shí)刻空閑司機(jī)的所在位置。由于高峰期空閑司機(jī)多為司機(jī)完成訂單后轉(zhuǎn)換而來(lái),預(yù)測(cè)司機(jī)的位置就變成了一個(gè)相對(duì)確定性的問(wèn)題,即監(jiān)測(cè)司機(jī)到目的地的距離和時(shí)間。當(dāng)服務(wù)中的司機(jī)距終點(diǎn)很近,且終點(diǎn)離乘客新產(chǎn)生的訂單也很近時(shí),便會(huì)命中連環(huán)派單邏輯。司機(jī)在結(jié)束上一單服務(wù)后,會(huì)立刻進(jìn)入新訂單的接單過(guò)程中,有效地壓縮了訂單的應(yīng)答時(shí)間、以及司機(jī)的接單距離。
▍如何做的更好
整個(gè)派單算法核心克服的是未來(lái)供需的不確定性,動(dòng)態(tài)的時(shí)空結(jié)構(gòu)的建模,以及用戶(hù)行為的不確定性,對(duì)于這些不確定性我們現(xiàn)在更多采用深度學(xué)習(xí)方法對(duì)我們的時(shí)空數(shù)據(jù)&用戶(hù)行為進(jìn)行建模預(yù)測(cè)。
另外,我們的問(wèn)題相對(duì)于傳統(tǒng)推薦搜索領(lǐng)域,多了一層匹配決策,我們到底積攢多久的訂單進(jìn)行分配,對(duì)于每一個(gè)分配來(lái)說(shuō)我們都面臨著分或者不分,現(xiàn)在分還是未來(lái)分配,并且分給誰(shuí)的問(wèn)題,這個(gè)問(wèn)題天生就可以建模為強(qiáng)化學(xué)習(xí)問(wèn)題,目前在我們的系統(tǒng)中也引入了強(qiáng)化學(xué)習(xí)方法來(lái)優(yōu)化更長(zhǎng)期的收益。
除了不斷去優(yōu)化之前說(shuō)到的派單問(wèn)題,整個(gè)派單系統(tǒng)還面臨著大量其他的挑戰(zhàn),包括如何利用快車(chē)優(yōu)享等多個(gè)品類(lèi)的運(yùn)力進(jìn)行跨層的最優(yōu)分配,如何同時(shí)對(duì)用戶(hù)&司機(jī)&平臺(tái)短期長(zhǎng)期等多個(gè)目標(biāo)進(jìn)行優(yōu)化,如何同時(shí)優(yōu)化預(yù)約&實(shí)時(shí)訂單,如何在具備網(wǎng)絡(luò)效應(yīng)的場(chǎng)景下對(duì)算法進(jìn)行評(píng)估,如果建立一個(gè)較為精準(zhǔn)的仿真系統(tǒng)等等,這里既是挑戰(zhàn),也是AI For Transportation中大量新的重新定義問(wèn)題和創(chuàng)新算法的機(jī)會(huì)。
4.總結(jié)
每天, 我們的派單系統(tǒng)要面對(duì)超過(guò)3000萬(wàn)用戶(hù)的叫車(chē)需求, 高峰期每分鐘接收超過(guò)6萬(wàn)乘車(chē)需求,平均每?jī)擅刖托枰ヅ鋷装俚缴锨У某丝秃退緳C(jī) 。我們當(dāng)前的派單策略相對(duì)于最初的派單策略版本,每天能夠多滿足百萬(wàn)以上乘客的出行需求。為了讓更多人能更快、更確定的打到車(chē),我們的交易策略團(tuán)隊(duì)將在更好的公平感知的前提下,不斷地優(yōu)化和打磨我們的派單算法,為乘客&司機(jī)創(chuàng)造更多價(jià)值。
當(dāng)然當(dāng)前的派單策略還有很多不夠完善和完備的地方,本身也是一個(gè)相當(dāng)復(fù)雜的問(wèn)題和系統(tǒng),一方面借此機(jī)會(huì)讓大家對(duì)派單有更好的理解和認(rèn)識(shí),另一方面,也更歡迎大家對(duì)我們提出更多的寶貴意見(jiàn),幫助我們進(jìn)一步成長(zhǎng)。
文章來(lái)源滴滴技術(shù)
每月持續(xù)產(chǎn)品迭代更新
快速Saas搭建+定制開(kāi)發(fā)
專(zhuān)屬客戶(hù)經(jīng)理提供技術(shù)支持
提供企業(yè)合同及國(guó)家增值稅發(fā)票