2024-09-12 00:17:21 -07:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using UnityEngine;
|
2024-09-29 23:18:40 -07:00
|
|
|
using System.Diagnostics.Contracts;
|
|
|
|
// The round-robin assignment class assigns interceptors to the targets in a
|
|
|
|
// round-robin order using the new paradigm.
|
2024-09-13 22:45:25 -07:00
|
|
|
public class RoundRobinAssignment : IAssignment {
|
2024-09-29 23:18:40 -07:00
|
|
|
// Previous target index that was assigned.
|
|
|
|
private int prevTargetIndex = -1;
|
2024-09-12 00:17:21 -07:00
|
|
|
|
2024-09-29 23:18:40 -07:00
|
|
|
// Assign a target to each interceptor that has not been assigned a target yet.
|
|
|
|
[Pure]
|
|
|
|
public IEnumerable<IAssignment.AssignmentItem> Assign(in IReadOnlyList<Interceptor> interceptors, in IReadOnlyList<ThreatData> targets) {
|
|
|
|
List<IAssignment.AssignmentItem> assignments = new List<IAssignment.AssignmentItem>();
|
2024-09-12 00:17:21 -07:00
|
|
|
|
2024-09-29 23:18:40 -07:00
|
|
|
// Get the list of interceptors that are available for assignment.
|
|
|
|
List<Interceptor> assignableInterceptors = IAssignment.GetAssignableInterceptors(interceptors);
|
|
|
|
if (assignableInterceptors.Count == 0) {
|
|
|
|
return assignments;
|
|
|
|
}
|
2024-09-12 00:17:21 -07:00
|
|
|
|
2024-09-29 23:18:40 -07:00
|
|
|
// Get the list of active threats that need to be addressed.
|
|
|
|
List<ThreatData> activeThreats = IAssignment.GetActiveThreats(targets);
|
|
|
|
if (activeThreats.Count == 0) {
|
|
|
|
return assignments;
|
|
|
|
}
|
2024-09-12 00:17:21 -07:00
|
|
|
|
2024-09-29 23:18:40 -07:00
|
|
|
// Perform round-robin assignment.
|
|
|
|
foreach (Interceptor interceptor in assignableInterceptors) {
|
|
|
|
// Determine the next target index in a round-robin fashion.
|
|
|
|
int nextTargetIndex = (prevTargetIndex + 1) % activeThreats.Count;
|
|
|
|
ThreatData selectedThreat = activeThreats[nextTargetIndex];
|
2024-09-12 15:44:55 -07:00
|
|
|
|
2024-09-29 23:18:40 -07:00
|
|
|
// Assign the interceptor to the selected threat.
|
|
|
|
assignments.Add(new IAssignment.AssignmentItem(interceptor, selectedThreat.Threat));
|
|
|
|
|
|
|
|
// Update the previous target index.
|
|
|
|
prevTargetIndex = nextTargetIndex;
|
|
|
|
}
|
2024-09-13 22:45:25 -07:00
|
|
|
|
2024-09-29 23:18:40 -07:00
|
|
|
return assignments;
|
|
|
|
}
|
2024-09-12 00:17:21 -07:00
|
|
|
}
|