Skip to content

Commit a6423b6

Browse files
committed
feat: Add SelfAdjustingScheduling new algorithm with Junit tests
1 parent bcf4034 commit a6423b6

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import java.util.PriorityQueue;
4+
5+
/**
6+
* SelfAdjustingScheduling is an algorithm where tasks dynamically adjust
7+
* their priority based on real-time feedback, such as wait time and CPU usage.
8+
* Tasks that wait longer will automatically increase their priority,
9+
* allowing for better responsiveness and fairness in task handling.
10+
*
11+
* Use Case: Real-time systems that require dynamic prioritization
12+
* of tasks to maintain system responsiveness and fairness.
13+
*
14+
* @author Hardvan
15+
*/
16+
public final class SelfAdjustingScheduling {
17+
18+
private static class Task implements Comparable<Task> {
19+
String name;
20+
int waitTime;
21+
int priority;
22+
23+
Task(String name, int priority) {
24+
this.name = name;
25+
this.waitTime = 0;
26+
this.priority = priority;
27+
}
28+
29+
void incrementWaitTime() {
30+
waitTime++;
31+
priority = priority + waitTime;
32+
}
33+
34+
@Override
35+
public int compareTo(Task other) {
36+
return Integer.compare(this.priority, other.priority);
37+
}
38+
}
39+
40+
private final PriorityQueue<Task> taskQueue;
41+
42+
public SelfAdjustingScheduling() {
43+
taskQueue = new PriorityQueue<>();
44+
}
45+
46+
public void addTask(String name, int priority) {
47+
taskQueue.offer(new Task(name, priority));
48+
}
49+
50+
public String scheduleNext() {
51+
if (taskQueue.isEmpty()) {
52+
return null;
53+
}
54+
Task nextTask = taskQueue.poll();
55+
nextTask.incrementWaitTime();
56+
taskQueue.offer(nextTask);
57+
return nextTask.name;
58+
}
59+
60+
public boolean isEmpty() {
61+
return taskQueue.isEmpty();
62+
}
63+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.thealgorithms.scheduling;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
5+
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class SelfAdjustingSchedulingTest {
10+
11+
private SelfAdjustingScheduling scheduler;
12+
13+
@BeforeEach
14+
public void setup() {
15+
scheduler = new SelfAdjustingScheduling();
16+
}
17+
18+
@Test
19+
public void testAddAndScheduleSingleTask() {
20+
scheduler.addTask("Task1", 5);
21+
assertEquals("Task1", scheduler.scheduleNext());
22+
}
23+
24+
@Test
25+
public void testAddMultipleTasks() {
26+
scheduler.addTask("Task1", 5);
27+
scheduler.addTask("Task2", 1);
28+
scheduler.addTask("Task3", 3);
29+
assertEquals("Task2", scheduler.scheduleNext());
30+
assertEquals("Task2", scheduler.scheduleNext());
31+
assertEquals("Task3", scheduler.scheduleNext());
32+
}
33+
34+
@Test
35+
public void testPriorityAdjustment() {
36+
scheduler.addTask("Task1", 1);
37+
scheduler.addTask("Task2", 1);
38+
scheduler.scheduleNext();
39+
scheduler.scheduleNext();
40+
scheduler.scheduleNext();
41+
assertEquals("Task2", scheduler.scheduleNext());
42+
}
43+
44+
@Test
45+
public void testEmptyScheduler() {
46+
assertNull(scheduler.scheduleNext());
47+
}
48+
49+
@Test
50+
public void testTaskReschedulingAfterWait() {
51+
scheduler.addTask("Task1", 1);
52+
scheduler.addTask("Task2", 2);
53+
scheduler.scheduleNext();
54+
scheduler.scheduleNext();
55+
assertEquals("Task1", scheduler.scheduleNext());
56+
}
57+
}

0 commit comments

Comments
 (0)