标签:
电梯调度结对编程
1.题目:设计一个电梯调度算法,实现基本的电梯调度功能,要求有四部电梯,每部电梯21层,并且具有重量检验算法。
2.设计前的准备:确定了结对之后,我们首先对设计中可能遇到的问题进行了大体的分析与讨论,确定了编程的方向(java语言)并且约定了一些编程规范,语法规范为使用eclipse中的format规范代码,其他可能遇到的编程问题会在开发中随时交流。接着我们对题目进行了更深入的分析,考虑到电梯运行时的各种情况并发表自己的看法,思考设计合适的算法来解决调度问题。最后我们上网查阅了大量关于电梯调度算法的资料,并下载了一些网上的代码,以作参考。
3.设计中:在设计中遇到了很多困难,不仅有两个人合作不够默契的问题,也存在基础的问题,编程基础不够扎实,最困难的是算法的编写,要考虑到种种情况,比如四部电梯的最优调度等。最后克服了种种困难,在查阅大量代码,学习别人的思想之后,终于将项目的一些基本功能完成。
4.心得:通过这次结对编程,让我充分的了解到在做项目时,两个人应该提前考虑到可能遇到的各种问题,尽可能的及早解决发现的问题,防止为以后的编程留下隐患,此外在合作中遇到可能影响项目的问题时应两个人商量,合作解决,避免自己的武断造成损失。以下是具体项目:
(1)项目共有六个类,分别为:
ElevatorTest 项目主类,程序的入口
ElevatorFrame 程序主窗口
ElevatorPanel 程序主窗口界面布局
MainPanel 电梯布局
ControlPanel 命令布局及监听
SubPanel 一部电梯的界面布局及管理
(2)项目的主要算法:
private boolean ProcessInput(int[] FloorStop, int num, int CurrentFloor,
int CurrentState) {
if (CurrentState == 1) {
if (num > CurrentFloor) {
FloorStop[num] = 1;
return true;
}
} else if (CurrentState == 2) {
if (num < CurrentFloor) {
FloorStop[num] = 1;
return true;
}
} else {
FloorStop[num] = 1;
return true;
}
return false;
}
private boolean isTheSameFloor(int[] FloorStop) {
if (FloorStop[CurrentFloor] == 1) {
return true;
}
return false;
}
private boolean isUP(int[] FloorStop) {
int i;
for (i = 1; i <= 20; ++i) {
if (FloorStop[i] == 1) {
break;
}
}
if (CurrentFloor < i) {
return true;
} else {
return false;
}
}
// 判断该部电梯,是否还要继续向上运行
private boolean isStillUP(int[] FloorStop, int Current) {
int i;
for (i = Current + 1; i <= 20; ++i) {
if (FloorStop[i] == 1) {
return true;
}
}
return false;
}
// 判断该部电梯,是否还要继续向下运行
private boolean isStillDOWN(int[] FloorStop, int Current) {
int i;
for (i = Current - 1; i > 0; --i) {
if (FloorStop[i] == 1) {
return true;
}
}
return false;
}
// 判断该部电梯,是否要在某个楼层停靠
private boolean isStoped(int[] FloorStop, int Current) {
if (FloorStop[Current] == 1) {
return true;
}
return false;
}
调度(其中之一):
private void isAssignedToStopElevatorDown(ArrayList runnableElevators) {
if (runnableElevators.size() == 0) {
return;
}
for (int i = 0; i < DownWardArray.length; ++i) {
if (DownWardArray[i] == 2) {
int nearestDistence = 999;
int nearestElevator = -1;
for (int j = 0; j < runnableElevators.size(); ++j) {
if (((SubPanel) runnableElevators.get(j)).getCurrentState()
== 0) {
int temp =
((SubPanel) runnableElevators.get(j))
.getCurrentFloor();
if (Math.abs(i - temp) < nearestDistence) {
nearestDistence = Math.abs(i - temp);
nearestElevator = j;
}
}
}
if (nearestElevator != -1) {
(
(SubPanel) runnableElevators.get(
nearestElevator)).setTask(
i);
DownWardArray[i] = 0;
nearestDistence = 999;
nearestElevator = -1;
}
}
}
}
(3)运行截图
下部的下拉框为电梯外部按钮,你在几楼就选择几楼的楼号,选择上楼或者下楼,距离你楼层数最少的电梯就会移动到你的楼层,进入电梯后就可选择自己要去的楼层(注意电梯上升时不能去下面的楼层,下降时不能去上面的楼层)
Github:https://github.com/mtj075/Elevator.git
标签:
原文地址:http://www.cnblogs.com/mtj3344/p/4819628.html