改进的电梯调度程序

改进的电梯调度程序

上文
GitHub

1. 学习心得

1.1 关于文件读写

其实我觉得这个没什么好说的,就是翻翻API,不会了man 3 freopen就这样

1.2 关于Git Commit规范

我有句MMP一定要说
我觉得这个规范太死板,有一些情况并不包含在那些type里面(有可能是我学习不够深入),在这种情况下写commit message都不知道怎么写。

2. 改进过程

2.1 外围代码的修改

2.1.1 文件输入输出

因为程序不需要往多个地方输入输出,直接重定向标准输入输出流就完事了

freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);

在main()开头加两行就行,因为程序运行完就退出,所以不需要考虑文件描述符(句柄)泄漏

2.1.2 外围调度部分

其实这个本来不用改,是我自己傻逼了

2.2 核心调度的修改

2.2.1 魔改预估时间法

上次在移植大佬的算法的过程中发现,他的算法整体思想并没有用到乘客只去1层和10层的假设,只是在有些地方数据写死了而已,只需要把这些写死的数据换成合适的变量就可以了。
至于最后那些计算公式的推导过程有没有用到假设就不知道了,反正程序能跑而且跑得挺正常的。

2.2.2 带顺向截梯控制的扫描算法

其实就是让电梯在1层和10层之间往复运动,如果有乘客到达目的地则停,如果有与电梯运行方向相同的请求则停
施工中

3. 踩坑记录

3.1 Windows可执行文件

无比巨坑

3.1.1 MinGW工具链和依赖库

Bootstrapping MinGW工具链的辛酸过程就不写了,编译出来的东西复制到Windows上会缺两个库(我的电脑上是两个,别的电脑就不知道了),保险起见开编译选项-static静态链接。

3.1.2 MSVC和GCC所带的STL行为不一致

GCC上正向迭代器的base()返回其所指代的元素指针,而在MSVC中只有反向迭代器有base()返回其所对应的正向迭代器,正向迭代器没有这个成员
CMake生成VS项目文件后打开一大片红,这也是为什么我最后选择MinGW

3.1.3 字符编码问题

程序输出中文乱码,控制台chcp 65001后正常
所以我猜想这是字符编码问题,MinGW按照UTF-8将文本字符写进程序,但输入输出库默认调用的是A系列API,在中文版Windows上接受GBK字符串,需要将MinGW配置为执行字符集使用GBK
解决:编译选项添加-fexec-charset=gbk

3.1.4 Git

全静态链接出来的可执行文件体积达10+M,多个版本后git仓库体积爆增
本来想用git rebase或者git gc这种黑魔法从历史中删除仓库对象,但是想想容易玩脱
所以我想可以让EXE单独stage然后commit,使这个commit处于History最顶端,需要修改时直接丢弃这个commit,修改后commit,再编译,再commit,最后git push --force强制推到远端

4. 测试样例

1 1 0
2 1 0
3 1 0
4 1 0
5 1 0
0 5 1
0 5 4
0 5 7
0 5 9
0 5 10
0 10 1
0 9 1
0 7 1
0 4 1
0 2 1
1 2 3
3 2 1
5 3 5
7 2 3
6 9 0
66666 3 9
66667 7 2
66660 5 2
66663 8 9
66673 1 9

5. 统计

时间 Bug数 行数
~3h ~5 ~480

6. 提交日志

posted @ 2018-02-17 15:48  rtxux  阅读(283)  评论(4编辑  收藏  举报