-
Notifications
You must be signed in to change notification settings - Fork 20.5k
Add HighestResponseRatioNextScheduling.java
new algorithm with tests
#5607
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 10 commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
aae1814
Add `HighestResponseRatioNextScheduling.java` new algorithm with tests
Hardvan 90d2097
Update directory
Hardvan 4db4786
Improve class documentation
Hardvan fcee154
Merge remote-tracking branch 'origin/hrr_new_algo' into hrr_new_algo
Hardvan 8143af0
Merge branch 'master' into hrr_new_algo
Hardvan 93cf0dd
Update directory
Hardvan 82fbe4d
Fix
Hardvan bd302ce
Merge remote-tracking branch 'origin/hrr_new_algo' into hrr_new_algo
Hardvan 28be35c
Fix
Hardvan e4ec608
Fix
Hardvan 6b5f794
Add suggested changes
Hardvan f6cda32
Fix clang errors
Hardvan 863859e
Merge branch 'master' into hrr_new_algo
alxkm File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
140 changes: 140 additions & 0 deletions
140
src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
package com.thealgorithms.scheduling; | ||
|
||
import java.util.Arrays; | ||
import java.util.Comparator; | ||
|
||
/** | ||
* The HighestResponseRatioNextScheduling class implements | ||
* the Highest Response Ratio Next (HRRN) scheduling algorithm. | ||
* HRRN is a non-preemptive scheduling algorithm that | ||
* selects the process with the highest response ratio for execution. | ||
* The response ratio is calculated as (waiting time + burst time) / burst time. | ||
* This algorithm aims to reduce the average waiting time | ||
* and improve overall system performance by balancing short and long processes. | ||
*/ | ||
public final class HighestResponseRatioNextScheduling { | ||
private HighestResponseRatioNextScheduling() { | ||
} | ||
|
||
/** | ||
* Calculates the Turn Around Time (TAT) for each process. | ||
* | ||
Hardvan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
* @param processNames Array of process names. | ||
* @param arrivalTimes Array of arrival times corresponding to each process. | ||
* @param burstTimes Array of burst times for each process. | ||
* @param noOfProcesses The number of processes. | ||
* @return An array of Turn Around Times for each process. | ||
*/ | ||
public static int[] calculateTurnAroundTime(String[] processNames, int[] arrivalTimes, int[] burstTimes, int noOfProcesses) { | ||
Hardvan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
int currentTime = 0; | ||
int[] turnAroundTime = new int[noOfProcesses]; | ||
Hardvan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
boolean[] finishedProcess = new boolean[noOfProcesses]; | ||
int finishedProcessCount = 0; | ||
|
||
// Sort by arrival times using a simple bubble sort for demonstration | ||
int[] sortedIndices = sortIndicesByArrival(arrivalTimes); | ||
arrivalTimes = Arrays.copyOf(arrivalTimes, arrivalTimes.length); | ||
burstTimes = Arrays.copyOf(burstTimes, burstTimes.length); | ||
processNames = Arrays.copyOf(processNames, processNames.length); | ||
|
||
// Reorder the arrays based on sorted indices | ||
int[] tempArrival = new int[noOfProcesses]; | ||
int[] tempBurst = new int[noOfProcesses]; | ||
String[] tempProcess = new String[noOfProcesses]; | ||
|
||
for (int i = 0; i < noOfProcesses; i++) { | ||
tempArrival[i] = arrivalTimes[sortedIndices[i]]; | ||
tempBurst[i] = burstTimes[sortedIndices[i]]; | ||
tempProcess[i] = processNames[sortedIndices[i]]; | ||
} | ||
|
||
arrivalTimes = tempArrival; | ||
burstTimes = tempBurst; | ||
processNames = tempProcess; | ||
|
||
while (finishedProcessCount < noOfProcesses) { | ||
currentTime = Math.max(currentTime, arrivalTimes[findNextProcess(arrivalTimes, finishedProcess, currentTime)]); | ||
int loc = findHighestResponseRatio(processNames, arrivalTimes, burstTimes, finishedProcess, currentTime); | ||
|
||
turnAroundTime[loc] = currentTime + burstTimes[loc] - arrivalTimes[loc]; | ||
currentTime += burstTimes[loc]; | ||
finishedProcess[loc] = true; | ||
finishedProcessCount++; | ||
} | ||
|
||
return turnAroundTime; | ||
} | ||
|
||
/** | ||
* Calculates the Waiting Time (WT) for each process. | ||
* | ||
* @param turnAroundTime The Turn Around Times for each process. | ||
* @param burstTimes The burst times for each process. | ||
* @return An array of Waiting Times for each process. | ||
*/ | ||
public static int[] calculateWaitingTime(int[] turnAroundTime, int[] burstTimes) { | ||
int[] waitingTime = new int[turnAroundTime.length]; | ||
for (int i = 0; i < turnAroundTime.length; i++) { | ||
waitingTime[i] = turnAroundTime[i] - burstTimes[i]; | ||
} | ||
return waitingTime; | ||
} | ||
|
||
/** | ||
* Finds the next process to be scheduled based on arrival times and the current time. | ||
* | ||
* @param arrivalTimes Array of arrival times for each process. | ||
* @param finishedProcess Array indicating whether each process has finished. | ||
* @param currentTime The current time in the scheduling process. | ||
* @return The index of the next process to be scheduled. | ||
*/ | ||
private static int findNextProcess(int[] arrivalTimes, boolean[] finishedProcess, int currentTime) { | ||
for (int i = 0; i < arrivalTimes.length; i++) { | ||
if (!finishedProcess[i] && arrivalTimes[i] <= currentTime) { | ||
return i; | ||
} | ||
} | ||
return 0; | ||
Hardvan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
} | ||
|
||
/** | ||
* Finds the process with the highest response ratio. | ||
* | ||
* @param processNames Array of process names. | ||
* @param arrivalTimes Array of arrival times for each process. | ||
* @param burstTimes Array of burst times for each process. | ||
* @param finishedProcess Array indicating whether each process has finished. | ||
* @param currentTime The current time in the scheduling process. | ||
* @return The index of the process with the highest response ratio. | ||
*/ | ||
private static int findHighestResponseRatio(String[] processNames, int[] arrivalTimes, int[] burstTimes, boolean[] finishedProcess, int currentTime) { | ||
double maxResponseRatio = -1; | ||
Hardvan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
int loc = -1; | ||
|
||
for (int i = 0; i < processNames.length; i++) { | ||
if (!finishedProcess[i] && arrivalTimes[i] <= currentTime) { | ||
double responseRatio = (double) (burstTimes[i] + currentTime - arrivalTimes[i]) / burstTimes[i]; | ||
Hardvan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
if (responseRatio > maxResponseRatio) { | ||
maxResponseRatio = responseRatio; | ||
loc = i; | ||
} | ||
} | ||
} | ||
return loc; | ||
} | ||
|
||
/** | ||
* Sorts the indices of the arrival times array in ascending order. | ||
* | ||
* @param arrivalTimes Array of arrival times for each process. | ||
* @return An array of indices sorted by the corresponding arrival times. | ||
*/ | ||
private static int[] sortIndicesByArrival(int[] arrivalTimes) { | ||
Integer[] indices = new Integer[arrivalTimes.length]; | ||
Hardvan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
for (int i = 0; i < arrivalTimes.length; i++) { | ||
indices[i] = i; | ||
} | ||
Arrays.sort(indices, Comparator.comparingInt(a -> arrivalTimes[a])); | ||
return Arrays.stream(indices).mapToInt(Integer::intValue).toArray(); | ||
} | ||
} |
47 changes: 47 additions & 0 deletions
47
src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package com.thealgorithms.scheduling; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertArrayEquals; | ||
|
||
import org.junit.jupiter.api.Test; | ||
|
||
public class HighestResponseRatioNextSchedulingTest { | ||
|
||
@Test | ||
public void testCalculateTurnAroundTime() { | ||
String[] processNames = {"A", "B", "C"}; | ||
int[] arrivalTimes = {0, 2, 4}; | ||
int[] burstTimes = {3, 1, 2}; | ||
int noOfProcesses = 3; | ||
Hardvan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
int[] expectedTurnAroundTimes = {3, 2, 2}; | ||
int[] actualTurnAroundTimes = HighestResponseRatioNextScheduling.calculateTurnAroundTime(processNames, arrivalTimes, burstTimes, noOfProcesses); | ||
|
||
assertArrayEquals(expectedTurnAroundTimes, actualTurnAroundTimes, "Turn Around Times do not match"); | ||
} | ||
|
||
@Test | ||
public void testCalculateWaitingTime() { | ||
int[] turnAroundTimes = {3, 1, 5}; | ||
int[] burstTimes = {3, 1, 2}; | ||
|
||
int[] expectedWaitingTimes = {0, 0, 3}; | ||
int[] actualWaitingTimes = HighestResponseRatioNextScheduling.calculateWaitingTime(turnAroundTimes, burstTimes); | ||
|
||
assertArrayEquals(expectedWaitingTimes, actualWaitingTimes, "Waiting Times do not match"); | ||
} | ||
|
||
@Test | ||
public void testCompleteSchedulingScenario() { | ||
String[] processNames = {"A", "B", "C"}; | ||
int[] arrivalTimes = {0, 1, 2}; | ||
int[] burstTimes = {5, 2, 1}; | ||
|
||
int[] expectedTurnAroundTimes = {5, 7, 4}; | ||
int[] turnAroundTimes = HighestResponseRatioNextScheduling.calculateTurnAroundTime(processNames, arrivalTimes, burstTimes, processNames.length); | ||
assertArrayEquals(expectedTurnAroundTimes, turnAroundTimes, "Turn Around Times do not match"); | ||
|
||
int[] expectedWaitingTimes = {0, 5, 3}; | ||
int[] waitingTimes = HighestResponseRatioNextScheduling.calculateWaitingTime(turnAroundTimes, burstTimes); | ||
assertArrayEquals(expectedWaitingTimes, waitingTimes, "Waiting Times do not match"); | ||
} | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.