附件2中有50辆共享单车(编号为951-1000)的数据。已知其中5辆单车会间歇性地发生故障,从而导致该车在部分时段的骑行速度过慢。请根据附件1,判断附件2中有哪5辆车最有可能是问题车。

导入附件1数据

%% 导入数据[~, ~, raw0_0] = xlsread('附件1 共享单车数据.xls','Sheet1','B1:B12030');[~, ~, raw0_1] = xlsread('附件1 共享单车数据.xls','Sheet1','D1:D12030');[~, ~, raw0_2] = xlsread('附件1 共享单车数据.xls','Sheet1','F1:F12030');[~, ~, raw0_3] = xlsread('附件1 共享单车数据.xls','Sheet1','H1:H12030');[~, ~, raw0_4] = xlsread('附件1 共享单车数据.xls','Sheet1','J1:J12030');raw = [raw0_0,raw0_1,raw0_2,raw0_3,raw0_4];raw(cellfun(@(x) ~isempty(x) && isnumeric(x) && isnan(x),raw)) = {''};%% 将非数值元胞替换为 NaNR = cellfun(@(x) ~isnumeric(x) && ~islogical(x),raw); % 查找非数值元胞raw(R) = {NaN}; % 替换非数值元胞%% 创建输出变量data = reshape([raw{:}],size(raw));%% 创建表data1 = table;%% 将导入的数组分配给列变量名称data1.bh = data(:,1);data1.cf_time = data(:,2);data1.cf_tcd = data(:,3);data1.dd_time = data(:,4);data1.dd_tcd = data(:,5);%% 清除临时变量clearvars data raw raw0_0 raw0_1 raw0_2 raw0_3 raw0_4 R;% 备份一下数据data_bf = data1;

处理第一列的缺失值

data1.bh = fillmissing(data1.bh,'previous');

删除表中包含缺失数据的任何行

data1 = rmmissing(data1);

提取这10个停车点来回之间的数据

num = 10; % 10个停车点tcd_data = cell(num,num);for i = 1:numfor j = 1:iind1 = (data1.cf_tcd == i & data1.dd_tcd == j); % i-->jind2 = (data1.cf_tcd == j & data1.dd_tcd == i); % j-->itcd_data{i,j} = data1(ind1|ind2,:);endend

计算平均值和标准差

mean_tcd = cellfun(@(x) mean(x.dd_time-x.cf_time), tcd_data,'ErrorHandler',@(varargin) NaN);std_tcd = cellfun(@(x) std(x.dd_time-x.cf_time), tcd_data,'ErrorHandler',@(varargin) NaN);

生成一个对称矩阵,在此之前将nan改为0

mean_tcd(isnan(mean_tcd)) = 0;std_tcd(isnan(std_tcd)) = 0;mean_tcd = mean_tcd + mean_tcd';std_tcd = std_tcd + std_tcd';

导入附件2数据

%% 导入数据[~, ~, raw0_0] = xlsread('附件2 待检测的共享单车数据.xls','Sheet1','B1:B619');[~, ~, raw0_1] = xlsread('附件2 待检测的共享单车数据.xls','Sheet1','D1:D619');[~, ~, raw0_2] = xlsread('附件2 待检测的共享单车数据.xls','Sheet1','F1:F619');[~, ~, raw0_3] = xlsread('附件2 待检测的共享单车数据.xls','Sheet1','H1:H619');[~, ~, raw0_4] = xlsread('附件2 待检测的共享单车数据.xls','Sheet1','J1:J619');raw = [raw0_0,raw0_1,raw0_2,raw0_3,raw0_4];raw(cellfun(@(x) ~isempty(x) && isnumeric(x) && isnan(x),raw)) = {''};%% 将非数值元胞替换为 NaNR = cellfun(@(x) ~isnumeric(x) && ~islogical(x),raw); % 查找非数值元胞raw(R) = {NaN}; % 替换非数值元胞%% 创建输出变量data = reshape([raw{:}],size(raw));%% 创建表data2 = table;%% 将导入的数组分配给列变量名称data2.bh = data(:,1);data2.cf_time = data(:,2);data2.cf_tcd = data(:,3);data2.dd_time = data(:,4);data2.dd_tcd = data(:,5);%% 清除临时变量clearvars data raw raw0_0 raw0_1 raw0_2 raw0_3 raw0_4 R;% 备份一下数据data_bf2 = data2;

处理第一列的缺失值

data2.bh = fillmissing(data2.bh,'previous');

删除表中包含缺失数据的任何行

data2 = rmmissing(data2);

计算行驶的时间

data2.dif_time = data2.dd_time-data2.cf_time;

3sigma原则确定异常值

diftime = data2.dif_time;cfd = data2.cf_tcd;ddd = data2.dd_tcd;num = length(cfd); % 569res = zeros(num,1); % 初始化要求的结果for i = 1:numsigma = std_tcd(cfd(i),ddd(i));if diftime(i) < mean_tcd(cfd(i),ddd(i)) - 3*sigmares(i) = 1;elseif diftime(i) > mean_tcd(cfd(i),ddd(i)) + 3*sigmares(i) = 1;endenddata2.res = res;

统计这50辆车中,异常值的占比

先对数据进行分组,G是分组编号,M是代表的意义

[G,M] = findgroups(data2.bh);f = @(x) length(x(x==1))/length(x);bl = splitapply(f,data2.res,G); % 计算异常值的比例format long gsortrows([M,bl],2,'descend')

ans = 50×2

975 0.833333333333333

961 0.8

996 0.636363636363636

977 0.625

981 0.444444444444444

951 0

952 0

953 0

954 0

955 0

编号为[975 961 996 977 981]的这五辆车存在问题。

为确保停车点的正常运行,工作人员每天需骑车从第1个停车点开始,对10个停车点依次进行无重复无遗漏地巡视,途中不作停留,最后回到第1个停车点。为了尽快完成所有停车点的巡视并返回,根据附件1,请给出一条巡视路线(即10个停车点的巡视顺序),并给出巡视一次所需要的最短时间。

factorial(9)

ans =

362880

问题规模不算太大,可以枚举,没太大必要用模拟退火或者遗传算法等智能优化算法!

枚举法:先来生成路径的排列组合(不到1s出结果了)

ticPATH = perms(2:10);num = size(PATH,1);PATH = [ones(num,1),PATH];TIME = zeros(num,1); % 保存每条路径的时间for i = 1:numTIME(i) = calculate_tsp_d(PATH(i,:),mean_tcd);endtoc

历时 0.432379 秒。

function  result =  calculate_tsp_d(path,d)
% 输入:path:路径(1至n的一个序列),d:距离矩阵(在本题中就是时间~)n = length(path);result = 0; % 初始化该路径走的距离为0for i = 1:n-1  result = d(path(i),path(i+1)) + result;  % 按照这个序列不断的更新走过的路程这个值end   result = d(path(1),path(n)) + result;  % 别忘了加上从最后一个城市返回到最开始那个城市的距离
end
[min_time,ind] = min(TIME);disp('最优路线是:')PATH(ind,:)

% ans = 1×10

% 1 10 2 8 5 7 4 9 3 6

disp('最短时间是')

最短时间是

min_time

min_time =

53.4753546422219

为应对疫情,工作人员需要每隔4小时对共享单车进行一次消毒。消毒的方式为:从停车点1开始消毒,并骑电动车对10个停车点依次进行无重复无遗漏地消毒(电动车的速度为共享单车的1.5倍),每个停车点停留10分钟,最后返回停车点1。在某个停车点停留时,对出现在当前停车点的所有共享单车,在把手、坐垫和篮筐上喷洒医用酒精进行消毒。由于消毒方式便于操作,停留的10分钟已然够用。同时,鉴于酒精的快速挥发性,消毒不影响借还车的进行。若某次消毒,工作人员在上午9点出发,根据附件1,请给出一条消毒路线(即10个停车点的消毒顺序),使得本次能够被消毒的共享单车数量尽可能地多,并且不影响下一次消毒的进行。

这个题目有一点点歧义,即要不要算上附件二中编号为951-1000的这50辆车

如果算上的话可以这么做:

% data = union(data1,data2(:,1:5));

如果同时还要排除存在问题的这五辆车,可以这样做:

% ind = [975 961 996 977 981];

% for i = 1:length(ind)

% data(data.bh == ind(i),:) = [];

% end

%统计在一天的每一分钟,每个停车点有多少辆车

R = zeros(24 * 60 , 10);data = data1;data.cf_time = ceil(data.cf_time);data.dd_time = ceil(data.dd_time);bh = unique(data.bh);num_bh = length(bh);for k = 1:num_bhtmp = data(data.bh == bh(k),:);num = height(tmp); % 有几个记录if num == 1R(1:tmp.cf_time, tmp.cf_tcd) = R(1:tmp.cf_time, tmp.cf_tcd)+1;R(tmp.dd_time:end, tmp.dd_tcd) = R(tmp.dd_time:end, tmp.dd_tcd)+1;elsefor i = 1:numif i == 1R(1:tmp.cf_time(i), tmp.cf_tcd(i)) = R(1:tmp.cf_time(i), tmp.cf_tcd(i))+1;elseif i == numR(tmp.dd_time(i): end, tmp.dd_tcd(i)) = R(tmp.dd_time(i):end, tmp.dd_tcd(i))+1;R(tmp.dd_time(i-1): tmp.cf_time(i), tmp.dd_tcd(i-1)) = R(tmp.dd_time(i-1): tmp.cf_time(i), tmp.dd_tcd(i-1))+1;elseR(tmp.dd_time(i-1): tmp.cf_time(i), tmp.dd_tcd(i-1)) = R(tmp.dd_time(i-1): tmp.cf_time(i), tmp.dd_tcd(i-1))+1;endendendend

这一问也可以采用枚举法:先来生成路径的排列组合(不到10s出结果了)

ticPATH = perms(2:10);num = size(PATH,1);PATH = [ones(num,1),PATH];CLS = zeros(num,1); % 保存每条路径能够消毒的车辆数for i = 1:numCLS(i) = calculate_num(PATH(i,:),mean_tcd,R);endtoc

历时 4.385277 秒。

function  result =  calculate_num(path,mean_tcd,R)
%    1    10     9     8     7     6     5     4     3     2start_clock = 60 * 9;  % 在上午9点开始消毒tlsj = 10; % 每个停车点停留时间是10分钟num = length(path);result = 0;for i = 1:numresult = result + max(R(start_clock: start_clock+tlsj-1, path(i)));if i < num  start_clock = ceil(start_clock + tlsj + mean_tcd(path(i),path(i+1)) / 1.5);endend
end
[max_cls,ind] = max(CLS);disp('最优路线是:')

最优路线是:

PATH(ind,:)

ans = 1×10

1 3 7 6 2 8 4 10 5 9

disp('能够消毒的车辆数最多是:')

能够消毒的车辆数最多是:

max_cls

max_cls =

943

根据附件1,如何在某个时间段内对停车点的共享单车需求程度进行评估,给出评价标准,并指出从450到600这个时间段,对共享单车需求程度最高的3个停车点。

这里考虑一种最简单的定义需求的关系:

如果某个停车点第x分钟有f(x)辆车,第x+1分钟有f(x+1)辆车

这一分钟的需求量是max(f(x)-f(x+1),0)辆车(车被借走了才有需求)

同理可以考虑一段时间的需求量,只需要进行一个累计求和即可。

r1 = R(450:599,:);r2 = R(451:600,:);demand = sum(max(r1-r2,0))

demand = 1×10

123 84 102 95 116 111 112 100 97 95

上面这种需求方式只考虑了借车的需求,如果同时考虑还车的需求,可以这样做:

% r1 = R(450:599,:);
% r2 = R(451:600,:);
% demand = sum(abs(r1-r2))

还有一个小问题:按照这个需求关系的定义:如果某一时刻借出一辆然后同时还回一辆不是需求量就变成零了吗?
解决方法:上面我们生成矩阵的时候时间是以1分钟分割的,如果你把时间划分的更加精细一点,比如以0.1分钟来分割,就可以减小这个误差。但这个时候的R矩阵会比原来的大10倍,这对matlab来说还是能够应付的过来的,大家有兴趣可以自己实现这个代码。

下面是画图(matlab2021a版本可以运行,2017a版本会报错,其他版本请自己测试)

figure1 = figure('NumberTitle','off','Name','Figure','Color',[1 1 1]);% 创建 axesaxes1 = axes('Parent',figure1);hold(axes1,'on');% 创建 barb = bar(demand,'DisplayName',' 需求');% 添加数据点xtips1 = b(1).XEndPoints;ytips1 = b(1).YEndPoints;labels1 = string(b(1).YData);text(xtips1,ytips1,labels1,'HorizontalAlignment','center',...'VerticalAlignment','bottom')% 创建 plotplot([0,11],[mean(demand),mean(demand)],'DisplayName',' 均值','Tag','mean y','LineStyle','-.',...'Color',[0 0.5 0]);box(axes1,'on');hold(axes1,'off');% 设置其余坐标区属性set(axes1,'XTick',[1 2 3 4 5 6 7 8 9 10]);% 创建 legendlegend(axes1,'show');

2019年,宁波市发布了文件《关于规范宁波市互联网租赁自行车发展的若干意见》(附件3),文件中提到:“按照交通相宜、规模适度、因地制宜、方便公众的原则,科学编制非机动车停放区域设置规划” 。公司根据文件精神,要撤销2个停车点。具体操作为,在附件1中的所有借还车行为结束后,移除这两个停车点的车辆,并运送到其他城市。请给出撤销停车点的评判标准,并指出应撤销哪两个停车点?

这题就很简单了,可以考虑很多指标

比如上一问定义的需求量 波动情况等

数学建模共享单车问题相关推荐

  1. 共享单车MATLAB建模,数学建模共享单车论文.pdf

    2017 年北京科技大学数学建模练习题 (请先阅读"全国大学生数学建模竞赛论文格式规范") A 题: 共享单车运营方案 共享单车的存在解决了城市里"最后一公里" ...

  2. Python数据分析之共享单车及建模探索(CLV建模、可视化)

    Python数据分析之共享单车及建模探索(CLV建模.可视化) 开发环境 4.3[开发平台及环境] Windons 10 教育版 Python 3.7 IntelliJ IDEA 2018.2.1 / ...

  3. 基于共享单车轨迹的自行车道规划(读书笔记)

    ​​​​​      近来重新学习了一下 Planning Bike Lanes based on Sharing-Bikes' Trajectories这篇文章,觉得写得蛮好的,对于学习轨迹数据挖掘 ...

  4. 【数学建模】6 近十年江西省研究生建模赛题及近三年全国建模赛题目录

    1 数学建模的基本过程 (1)模型准备–了解背景 (2)模型假设–明确目标 (3)模型建立–刻画规律 (4)模型建立–得到结果 (5)模型分析–总结规律 (6)模型检验–形成结论 2 江西省研究生历年 ...

  5. 【Social listening实操】用大数据文本挖掘,来洞察“共享单车”的行业现状及走势

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 对于当下共享单车在互联网界的火热状况,笔者想从大数据文本挖 ...

  6. 共享单车运营分析及决策研究

    共享单车运营分析及决策研究 张红, 周迪新, 程传祺, 沙毓 兰州理工大学计算机与通信学院,甘肃 兰州 730050   摘要:针对共享单车运营过程中出现的分配不均衡和调度不合理的问题,基于某城市10 ...

  7. python客户端开发自行车租赁系统_爬虫获取mobike共享单车信息

    背景:端午节假期的时候参加了学校的数学建模比赛,题目是关于共享单车的供需匹配问题,需要获得共享单车的数量和时空分布情况. 在苦苦找寻数据无果的情况下决定自己用爬虫对天津地区的mobike进行统计. 在 ...

  8. 数学建模记录(如何组织,如何参加)(一)

    一.组织记录 在8.15结束的东三省数学建模比赛中,我自己既是赛事的组织者又是参与者.建模比赛是由数学科学学院统筹规划的,我参与了从报名到论文提交的全过程,并且是全程通过线上完成的,作为我第一次组织也 ...

  9. 2021第六届数维杯大学生数学建模竞赛赛题_A 外卖骑手的送餐危机

    外卖骑手的送餐危机 外卖业务已经成为了大城市上班族每日生活中不可或缺的一部分.根据美团2020年6月发布的<2019中国即时配送行业发展报告>中显示,2019年我国即食配送业务订单规模达到 ...

最新文章

  1. MongoDB trouble shoot sharded clusters
  2. [经典面试题]二叉树宽度
  3. __doPostBack简单的使用方法
  4. Wi-Fi和WLAN有什么区别
  5. 什么是devops开发运维_为什么假设驱动的开发是DevOps的关键
  6. 华为云鲲鹏云服务器RC6正式公测,多元算力加速企业创新升级
  7. [BJWC2011]元素
  8. HLG 1334 最好的心情[lis 变形]
  9. android thread 用法,我们如何在Android中使用runOnUiThread?
  10. 2016峰会:项目管理与高级项目管理(广州站)
  11. 拜托!面试请不要再问我Spring Cloud底层原理
  12. 用matlab如何求导,matlab如何求导 matlab求导 matlab如何求导
  13. windows捕获串口数据_如何下载和安装用于Windows数据包捕获的Npcap库?
  14. Mac系统搭建C语言开发环境
  15. 普通IO口模拟实现SPI通信及应用解析
  16. Android-组件化开发
  17. Unity3d读取安卓手机相册
  18. kotlin serialization 使用指南(一)
  19. wps转ppt怎么转换?通过这些方法学会wps如何转换成ppt
  20. 魔性!Python生成全网爆火的“蚂蚁呀嘿”

热门文章

  1. ping检测网络连接异常
  2. 12306多线程抢票
  3. mac电脑怎么彻底关闭系统更新提示?
  4. 手机屏幕取词翻译软件哪个比较好?快看这篇文章,它能告诉你
  5. 建筑施工技术【22】
  6. 移动硬盘参数错误无法访问数据恢复方法
  7. [No00005F]读书与心智
  8. 浅析 | 海岸试验数据管理系统TDM-设计理念(系统特征)
  9. 银行营销策略数据分析 - 智能定位
  10. Android图片背景朦胧效果,android 图片的模糊化处理,效果类似超级课程表的“我的中心里头像背景,看起来很炫...