电梯V2.0

电梯V2.0

GitHub仓库地址

Problem

一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层。其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停留在第1层和偶数层。电梯移动1层的耗时为1,在某一层停靠的耗时为1(时间初始为0)。电梯不允许未仆先知,必须在时间到了之后才能开始响应这条请求。
为了使得电梯完成接送所有乘客的运行时间最短,请你编写一个程序来进行电梯调度。

输入
输入文件的文件名为 input.txt ,其中:第一行为一个非负整数N,代表乘客的请求数量;接下来N行,描述了这N个请求的信息,格式为请求时刻 起始楼层数 去往楼层。
保证请求时刻是单调不减的。

/input example/
2
1 1 2
1 2 1

输出
输出调度决策,3部电梯分别输出到3个文件。文件名分别为output1.txt、output2.txt和output3.txt,其中:每一行的输出格式为时刻 停靠楼层。(初始时停在1层的状态不输出)
注意:“时刻”指的是在某层楼停靠的时刻,且不算入在该层的停靠时间。

/onput1.txt为空/

/onput2 example/
3 2

/onput3 example/
2 2
4 1


思考过程

提示:本文针对的是我对这题的思考过程,思路不止一种。

拿到题目的我直接一脸懵逼,这次的作业直接由之前的单线操作变为多线同时操作,我猜测老师和助教的本意是让我们尝试使用继承和多态来解决不同运行规律的电梯这个问题,然而在加大语法考核难度的同时算法难度几乎是几何倍的增长了啊!这周又有高数考试忙于复习,这不是为难我胖虎么!
总之,问题是不会少的,在我实践的过程中,大概碰到了以下几个问题

如何建立特殊运行模式的电梯?
如何设计实现多线程同时运行的算法?
如何使函数与继承的类联系?

第一个问题还算好解决,直接把学来的继承和多态用上,建立一个特殊的电梯类。然而第二个问题困扰了我很久,我之前设计的算法思想采用的是dfs(深度优先搜索),是以单线操作为设计思路设计的算法,在多线程操作上无能为力,只能重新设计算法,又由于考试的原因没能去深思,还没能想出好的解决办法,暂且就用了比较菜的调度算法orz。而因为第二个问题还没能有效的解决,第三个问题也只好先留着了。具体请留意本篇博客的更新。


5.21更新

这几天想算法和DeBug真的要搞到我头发掉光QAQ。想来想去,参考了部分前辈的算法思想,但是由于知识所限以及deadline的逼迫,目前还是只能利用dfs实现电梯调度,以此算法思想为核心编写了两个调度算法,我将其称为:

任务分配型电梯调度算法
全局响应型电梯调度算法

以下就这两个算法进行简单的叙述。

任务分配型电梯调度算法

当乘客提出请求时,将乘客请求分配给三台电梯中满足乘客要求的电梯进行模拟运算,选出运行时间最短的电梯,将乘客直接分配给电梯(乘客:被安排的明明白白.jpg)。电梯在收到分配的乘客请求后才会进入运行状态,没有任务则会在最后一位乘客离开时的楼层停机待命。
优点:满足尽量缩短电梯运行时间的要求,算法实现较为简单。
缺点:新的乘客请求不会影响到已经分配的任务,其他可能最优的电梯无法干涉已分配的任务。
时间复杂度:O(3^n)(单次运算)

全局响应型电梯调度算法

当乘客发出请求后,并不将乘客直接分配给电梯,而是所有满足运行规则的电梯都可以为其响应,直到乘客成功进入电梯后才分配给电梯。电梯在丢失乘客请求(即乘客进入电梯后)在运行的当前楼层停止运行(电梯没人的情况下)。
优点:尽量缩短所有乘客的等待时间,且新请求可以影响乘客最终的分配情况。
缺点:并不是电梯最短运行时间,不符合题意
时间复杂度:O(3^n)(单次运算)
没错这个算法其实是我看错题目后写的(依照寒假最短乘客等待时间设计算法),直到抓完bug后再看一眼题目才发现做错了。。。(你感受过绝望吗.jpg)

DFS算法的缺点(算法设计心得和反思)

效率极低!即使我进行了剪枝还是没能挽救20数据1s响应的指数级复杂度。在设计算法的期间对TSP等算法进行了简单的了解(时间复杂度还是很高。。),以及一直被@Stolf大佬安利贪心算法(然而实在是不能理解和设计贪心策略)。总之不管如何,当前的算法绝对是无法在下次的作业中继续使用了,设计新的算法思路迫在眉睫。

一些其他的收获和总结

在这次的编程作业中,也首次使用了很多新学的骚操作:

为了更好的方便数据调度,首次在工程中大规模的使用STL容器(std::vector)。
尝试使用继承、多态等类操作
更加充分利用指针的特性,在一些地方使用更加便利

不过一次上了这么多新学的东西,出现问题和疑惑是必然的

无法很好的处理迭代器的使用和容器操作
如何让函数适应继承类
指针的错误操作

以上的每一个问题都让我脑壳发疼,解决他们促使不断地学习和解决。
不过以上语法问题都是小问题,最严重的不足还是对面向对象OOP思想的理解不够深刻。特别是对程序框架搭建的不够理解和不懂的如何搭建程序框架,使得算法设计再一次变得复杂,对框架无法很好的利用,修补bug就像不断的挖土填坑,也促使了bug的接憧而至。下一步应该要好好的学习接口设计和框架搭建了。
这次作业让我又学到了不少OOP的知识,也在这次编程作业中尝试使用了,更多的思考内容可以移步面向对象编程学习日记参看。


关于C语言实现的过程

本次作业我使用的显然是C++,如果使用C语言的话无非就是结构体+函数+以设计过程为思路来实现电梯的调度了。

End

你可能感兴趣的:(电梯V2.0)