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来进行团队开发项目,令我们明白了如何去协作,如何去测试,如何去和队友进行交流。同时第一次接触这种开发模式,可以说收获颇丰。

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

转载于:https://www.cnblogs.com/wddwxy/p/3358393.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的电梯调度算法的C语言实现,仅供参考: ```c #include <stdio.h> #define MAX 10 // 电梯最大承载量 #define FLOORS 20 // 楼层数 int floors[FLOORS] = {0}; // 记录每层楼的乘客数 int direction = 1; // 记录电梯的运行方向,1表示上行,-1表示下行 int current_floor = 0; // 记录电梯当前所在楼层 int passengers = 0; // 记录电梯内的乘客数 // 电梯上行 void go_up() { // 如果电梯到达顶层,改变运行方向 if (current_floor == FLOORS - 1) { direction = -1; return; } // 否则到达下一层楼 current_floor++; // 如果有乘客需要在该楼层上行,让他们上电梯 while (floors[current_floor] > 0 && passengers < MAX) { floors[current_floor]--; passengers++; } } // 电梯下行 void go_down() { // 如果电梯到达底层,改变运行方向 if (current_floor == 0) { direction = 1; return; } // 否则到达下一层楼 current_floor--; // 如果有乘客需要在该楼层下行,让他们上电梯 while (floors[current_floor] < 0 && passengers < MAX) { floors[current_floor]++; passengers++; } } int main() { int target_floor; while (1) { // 模拟电梯的运行 if (direction == 1) { go_up(); } else { go_down(); } // 打印电梯信息 printf("Current floor: %d\n", current_floor); printf("Passengers: %d\n", passengers); printf("Direction: %s\n", direction == 1 ? "up" : "down"); // 让乘客输入目标楼层 printf("Please enter the target floor (or -1 to exit): "); scanf("%d", &target_floor); // 如果输入-1,退出程序 if (target_floor == -1) { break; } // 如果电梯已满,拒绝新的乘客 if (passengers == MAX) { printf("The elevator is full. Please wait for the next one.\n"); continue; } // 记录乘客的目标楼层 floors[target_floor]++; } return 0; } ``` 这个算法模拟了一个简单的电梯调度过程,根据每个乘客的目标楼层,让电梯前往相应的楼层。在达到每个楼层时,如果有需要上行或下行的乘客,就让他们上电梯,直到电梯满员或没有更多的乘客需要上行或下行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值