【数学建模】十二(最后一篇):MATLAB CUMCM真题求解实例三:机理建模型
机理建模问题在国赛中的占比呈上升趋势,近年来的题目有重庆交警平台设置、打车软件补贴优化、开放小区等问题, 本讲将以 2015 年的打车软件问题为例,介绍 MATLAB 在这类问题中的求解过程。
所介绍的 MATLAB 案例是获得 2015 年国赛 ”MATLAB创新奖” 的程序, 所用的求解方法也是比较典型的机理建模方法。
1. 问题重述
1.1 背景资料与条件
出租车是市民出行的重要交通工具之一,“打车难”是人们关注的一个社会 热点问题。随着“互联网+”时代的到来,有多家公司依托移动互联网建立了打 车软件服务平台,实现了乘客与出租车司机之间的信息互通,同时推出了多种出 租车的补贴方案。
1.2 需要解决的问题
(1)试建立合理的指标,并分析不同时空出租车资源的“供求匹配”程度。 (2)分析各公司的出租车补贴方案是否对“缓解打车难”有帮助。 (3)如果要创建一个新的打车软件服务平台,你们将设计什么样的补贴方案,并论证其合理性。
2. 建模与求解思路
(1) 首先要找到合理的指标;
(2) 采用机理仿真方式对打车的流程中乘客和出租车的行为进行仿真;
(3) 计算整个打车系统中的指标,优化打车方案,具体实现的主要代码如下:
%% 2015 CUMCM
clc, clear, close all
%% 数据结构设计
% passengers:
% [出发点横坐标,出发点纵坐标,目的地横坐标,目的地纵坐标,出行里程]
% 即[xs,ys,xd,yd,l]
% taxis
% [出租车位置横坐标,出租车位置纵坐标,出租车被占用里程]
% 即[x_taxi,y_taxi,lo]
%%
r_valid = 2/10;%出租车有效覆盖半径
xmax = 111*cos(pi*34/180)*1.4;
ymax = 0.7*111;
xmax = xmax/10;
ymax = ymax/10;
psnger_total = 80;
taxi_total = 152;
%先生成5000个出发点
for i = 1:psnger_total
passengers(i,:) = gen_passenger();
end
for i = 1:taxi_total
taxis(i,:) = gen_taxi();
end
figure
scatter(taxis(:,1)*10,taxis(:,2)*10)
xlabel(‘x(km)‘)
ylabel(‘y(km)‘)
all_B = [];
all_K = [];
for i = 1:200
%% 首先更新出租车状态
lc = taxis(:,3) - 0.01;%出租车被占用里程
lc(lc < 0) = 0;
taxis(:,3) = lc;
%空车随机一个方向前进0.01
valid_lines = find( lc == 0 );
all_K = [all_K,1-length(valid_lines)/taxi_total];
for m = 1:length(valid_lines)
k = valid_lines(m);
while(1)
degree = 2*pi*rand();%出行方向
new_x = taxis(k,1) + 0.01.*cos(degree);
new_y = taxis(k,2) + 0.01.*sin(degree);
if(new_x>=0 && new_x<=xmax && new_y>=0 && new_y<=ymax)
taxis(k,1:2) = [new_x,new_y];
break
end
end
end
%% 乘客加入系统
add_passengers_total = 4;%round(normrnd(10,3));
add_passengers = zeros(add_passengers_total,5);
for n = 1:add_passengers_total
add_passengers(n,:) = gen_passenger();
end
passengers = [passengers;add_passengers];
%% 计算各乘客视野内出租车数目
for j = 1:length(passengers)
p = passengers(j,:);
if isnan(p(1))
continue
end
temp_taxis = taxis;
%被占用的出租车不参与打车
invalid_lines = find(temp_taxis(:,3)>0);
temp_taxis(invalid_lines,:) = nan;
%% 然后是乘客乘车
r = sqrt((temp_taxis(:,1)-p(1)).^2+(temp_taxis(:,2)-p(2)).^2);
taxi_num = find(r<r_valid);%视野范围内的车辆
if isempty(taxi_num)%视野内没有车,下一位乘客
continue;
else
%随机选一辆乘坐
index = round(rand()*(length(taxi_num)-1))+1;
taxi_num = taxi_num(index);
taxis(taxi_num,3) = p(5) + sqrt((taxis(taxi_num,1)-p(1))^2+(taxis(taxi_num,2)-p(2))^2);%此乘客p乘坐的出租车被占用
taxis(taxi_num,1) = p(3);taxis(taxi_num,2) = p(4);%将其更新到目的地
passengers(j,:) = nan;%更新乘客状态,上车的乘客变为nan,移出系统
end
end
all_B = [all_B,calcu_b(passengers,taxis)];
end
figure
hold on
scatter(taxis(:,1)*10,taxis(:,2)*10,’g*‘)
legend(‘初始位置‘,’一段时间后位置‘)
%20次演化后才得到平时状态,故只保留20次之后的数据
pos = (20:length(all_B));
figure
plot((pos-20)/4.5,all_B(pos));
xlabel(‘时间(分钟)’)
ylabel(‘数目不平衡度‘)
figure
plot((pos-20)/4.5,all_K(pos));
xlabel(‘时间(分钟)’)
ylabel(‘里程利用率‘)
figure
res = sqrt( ((all_K-0.66)./0.66).^2 + (all_B-1).^2 );
plot((pos-20)/4.5,res(pos));
xlabel(‘时间(分钟)’)
ylabel(‘供需不平衡度‘)
程序的仿真结果如图 1、图 2 所示。
图 1 出租车初始位置
图 2 评价指标随时间的变化趋势图
3. 点评
本问题如果按照传统的建模方法, 无论是建模还是求解难度都比较大, 但如果采用元胞自动机思想的仿真法,就可以利用系统的方法对整个系统进行仿真,再通过参数优化得到最佳的补贴。
程序本身虽然还有不少可以改进的地方, 但总的来说, 程序的建模思路清晰, 程序框架和模块的构造都比较合理, 编程中使用了分节、注释、变量预定义、函数定义等方法, 使得整个程序既具备良好的功能性,也体现了可读性、性能提升等程序开发细节, 在三天时间内能达到这个水平, 确实不容易。
当然在此基础上还有不少可以提升、拓展的空间, 比如如何在此程序基础上结合不同的城市或区域,仿真出更真实的打车情况, 另外,还可以在指标上拓展思路, 比如一个指标还是有些偏面,但既然可以做仿真, 各种指标都可以仿真出来, 对提升整个建模水平还是比较有帮助的。
【数学建模】十二(最后一篇):MATLAB CUMCM真题求解实例三:机理建模型相关推荐
- 数学建模专栏 | 第十二篇:MATLAB CUMCM真题求解实例三:机理建模型
机理建模问题在国赛中的占比呈上升趋势,近年来的题目有重庆交警平台设置.打车软件补贴优化.开放小区等问题, 本讲将以 2015 年的打车软件问题为例,介绍 MATLAB 在这类问题中的求解过程. 所介绍 ...
- 数学建模专栏 | 第十篇:MATLAB CUMCM真题求解实例一:数据型
本讲针对的题型是数据型的建模问题, 2012 年的 A 题就是一道典型这类问题,接下来将介绍这道题的 MATLAB 求解过程. 1. 问题的提出 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品 ...
- 【数学建模】十:MATLAB CUMCM真题求解实例一:数据型
本讲针对的题型是数据型的建模问题, 2012 年的 A 题就是一道典型这类问题,接下来将介绍这道题的 MATLAB 求解过程. 1. 问题的提出 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品 ...
- 数学建模_数学模型的分类数学建模十大算法
数学模型的分类 数学建模十大算法 1.蒙特卡罗算法 (该算法又称随机性模拟算法, 是通过计算机仿真来解决问题的算法, 同时可以 通过模拟可以来检验自己模型的正确性,比较好用的算法) 2.数据拟合.参数 ...
- 风控建模十二:数据淘金——如何从APP数据中挖掘出有效变量
风控建模十二:数据淘金--如何从APP数据中挖掘出有效变量 1.常识知识 2.个例分析 3.分布排查 智能手机的诞生改变了人类的生活方式,智能手机所承载的功能日臻完善.强大,人们在衣.食.住.行.工作 ...
- 【FastAPI 学习十二】定时任务篇 (移步博客园或个人网站 无广告,界面清爽整洁)
声明 目前个人放弃CSDN平台,文章只发布于个人网站和博客园 博客园地址 [FastAPI 学习十二]定时任务篇
- 数学建模中matlab程序,数学建模中常用的30个MATLAB程序和函数
<数学建模中常用的30个MATLAB程序和函数>由会员分享,可在线阅读,更多相关<数学建模中常用的30个MATLAB程序和函数(15页珍藏版)>请在人人文库网上搜索. 1.内部 ...
- 2021年春季学期-信号与系统-第十二次作业参考答案-第四小题
▓ 本文是 2021年春季学期-信号与系统-第十二次作业参考答案中的小题答案 §04 第四小题 4. 画出X(z)X\left( z \right)X(z) 的零极点图,在下列三种收敛域下,求各对应的 ...
- 2021年春季学期-信号与系统-第十二次作业参考答案-第三小题
▓ 本文是 2021年春季学期-信号与系统-第十二次作业参考答案中的小题答案 §03 第三小题 3. 设激励x(t)=e−tx\left( t \right) = e^{ - t}x(t)=e−t 时 ...
最新文章
- python将二维列表内容写入和读取.txt文件
- 检查压缩包是否损坏_修复损坏的gzip压缩文件之原理篇
- Java synchronized解析
- php-dev离线安装,局域网 pm2 离线安装
- android listview item点击时更改textview的颜色 代码中实现
- wiremock 使用_使用WireMock进行更好的集成测试
- SpringBoot获取配置文件常量值
- MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!
- python进阶05并发之一基本概念
- Error - ORA-26028
- “陆奇争夺战”:江湖传言,得陆奇者得AI天下。
- python安装包国内地址
- linux编译 __stdcall,Linux下的stdcall 约定格式
- 记首次CCF数据算法竞赛的心得与收获(排名top1、top2%、top8%),CCF明年再会!
- 《Miss Talk》第07期:对话拓课云联合创始人兼CTO 王晓伟
- 美团Java后台一面
- Revit二次开发之技能篇(五)———模型轻量化.RVT到JSON实现的测试
- 寻回失落的“纸人李”——四川大学团队用3D技术平台重现传统纸人工艺
- sklearn实战之随机森林
- mt4双线macd_金叉死叉?高手教你MT4的MACD用法