电梯调度模拟系统

电梯调度模拟系统

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.  第一次使用了 观察者设计模式。之前对设计模式了解一些,什么最简单的工厂模式,单例模式。以前也用过,没什么。这次我要实现主控制与子线程(电梯线程)之间的通线。当然可以那样,主线程在之线程内部创建,作为其成员变量。大多人应该是这样做的。或许还有人那样做,将状态量和一些请求列表放在 静态类里面(有点象 全局变量)。我采用了上面讲的模式,虽然有点麻烦。但是体验了一翻觉得还可以。(参见类ElevatorArithMainControler)。

2.  第一次用VE(可视化编辑器)设计界面(Swing/JFC.(参见OuterElevatorPaneOuterElevatorDialogInnerElevatorPane InnerElevatorDialogMainFrameExpDialogElevatorPane)

3.  自己设计了好多的小类:StaticRequestList(静态请求列表)、ElevatorState、(电梯状态)、Mycomp(用于排序用的继承于Comparator)、DisResponse(分配外部任务响应)CRequestList(请求格式)

4.  ElevatorThread,电梯线程,里面Run,实现了各个电梯的运行显示。对每个内部请求的响应。响应外部房在了ElevatorArith中。

5.  电梯运动效果:Thread.sleep(时间).实现延迟。我在主框架里有一个 Timer(时间,事件监听器).

6.  对数据类型有了无数次的转化,判断条件的繁多。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1乘客类型 反映乘客的所有属性。 ADT Client 数据对象:D={ai∈乘客信息,I=1,2,…,n,n≥0} 数据关系:R={|ai-1,ai∈D,i=2,…,n} 基本操作: PrintClientInfo(Client const &e,ClientStatus s) 操作结果:输出乘客信息。 CreatClient(Client *&p) 操作结果:生成新的乘客。 DestoryClient(Client *&p) 操作结果:该乘客离开系统。 GoAbove(Client const &e) 操作结果:判断该乘客是否去往高层。 CInfloor(Client const &e) 操作结果:返回乘客进入的楼层。 CInTime(Client const &e) 操作结果:返回乘客进入时间。 COutfloor(Client const &e) 操作结果:返回乘客进入时间。 } 2、 乘客栈类型 电梯内的乘客用乘客栈表示,去不同楼层的乘客放在不同的栈中。 ADT Estack 数据对象:D={ai∈乘客信息,I=1,2,…,n,n≥0} 数据关系:R={|ai-1,ai∈D,i=2,…,n} 基本操作: 略。 } 3、 等候队列类型 在电梯外等待的乘客用等待队列表示。每层各有两个等待队列,分别为上楼队列和下楼队列。 与一般队列不同的是在基本操作中加入了放弃操作CGiveUp(WQueue &Q,int floor)。 4、 电梯类型 表示电梯的各个属性和所有动作。 ADT Elevator 数据对象:D={ai∈电梯信息,I=1,2,…,n,n≥0} 基本操作: InitEle(Elevator &E) 操作结果:初始化电梯类型。 DestoryEle(Elevator &E) 操作结果:销毁电梯类型。 EleDecide(Elevator &E,WQueue w[Maxfloor+1][2]) 操作结果:电梯动作决策。 ElevatorRun(Elevator &E,WQueue w[Maxfloor+1][2]){ 操作结果:电梯状态转换。 CountOver(Elevator &E) 操作结果:判断电梯计时是否完成。 EleFloor(Elevator const &E) 操作结果:返回电梯所在的层。 EleStatus(Elevator const &E) 操作结果:返回电梯状态。 RequireAbove(Elevator const &E) 操作结果:判断是否有高层请求。 RequireBelow(Elevator const &E) 操作结果:判断是否有低层请求。 EleAchieved(Elevator &E) 操作结果:判断电梯是否要停于当前层。 EleOpenDoor(Elevator &E) 操作结果:判断电梯是否要开门。 } 5、 高楼模块 实现电梯和乘客之间的互交功能。包括: InOut(Elevator &E,WQueue w[Maxfloor+1][2]) 操作结果:进行乘客的进出电梯活动。 NewClient(Elevator &E,WQueue w[5][2]) 操作结果:进入新乘客。 PrintStatus(Elevator &E,WQueue w[5][2]) 操作结果:输出当前状态。 Print(Elevator &E,Action a)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值