(本篇为原创,转载使用请注明出处)
-
实际问题描述
在北科大校园内安置1000辆小黄车,怎样安置使得小黄车的利用效率最高
既然是利用效率的最大化问题,其实可以抽象为更多“人”,骑“自行车”更“方便”。
先将北科地图进行抽象,分为五块区域,八个聚簇群。
定义聚簇热点度与聚簇流动度。
对于热点度的主要变量为常驻人口数(如宿舍的人口与教学楼平均上课自习人数),确定这个点小黄车的最少基数
对于流动度分为两类变量:
变量一:区域通达度:点与其他非邻接点(骑车的最少条件,太近不骑车)的“关联度”
关联度即为人们的需求,分为:
软性需求:与其他非邻接点的长度越长,对于小黄车的需求越高
刚性需求:基于两个点之间常识的需求(常量、补正软性需求)
变量二:人员流动度:这个聚簇的人员的一天流动需求有多大(比如教学楼一天一直有大量人员流动,但类似机电楼群等较少)
公式:聚簇小黄车配额度=k1*聚簇热点度(C)+k2*聚簇流动度
聚簇热点度=k3*常驻人口数(C)
聚簇流动度=k4*区域通达度+k5*人员流动度(C)
区域通达度=Σ(点到第i个非邻接点的软性需求*点到第i个非邻接点的刚性需求)(占总共n个点刚性需求百分比)
软性需求=各点到其余非邻接点的最短路径长度
配额=(该点配额度/各点配额度之和)*小黄车总数
北科大带权无向图
-
编程过程与算法
程序分为四个部分,功能分别是
- 输出抽象的北科地图,在进行合理的假设与归并之后,化成带权值的无向图。
- 输出邻接矩阵
- 每点到各点的最短路径长度
- 输出小黄车在北京科技大学八个聚簇的配额
-
收获体会
本次作业选择了小黄车题目,平台语言采用了C++开发的简单WIN32程序。结合离散数学图论与数理逻辑的相关知识进行问题的分析。编程过程中出现了好多问题,首先对于数据过多的问题,一开始觉得一次次添加数据较为繁琐,后来就将数据保存改为读取的方式,解决了一大难题。在读取数据的过程中,尤其是最短路径带权数据的读取中出现了一些问题,首先对于算法程序,应该将不带权的地方置最大数而不是0,其次循环过程中出现了一些问题,应该从1至8,而不是0至7,导致输入的一些数据溢出,程序出错。
这次作业不光是对离散数学的回顾与学习,也是对自己编程知识习惯的一次巩固,代码尽量模块化,简洁美观。
可惜的是没有做图形界面,主要C++的MFC写图形界面事倍功半,其余图形界面的编程并未作过多的深入研究,所以只是做了伪图形界面,有一些可惜。
-
资源分享
链接:09-2017.12-离散数学编程《小黄车在北科大的配额问题》 密码:bf6c