1 #include "elevatorcontroller.hpp"
3 ElevatorController::ElevatorController (int floors, int elevators)
4 : number_of_floors_(floors)
5 , number_of_elevators_(elevators)
9 std::srand ( std::time (NULL) );
11 /* Create and add all of the elevators */
12 for (int i=0; i<number_of_elevators_; i++)
13 elevators_.push_back (Elevator(i));
16 static int choose_random_number_in_range (int low, int high)
18 return std::rand () % high + low;
21 void ElevatorController::call_elevator_to (int floor, Direction direction)
23 std::cout << "Called elevator to: floor=" << floor << " direction=" << direction << std::endl;
25 /* Check the parameters */
26 if (floor < 0 || floor > number_of_floors_)
29 ElevatorList::iterator it;
30 std::vector<Elevator*> low_load_elevators;
31 Stop requested_stop (floor, direction);
32 const int max_load = number_of_floors_ / 3;
34 std::cout << "Using max load: " << max_load << std::endl;
36 /* Find all elevators with "low load" */
37 for (it=elevators_.begin(); it != elevators_.end(); it++)
39 std::cout << "loop1" << std::endl;
40 if (it->getLoad() < max_load)
41 low_load_elevators.push_back (&(*it));
44 std::vector<Elevator*>::iterator lle_it;
46 float distance = INT_MAX;
50 /* Make sure there are lightly loaded elevators */
51 if (low_load_elevators.size() > 0)
53 /* Find the closest lightly loaded elevator */
54 for (lle_it = low_load_elevators.begin(); lle_it != low_load_elevators.end(); lle_it++)
56 std::cout << "loop2" << std::endl;
57 if ((*lle_it)->distance_from (requested_stop) < distance)
60 distance = (*lle_it)->distance_from (requested_stop);
65 /* Found a closest one, send it */
68 std::cout << "Found closest LLE" << std::endl;
69 e->stop_at (requested_stop);
73 /* No closest one, so send randomly */
74 std::cout << "No closest LLE: choosing randomly" << std::endl;
75 num = choose_random_number_in_range (0, low_load_elevators.size());
76 low_load_elevators.at (num) -> stop_at (requested_stop);
80 /* There were no lightly loaded elevators, so just choose randomly */
81 std::cout << "No LLE at all, choosing randomly" << std::endl;
82 num = choose_random_number_in_range (0, elevators_.size());
83 Elevator &e_ref = elevators_.at (num);
85 e_ref.stop_at (requested_stop);
89 ElevatorList::iterator it;
90 std::vector<Elevator*> idle_elevators;
91 Stop requested_stop(floor, direction);
93 /* Find all idle Elevators */
94 for (it = elevators_.begin(); it != elevators_.end(); it++)
97 /* If we have an IDLE elevator that is currently sitting at the
98 * requested floor, we should obviously send that. */
99 if (it->distance_from (requested_stop) == 0)
101 it->stop_at (requested_stop);
105 /* Was not at the right floor, but still is a good cantidate */
106 idle_elevators.push_back (&(*it));
109 if (idle_elevators.size() > 0)
111 std::vector<Elevator*>::iterator idle_it;
113 float distance = INT_MAX;
116 /* Try to send the closest IDLE elevator */
117 for (idle_it=idle_elevators.begin(); idle_it!=idle_elevators.end(); idle_it++)
119 if ((*idle_it)->distance_from (requested_stop) < distance)
122 distance = (*idle_it)->distance_from (requested_stop);
129 e->stop_at (requested_stop);
133 /* No closest IDLE elevator was found, so choose one randomly */
134 int num = choose_random_number_in_range (0, idle_elevators.size());
136 idle_elevators.at (num) -> stop_at (requested_stop);
140 /* Find the Elevator which is closest to the requested Stop */
142 float distance = INT_MAX;
145 for (it = elevators_.begin(); it != elevators_.end(); it++)
147 if (it->distance_from (requested_stop) < distance)
150 distance = it->distance_from (requested_stop);
155 /* If we found one, send the closest Elevator */
158 e->stop_at (requested_stop);
162 /* Now we're having really bad luck. No elevators are idle, and none are closer than
163 * any other. A random choice will have to do. */
164 int num = choose_random_number_in_range (0, elevators_.size());
165 Elevator &e_ref = elevators_.at (num);
167 e_ref.stop_at (requested_stop);
171 void ElevatorController::elevator_request (int elevator_number, int floor)
173 std::cout << "Request that elevator=" << elevator_number << " stop at floor=" << floor << std::endl;
175 /* Check the parameters */
176 if (elevator_number < 0 || elevator_number > number_of_elevators_)
177 throw bad_elevator ();
179 if (floor < 0 || floor > number_of_floors_)
182 /* Construct the Stop to use */
185 /* Get the Elevator */
186 Elevator &e = elevators_.at (elevator_number);
188 /* Tell it where to stop */
192 void ElevatorController::move_elevators ()
194 ElevatorList::iterator it;
196 for (it = elevators_.begin(); it != elevators_.end(); it++)
200 /* vim: set ts=4 sts=4 sw=4 noet tw=112: */