Miscellaneous scripts
This repository contains miscellaneous scripts that does not fit in one repository, yet I will use them sometimes for my personal use. Note that some of the scripts might contain hardcoded paths and opinionated presets, and you are advised to inspect them before actually using.
 
Loading...
Searching...
No Matches
lift.cpp File Reference
#include <algorithm>
#include <cassert>
#include <chrono>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>
Include dependency graph for lift.cpp:

Go to the source code of this file.

Classes

class  Lift
 
class  Queue
 

Macros

#define numLifts   numQueues
 
#define numQueues   2
 

Enumerations

enum  {
  liftCapacity = 20 , maxRound = 12 , minRound = 5 , minRoundDifference = 4 ,
  minNumPeople = 0 , maxNumPeople = liftCapacity * maxRound , minDefaultNumPeople = liftCapacity * minRound , normDistSDBound = 2 ,
  coutWidth = 8
}
 
enum  {
  lift1MeanWaitingTime = 10 , lift1StdDevWaitingTime = 2 , lift2MeanWaitingTime = 12 , lift2StdDevWaitingTime = 4 ,
  isLift1FasterThanLift2 = true
}
 

Functions

auto main () -> int
 
auto simulateTwoQueues (std::vector< Queue * > queues) -> decltype(Queue::id)
 

Macro Definition Documentation

◆ numLifts

#define numLifts   numQueues

Definition at line 27 of file lift.cpp.

Referenced by Queue::Queue().

◆ numQueues

#define numQueues   2

Definition at line 26 of file lift.cpp.

Referenced by Queue::Queue(), and main().

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
liftCapacity 
maxRound 
minRound 
minRoundDifference 
minNumPeople 
maxNumPeople 
minDefaultNumPeople 
normDistSDBound 
coutWidth 

Definition at line 14 of file lift.cpp.

14 {
15 liftCapacity = 20,
16 maxRound = 12,
17 minRound = 5,
19 minNumPeople = 0,
23 coutWidth = 8
24};
@ minNumPeople
Definition lift.cpp:19
@ minRoundDifference
Definition lift.cpp:18
@ normDistSDBound
Definition lift.cpp:22
@ maxRound
Definition lift.cpp:16
@ minDefaultNumPeople
Definition lift.cpp:21
@ coutWidth
Definition lift.cpp:23
@ minRound
Definition lift.cpp:17
@ maxNumPeople
Definition lift.cpp:20
@ liftCapacity
Definition lift.cpp:15

◆ anonymous enum

anonymous enum
Enumerator
lift1MeanWaitingTime 
lift1StdDevWaitingTime 
lift2MeanWaitingTime 
lift2StdDevWaitingTime 
isLift1FasterThanLift2 

Definition at line 29 of file lift.cpp.

29 {
35};
@ lift1MeanWaitingTime
Definition lift.cpp:30
@ lift2StdDevWaitingTime
Definition lift.cpp:33
@ isLift1FasterThanLift2
Definition lift.cpp:34
@ lift2MeanWaitingTime
Definition lift.cpp:32
@ lift1StdDevWaitingTime
Definition lift.cpp:31

Function Documentation

◆ main()

auto main ( void ) -> int

Definition at line 130 of file lift.cpp.

130 {
131 // Result vector
132 std::vector<std::string> const headers = {"Queue1", "Queue2", "Lift1", "Lift2", "Fastest"};
133 struct results {
134 public:
135 unsigned int queueLength;
136 unsigned int queue2Length;
137 unsigned int lift1WaitingTime;
138 unsigned int lift2WaitingTime;
139 unsigned int fastestQueueId;
140 } __attribute__((aligned(32)));
141 std::vector<results> rows;
142 // Simulate which queue is the fastest under every possible scenario
143 // which is achieved by generating random queue length and lift waiting time
144 static_assert(isLift1FasterThanLift2 != 0u, "Lift 1 must be faster than Lift 2");
145 for (unsigned int queueLength = minDefaultNumPeople; queueLength <= maxNumPeople;
146 queueLength += liftCapacity) {
147 for (unsigned int queue2Length = minDefaultNumPeople;
148 queue2Length <= queueLength - minRoundDifference; queue2Length += liftCapacity) {
149 std::vector<Queue *> queues;
150
151 // todo: add more queues
152 queues.push_back(new Queue(numQueues - 1, queueLength,
154 queues.push_back(new Queue(numQueues, queue2Length,
156
157 auto fastestQueueId = simulateTwoQueues(queues);
158
159 // Add the result only if the fastest queue is different from the previous
160 // simulation Otherwise, remove the last simulation and add the new one
161 if (!rows.empty() && rows.back().fastestQueueId == fastestQueueId &&
162 rows.back().queueLength == queueLength) {
163 rows.pop_back();
164 }
165 results const result = {queueLength, queue2Length, (*queues.begin())->waitingTime,
166 (*++queues.begin())->waitingTime, fastestQueueId};
167 rows.push_back(result);
168
169 // Free the memory
170 for (Queue * queue : queues) {
171 delete queue->lift;
172 delete queue;
173 }
174 }
175 }
176
177 // Print the results
178 for (const std::string & header : headers) {
179 std::cout << std::setw(coutWidth) << header;
180 }
181 std::cout << '\n';
182 for (const results & row : rows) {
183 std::cout << std::setw(coutWidth) << row.queueLength;
184 std::cout << std::setw(coutWidth) << row.queue2Length;
185 std::cout << std::setw(coutWidth) << row.lift1WaitingTime;
186 std::cout << std::setw(coutWidth) << row.lift2WaitingTime;
187 std::cout << std::setw(coutWidth) << row.fastestQueueId;
188 std::cout << '\n';
189 }
190 return 0;
191}
Definition lift.cpp:40
Definition lift.cpp:81
#define numQueues
Definition lift.cpp:26
auto simulateTwoQueues(std::vector< Queue * > queues) -> decltype(Queue::id)
Definition lift.cpp:113

References coutWidth, isLift1FasterThanLift2, lift1MeanWaitingTime, lift1StdDevWaitingTime, lift2MeanWaitingTime, lift2StdDevWaitingTime, liftCapacity, maxNumPeople, minDefaultNumPeople, minRoundDifference, numQueues, and simulateTwoQueues().

Here is the call graph for this function:

◆ simulateTwoQueues()

auto simulateTwoQueues ( std::vector< Queue * > queues) -> decltype(Queue::id)

Definition at line 113 of file lift.cpp.

113 {
114 // Simulate the total time taken for the lift to serve all the queues
115 for (Queue * queue : queues) {
116 while (queue->numPeople > minNumPeople) {
117 queue->waitingTime = queue->lift->getAvailableTime(queue->waitingTime);
118 if (queue->numPeople > queue->lift->capacity) {
119 queue->numPeople -= queue->lift->capacity;
120 }
121 else {
122 queue->numPeople = minNumPeople;
123 }
124 }
125 }
126 // Return the fastest queue id
127 return (*std::min_element(queues.begin(), queues.end()))->id;
128}

References Queue::id, and minNumPeople.

Referenced by main().

Here is the caller graph for this function: