博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
滴滴算法大赛算法解决过程(实时更新)
阅读量:5877 次
发布时间:2019-06-19

本文共 3199 字,大约阅读时间需要 10 分钟。

(这里只是做分析,不提供源代码,毕竟是一个比赛)

题目分析

构建一个模型,根据天气,交通,区域里面的各种设施,以往历史数据,预测未来的某个时间点,某个区域里,打车需求的缺口。整个算法其实就是一个有监督的机器学习的过程。

数据整理

下载后的整个压缩数据包575M,其中包括的订单数据大约900万条。(其他Master表数据量很小,这里忽略不计)

使用MongoDB存储的话,大概使用2GB的空间,全部导入之后,工作用计算机十分卡顿。MongoCola管理软件失去响应。所以,这里的订单按照日期导入。(训练的时候,按照天来训练)注意:官方的订单数据的 订单号 OrderID是主键重复的。这里以第一次出现的订单号的数据为准。

Thumbnail?filename=00000001_20160520153202_didi0001.PNG

由于数据量非常庞大,所以这里建议将中间的计算结果也放入数据库中备用。

订单数据整理

订单数据整理,主要是整理出各个时段,各个地域的订单数据。

  • 时间段
  • 地域编号
  • 需求数
  • 缺口
  • 缺口比例

Thumbnail?filename=00000001_20160520161644_didi0002.PNG

数据整理尽量使用LINQ进行处理,MONGODB查询是消耗时间的!!!,这里数据库只是用作数据的存储不做计算

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
(); 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
(); 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); //暂时只分析一天数据 break; } } }

利用Excel,可视化数据

以下是2016-01-01的数据分析。蓝色的是GAP缺口数,红色的是Total数。

一天24个小时整体需求分布可以看个大概了。

Thumbnail?filename=00000001_20160520172148_didi0003.PNG

拟合

Gap的预测,是建立在一个拟合函数上的。也有一些机器学习的味道。

总的Gap函数 = 函数(时间,地区)

  • TimeID : 时间片编号
  • DistricID:地区编号
  • Traffic:交通流量
  • Weather:天气
  • POI:设施数

交通流量和时间有关,一个地方的拥堵程度和时间有关系

不同的地区,各种设施配置不同。
天气和时间有关。

Gap函数 = 函数(交通拥挤度函数(时间,地区编号),POI函数(地区编号),天气函数(时间))

这里可以认为,一个地方的打车人数,交通越堵,则打车的GAP越大。天气不好,打车的人则越多,GAP也越大。设施越多的地方,打车的需求也越多,GAP可能也越大。但是这一切都只是可能性。

(题外话,其实真实的情况也要考虑节假日的问题,在节假日的时候,GAP可能会变大。当然这是一个人文的考量了)

算法

交通拥堵函数:

这里的交通拥堵函数是使用4个等级表示的。

  • LV1 20条路 权重8
  • LV2 10条路 权重4
  • LV3 15条路 权重2
  • LV4 05条路 权重1
    那么拥堵指数怎么计算呢?这里应该是对每个拥堵哟一个权重,等级越高,权重越大。
    拥挤度 = SUM(权重 * 数量)
    当然权重也是一个需要训练和拟合的。
    (设施数和天气差不多,也是同样考虑的。)
    这里有三个指标,每种指标对于整体的影响程度也是需要训练的。

本博文将在 进行实时更新。

任何疑问,讨论,请移步
本文不求大部分关注,只求算法爱好者的参与。

转载于:https://www.cnblogs.com/TextEditor/p/5513552.html

你可能感兴趣的文章
mybatis数据处理的几种方式
查看>>
QStandardItem and QStandardItemModel Class Reference
查看>>
友情链接的作用
查看>>
我的友情链接
查看>>
MySQL common_schema简介
查看>>
centos挂载windows共享文件夹
查看>>
java 笔记
查看>>
使用Nginx搭建WEB服务器
查看>>
【oracle唯一主键SYS_GUID()】
查看>>
Logstash笔记(四) ----output插件
查看>>
mysql更改用户密码
查看>>
Cunit编译安装
查看>>
未加域客户端使用Lync时反复弹框要求输入凭证
查看>>
Tomcat部署方式总结
查看>>
可以用IE访问啦^-^,解决了SmartScreen问题哦
查看>>
stdext命名空间
查看>>
nagios plugin shell 自定义,并可以被rrdtool+pnp4nagios 绘画
查看>>
PyQt5 ImportError: DLL load failed: 找不到指定的模块
查看>>
我的友情链接
查看>>
我的主页
查看>>