diff --git a/DIRECTORY.md b/DIRECTORY.md index 804320a28..a1bbbf9af 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -535,6 +535,7 @@ * [JobSchedulingWithDeadline](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/JobSchedulingWithDeadline.java) * [LotteryScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/LotteryScheduling.java) * [MLFQScheduler](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/MLFQScheduler.java) + * [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) * [RRScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RRScheduling.java) @@ -1131,6 +1132,7 @@ * [JobSchedulingWithDeadlineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/JobSchedulingWithDeadlineTest.java) * [LotterySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/LotterySchedulingTest.java) * [MLFQSchedulerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/MLFQSchedulerTest.java) + * [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) * [RRSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RRSchedulingTest.java) diff --git a/src/main/java/com/thealgorithms/scheduling/MultiAgentScheduling.java b/src/main/java/com/thealgorithms/scheduling/MultiAgentScheduling.java new file mode 100644 index 000000000..113b1691d --- /dev/null +++ b/src/main/java/com/thealgorithms/scheduling/MultiAgentScheduling.java @@ -0,0 +1,72 @@ +package com.thealgorithms.scheduling; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * MultiAgentScheduling assigns tasks to different autonomous agents + * who independently decide the execution order of their assigned tasks. + * The focus is on collaboration between agents to optimize the overall schedule. + * + * Use Case: Distributed scheduling in decentralized systems like IoT networks. + * + * @author Hardvan + */ +public class MultiAgentScheduling { + + static class Agent { + String name; + List tasks; + + Agent(String name) { + this.name = name; + this.tasks = new ArrayList<>(); + } + + void addTask(String task) { + tasks.add(task); + } + + List getTasks() { + return tasks; + } + } + + private final Map agents; + + public MultiAgentScheduling() { + agents = new HashMap<>(); + } + + public void addAgent(String agentName) { + agents.putIfAbsent(agentName, new Agent(agentName)); + } + + /** + * Assign a task to a specific agent. + * + * @param agentName the name of the agent + * @param task the task to be assigned + */ + public void assignTask(String agentName, String task) { + Agent agent = agents.get(agentName); + if (agent != null) { + agent.addTask(task); + } + } + + /** + * Get the scheduled tasks for each agent. + * + * @return a map of agent names to their scheduled tasks + */ + public Map> getScheduledTasks() { + Map> schedule = new HashMap<>(); + for (Agent agent : agents.values()) { + schedule.put(agent.name, agent.getTasks()); + } + return schedule; + } +} diff --git a/src/test/java/com/thealgorithms/scheduling/MultiAgentSchedulingTest.java b/src/test/java/com/thealgorithms/scheduling/MultiAgentSchedulingTest.java new file mode 100644 index 000000000..16067fa8c --- /dev/null +++ b/src/test/java/com/thealgorithms/scheduling/MultiAgentSchedulingTest.java @@ -0,0 +1,52 @@ +package com.thealgorithms.scheduling; + +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; + +public class MultiAgentSchedulingTest { + + private MultiAgentScheduling scheduler; + + @BeforeEach + public void setup() { + scheduler = new MultiAgentScheduling(); + } + + @Test + public void testAddAgentAndAssignTask() { + scheduler.addAgent("Agent1"); + scheduler.assignTask("Agent1", "Task1"); + Map> expected = Map.of("Agent1", List.of("Task1")); + assertEquals(expected, scheduler.getScheduledTasks()); + } + + @Test + public void testMultipleAgentsWithTasks() { + scheduler.addAgent("Agent1"); + scheduler.addAgent("Agent2"); + scheduler.assignTask("Agent1", "Task1"); + scheduler.assignTask("Agent2", "Task2"); + Map> expected = Map.of("Agent1", List.of("Task1"), "Agent2", List.of("Task2")); + assertEquals(expected, scheduler.getScheduledTasks()); + } + + @Test + public void testAgentWithMultipleTasks() { + scheduler.addAgent("Agent1"); + scheduler.assignTask("Agent1", "Task1"); + scheduler.assignTask("Agent1", "Task2"); + Map> expected = Map.of("Agent1", List.of("Task1", "Task2")); + assertEquals(expected, scheduler.getScheduledTasks()); + } + + @Test + public void testEmptyAgentSchedule() { + scheduler.addAgent("Agent1"); + Map> expected = Map.of("Agent1", List.of()); + assertEquals(expected, scheduler.getScheduledTasks()); + } +}