兰州市机动车尾号限行问
数学建模
2012年兰州交通大学大学生数学建模竞赛
承 诺
我们仔细阅读了数学建模的竞赛规则。
我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮
件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问
题。
我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他
公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正
文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。如有违反
竞赛规则的行为,我们将受到严肃处理。
我们参赛选择的题号是(从A/B/中选择一项填写): A
参赛队员 (打印并签名) :1.
2.
3.
指导教师或指导教师组负责人 (打印并签名):
日期: 2012 年 5月 7日
机动车尾号问题
摘要
本文针对机动车辆尾号限行问题,提出这样的假设:不管周末和节假日以及六类特殊情况,建立了如下的数学模型:每个尾号在不同年限内被限制的天数-对应年限内的周末和节假日天数。运用计算机语言编程解决模型的运算。
对于问题一,用每个尾号在一年内的被限制天数减去一年内的周末和节假日天数,通过模型得知,被限制天数与车辆尾号相关,与车辆的价位无关,而车辆尾号与车辆价位之间没有必然联系。所以,该限行方案具有年公平性。
对于问题二,用同样的模型,把年限换成五年,即可得出尾号最优获益与最大亏损度,最优获益度为0.02131 ,最大亏损度0.05762 ,最优尾号为 2,7 ,最亏尾号为 1,6 。
对于问题三,用同样的模型,把年限换成10年,10年为国家规定的机动车辆使用年限,得出尾号限行对每辆机动车不具有同样的公平性。
1、问题的提出
一个城市的交通秩序是一个城市形象与风貌的重要风向标。随着经济发展和人民生活水平提高,出行的人流和私家车的数量与日俱增,解决交通拥堵问题势在必行,机动车辆尾号限制无疑是解决交通拥堵问题很有效的一种方案。
我们考虑机动车辆尾号限制的公平性问题建立模型。
这里讨论的公平性有两个层面的含义:
(1),不同价位的车支付不同的交通费用金额,限行对高价车与低价车是否具有同样的公平性。
(2),不同尾号的车在同样的限行期限内是否具有同样的公平性。 问题一属于第一个层面的含义,讨论限行对不同价位的车的公平性。问题二、问题三属于第二个层面的含义,谈论限行对不同尾号的车的公平性。
问题1:不同价格的机动车年需付各类金额(如:保险费,路桥费,保养费等)不同;车价越高,相应付出各类金额越多;试建模型讨论机动车尾号限行办法的年公平性。
问题2:若兰州市机动车尾号限行办法实施5年,试讨论尾号最优获益和最大亏损度,并给出最优和最亏具体尾号,
问题3、若兰州市机动车尾号限行办法长期使用,是否对每辆机动车具有同样的公平性,
2、问题分析
针对上面提出的问题,进行相关分析。问题的核心是公平性,对于机动车辆限行而言,公平性指在某个确定的时间段内,被限行天数是否相同,因此,问题转换为计算不同尾号的车辆的被限行天数。 3、模型假设
1、假设六类特殊车辆不参与模型建立,六类特殊情形如下:
第一,在限行时间上,只限白天不限夜晚,不是全天都限。具体限行时间为每日早7时至晚8时;双休日、节假日不限号。
第二,在限行范围上,只限城关、七里河两区中心城区道路,不是市内四区都限,也不是所有道路都限。具体限行范围为桃树坪三岔路口以西,北滨河路、靖远路、盐场路以南,南山战备路、工林路、兰工坪路、晏家坪北路以北,武威路、敦煌路、七里河大桥以东范围内所有道路(含上述路段)。
第三,在限行车型上,外地来兰机动车3天内不受限行规定限制,以路桥收费票据为凭。
第四:本市各级党政机关每日在限行规定的基础上停驶20%的公务用车;双休日和法定节假日,本市城区各级党政机关公务用车一律停驶(执行公务除外)。
第五、六类机动车不限行
1、军车、警车、消防车、救护车、工程救险车等执行紧急任务的特种车辆;
2、公交车、公路客运车、出租车(原单双日运行规定不变)、旅游车以及9座以上(含9座)客车;
3、喷涂统一标识并执行任务的行政执法车辆、邮政专用车辆、清障专用车辆;
4、环卫、园林、道路养护部门的专项作业车辆,殡仪馆的殡葬车辆;
5、运送危重病人等紧急情况确需通行的车辆(事前或事后须向辖区交警大队书面说明并提供证明材料);
6、机要通讯、运送城市重要生产生活物资等其他特殊情况确需通行的车辆(凭市公安局交警支队核发的通行手续通行)
2、假设车辆尾号与价位之间没有直接关系。
3、假设参与建模车辆的国家规定的使用年限均为10年。 4、模型建立
直接建立数学模型:每个尾号在某一时间段内的被限行天数-该时间段内的周末和节假日天数
问题一求解:每个尾号在一年内被限行的天数,一年内的周末和节假日天数如下图
一年内被限行的天数一年内节假日数 实际被限制的天数 尾号
(不含周末) (不含周末)
1 56 1 55 2 52 4 48 3 52 1 51 4 50 1 49 5 51 1 50
6 56 1 55 7 52 4 48 8 52 1 51 9 50 1 49 0 51 1 50
计算结果得出结论,限制天数的长短只与尾号相关,再结合假设尾号与车的价位无关,所以,车的价位不同产生的交通费用不同,不会影响车辆限行的年公平性。
问题二求解:每个尾号在五年内的被限制情况如下 尾号 五年内被限行的天数 五年内周末和节假日数 实际被限制的天数
(不含周末) (不含周末)
1 281 13 268 2 257 9 248 3 257 8 249 4 255 6 249 5 255 2 253 6 281 13 268 7 257 9 248 8 257 8 249 9 255 6 249 0 255 2 253
由图得出:
限行天数总和:1267
每组尾号的平均现行日期:1267/5 = 253.4
最优获益度为: 1 - 248 / 253.4 = 0.02131
最大亏损度为: 268 / 153.4 - 1 = 0.05762
最优尾号为: 2,7
最亏尾号为: 1,6
问题三求解:每个尾号在10年内的被限制情况
尾号 十年内被限行的天数 十年内周末和节假日数 实际被限制的天数
(不含周末) (不含周末)
1 565 26 539 2 514 15 499 3 514 15 499 4 509 12 497 5 509 7 502 6 565 26 539 7 514 15 499 8 514 15 499 9 509 12 497 0 509 7 502
由图得出结论,该方案长期使用,对每个尾号不同的车辆对应不同的被限制天数,即对每个车辆不具有同样的公平性。 5、计算方法设计
我们对模型的分析与推理后,最终通过如下程序实现了尾号的限行日期的初步计算。
采用的编程语言是C#。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace shuXueJianMo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//label1.Text = Week();
//lbl05.Text = CaculateWeekDay(2012, 5, 31);
WeiHaoXianXingRiQiTongJi(2010, 9, 18,5);
}
//尾号限行日期统计
public void WeiHaoXianXingRiQiTongJi(int
year,int month,int day,int n)
{
int _zero; //定义5个变量,作为
各个
尾号限行日期的变量
int _one;
int _two;
int _three;
int _four;
int _weekend; //记录周末有多少天
int
_account,_accountOne,_accountTwo,_accountThree,_accountFour,_accountFive; //记录限行的日期总数
int Maxmonth; //需要循环到那一个月
int Maxday; //这个月的总天数
int Middlemonth; //记录月份的中间变量
int Middleday; //记录一月中天数的中间变量
int Testyear, Testmonth, Testday;
Testyear = Testmonth = Testday = 0;
_zero = _one = _two = _three = _four = _weekend
= 0;
Maxday = 0;
Middlemonth = month;
Middleday = day;
for ( Testyear = year; Testyear <= year + n;
Testyear++)
{
if (Testmonth == 13 && Testyear == year +
n) //当加到十三是返回到1
{
Middlemonth = 1;
Maxmonth = month;
}
else if (Testmonth == 13)
{
Middlemonth = 1;
Maxmonth = 12;
}
else
{
Maxmonth = 12;
}
for ( Testmonth = Middlemonth; Testmonth <= Maxmonth ; Testmonth++)
{
Maxday = Day(Testyear, Testmonth); //得到当月的总天数
if (Testday == 32 || Testday == 31 || Testday == 30 || Testday == 29)
{
Middleday = 1;
if (Testyear == year + n && Testmonth == month)
Maxday = day;
}
else
{
Middleday = day;
}
for (Testday = Middleday; Testday <= Maxday; Testday++)
{
if ((Testday == 5) || (Testday == 10) || (Testday == 15) || (Testday == 20) || (Testday == 25) || (Testday == 30))
{
if
((CaculateWeekDay(Testyear, Testmonth, Testday) == "星期六")
|| (CaculateWeekDay(Testyear, Testmonth, Testday) == "星期日
"))
{
_weekend++;
continue;
}
else
_zero++;
}
else if ((Testday == 1) || (Testday == 6) || (Testday == 11) || (Testday == 16) || (Testday
== 21) || (Testday == 26) || (Testday == 31))
{
if
((CaculateWeekDay(Testyear, Testmonth, Testday) == "星期六")
|| (CaculateWeekDay(Testyear, Testmonth, Testday) == "星期日
"))
{
_weekend++;
continue;
}
_one++;
}
else if ((Testday == 2) || (Testday == 7) || (Testday == 12) || (Testday == 17) || (Testday
== 22) || (Testday == 27))
{
if
((CaculateWeekDay(Testyear, Testmonth, Testday) == "星期六")
|| (CaculateWeekDay(Testyear, Testmonth, Testday) == "星期日
"))
{
_weekend++;
continue;
}
_two++;
}
else if ((Testday == 3) || (Testday == 8) || (Testday == 13) || (Testday == 18) || (Testday
== 23) || (Testday == 28))
{
if
((CaculateWeekDay(Testyear, Testmonth, Testday) == "星期六")
|| (CaculateWeekDay(Testyear, Testmonth, Testday) == "星期日
"))
{
_weekend++;
continue;
}
_three++;
}
else if ((Testday == 4) || (Testday == 9) || (Testday == 14) || (Testday == 19) || (Testday
== 24) || (Testday == 29))
{
if ((CaculateWeekDay(Testyear, Testmonth, Testday) == "星期六") || (CaculateWeekDay(Testyear, Testmonth, Testday) == "星期日
"))
{
_weekend++;
continue;
}
_four++;
}
}
}
}
_account = _zero + _one + _two + _three + _four;
text05.Text = Convert.ToString(_zero);
text16.Text = Convert.ToString(_one);
text27.Text = Convert.ToString(_two);
text38.Text = Convert.ToString(_three);
text49.Text = Convert.ToString(_four);
textAll.Text = Convert.ToString(_account);
textWeekend.Text =
Convert.ToString(_weekend);
textAccount.Text = Convert.ToString(_account + _weekend);
}
//看看今天是星期几,
public string Week()
{
string[] weekdays = { "星期日", "星期一", "
星期二", "星期三", "星期四", "星期五", "星期六" };
string week =
weekdays[Convert.ToInt32(DateTime.Now.DayOfWeek)];
return week;
}
//计算某一天是星期几
public string CaculateWeekDay(int y, int m, int d)
{
if (m == 1)
m = 13;
if (m == 2)
m = 14;
int week = (d + 2 * m + 3 * (m + 1) / 5 + y +
y / 4 - y / 100 + y / 400) % 7;//基姆拉尔森计算公式
string weekstr = "";
switch (week)
{
case 0: weekstr = "星期一"; break;
case 1: weekstr = "星期二"; break;
case 2: weekstr = "星期三"; break;
case 3: weekstr = "星期四"; break;
case 4: weekstr = "星期五"; break;
case 5: weekstr = "星期六"; break;
case 6: weekstr = "星期日"; break;
}
return weekstr;
}
//判断某一年是否为闰年,闰年返回1,平年返回0
public int LeapYear(int year)
{
if ((year % 400 == 0) || (year % 100 != 0) &&
(year % 4 == 0))
return 1;
else
return 0;
}
//判断某月有几天
public int Day(int year,int month)
{
const int _yisan = 31; // 一三五七八十腊
是三十一天
const int _erNotLeap = 28; //非闰月为二十八天
const int _erLeap = 29; //二月闰月为二十九
天
const int _siliu = 30; //4 6 9 11为三十
天
int day ; //记录天数的变量
day = 0;
if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
{
day = _yisan;
}
else if ((month == 4) | (month == 6) | (month == 9) | (month == 11))
{
day = _siliu;
}
else if (month == 2 && LeapYear(year) == 1)
{
day = _erLeap;
}
else if (month == 2 && LeapYear(year) != 1)
{
day = _erNotLeap;
}
return day;
}
}
}
6、结果分析与检验
对于第一个问题的结果,完全符合生活常规。即使不限行,高价车支付的交通费用金额高于低价车,限行天数与车的价位之间没有必然的关系。对于第二,第三个问题,在假定范围内,数据具有较高的精确性,误差在合理范围内,数据稳定性较好。
7、模型的改进与推广
本文模型假设中,第三点假设假定参与模型建立的车辆国家规定的使用年限为10年,可以适当放宽,以作改进。计算15甚至20年内的公平性问题,本模型虽是针对机动车辆限行公平性问题提出的,但在建模的方法上不失一般性,在遇到相似问题时可以发挥较好的模型作用。