普通电梯调度算法
GitHub: https://github.com/StolfdaInuit/object-oriented
编写程序的代码行数 | 调试的bug数 | 完成该次作业总耗时 |
---|---|---|
277行 | 2个 | 1h |
文件清单
\\ elevator-scheduling(normal)
\\ main.cpp // 策略:估计当前 向上、向下、停靠 三类行动的耗时,采用预估耗时最少的
\\ BIN
\\ elevator.exe // 运行一次测试五组数据
\\ input.txt // 包含所有的五组测试数据
\\ output.txt // 包含所有的五组测试结果
优化过程
问题给出的要求是实现一个正常的电梯调度算法,因为之前的作业就是当正常电梯来写的,所以在之前代码的基础上稍微改改就行了。
不过考虑到贪心算法很容易忽略掉一些条件,又重新整理了一遍公式。
下次如果还写电梯,打算用深搜了,贪心毕竟还是不够对口,虽然感觉如果考虑实际情况下的嵌入式算法可能贪心会更容易用到。。
总结了一下基本的运行流程:
电梯每一秒执行如下操作:
1. 遍历乘客信息,获取有效的目的地信息。
2. 目的地指:【已发出请求的未上电梯的乘客的起始楼层】 以及 【已上电梯的乘客的去往楼层】。
3. 把所有目的地归纳为三大类:向上,向下,停靠。
4. 对运行目标按照以下规则进行选择:
估计当前 向上、向下、停靠 三类行动的耗时,采用预估耗时最少的
5. 执行当前运行目标。
注:初始运行目标为停靠。
另外还把测试模式改成多组数据,也就是运行一次测试五组数据。
因为没有考虑全局变量重置的问题,出了点小bug。
文件读写
#include<fstream>
......
fstream(const char *, int = ios::in); // 有参构造函数
void open(const char *, int =ios::in); // 打开文件
bool is_open() const; // 检查文件是否正确打开
void close(); // 关闭文件
-
文件输出流类ofstream及文件输出
– 【输出文本文件】
– 【输出二进制文件】
-
文件输入流类ifstream及文件输入
– 【输入文本文件】
– 【输入二进制文件】
-
检查输入文件状态
–eof()
检查文件是否已结束
–good()
检查文件是否已损坏 -
文件打开模式
-
文件的随机读写
– 文件输入流对象包含一个读文件指针
– 文件输出流对象包含一个写文件指针istream& seekg(long bytes, ios::seek_dir origin); // 移动读文件指针 long tellg(); // 返回当前读文件指针的位置 ostream& seekp(long bytes, ios::seek_dir origin); // 移动写文件指针 long tellp(); // 返回当前写文件指针的位置
git commit 日志
测试数据
- 数据1:
目的信息同时出现,电梯应当达到理论最优解
0 5 8
5 4 9
5 2 5
5 6 7
5 8 2
```
```
测试结果:
64
得到最优解,符合预测
```
- 数据2:
电梯应当在运行中掉头才能得到最优解
0 1 9
0 1 9
0 1 9
5 5 4
5 5 4
```
```
测试结果:
43
电梯掉头,符合预测
```
- 数据3:
电梯应当在运行中不掉头才能得到最优解
0 1 8
0 1 8
0 1 8
0 1 8
3 6 1
```
```
测试结果:
46
电梯不掉头,符合预测
```
- 数据4:
即使到达目的地也不能停,电梯应当优先满足多数人的需求
0 1 8
0 1 8
0 1 8
0 1 8
3 3 7
```
```
测试结果:
44
电梯中途未停,符合预测
```
- 数据5:
随机的较大数据,观察是否出现异常
66666 3 9
66667 7 2
66660 5 2
66663 8 9
66673 1 9
```
```
测试结果:
80
电梯正常运行
```