• Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]


    11061184      (yjxrtzyx)   乔立男

    11061209      (wddwxy)  王旭阳

    关于结对编程

    我与我的搭档在事先作了了解分析之后,认为我对算法更熟悉一些,所以让我负责算法设计以及错误检查,而我的搭档对C#语言和面向对象编程比我更了解,所以他主要去搞代码实现这一块。下面是我们结对编程时的照片:

    结对编程,一般是指两个程序员在一起,共同进行编程工作。其中两人可以互相思维碰撞,交流经验,取长补短,齐心协力,从而大大提高编程的效率。具体而言,其特点表现在以下方面:

    优点

    (1)结对编程可以提高二人的总体水平,优势互补,增强了解决问题的能力。

    (2)同伴的帮助有助于提升自信心。

    (3)一个人独处时有可能经常心不在焉地开小差,而在同伴的监督下,就不得不严肃地去处理问题了。

    (4)编写代码时出现的问题往往自己是看不到的,而对别人的毛病却总是异常敏感,这样可以及时纠正错误,养成良好编程习惯,避免走许多弯路。

    缺点

    结对编程的时间并不好约定,且两个人若意见不一致,可能产生争执,这中间浪费的可就是两个人的时间了。

    信息隐藏,隐藏了软件运行过程中许多中间变量,不仅提升了安全性,也使得程序内部更加简洁有序,主次分明;而对界面的设计则可以使软件的使用过程更加人性化。

    单元测试

    image

    在单元测试部分,我对scheduler类进行了单元测试,如图所示。

    在单元测试中,需要频繁调用其他类中的部分,故在建立测试用例的时候并不能够面面俱到,所以造成了代码覆盖率低的恶果。

    希望老师能在这个部分多讲一些,毕竟这个是新接触的,自学的不太明白。

    UML图

    image

    通过Visual Studio自带的反向工程的功能,生成了UML的类图,可以看出各个类间的依赖关系,通过接口定义了标准,在用不同的类继承接口,实现功能。

    算法分析

    在算法方面,我的电梯调度算法比较贴近实际生活中我们所遇到的情况差不多。

    我将整个调度过程分成了两个部分,一部分是用户在电梯外提出乘坐电梯的请求,我们称之为外部请求;另一部分是用户在电梯中,点击其目的地的请求,我们称之为内部请求。

    于是我们将这两个部分统一的放到任务列表中进行调度,具体的调度方法如下:

    一、前提:电梯的currentDirection为NO,即电梯为停止状态

    1、检查电梯已经完成的任务,完成后在任务列表中删除任务

    2、判断任务列表中是否有任务:

               有任务:按照规定的顺序去执行任务列表中的任务(电梯向上为正序执行,电梯向下为逆序执行)

               无任务:检查是否有外部任务进入,若没有将电梯归位至一层(因为1层客流量最大)

                             否则按照固定顺序去选择外部任务。

    顺序:

            1、选择请求在当前位置以下的任务,方向向下,离当前位置越近越好(减少冤枉路,并尽量向一层靠拢)

            2、选择请求在当前位置以下的任务,方向向上,离当前位置越远越好(能够接上更多的乘客)

            3、选择请求在当前位置以上的任务,方向向上,离当前位置越近越好(能够接上更多的乘客)

            4、选择请求在当前位置以上的任务,方向向下,离当前位置越远越好(能够接上更多的乘客)

    二、前提:电梯为运行状态

    1、判断电梯运行方向,确定电梯的任务执行顺序,若向上,则执行第一个任务,否则执行最后一个

    2、若遇到新外部请求,其在当前电梯的运行轨道上,切电梯能够停下,则将新外部请求加入任务队列中,对任务队列进行维护。

    运行效果:

    针对passenger2.xml进行测试,原始方案得到如下结果:

    image

    我们的方案得到如下结果,可以明显看出我们算法的效率。

    image

    总结

    这次结对编程对我们是一次重大的考验和挑战,我因此结识了一位出色的好伙伴,也从中学到了很多有用的知识。

    ---------乔立男

    这次的结对编程让我学会了使用vs来进行团队开发项目,令我们明白了如何去协作,如何去测试,如何去和队友进行交流。同时第一次接触这种开发模式,可以说收获颇丰。

    ---------王旭阳

  • 相关阅读:
    try,catch,finally的简单问题
    设置类可序列化,写入VIewState
    jQuery实现购物车物品数量的加减 (针对GirdView的类似事件)
    js获取Gridview中的控件id
    asmx ASp.net AJAX使用 ScriptManager
    js返回上一页并刷新,JS实现关闭当前子窗口,刷新父窗口
    asp.net(c#)网页跳转七种方法小结
    在触发器中回滚和提交
    redis 缓存对象、列表
    spring cloud 停止服务
  • 原文地址:https://www.cnblogs.com/wddwxy/p/3358393.html
Copyright © 2020-2023  润新知