滴滴算法大赛算法解决过程(实时更新)
(這里只是做分析,不提供源代碼,畢竟是一個(gè)比賽)
題目分析
賽題詳情
構(gòu)建一個(gè)模型,根據(jù)天氣,交通,區(qū)域里面的各種設(shè)施,以往歷史數(shù)據(jù),預(yù)測未來的某個(gè)時(shí)間點(diǎn),某個(gè)區(qū)域里,打車需求的缺口。整個(gè)算法其實(shí)就是一個(gè)有監(jiān)督的機(jī)器學(xué)習(xí)的過程。
數(shù)據(jù)整理
下載后的整個(gè)壓縮數(shù)據(jù)包575M,其中包括的訂單數(shù)據(jù)大約900萬條。(其他Master表數(shù)據(jù)量很小,這里忽略不計(jì))
使用MongoDB存儲(chǔ)的話,大概使用2GB的空間,全部導(dǎo)入之后,工作用計(jì)算機(jī)十分卡頓。MongoCola管理軟件失去響應(yīng)。所以,這里的訂單按照日期導(dǎo)入。(訓(xùn)練的時(shí)候,按照天來訓(xùn)練)注意:官方的訂單數(shù)據(jù)的 訂單號(hào) OrderID是主鍵重復(fù)的。這里以第一次出現(xiàn)的訂單號(hào)的數(shù)據(jù)為準(zhǔn)。
由于數(shù)據(jù)量非常龐大,所以這里建議將中間的計(jì)算結(jié)果也放入數(shù)據(jù)庫中備用。
訂單數(shù)據(jù)整理
訂單數(shù)據(jù)整理,主要是整理出各個(gè)時(shí)段,各個(gè)地域的訂單數(shù)據(jù)。
- 時(shí)間段
- 地域編號(hào)
- 需求數(shù)
- 缺口
- 缺口比例
數(shù)據(jù)整理盡量使用LINQ進(jìn)行處理,MONGODB查詢是消耗時(shí)間的!!!,這里數(shù)據(jù)庫只是用作數(shù)據(jù)的存儲(chǔ)不做計(jì)算
private void btnImportDB_Click(object sender, EventArgs e){string rootFolder = txtRootDir.Text;//Order: Root + "\order_data"foreach (var filename in Directory.GetFiles(rootFolder + "\\order_data")){if (!filename.Contains("._")){string strDate = filename.Substring(filename.LastIndexOf("_") + 1);var colname = "Order_" + strDate;Database.Clear(colname);var orderlist = new List<Order>();var read = new StreamReader(filename);while (!read.EndOfStream){var o = Order.Gernerate(read.ReadLine());orderlist.Add(o);}orderlist = orderlist.Distinct(x => x.order_id).ToList();Database.InsertRecBatch(orderlist, colname);var orderGaplist = new List<OrderGap>();Database.Clear("OrderGap_" + strDate);for (int time = 1; time < 144 + 1; time++){for (int area = 1; area < 66 + 1; area++){var m = new OrderGap() { DistrictId = area,TimeSlient = time};m.Total = orderlist.Count((x) => { return x.DistrictID == area && x.TimeSlient == time; }); m.Gap = orderlist.Count((x) => { return x.DistrictID == area && x.TimeSlient == time && x.driver_id == "NULL" ; });m.GapPercent = m.Total == 0 ? 0 : Math.Round(((double)m.Gap / m.Total) * 100, 2);orderGaplist.Add(m);}}Database.InsertRecBatch(orderGaplist, "OrderGap_" + strDate);//暫時(shí)只分析一天數(shù)據(jù)break;}}}利用Excel,可視化數(shù)據(jù)
以下是2016-01-01的數(shù)據(jù)分析。藍(lán)色的是GAP缺口數(shù),紅色的是Total數(shù)。
一天24個(gè)小時(shí)整體需求分布可以看個(gè)大概了。
擬合
Gap的預(yù)測,是建立在一個(gè)擬合函數(shù)上的。也有一些機(jī)器學(xué)習(xí)的味道。
總的Gap函數(shù) = 函數(shù)(時(shí)間,地區(qū))
- TimeID : 時(shí)間片編號(hào)
- DistricID:地區(qū)編號(hào)
- Traffic:交通流量
- Weather:天氣
- POI:設(shè)施數(shù)
POI說明
交通流量和時(shí)間有關(guān),一個(gè)地方的擁堵程度和時(shí)間有關(guān)系
不同的地區(qū),各種設(shè)施配置不同。
天氣和時(shí)間有關(guān)。
Gap函數(shù) = 函數(shù)(交通擁擠度函數(shù)(時(shí)間,地區(qū)編號(hào)),POI函數(shù)(地區(qū)編號(hào)),天氣函數(shù)(時(shí)間))
這里可以認(rèn)為,一個(gè)地方的打車人數(shù),交通越堵,則打車的GAP越大。天氣不好,打車的人則越多,GAP也越大。設(shè)施越多的地方,打車的需求也越多,GAP可能也越大。但是這一切都只是可能性。
(題外話,其實(shí)真實(shí)的情況也要考慮節(jié)假日的問題,在節(jié)假日的時(shí)候,GAP可能會(huì)變大。當(dāng)然這是一個(gè)人文的考量了)
算法
交通擁堵函數(shù):
這里的交通擁堵函數(shù)是使用4個(gè)等級(jí)表示的。
- LV1 20條路 權(quán)重8
- LV2 10條路 權(quán)重4
- LV3 15條路 權(quán)重2
- LV4 05條路 權(quán)重1
那么擁堵指數(shù)怎么計(jì)算呢?這里應(yīng)該是對每個(gè)擁堵喲一個(gè)權(quán)重,等級(jí)越高,權(quán)重越大。
擁擠度 = SUM(權(quán)重 * 數(shù)量)
當(dāng)然權(quán)重也是一個(gè)需要訓(xùn)練和擬合的。
(設(shè)施數(shù)和天氣差不多,也是同樣考慮的。)
這里有三個(gè)指標(biāo),每種指標(biāo)對于整體的影響程度也是需要訓(xùn)練的。
本博文將在 http://www.codesnippet.info/Article/Index?ArticleId=00000038 進(jìn)行實(shí)時(shí)更新。
任何疑問,討論,請移步 http://www.codesnippet.info/Article/Index?ArticleId=00000038
本文不求大部分關(guān)注,只求算法愛好者的參與。
轉(zhuǎn)載于:https://www.cnblogs.com/TextEditor/p/5513552.html
總結(jié)
以上是生活随笔為你收集整理的滴滴算法大赛算法解决过程(实时更新)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS自动偏移64个像素
- 下一篇: 继承-person