zoukankan      html  css  js  c++  java
  • 改进的电梯调度程序

    改进的电梯调度程序

    上文
    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. 提交日志

  • 相关阅读:
    转:ASP.NET中的SESSION实现与操作方法
    SQLHelper
    【Shell】使用Shell脚本发布项目
    【JFinal】关于Model的继承
    【Chrome】离线版下载
    【IDEA 2016.3.4】License Server
    【Windows】修改C盘下用户名
    【MySql】查询数据库中所有表及列的信息
    maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
    rabbitMQ
  • 原文地址:https://www.cnblogs.com/rtxux/p/8451936.html
Copyright © 2011-2022 走看看