普通电梯调度算法

普通电梯调度算法

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及文件输出
    – 【输出文本文件
    1329622-20180210015419076-875303913.png
    – 【输出二进制文件
    1329622-20180210015423857-55383901.png
  • 文件输入流类ifstream及文件输入
    – 【输入文本文件
    1329622-20180210015428685-728332677.png
    – 【输入二进制文件
    1329622-20180210015431857-1021813944.png

  • 检查输入文件状态
    eof()检查文件是否已结束
    good()检查文件是否已损坏

  • 文件打开模式
    1329622-20180210020301685-1930651708.png

  • 文件的随机读写
    – 文件输入流对象包含一个读文件指针
    – 文件输出流对象包含一个写文件指针
    istream& seekg(long bytes, ios::seek_dir origin); // 移动读文件指针 long tellg(); // 返回当前读文件指针的位置 ostream& seekp(long bytes, ios::seek_dir origin); // 移动写文件指针 long tellp(); // 返回当前写文件指针的位置


git commit 日志

1329622-20180222152036126-1327224167.png


测试数据

  • 数据1:
    目的信息同时出现,电梯应当达到理论最优解 0 5 8 5 4 9 5 2 5 5 6 7 5 8 2
    1329622-20180222143143330-324782409.png

    测试结果:
    64
    得到最优解,符合预测

  • 数据2:
    电梯应当在运行中掉头才能得到最优解 0 1 9 0 1 9 0 1 9 5 5 4 5 5 4
    1329622-20180222143146915-1182103669.png

    测试结果:
    43
    电梯掉头,符合预测

  • 数据3:
    电梯应当在运行中不掉头才能得到最优解 0 1 8 0 1 8 0 1 8 0 1 8 3 6 1
    1329622-20180222143150399-1166787320.png

    测试结果:
    46
    电梯不掉头,符合预测

  • 数据4:
    即使到达目的地也不能停,电梯应当优先满足多数人的需求 0 1 8 0 1 8 0 1 8 0 1 8 3 3 7
    1329622-20180222143153522-1400627690.png

    测试结果:
    44
    电梯中途未停,符合预测

  • 数据5:
    随机的较大数据,观察是否出现异常 66666 3 9 66667 7 2 66660 5 2 66663 8 9 66673 1 9
    1329622-20180222143156978-1609307655.png

    测试结果:
    80
    电梯正常运行

转载于:https://www.cnblogs.com/stolf/p/8443495.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电梯调度算法是指在多层楼房中,通过电梯的运行,使乘客尽快到达目的地的一种算法。常用的电梯调度算法有 FCFS(先来先服务)、SSTF(最短寻找时间优先)、SCAN(扫描)、CSCAN(循环扫描)等。 以下是一个简单的电梯调度算法的C++代码示例,其中使用了SCAN算法: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int current_floor = 1; // 当前电梯所在楼层 int direction = 1; // 1表示上行,-1表示下行 vector<int> requests; // 请求列表 // 模拟电梯接受请求的过程 requests.push_back(5); requests.push_back(3); requests.push_back(7); requests.push_back(2); requests.push_back(6); // 对请求进行排序,按照电梯所在楼层的方向进行排序 sort(requests.begin(), requests.end(), [current_floor, direction](int a, int b) { return (direction == 1) ? (a < b) : (a > b); }); // 执行电梯调度 while (!requests.empty()) { int target_floor = requests.back(); // 获取最后一个请求 requests.pop_back(); // 弹出最后一个请求 // 判断电梯运行方向并输出运行轨迹 if (target_floor > current_floor) { while (current_floor < target_floor) { cout << "电梯上行到达第" << current_floor << "层" << endl; current_floor++; } } else { while (current_floor > target_floor) { cout << "电梯下行到达第" << current_floor << "层" << endl; current_floor--; } } cout << "电梯到达第" << current_floor << "层,开门" << endl; } cout << "电梯调度完成" << endl; return 0; } ``` 该示例代码只是一个简单的电梯调度算法的实现,实际应用中需要考虑更多的因素,如电梯负载、优先级、故障处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值