Elevator Simulation Algorithm In C++ , develop an algorithm to simulate a single
ID: 3692076 • Letter: E
Question
Elevator Simulation Algorithm
In C++, develop an algorithm to simulate a single elevator in a 10-story building. There will be some simplifying assumptions that will make this a bit less complex than a real-world implementation. The number of floors is not important, nor is the number of people getting on or getting off the elevator. The following 6 Rules apply to movement of the elevator:
1. By default, the elevator will always begin to operate from the 1st floor.
2. The algorithm needs to support the 2 separate directions of up and down.
3. The algorithm needs to support the 2 separate requirements of “get on” and “get off”.
4. Wherever the elevator happens to be, it always continues in the same direction, unless there are no passengers and no people waiting for the elevator with “get on” requests.
5. When the elevator stops moving in one direction, it checks to see if there are additional “get on” requests. The elevator does not move again until it receives a request to move.
6. Once the elevator starts to move, there can be no “get on” requests until the elevator has stopped and has no more pickups or drop-offs in the same direction. In other words, the elevator does not move in the opposite direction until a request to move is made.
The approach to simulating the elevator is as follows:
1. The events needed to simulate are described below. The 2 event types are ‘GET ON’ and ‘MOVE. Since they are fixed, you can populate them into an array if you like. The array should be 2-dimensional, since each event will have 3 pieces of information, as described by #2.
2. ‘GET ON’ has 2 parameters: the number of the floor on which a person or persons will enter the elevator and the number of the floor on which the person(s) will get off. ‘MOVE’ has no parameters but you can assign 2 parameters with values of zeros so that the 2 events are parallel.
3. Implement the elevator as a Doubly-linked list. When the elevator is moving up, it follows from the head to determine where to go to next. When it is moving down, it follows from the tail backwards.
4. When there are no more nodes in the same direction as the elevator is moving, it checks the array for its next requests and either moves or adds “get on” requests. It then continues to move in the same direction it was moving, if there are now requests for that direction, or it reverses direction to pick up people. If the entire list is empty, it returns to the 1st floor to wait.
5. The doubly-linked list nodes need to contain two items of information: a primary floor number to stop at and, for an arriving passenger, a secondary floor number representing the “get off”. You cannot add the “get off” as a node until the passenger has gotten on. Otherwise, you may try to discharge a passenger who is not yet on the elevator.
6. To summarize, when you pick up a ‘GET ON’ request, add it to the list, along with the ‘get off’, as an additional parameter. When the ‘GET ON’ is satisfied, you remove its node and add the ‘get off’ node.
EVENT LIST
GET ON 4,6 (means a person wants to get on at 4 and get off at 6)
MOVE
GET ON 8,2
GET ON 1,5
GET ON 9,3
MOVE
GET ON 10,2
GET ON 7,4
MOVE
GET ON 1,7
MOVE
NOTE: “MOVE” makes the elevator move(a) in the same direction if there are requests, (b) in the opposite direction if there are requests or (c) down to 1 if there are no requests in the list.
The output from this program should identify each of the elevator stops and whether people get off, get on, or both. An ouput should be produced when a MOVE instruction is encountered. In other words, there should be 4 separate outputs, each identifying a set of floors and “get on” or “get off” ac
Explanation / Answer
Answer for Question:
This below c++ code may help you or solve the given elevator problem.
See the below code:
class elevator{
private:
//The Lift box the elevator controls
liftboxControlUnit & mLiftBoxCtrlUnit;
//constructor
elevator(int Level=1, int NoOfBanks =1 );
//Destructor
~elevator();
//Triggers the search to move to the next floor if required
void moveLiftToNext();
public:
//Adds request to the queue
void addRequest(int FloorNumber){
//Add the request to the queue. The single button outside the elevator door
mLiftBoxCtrlUnit.addRequest(FloorNumber);
}
//For Emergency. Should be accessible to everyone !
void setEmergency();
void unsetEmergency();
};
typedef enum Direction{
UP,
DOWN
}direction;
class liftboxControlUnit{
private:
//The request for various floors
set<int> mRequestQueue;
//The various banks for the whole system
vector<Bank> mBanks;
//The total number of levels. Remains the same for one building
const int mTotalLevel;
//Instruction to move the box to certain level
void processRequest(){
//Do the logic to move the box.
}
//can passed to the elevator
void addRequest(int x){
mRequestQueue.insert(x);
}
//Can be set by elevator class
void setEmergency(){
//Do the required
//Set Emergency on all Banks
}
void unsetEmergency(){
//UnsetEmegency on all banks
}
void emergencyListener(){
//Listen to all the banks if emergency has been set
}
void BankFreeListener(){
//Listen to the banks if any is free
//If so then
processRequest();
}
public:
//Constructor
liftboxControlUnit(int TotalLevels, int NoOfBanks): mTotalLevel(TotalLevels){
for(int i=0 ; i lessthan NoOfBanks; ++ i)
mBanks.push_back(Bank(0,UP));
}
friend class elevator;
};
class Bank{
private:
//The dailpad inside the bank
dailpad & mpad;
//Current Location
int mPresentLevel;
//Current direction of movement
direction mDirection;
//Currently moving
bool mEngaged;
//Manipulate the bank
void move(int NoOfMoves){
setEngaged();
//Move the elevator
unsetEngaged();
}
//getters
int getPresentLevel() const;
int getDirection() const;
//setters
void setPresentLevel(int);
void setDirection(direction);
//Manipulate the engaged flag
bool isEngaged() const;
bool setEngaged();
bool unsetEngaged();
//For emergency
void reset();
//Dailpad Listener
void dailpadListener(){
}
public:
Bank(int StartingLevel, direction Direction): mPresentLevel(StartingLevel),
mDirection(Direction),
mEngaged(false),
mpad()
{
}
//For emergency . Should be available for all.
void SetEmergency();
void UnsetEmergency();
bool isEmergency();
friend class liftboxControlUnit;
};
class dailpad{
private:
//Some DS to represent the state . probably a 2D Array.
void renderDisplay();
public:
//Constructor
dailpad();
void getCommand(int x){
//Depending on the value we can do the following
//Make necessary changes to the display
renderDisplay();
}
friend class Bank;
};
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.