Skip to content

Commit 32cb98d

Browse files
authored
Add MultiAgentScheduling algorithm (#5816)
1 parent 92a04f8 commit 32cb98d

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@
535535
* [JobSchedulingWithDeadline](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/JobSchedulingWithDeadline.java)
536536
* [LotteryScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/LotteryScheduling.java)
537537
* [MLFQScheduler](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/MLFQScheduler.java)
538+
* [MultiAgentScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/MultiAgentScheduling.java)
538539
* [NonPreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/NonPreemptivePriorityScheduling.java)
539540
* [PreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/PreemptivePriorityScheduling.java)
540541
* [RRScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/RRScheduling.java)
@@ -1131,6 +1132,7 @@
11311132
* [JobSchedulingWithDeadlineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/JobSchedulingWithDeadlineTest.java)
11321133
* [LotterySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/LotterySchedulingTest.java)
11331134
* [MLFQSchedulerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/MLFQSchedulerTest.java)
1135+
* [MultiAgentSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/MultiAgentSchedulingTest.java)
11341136
* [NonPreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/NonPreemptivePrioritySchedulingTest.java)
11351137
* [PreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/PreemptivePrioritySchedulingTest.java)
11361138
* [RRSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/RRSchedulingTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
/**
9+
* MultiAgentScheduling assigns tasks to different autonomous agents
10+
* who independently decide the execution order of their assigned tasks.
11+
* The focus is on collaboration between agents to optimize the overall schedule.
12+
*
13+
* Use Case: Distributed scheduling in decentralized systems like IoT networks.
14+
*
15+
* @author Hardvan
16+
*/
17+
public class MultiAgentScheduling {
18+
19+
static class Agent {
20+
String name;
21+
List<String> tasks;
22+
23+
Agent(String name) {
24+
this.name = name;
25+
this.tasks = new ArrayList<>();
26+
}
27+
28+
void addTask(String task) {
29+
tasks.add(task);
30+
}
31+
32+
List<String> getTasks() {
33+
return tasks;
34+
}
35+
}
36+
37+
private final Map<String, Agent> agents;
38+
39+
public MultiAgentScheduling() {
40+
agents = new HashMap<>();
41+
}
42+
43+
public void addAgent(String agentName) {
44+
agents.putIfAbsent(agentName, new Agent(agentName));
45+
}
46+
47+
/**
48+
* Assign a task to a specific agent.
49+
*
50+
* @param agentName the name of the agent
51+
* @param task the task to be assigned
52+
*/
53+
public void assignTask(String agentName, String task) {
54+
Agent agent = agents.get(agentName);
55+
if (agent != null) {
56+
agent.addTask(task);
57+
}
58+
}
59+
60+
/**
61+
* Get the scheduled tasks for each agent.
62+
*
63+
* @return a map of agent names to their scheduled tasks
64+
*/
65+
public Map<String, List<String>> getScheduledTasks() {
66+
Map<String, List<String>> schedule = new HashMap<>();
67+
for (Agent agent : agents.values()) {
68+
schedule.put(agent.name, agent.getTasks());
69+
}
70+
return schedule;
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.List;
6+
import java.util.Map;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
10+
public class MultiAgentSchedulingTest {
11+
12+
private MultiAgentScheduling scheduler;
13+
14+
@BeforeEach
15+
public void setup() {
16+
scheduler = new MultiAgentScheduling();
17+
}
18+
19+
@Test
20+
public void testAddAgentAndAssignTask() {
21+
scheduler.addAgent("Agent1");
22+
scheduler.assignTask("Agent1", "Task1");
23+
Map<String, List<String>> expected = Map.of("Agent1", List.of("Task1"));
24+
assertEquals(expected, scheduler.getScheduledTasks());
25+
}
26+
27+
@Test
28+
public void testMultipleAgentsWithTasks() {
29+
scheduler.addAgent("Agent1");
30+
scheduler.addAgent("Agent2");
31+
scheduler.assignTask("Agent1", "Task1");
32+
scheduler.assignTask("Agent2", "Task2");
33+
Map<String, List<String>> expected = Map.of("Agent1", List.of("Task1"), "Agent2", List.of("Task2"));
34+
assertEquals(expected, scheduler.getScheduledTasks());
35+
}
36+
37+
@Test
38+
public void testAgentWithMultipleTasks() {
39+
scheduler.addAgent("Agent1");
40+
scheduler.assignTask("Agent1", "Task1");
41+
scheduler.assignTask("Agent1", "Task2");
42+
Map<String, List<String>> expected = Map.of("Agent1", List.of("Task1", "Task2"));
43+
assertEquals(expected, scheduler.getScheduledTasks());
44+
}
45+
46+
@Test
47+
public void testEmptyAgentSchedule() {
48+
scheduler.addAgent("Agent1");
49+
Map<String, List<String>> expected = Map.of("Agent1", List.of());
50+
assertEquals(expected, scheduler.getScheduledTasks());
51+
}
52+
}

0 commit comments

Comments
 (0)