结对项目:电梯调度算法的实现与测试
结对编程人员:12061174 李靖
12061167 林旭鹏
文件位于TFS上的Pairproject11中
算法核心:两个关键---1.history direction变量 2电梯里面有没有人。
电梯初始的方向默认为向上,在每个tick时间点
电梯如果在底层,history direction为上,如果在顶层则为下。
电梯内没有人的时候,先遍历请求,如果有方向一致并且可以去到的楼层请求,则Reqstopat最近的。
若当前History dirction方向上,没有方向一致的楼层请求,则检查有没有方向不一致且当前History dirction方向上可达的楼层请求,若有,Reqstopat符合情况的距离最远的,并令电梯的revs变量为true;(revs变量为真时乘客类会进入方向不一致的电梯,接到最远的乘客后此变量为false)
若当前History dirction方向上,没有任何楼层请求,将电梯方向转向,下个tick再判断。
电梯内有人时:
遍历所有的电梯内部请求,以及当前History dirction方向上可达,并且方向一致的楼层请求,Reqstopat这些请求中最近的,每个tick点都更新。
采用算法的特点:
这种算法可以做到电梯在每一个方向的一趟中都能确保把当前方向上的所有请求考虑到,没有请求了才考虑转向的问题。
在调试阶段我们看到一种情形,当一层和零层有大量的请求时,电梯每次都只能带一部分人上楼,最好电梯是应该送完人上去后马上就下来再载人上去,同时响应顺路的请求。而我们一开始想的调度算法,就可能出现电梯在楼上不断上下响应高楼层的请求,而忽略较远的零层和一层的请求,这样由于0层和1层的等待人数太多,就会使平均调度时间大大增加。使用新的算法,反向的时候优先考虑反方向上符合请求的最远的请求,也就到了楼底接0,1层的人,实际上保证了电梯不会无视这些较远的请求。
对于契约编程,要求人员明确给编程者提供了明确了要求,编程者页必须正确实现要求人员希望实现的功能和目标。
一 前置条件(precondiction):
Information Hiding:首先,在类中,定义的变量和方法可以再前面加上一个下划线"_"来标识,这是一个好的命名规范,可以避免无意中对私有成员进行赋值。类与类之间交换信息时,要交流私有变量时,要用事先设计好的方法来访问,这样如果我们在其它类里面调用另外一个类的私有变量,那么我们必须定义一个获得该类私有变量的方法;要在另一个类里面改变另外一个类里面的变量时,我们也要定义一个改变该类私有变量的方法。在C#里特别方便的一点就是有set和get,我们可以很方便的定义访问一个类私有变量的方法。
interface design:一个好的接口能够提供给后面的程序设计一个良好的框架,在这次电梯调度项目里,接口IElevator、IPassenger、IScheduler、IRequest,我们通过接口能很快的知道电梯、乘客、调度方案、请求都有哪些属性,要实现哪些方法,而不用关心具体的实现细节;这样我们的软件测试也变得更简单了。
loose coupling:在我们的代码设计时,不用担心会破坏其它地方的代码。这种类与类之间依赖性低的设计方法,使一个类与另外一个类仿佛隔开了,它们之间只是通过消息来联系的,所以设计一类时,可以不用担心破坏另外一个类。当代码有改动时,可以不用大规模的改动我们的代码,我们只用定位于一个出问题的模块,然后对其进行更改就好了,而且能做到不改变其它模块的服务。
信息隐藏、接口设计、松耦合都是面向对象设计的重要方法,都是使程序设计时更接近日常认识,在大模块之间关系中不用过于担心细节,只需在模块设计时下功夫。
以下是结对编程时的照片和一些测试信息