首页 > 代码库 > 结对项目:电梯调度算法的实现与测试

结对项目:电梯调度算法的实现与测试

      结对编程人员: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):

       为了调用函数,必须为真的条件,在其违反时,函数决不调用,传递好数据是调用者的责任。
       二 后置条件 (postcondiction):
       函数保证能做到的事情,函数完成时的状态,函数有这一事实表示它会结束,不会无休止的循环。
       三 类不变项(class invariant):
       从调用者的角度来看,该条件总是为真,在函数的内部处理过程中,不变项可以为变,但在函数结束后,控制返回调用者时,不变项必须为真。
       在测试模块中,我们保证了双方地位的平等,通过契约的思想和要求来交互不同的模块,保证每一步过程的正确性和科学性。同时也在进行单元测试的时候,对方法进行了有效性的验证和推理。
     
      我的优点:在合作编程是会支持比较细腻的代码风格,保证代码的整洁,并且比较注重于在算法方面完善之后再编程序,能及时发现问题。
      缺点:对c#的编程能力欠佳,代码能力较弱,读代码花了较长时间。
      林旭鹏的优点:有win8app开发的经验,c#的编程能力较强,思路清晰。
      缺点:打代码时会有时候犯粗心的毛病,经常犯一些机械性的错误(打错变量名字等),在debug的时候花了较长时间。
     
      结对编程优点,结队团队的人员能够相互弥补之间的不足,比如我的代码能力较弱,林旭鹏就能在编写代码的时候帮助我一下,他写部分代码的时候我也能快速发现他打错的地方,及时改正避免debug的时间消耗。
     在算法设计的层面上,我们也能及时提出对方没想到的算法的缺陷,然后一起讨论完善,而且个人写程序时,也许有时候还需要给对方讲一讲他看不懂的你的程序的具体实现细节,一个人做不到。
     两个人编程技能相互监督,提高注意力,也能在debug,调试陷入瓶颈的时候及时发表自己的意见,及时的意见交流鲤鱼加快编程进度,及时解决手误和算法结构问题等问题。
     两个人结对编程还能吸收对方好的优点,有利于提升自己的技术水平,一个人做不到。

     Information Hiding:首先,在类中,定义的变量和方法可以再前面加上一个下划线"_"来标识,这是一个好的命名规范,可以避免无意中对私有成员进行赋值。类与类之间交换信息时,要交流私有变量时,要用事先设计好的方法来访问,这样如果我们在其它类里面调用另外一个类的私有变量,那么我们必须定义一个获得该类私有变量的方法;要在另一个类里面改变另外一个类里面的变量时,我们也要定义一个改变该类私有变量的方法。在C#里特别方便的一点就是有set和get,我们可以很方便的定义访问一个类私有变量的方法。

      interface design:一个好的接口能够提供给后面的程序设计一个良好的框架,在这次电梯调度项目里,接口IElevator、IPassenger、IScheduler、IRequest,我们通过接口能很快的知道电梯、乘客、调度方案、请求都有哪些属性,要实现哪些方法,而不用关心具体的实现细节;这样我们的软件测试也变得更简单了。

      loose coupling:在我们的代码设计时,不用担心会破坏其它地方的代码。这种类与类之间依赖性低的设计方法,使一个类与另外一个类仿佛隔开了,它们之间只是通过消息来联系的,所以设计一类时,可以不用担心破坏另外一个类。当代码有改动时,可以不用大规模的改动我们的代码,我们只用定位于一个出问题的模块,然后对其进行更改就好了,而且能做到不改变其它模块的服务。

     信息隐藏、接口设计、松耦合都是面向对象设计的重要方法,都是使程序设计时更接近日常认识,在大模块之间关系中不用过于担心细节,只需在模块设计时下功夫。

     以下是结对编程时的照片和一些测试信息

    

     
    
  
    

 

结对项目:电梯调度算法的实现与测试