From ff394a65380a390f0aa2d8e48f88d31b2485321a Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 14 Oct 2024 18:41:41 +0530 Subject: [PATCH 1/6] feat: Add `RandomScheduling` new algorithm with Junit tests --- .../scheduling/RandomScheduling.java | 44 +++++++++ .../scheduling/RandomSchedulingTest.java | 91 +++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 src/main/java/com/thealgorithms/scheduling/RandomScheduling.java create mode 100644 src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java diff --git a/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java b/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java new file mode 100644 index 000000000000..c7fd952bcac5 --- /dev/null +++ b/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java @@ -0,0 +1,44 @@ +package com.thealgorithms.scheduling; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +/** + * RandomScheduling is an algorithm that assigns tasks in a random order. + * It doesn't consider priority, deadlines, or burst times, making it + * inefficient but useful in scenarios where fairness or unpredictability + * is required (e.g., load balancing in distributed systems). + * + * Use Case: Distributed systems where randomness helps avoid task starvation. + * + * @author Hardvan + */ +public final class RandomScheduling { + + private final List tasks; + private final Random random; + + /** + * Constructs a new RandomScheduling instance. + * + * @param tasks A list of task names to be scheduled. + * @param random A Random instance for generating random numbers. + */ + public RandomScheduling(List tasks, Random random) { + this.tasks = new ArrayList<>(tasks); // Store tasks locally + this.random = random; + } + + /** + * Schedules the tasks randomly and returns the randomized order. + * + * @return A list representing the tasks in their randomized execution order. + */ + public List schedule() { + List shuffledTasks = new ArrayList<>(tasks); + Collections.shuffle(shuffledTasks, random); + return shuffledTasks; + } +} diff --git a/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java new file mode 100644 index 000000000000..b70efff61e8b --- /dev/null +++ b/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java @@ -0,0 +1,91 @@ +package com.thealgorithms.scheduling; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +import java.util.List; +import java.util.Random; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class RandomSchedulingTest { + + private RandomScheduling randomScheduling; + private Random mockRandom; + + @BeforeEach + public void setup() { + mockRandom = mock(Random.class); // Mocking Random for predictable behavior + } + + @Test + public void testRandomOrder1() { + // Arrange + List tasks = List.of("Task1", "Task2", "Task3"); + // Mock the random sequence to control shuffling: swap 0 <-> 1, and 1 <-> 2. + when(mockRandom.nextInt(anyInt())).thenReturn(1, 2, 0); + randomScheduling = new RandomScheduling(tasks, mockRandom); + + // Act + List result = randomScheduling.schedule(); + + // Assert + assertEquals(List.of("Task1", "Task2", "Task3"), result); + } + + @Test + public void testRandomOrder2() { + // Arrange + List tasks = List.of("A", "B", "C", "D"); + // Mocking predictable swaps for the sequence: [C, B, D, A] + when(mockRandom.nextInt(anyInt())).thenReturn(2, 1, 3, 0); + randomScheduling = new RandomScheduling(tasks, mockRandom); + + // Act + List result = randomScheduling.schedule(); + + // Assert + assertEquals(List.of("A", "C", "B", "D"), result); + } + + @Test + public void testSingleTask() { + // Arrange + List tasks = List.of("SingleTask"); + when(mockRandom.nextInt(anyInt())).thenReturn(0); // No real shuffle + randomScheduling = new RandomScheduling(tasks, mockRandom); + + // Act + List result = randomScheduling.schedule(); + + // Assert + assertEquals(List.of("SingleTask"), result); + } + + @Test + public void testEmptyTaskList() { + // Arrange + List tasks = List.of(); + randomScheduling = new RandomScheduling(tasks, mockRandom); + + // Act + List result = randomScheduling.schedule(); + + // Assert + assertEquals(List.of(), result); // Should return an empty list + } + + @Test + public void testSameTasksMultipleTimes() { + // Arrange + List tasks = List.of("X", "X", "Y", "Z"); + when(mockRandom.nextInt(anyInt())).thenReturn(3, 0, 1, 2); + randomScheduling = new RandomScheduling(tasks, mockRandom); + + // Act + List result = randomScheduling.schedule(); + + // Assert + assertEquals(List.of("Y", "X", "X", "Z"), result); + } +} From fb871910a0be491e36e91ae661775def6431e8ba Mon Sep 17 00:00:00 2001 From: Hardvan Date: Mon, 14 Oct 2024 13:12:00 +0000 Subject: [PATCH 2/6] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 4c454088088b..b45373006990 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -519,6 +519,7 @@ * [MLFQScheduler](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/MLFQScheduler.java) * [NonPreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/NonPreemptivePriorityScheduling.java) * [PreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/PreemptivePriorityScheduling.java) + * [RandomScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java) * [RRScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RRScheduling.java) * [SJFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SJFScheduling.java) * [SRTFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SRTFScheduling.java) @@ -1070,6 +1071,7 @@ * [MLFQSchedulerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/MLFQSchedulerTest.java) * [NonPreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/NonPreemptivePrioritySchedulingTest.java) * [PreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/PreemptivePrioritySchedulingTest.java) + * [RandomSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java) * [RRSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RRSchedulingTest.java) * [SJFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SJFSchedulingTest.java) * [SRTFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SRTFSchedulingTest.java) From 22dc5b57a43575454791baeb8bfafebf10f3288e Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 14 Oct 2024 18:46:42 +0530 Subject: [PATCH 3/6] Fix --- .../com/thealgorithms/scheduling/RandomSchedulingTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java index b70efff61e8b..e2c8777d892f 100644 --- a/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java +++ b/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java @@ -1,7 +1,9 @@ package com.thealgorithms.scheduling; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.util.List; import java.util.Random; From 537f4a9f784f8a474abac684898a9edc134f7d4e Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Tue, 29 Oct 2024 09:38:41 +0530 Subject: [PATCH 4/6] Fix --- .../java/com/thealgorithms/scheduling/RandomScheduling.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java b/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java index c7fd952bcac5..02fa5cffe726 100644 --- a/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java +++ b/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java @@ -1,6 +1,7 @@ package com.thealgorithms.scheduling; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Random; @@ -23,10 +24,10 @@ public final class RandomScheduling { /** * Constructs a new RandomScheduling instance. * - * @param tasks A list of task names to be scheduled. + * @param tasks A collection of task names to be scheduled. * @param random A Random instance for generating random numbers. */ - public RandomScheduling(List tasks, Random random) { + public RandomScheduling(Collection tasks, Random random) { this.tasks = new ArrayList<>(tasks); // Store tasks locally this.random = random; } From e730b7b9088e486a0b4ae1711d86aceab2b35d0a Mon Sep 17 00:00:00 2001 From: Hardvan Date: Tue, 29 Oct 2024 04:11:24 +0000 Subject: [PATCH 5/6] Update directory --- DIRECTORY.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DIRECTORY.md b/DIRECTORY.md index 52b726d3d62e..c4d3ce87e8a6 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -558,8 +558,8 @@ * [MultiAgentScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/MultiAgentScheduling.java) * [NonPreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/NonPreemptivePriorityScheduling.java) * [PreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/PreemptivePriorityScheduling.java) - * [RandomScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java) * [ProportionalFairScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/ProportionalFairScheduling.java) + * [RandomScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java) * [RRScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RRScheduling.java) * [SelfAdjustingScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SelfAdjustingScheduling.java) * [SJFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SJFScheduling.java) @@ -598,6 +598,7 @@ * [UnionFind](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/UnionFind.java) * [UpperBound](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/UpperBound.java) * slidingwindow + * [LongestSubarrayWithSumLessOrEqualToK](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/LongestSubarrayWithSumLessOrEqualToK.java) * [LongestSubstringWithoutRepeatingCharacters](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java) * [MaxSumKSizeSubarray](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java) * [MinSumKSizeSubarray](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/MinSumKSizeSubarray.java) @@ -1189,8 +1190,8 @@ * [MultiAgentSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/MultiAgentSchedulingTest.java) * [NonPreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/NonPreemptivePrioritySchedulingTest.java) * [PreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/PreemptivePrioritySchedulingTest.java) - * [RandomSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java) * [ProportionalFairSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/ProportionalFairSchedulingTest.java) + * [RandomSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RandomSchedulingTest.java) * [RRSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RRSchedulingTest.java) * [SelfAdjustingSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SelfAdjustingSchedulingTest.java) * [SJFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SJFSchedulingTest.java) @@ -1230,6 +1231,7 @@ * [UnionFindTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/UnionFindTest.java) * [UpperBoundTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/UpperBoundTest.java) * slidingwindow + * [LongestSubarrayWithSumLessOrEqualToKTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/LongestSubarrayWithSumLessOrEqualToKTest.java) * [LongestSubstringWithoutRepeatingCharactersTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java) * [MaxSumKSizeSubarrayTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarrayTest.java) * [MinSumKSizeSubarrayTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/MinSumKSizeSubarrayTest.java) From 7d13d5e05d5e84641edafd2a377339cb709558f3 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Tue, 29 Oct 2024 09:42:06 +0530 Subject: [PATCH 6/6] Fix --- .../java/com/thealgorithms/scheduling/RandomScheduling.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java b/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java index 02fa5cffe726..b7e863b5cfd8 100644 --- a/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java +++ b/src/main/java/com/thealgorithms/scheduling/RandomScheduling.java @@ -28,7 +28,7 @@ public final class RandomScheduling { * @param random A Random instance for generating random numbers. */ public RandomScheduling(Collection tasks, Random random) { - this.tasks = new ArrayList<>(tasks); // Store tasks locally + this.tasks = new ArrayList<>(tasks); this.random = random; } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy