1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sxx1111-elevator_simulation

Клонировать/Скачать
Manager.cpp 8.3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Shixinxin Отправлено 07.01.2019 20:52 9b3613b
#include "Manager.h"
#include "Rule.h"
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
using namespace std;
Manager::Manager () {
cout << "初始化开始" << endl;
E.push_back(new Elevator(Rule::rule1));
E.push_back(new Elevator(Rule::rule1));
E.push_back(new Elevator(Rule::rule2));
E.push_back(new Elevator(Rule::rule2));
E.push_back(new Elevator(Rule::rule3));
E.push_back(new Elevator(Rule::rule3));
E.push_back(new Elevator(Rule::rule4));
E.push_back(new Elevator(Rule::rule4));
E.push_back(new Elevator(Rule::rule5));
E.push_back(new Elevator(Rule::rule5));
for (int i = 0; i < E.size(); i ++) {
cout << i << "号电梯停留在" << E[i]->getCurrentFloor() << "层" << endl;
}
for (int i = 0; i < Rule::MaxN; i ++ ) {
P.insert(new Person(i));
}
personNumber = P.size();
time = 0;
cout << "初始化完成" << endl;
}
void Manager::printWindow () {
cout << "----------------------------------------------------------------------------------" << endl;
for (int i = 0; i < E.size(); i ++) {
cout << "\t" << i << "号电梯:" << endl;
E[i]->printSelf();
}
cout << "仿真人数剩余" << personNumber << endl;
cout << "----------------------------------------------------------------------------------" << endl;
}
// 根据前往楼层选择电梯
int Manager::selectElevator(int ce, int te) {
int re = -1;
int re2 = -1;
int Dis = 40;
for(int i = 0; i < E.size(); i ++) {
if (
E[i]->canArrive(te) &&
abs(E[i]->getCurrentFloor() - ce) < Dis
) {
if(!(E[i]->getState() * (ce - E[i]->getCurrentFloor()) < 0)) {
re = i;
} else {
re2 = i;
}
Dis = E[i]->getCurrentFloor() - ce;
}
}
return re != -1 ? re : re2;
}
// 获取联动电梯编号
int Manager::getLink(int ite) {
if (ite % 2 == 0) return ite + 1;
else return ite - 1;
}
// 联动另一部电梯
void Manager::linkage (int ite, int floor) {
E[getLink(ite)]->setoArriveFloor(floor);
}
void Manager::run () {
cout << "仿真开始" << endl;
while (personNumber) { // 还有人时仿真就继续
cout << "第" << time << "秒:" << endl;
ElevatorEvent(); // 处理电梯
PersonEvent(); // 处理人
if(time % 50 == 0) printWindow(); //打印界面
// if(time == 50) system("pause");
time ++; // 时间加一
}
cout << "仿真结束" << endl;
}
void Manager::ElevatorEvent () {
// 遍历所有电梯,串行处理
for (int i = 0; i < E.size(); i ++) {
ManageElevator(E[i]);
}
}
void Manager::ManageElevator (Elevator* &e) {
// 无人唤醒电梯,直接返回
if(e->getState() == 0) {
return;
}
// 电梯处于楼层之间
if (e->getSpaceTime() > 0) {
// cout << "\t\t楼层之间" << endl;
// 上升时间减少一秒
e->decreaseSpaceTime();
return;
}
// 电梯正在上下人
if (e->getIsPick() == true) {
// cout << "\t\t正在上下人" << endl;
// 重置关门时间
e->setCloseTime();
return;
}
// 电梯正在关门
if (e->getCloseTime() > 0) {
// cout << "\t\t正在关门" << endl;
// 关门时间减少一秒
e->decreaseCloseTime();
return;
}
// 电梯不处于楼层之间
if (e->getSpaceTime() == 0) {
// 取消该层可达性
e->cancelArriveFloor(e->getCurrentFloor());
// cout << "\t\t不处于楼层之间" << endl;
// 根据电梯状态开始运行
e->setSpaceTime();
// 改变上升下行方向
if (e->getState() == 1) {
if (e->getMaxFloor() <= e->getCurrentFloor()) {
e->setState(-1);
}
}
if (e->getState() == -1) {
if (e->getMinFloor() >= e->getCurrentFloor()) {
e->setState(1);
}
}
// 重置楼层
if (e->getMaxFloor() != 0) {
e->setCurrentFloor();
}
return;
}
}
void Manager::PersonEvent () {
// 遍历所有的人,串行处理
set<Person*>::iterator tp = P.begin();
for (; tp!= P.end(); tp++) {
ManagePerson(*tp);
}
}
void Manager::ManagePerson(Person*p) {
// 仿真结束直接返回
if (p->getSign() == false) {
return;
}
// 乘客还未到来直接返回
if (p->getStartTime() > time) {
return;
}
// 乘客此刻到来
if (p->getStartTime() == time) {
// 选择一部电梯
int ite = selectElevator(p->getCurrentFloor(), p->getToFloor());
p->setElevatorNo(ite);
// 设置电梯要到达该层
E[ite]->setoArriveFloor(p->getCurrentFloor());
// 联动另一部电梯
linkage(ite, p->getCurrentFloor());
cout
<< p->getNo() << "号乘客到来,"
<< "想去" << p->getToFloor() << "层,"
<< "选择了" << ite << "号电梯" << endl;
return;
}
// 乘客已经来到
// 乘客处于休息状态
if (p->getRestTime() > 0) {
// 休息时间减少一秒
p->decreaseRestTime();
// 休息还未结束,返回继续休息
if (p->getRestTime() > 0) {
return;
}
cout << p->getNo() << "号乘客不休息了" << endl;
// 休息结束
// 最后一次乘梯
if (p->getHL() == p->getL()) {
// 乘客已经在1层
if (p->getCurrentFloor() == 1) {
// 仿真人数减1
personNumber--;
cout << p->getNo() << "号乘客完成仿真-------" << personNumber << endl;
// 令其仿真结束,返回
p->setSign(false);
return;
}
// 乘客不在1层
else {
// 设置到达1层
p->setToFloor(1);
}
}
// 不是最后一次乘梯
else {
// 设置前往楼层
p->setToFloor();
}
// 选择一部电梯
int ite = selectElevator(p->getCurrentFloor(), p->getToFloor());
p->setElevatorNo(ite);
// 设置电梯要到达该层
E[ite]->setoArriveFloor(p->getCurrentFloor());
// 联动另一部电梯
linkage(ite, p->getCurrentFloor());
return;
}
// 乘客不处于休息状态
// 乘客在电梯内
if (p->getIsInElevator()) {
// 获取电梯编号
int ite = p->getElevatorNo();
// 电梯还未到乘客所欲到达层,返回,继续等待
if (E[ite]->getCurrentFloor () != p->getToFloor()) {
return;
}
// 电梯运行在楼层之间,返回,继续等待
if (E[ite]->getSpaceTime() != 0) {
return;
}
// 电梯到达
// 电梯正在上下人
if (E[ite]->getIsPick() == true) {
// 其他人正在上下电梯,直接返回
if (p->getPickTime() == 0) {
return;
}
// 是该乘客正在下电梯
// 下电梯时间减少1秒
p->decreasePickTime();
// 未完成下电梯动作,继续下电梯,返回
if (p->getPickTime() > 0) {
return;
}
// 完成了下电梯动作
// 设置电梯不再上下人
E[ite]->setIsPick(false);
// 电梯删除此人
E[ite]->pickDownPerson(p);
// 人出电梯
p->setIsInElevator(false);
// 重置人当前层数
p->setCurrentFloor(p->getToFloor());
cout << p->getNo() << "号乘客来到了" << p->getCurrentFloor() << "层" << endl;
// 乘坐电梯次数加1
p->setHL();
// 完成仿真
if (p->getHL() == p->getL() + 1) {
// 仿真人数减1
personNumber--;
cout << p->getNo() << "号乘客完成仿真-------" << personNumber << endl;
// 令其仿真结束,返回
p->setSign(false);
return;
}
// 未完成仿真
else {
// 设置休息时间
cout << p->getNo() << "号乘客休息了" << endl;
p->setRestTime();
return;
}
}
// 电梯不在上下人
else {
// 设置电梯正在上下人
E[ite]->setIsPick(true);
// 设置人正在出电梯
p->setPickTime(Rule::T);
return;
}
}
// 乘客在等待电梯
else {
// 获取电梯编号
int ite = p->getElevatorNo();
// 电梯以及联动电梯还未到乘客所在层,返回,继续等待
if (E[ite]->getCurrentFloor () != p->getCurrentFloor()) {
// 重新呼叫电梯
E[ite]->setoArriveFloor(p->getCurrentFloor());
// 联动另一部电梯
linkage(ite, p->getCurrentFloor());
// 若联动的电梯到来,去往联动的电梯
if (E[getLink(ite)]->getCurrentFloor () == p->getCurrentFloor()) {
ite = getLink(ite);
p->setElevatorNo(ite);
cout << p->getNo() << "号乘客去往了联动电梯" << ite << "号" << endl;
} else {
return;
}
}
// 电梯运行在楼层之间,返回,继续等待
if (E[ite]->getSpaceTime() != 0) {
return;
}
// 电梯到达
// 电梯是否正在上下人
if(E[ite]->getIsPick()) {
// 其他人正在上下电梯,返回,继续等待
if (p->getPickTime() == 0) {
return;
}
// 是该乘客正在上电梯
// 上电梯时间减少1秒
p->decreasePickTime();
// 未完成上电梯动作
if(p->getPickTime() > 0) {
return;
}
// 完成了上电梯动作
// 人进入了电梯
p->setIsInElevator(true);
// 电梯中放下此人
E[ite]->pickUpPerson(p);
cout << p->getNo() << "号乘客坐上了" << ite << "号电梯,目前" << E[ite]->getCurrentPerson() << "人" << endl;
// 设置电梯内可达层数
E[ite]->setiArriveFloor(p->getToFloor());
// 设置电梯不再上下人
E[ite]->setIsPick(false);
return;
}
// 电梯不在上下人
else {
// 电梯超重
if(E[ite]->overLoad() == true) {
return;
}
// 上了之后电梯超重
if(E[ite]->getWeight() + p->getWeight() > Rule::MaxK) {
return;
}
// 电梯未超重
// 设置电梯正在上下人
E[ite]->setIsPick(true);
// 设置人正在进电梯
p->setPickTime(Rule::T);
return;
}
}
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/sxx1111-elevator_simulation.git
git@api.gitlife.ru:oschina-mirror/sxx1111-elevator_simulation.git
oschina-mirror
sxx1111-elevator_simulation
sxx1111-elevator_simulation
master