From f3a555e38814fc1382065f53bae7b9029871ce1c Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 14 Oct 2024 19:08:50 +0530 Subject: [PATCH 1/6] feat: Add `EnergyAwareScheduling` new algorithm with Junit tests --- .../scheduling/EnergyAwareScheduling.java | 46 +++++++++++++++++ .../scheduling/EnergyAwareSchedulingTest.java | 49 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java create mode 100644 src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java diff --git a/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java b/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java new file mode 100644 index 000000000000..c3a59c7727b3 --- /dev/null +++ b/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java @@ -0,0 +1,46 @@ +package com.thealgorithms.scheduling; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * EnergyAwareScheduling schedules tasks based on their energy consumption profile, + * aiming to minimize the overall energy usage of the system. + * + * Use Case: Mobile devices, embedded systems, and data centers that need to save power + * while maintaining performance. + * + * @author Hardvan + */ +public final class EnergyAwareScheduling { + + static class Task { + String name; + int energyConsumption; + + Task(String name, int energyConsumption) { + this.name = name; + this.energyConsumption = energyConsumption; + } + } + + private final List tasks; + + public EnergyAwareScheduling() { + tasks = new ArrayList<>(); + } + + public void addTask(String name, int energyConsumption) { + tasks.add(new Task(name, energyConsumption)); + } + + public List scheduleTasks() { + tasks.sort(Comparator.comparingInt(t -> t.energyConsumption)); + List scheduledOrder = new ArrayList<>(); + for (Task task : tasks) { + scheduledOrder.add(task.name); + } + return scheduledOrder; + } +} diff --git a/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java new file mode 100644 index 000000000000..c000794e4285 --- /dev/null +++ b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java @@ -0,0 +1,49 @@ +package com.thealgorithms.scheduling; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class EnergyAwareSchedulingTest { + + private EnergyAwareScheduling scheduler; + + @BeforeEach + public void setup() { + scheduler = new EnergyAwareScheduling(); + } + + @Test + public void testAddAndScheduleSingleTask() { + scheduler.addTask("Task1", 10); + List expected = List.of("Task1"); + assertEquals(expected, scheduler.scheduleTasks()); + } + + @Test + public void testScheduleMultipleTasks() { + scheduler.addTask("Task1", 10); + scheduler.addTask("Task2", 5); + scheduler.addTask("Task3", 15); + List expected = List.of("Task2", "Task1", "Task3"); + assertEquals(expected, scheduler.scheduleTasks()); + } + + @Test + public void testScheduleTasksWithSameConsumption() { + scheduler.addTask("Task1", 10); + scheduler.addTask("Task2", 10); + scheduler.addTask("Task3", 5); + List expected = List.of("Task3", "Task1", "Task2"); + assertEquals(expected, scheduler.scheduleTasks()); + } + + @Test + public void testEmptyScheduler() { + List expected = List.of(); + assertEquals(expected, scheduler.scheduleTasks()); + } +} From 1faea3b68e369b09f492d1637e4741c1062ecfa7 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Mon, 14 Oct 2024 13:39:07 +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..3e97afada281 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -512,6 +512,7 @@ * [ScanScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/ScanScheduling.java) * [SSFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/SSFScheduling.java) * [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java) + * [EnergyAwareScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java) * [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java) * [HighestResponseRatioNextScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java) * [JobSchedulingWithDeadline](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/JobSchedulingWithDeadline.java) @@ -1063,6 +1064,7 @@ * [ScanSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/ScanSchedulingTest.java) * [SSFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/SSFSchedulingTest.java) * [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.java) + * [EnergyAwareSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java) * [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java) * [HighestResponseRatioNextSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java) * [JobSchedulingWithDeadlineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/JobSchedulingWithDeadlineTest.java) From c8c6aeae6b95f500438bd8c73b4836c91c2fd321 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 14 Oct 2024 19:11:33 +0530 Subject: [PATCH 3/6] Fix --- .../thealgorithms/scheduling/EnergyAwareSchedulingTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java index c000794e4285..27c8a092bb0e 100644 --- a/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java +++ b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java @@ -2,11 +2,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.List; - public class EnergyAwareSchedulingTest { private EnergyAwareScheduling scheduler; From 3a1268cc160f7849cceda46640c5b3690bd29c23 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Tue, 29 Oct 2024 10:20:25 +0530 Subject: [PATCH 4/6] Fix --- .../scheduling/EnergyAwareScheduling.java | 36 ++++++++++-- .../scheduling/EnergyAwareSchedulingTest.java | 55 ++++++++++++++----- 2 files changed, 70 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java b/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java index c3a59c7727b3..59b90a704224 100644 --- a/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java +++ b/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java @@ -2,10 +2,12 @@ import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** - * EnergyAwareScheduling schedules tasks based on their energy consumption profile, + * EnergyAwareScheduling schedules tasks based on their energy consumption profile and execution time, * aiming to minimize the overall energy usage of the system. * * Use Case: Mobile devices, embedded systems, and data centers that need to save power @@ -18,10 +20,12 @@ public final class EnergyAwareScheduling { static class Task { String name; int energyConsumption; + int executionTime; - Task(String name, int energyConsumption) { + Task(String name, int energyConsumption, int executionTime) { this.name = name; this.energyConsumption = energyConsumption; + this.executionTime = executionTime; } } @@ -31,16 +35,36 @@ public EnergyAwareScheduling() { tasks = new ArrayList<>(); } - public void addTask(String name, int energyConsumption) { - tasks.add(new Task(name, energyConsumption)); + public void addTask(String name, int energyConsumption, int executionTime) { + tasks.add(new Task(name, energyConsumption, executionTime)); } - public List scheduleTasks() { + /** + * Schedules tasks in an order that minimizes cumulative energy consumption and + * returns both the scheduled order and the total energy consumption. + * Steps: + * 1. Sort tasks by energy consumption per time unit to minimize cumulative energy cost. + * 2. Schedule tasks in the order of sorted tasks. + * 3. Calculate the total energy consumption. + * 4. Return the scheduled order and total energy consumption. + * + * @return a map containing the scheduled order and total energy consumption. + */ + public Map scheduleTasks() { tasks.sort(Comparator.comparingInt(t -> t.energyConsumption)); + List scheduledOrder = new ArrayList<>(); + int currentTime = 0; + int totalEnergyConsumption = 0; for (Task task : tasks) { scheduledOrder.add(task.name); + currentTime += task.executionTime; + totalEnergyConsumption += currentTime * task.energyConsumption; } - return scheduledOrder; + + Map result = new HashMap<>(); + result.put("scheduledOrder", scheduledOrder); + result.put("totalEnergyConsumption", totalEnergyConsumption); + return result; } } diff --git a/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java index 27c8a092bb0e..dde19f323d51 100644 --- a/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java +++ b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; +import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -17,32 +18,56 @@ public void setup() { @Test public void testAddAndScheduleSingleTask() { - scheduler.addTask("Task1", 10); - List expected = List.of("Task1"); - assertEquals(expected, scheduler.scheduleTasks()); + scheduler.addTask("Task1", 10, 5); + + // Expected schedule and energy consumption + List expectedOrder = List.of("Task1"); + int expectedEnergyConsumption = 10 * 5; + + Map result = scheduler.scheduleTasks(); + assertEquals(expectedOrder, result.get("scheduledOrder")); + assertEquals(expectedEnergyConsumption, result.get("totalEnergyConsumption")); } @Test public void testScheduleMultipleTasks() { - scheduler.addTask("Task1", 10); - scheduler.addTask("Task2", 5); - scheduler.addTask("Task3", 15); - List expected = List.of("Task2", "Task1", "Task3"); - assertEquals(expected, scheduler.scheduleTasks()); + scheduler.addTask("Task1", 10, 3); + scheduler.addTask("Task2", 5, 2); + scheduler.addTask("Task3", 15, 4); + + // Expected schedule order and cumulative energy calculation + List expectedOrder = List.of("Task2", "Task1", "Task3"); + + int expectedEnergyConsumption = 195; + + Map result = scheduler.scheduleTasks(); + assertEquals(expectedOrder, result.get("scheduledOrder")); + assertEquals(expectedEnergyConsumption, result.get("totalEnergyConsumption")); } @Test public void testScheduleTasksWithSameConsumption() { - scheduler.addTask("Task1", 10); - scheduler.addTask("Task2", 10); - scheduler.addTask("Task3", 5); - List expected = List.of("Task3", "Task1", "Task2"); - assertEquals(expected, scheduler.scheduleTasks()); + scheduler.addTask("Task1", 10, 2); + scheduler.addTask("Task2", 10, 1); + scheduler.addTask("Task3", 5, 3); + + List expectedOrder = List.of("Task3", "Task1", "Task2"); + + int expectedEnergyConsumption = 125; + + Map result = scheduler.scheduleTasks(); + assertEquals(expectedOrder, result.get("scheduledOrder")); + assertEquals(expectedEnergyConsumption, result.get("totalEnergyConsumption")); } @Test public void testEmptyScheduler() { - List expected = List.of(); - assertEquals(expected, scheduler.scheduleTasks()); + Map result = scheduler.scheduleTasks(); + + List expectedOrder = List.of(); + int expectedEnergyConsumption = 0; + + assertEquals(expectedOrder, result.get("scheduledOrder")); + assertEquals(expectedEnergyConsumption, result.get("totalEnergyConsumption")); } } From 0a067dc96497271b3b193d6843b4ff2ea404327c Mon Sep 17 00:00:00 2001 From: Hardvan Date: Tue, 29 Oct 2024 04:51:49 +0000 Subject: [PATCH 5/6] Update directory --- DIRECTORY.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index f8ce7b72e5a1..9624658a076b 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -549,6 +549,7 @@ * [SSFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/diskscheduling/SSFScheduling.java) * [EDFScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EDFScheduling.java) * [EnergyAwareScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/EnergyAwareScheduling.java) + * [FairShareScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FairShareScheduling.java) * [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java) * [GangScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/GangScheduling.java) * [HighestResponseRatioNextScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/HighestResponseRatioNextScheduling.java) @@ -597,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) @@ -1179,6 +1181,7 @@ * [SSFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/diskscheduling/SSFSchedulingTest.java) * [EDFSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EDFSchedulingTest.java) * [EnergyAwareSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java) + * [FairShareSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FairShareSchedulingTest.java) * [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java) * [GangSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/GangSchedulingTest.java) * [HighestResponseRatioNextSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/HighestResponseRatioNextSchedulingTest.java) @@ -1228,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 048bea11e265a344be867f81624c9a0c69fa4d2e Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Tue, 29 Oct 2024 10:22:27 +0530 Subject: [PATCH 6/6] Fix --- .../thealgorithms/scheduling/EnergyAwareSchedulingTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java index dde19f323d51..24e6bca799e3 100644 --- a/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java +++ b/src/test/java/com/thealgorithms/scheduling/EnergyAwareSchedulingTest.java @@ -20,7 +20,6 @@ public void setup() { public void testAddAndScheduleSingleTask() { scheduler.addTask("Task1", 10, 5); - // Expected schedule and energy consumption List expectedOrder = List.of("Task1"); int expectedEnergyConsumption = 10 * 5; @@ -35,7 +34,6 @@ public void testScheduleMultipleTasks() { scheduler.addTask("Task2", 5, 2); scheduler.addTask("Task3", 15, 4); - // Expected schedule order and cumulative energy calculation List expectedOrder = List.of("Task2", "Task1", "Task3"); int expectedEnergyConsumption = 195; @@ -52,7 +50,6 @@ public void testScheduleTasksWithSameConsumption() { scheduler.addTask("Task3", 5, 3); List expectedOrder = List.of("Task3", "Task1", "Task2"); - int expectedEnergyConsumption = 125; Map result = scheduler.scheduleTasks();