Advertisement
Guest User

Untitled

a guest
Feb 26th, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <utility>
  5. #include <numeric>
  6. #include <set>
  7. #include <iomanip>
  8. #include <queue>
  9. #include <map>
  10.  
  11.  
  12. using namespace std;
  13.  
  14. struct Process {
  15. int arrivalTime;
  16. int serviceTime;
  17. int index;
  18. int priority = 5;
  19. map<int, int> PriorityToUnit = { { 5,1 },{ 4,2 },{ 3,4 },{ 2, 8 },{ 1, numeric_limits<int>::max() } };
  20. Process(int arrival, int service, int indx) : arrivalTime(arrival), serviceTime(service), index(indx) {}
  21. };
  22.  
  23. namespace {
  24. struct ArrivalTimeSort {
  25. bool operator() (const Process &a, const Process &b) {
  26. return a.arrivalTime < b.arrivalTime;
  27. }
  28. };
  29.  
  30. struct SJF_Sort {
  31. bool operator() (const Process &a, const Process &b) {
  32. if (a.arrivalTime == b.arrivalTime)
  33. return a.serviceTime < b.serviceTime;
  34. else
  35. return a.arrivalTime < b.arrivalTime;
  36. }
  37. };
  38.  
  39. struct ServiceTimeSort {
  40. bool operator() (const Process *a, const Process *b) {
  41. if (a->serviceTime == b->serviceTime)
  42. return a->arrivalTime < b->arrivalTime;
  43. return a->serviceTime < b->serviceTime;
  44. }
  45. };
  46.  
  47. struct PrioritySort {
  48. bool operator() (const Process *a, const Process *b) {
  49. return a->priority > b->priority;
  50. }
  51. };
  52. }
  53.  
  54. vector<int> MLF(vector<Process> processes) {
  55. vector<int> toReturn(processes.size());
  56. stable_sort(processes.begin(), processes.end(), ArrivalTimeSort());
  57.  
  58. int currentTime = 0;
  59. //priority_queue<Process*, vector<Process*>, PrioritySort> q;
  60. multiset<Process*, PrioritySort> q;
  61. int currentRunningProcessTimeFrame = 0;
  62. bool returnToQueue = false;
  63. int i = 0;
  64. while (i < processes.size() || !q.empty()) {
  65. if (q.empty()) {
  66. q.insert(&processes[i]);
  67. currentTime = (*q.begin())->arrivalTime;
  68. i++;
  69. }
  70.  
  71. Process *currentRunningProcess = *q.begin();
  72.  
  73. if (currentRunningProcess->serviceTime <= currentRunningProcess->PriorityToUnit[currentRunningProcess->priority]) {
  74. currentTime += (currentRunningProcessTimeFrame = currentRunningProcess->serviceTime);
  75. currentRunningProcess->PriorityToUnit[currentRunningProcess->priority] = currentRunningProcess->serviceTime;
  76. returnToQueue = false;
  77. }
  78. else {
  79. currentTime += (currentRunningProcessTimeFrame = currentRunningProcess->PriorityToUnit[currentRunningProcess->priority]);
  80. returnToQueue = true;
  81. }
  82.  
  83. while (i < processes.size() && processes[i].arrivalTime < currentTime) {
  84. q.insert(&(processes[i]));
  85. if (processes[i].priority > currentRunningProcess->priority) {
  86. currentRunningProcess->serviceTime -= processes[i].arrivalTime - (currentTime - currentRunningProcessTimeFrame);
  87. currentRunningProcess->PriorityToUnit[currentRunningProcess->priority] = currentTime - processes[i].arrivalTime;
  88.  
  89. currentRunningProcess = *q.begin();
  90. currentTime = currentRunningProcess->arrivalTime;
  91. if (currentRunningProcess->serviceTime <= currentRunningProcess->PriorityToUnit[currentRunningProcess->priority]) {
  92. currentTime += (currentRunningProcessTimeFrame = currentRunningProcess->serviceTime);
  93. returnToQueue = false;
  94. }
  95. else {
  96. currentTime += (currentRunningProcessTimeFrame = currentRunningProcess->PriorityToUnit[currentRunningProcess->priority]);
  97. returnToQueue = true;
  98. }
  99. }
  100. i++;
  101. }
  102.  
  103. if (!returnToQueue) {
  104. toReturn[currentRunningProcess->index] = currentTime - currentRunningProcess->arrivalTime;
  105. q.erase(q.begin());
  106. }
  107. else {
  108. q.erase(q.begin());
  109. currentRunningProcess->serviceTime -= currentRunningProcess->PriorityToUnit[currentRunningProcess->priority];
  110. currentRunningProcess->priority--;
  111. q.insert(currentRunningProcess);
  112. }
  113. }
  114.  
  115. return toReturn;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement