From b2d18b8afba8ce8286de092536bd2040c5f0de9a Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 14 Oct 2024 18:56:07 +0530 Subject: [PATCH 1/3] feat: Add `SlackTimeScheduling` new algorithm with Junit tests --- .../scheduling/SlackTimeScheduling.java | 52 +++++++++++++++++++ .../scheduling/SlackTimeSchedulingTest.java | 48 +++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java create mode 100644 src/test/java/com/thealgorithms/scheduling/SlackTimeSchedulingTest.java diff --git a/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java b/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java new file mode 100644 index 000000000000..9b35c7765044 --- /dev/null +++ b/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java @@ -0,0 +1,52 @@ +package com.thealgorithms.scheduling; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * SlackTimeScheduling is an algorithm that prioritizes tasks based on their + * slack time, which is defined as the difference between the task's deadline + * and the time required to execute it. Tasks with less slack time are prioritized. + * + * Use Case: Real-time systems with hard deadlines, such as robotics or embedded systems. + * + * @author Hardvan + */ +public class SlackTimeScheduling { + + static class Task { + String name; + int executionTime; + int deadline; + + Task(String name, int executionTime, int deadline) { + this.name = name; + this.executionTime = executionTime; + this.deadline = deadline; + } + + int getSlackTime() { + return deadline - executionTime; + } + } + + private final List tasks; + + public SlackTimeScheduling() { + tasks = new ArrayList<>(); + } + + public void addTask(String name, int executionTime, int deadline) { + tasks.add(new Task(name, executionTime, deadline)); + } + + public List scheduleTasks() { + tasks.sort(Comparator.comparingInt(Task::getSlackTime)); + List scheduledOrder = new ArrayList<>(); + for (Task task : tasks) { + scheduledOrder.add(task.name); + } + return scheduledOrder; + } +} diff --git a/src/test/java/com/thealgorithms/scheduling/SlackTimeSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/SlackTimeSchedulingTest.java new file mode 100644 index 000000000000..555a0941e7f5 --- /dev/null +++ b/src/test/java/com/thealgorithms/scheduling/SlackTimeSchedulingTest.java @@ -0,0 +1,48 @@ +package com.thealgorithms.scheduling; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class SlackTimeSchedulingTest { + + private SlackTimeScheduling scheduler; + + @BeforeEach + public void setup() { + scheduler = new SlackTimeScheduling(); + } + + @Test + public void testAddAndScheduleSingleTask() { + scheduler.addTask("Task1", 2, 5); + List expected = List.of("Task1"); + assertEquals(expected, scheduler.scheduleTasks()); + } + + @Test + public void testScheduleMultipleTasks() { + scheduler.addTask("Task1", 2, 5); + scheduler.addTask("Task2", 1, 4); + scheduler.addTask("Task3", 3, 7); + List expected = List.of("Task1", "Task2", "Task3"); + assertEquals(expected, scheduler.scheduleTasks()); + } + + @Test + public void testScheduleTasksWithSameSlackTime() { + scheduler.addTask("Task1", 2, 5); + scheduler.addTask("Task2", 3, 6); + scheduler.addTask("Task3", 1, 4); + List expected = List.of("Task1", "Task2", "Task3"); + assertEquals(expected, scheduler.scheduleTasks()); + } + + @Test + public void testEmptyScheduler() { + List expected = List.of(); + assertEquals(expected, scheduler.scheduleTasks()); + } +} From 863d490eb6384bf1306ff0fa7a61464fca465d47 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Mon, 14 Oct 2024 13:26:25 +0000 Subject: [PATCH 2/3] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 4c454088088b..7fe3fef2e1b9 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -521,6 +521,7 @@ * [PreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/PreemptivePriorityScheduling.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) + * [SlackTimeScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java) * [SRTFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/SRTFScheduling.java) * searches * [BinarySearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/BinarySearch.java) @@ -1072,6 +1073,7 @@ * [PreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/PreemptivePrioritySchedulingTest.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) + * [SlackTimeSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SlackTimeSchedulingTest.java) * [SRTFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/SRTFSchedulingTest.java) * searches * [BinarySearch2dArrayTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/BinarySearch2dArrayTest.java) From af76b237ca9135236aa76382a15c04fa41cccb43 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 14 Oct 2024 19:00:58 +0530 Subject: [PATCH 3/3] Fix --- .../scheduling/SlackTimeScheduling.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java b/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java index 9b35c7765044..bbfd36f0f660 100644 --- a/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java +++ b/src/main/java/com/thealgorithms/scheduling/SlackTimeScheduling.java @@ -37,10 +37,22 @@ public SlackTimeScheduling() { tasks = new ArrayList<>(); } + /** + * Adds a task to the scheduler. + * + * @param name the name of the task + * @param executionTime the time required to execute the task + * @param deadline the deadline by which the task must be completed + */ public void addTask(String name, int executionTime, int deadline) { tasks.add(new Task(name, executionTime, deadline)); } + /** + * Schedules the tasks based on their slack time. + * + * @return the order in which the tasks should be executed + */ public List scheduleTasks() { tasks.sort(Comparator.comparingInt(Task::getSlackTime)); List scheduledOrder = new ArrayList<>();