电梯调度模拟系统
Elevator Attemper Simulation System(EASS)
设计开发者:夏斯华
1.调度描述:
实现电梯调度算法如下:
1. 初始状态在一楼。内外部没有请求,则保持原先状态。
2. 外部请求发出,放在请求列表中。定时分配:
a>.读取当前各电梯状态(运动状态、所在楼层)
b>.同方向、路径最短.(除去 同方向需要折回情况)
c>.同方向不符和,则取停止电梯中路径最短的那个。修改该电梯目标列表.
d>.此时没有符合要求的。则进入下一个循环。
3. 内部请求。下一个请求需要在电梯路径上,不允许折回。否则不响应.
4. 开门一直按着电梯会停着不动。电梯移动需要关上门。
2.开发环境:
1. Eclipse 3.0 M8(打上VE插件)(Sun JDK1.4.0_4).
2. Windows Xp profession Sp1.
3.设计方案:
基于上面算法调度,基本实现现实中的电梯运作样子。有各个电梯运行状态的显示。外部、内部乘客的请求以及对其合理的分配。
利用了java语言里的多线程机制,模拟了现实中电梯运行和处理请求的并行性。
其实实际运行时,系统有很多的线程运作。对于我实现的程序就有如上的线程。这些线程协同工作完成整个系统的需求。利用了java 面向对象性高一点再加上实现起来比较容易(相对于VC++,当然也可以采用VC SDK+DirectX9.0b有更美观效果或者 MFC6.0)。于是采用之。
考虑了老师的要求,警铃本来想做的,可以消除外部对该电梯的请求,让需求列表重新分配。还有考虑了让电梯更加智能,如采用将一天时间分段,各段处理请求不一样。如人少,就尽量电梯少从停-à动。人多的时候尽量将所有电梯都用上。当然,我跟同学还考虑了现实中是否有无聊之人暂着电梯门口不走动如何处理等等。不过,精力有限,况且主要是想体验一下多线程的妙处,所有在算法上没有太多的深入。
4.程序设计:
其实与其说是在解决什么调度不如说又一次锻炼了编程能力。花了好几天,五一节一直关注着她。
不过终于将自己预想的给实现了,不是最好,但在编程的过程中,体会良多。由于我是一个历史的人,喜欢将一些记录下来,老师岁没讲要写这部分。自我觉得有必要。
1. 第一次使用了 观察者设计模式。之前对设计模式了解一些,什么最简单的工厂模式,单例模式。以前也用过,没什么。这次我要实现主控制与子线程(电梯线程)之间的通线。当然可以那样,主线程在之线程内部创建,作为其成员变量。大多人应该是这样做的。或许还有人那样做,将状态量和一些请求列表放在 静态类里面(有点象 全局变量)。我采用了上面讲的模式,虽然有点麻烦。但是体验了一翻觉得还可以。(参见类ElevatorArith、MainControler)。
2. 第一次用VE(可视化编辑器)设计界面(Swing/JFC).(参见类OuterElevatorPane、OuterElevatorDialog、InnerElevatorPane 、InnerElevatorDialog、MainFrame、ExpDialog、ElevatorPane)。
3. 自己设计了好多的小类:StaticRequestList(静态请求列表)、ElevatorState、(电梯状态)、Mycomp(用于排序用的继承于Comparator)、DisResponse(分配外部任务响应)、CRequestList(请求格式)
4. ElevatorThread,电梯线程,里面Run,实现了各个电梯的运行显示。对每个内部请求的响应。响应外部房在了ElevatorArith中。
5. 电梯运动效果:Thread.sleep(时间).实现延迟。我在主框架里有一个 Timer(时间,事件监听器).
6. 对数据类型有了无数次的转化,判断条件的繁多。