Add Team functions
This commit is contained in:
@@ -3,19 +3,18 @@
|
||||
namespace Core.Calculation;
|
||||
public class TeamScheduler_DecisionTree
|
||||
{
|
||||
private readonly IList<Student> _students;
|
||||
private readonly IList<Team> _teams;
|
||||
private readonly Team[] _teams;
|
||||
|
||||
private readonly int _timeSlotCount;
|
||||
|
||||
public TeamScheduler_DecisionTree(IList<Team> teams, int timeSlotCount)
|
||||
public TeamScheduler_DecisionTree(Team[] teams, int timeSlotCount)
|
||||
{
|
||||
_timeSlotCount = timeSlotCount;
|
||||
_teams = teams;
|
||||
_students = teams.SelectMany(t => t.Students).Distinct().ToList();
|
||||
//_students = teams.SelectMany(t => t.Students).Distinct().ToList();
|
||||
}
|
||||
|
||||
public IList<Team>[] Solve()
|
||||
public TeamSchedulerSolution Solve()
|
||||
{
|
||||
var timeSlots = new IList<Team>[_timeSlotCount];
|
||||
for (var i = 0; i < _timeSlotCount; i++)
|
||||
@@ -34,68 +33,68 @@ public class TeamScheduler_DecisionTree
|
||||
|
||||
timeSlots[overlaps.First().Item1].Add(team);
|
||||
}
|
||||
return timeSlots;
|
||||
return new TeamSchedulerSolution(timeSlots.Select(e => e.ToArray()).ToArray(), "Success?");
|
||||
}
|
||||
|
||||
public IList<Team>[] SolveRecursive()
|
||||
{
|
||||
// initialize time slots
|
||||
var timeSlots = new IList<Team>[_timeSlotCount];
|
||||
for (var i = 0; i < _timeSlotCount; i++)
|
||||
timeSlots[i] = new List<Team>();
|
||||
//public Team[][] SolveRecursive()
|
||||
//{
|
||||
// // initialize time slots
|
||||
// var timeSlots = new Team[][_timeSlotCount];
|
||||
// for (var i = 0; i < _timeSlotCount; i++)
|
||||
// timeSlots[i] = [];
|
||||
|
||||
return
|
||||
(from i in Enumerable.Range(1, 5)
|
||||
let solution = Recursive(timeSlots, _teams, i)
|
||||
let overlapCount = Team.GetStudentTeamOverlapCount(solution)
|
||||
orderby overlapCount
|
||||
select solution).First();
|
||||
}
|
||||
// return
|
||||
// (from i in Enumerable.Range(1, 5)
|
||||
// let solution = Recursive(timeSlots, _teams, i)
|
||||
// let overlapCount = TeamSchedulerSolution.GetStudentTeamOverlapCount(solution.Select(e => e.ToArray()).ToArray())
|
||||
// orderby overlapCount
|
||||
// select solution).First();
|
||||
//}
|
||||
|
||||
private static IList<Team>[] CopyTimeSlots(IList<Team>[] timeSlots)
|
||||
{
|
||||
return timeSlots.Select(ts => (IList<Team>)new List<Team>(ts)).ToArray();
|
||||
}
|
||||
//private static Team[][] CopyTimeSlots(Team[][] timeSlots)
|
||||
//{
|
||||
// return timeSlots.Select(Team[] (ts) => ts.ToArray()).ToArray();
|
||||
//}
|
||||
|
||||
private static IList<Team>[] Recursive(IList<Team>[] timeSlots, IList<Team> teams, int overlapTriesStudents = 4)
|
||||
{
|
||||
if (!teams.Any())
|
||||
return timeSlots;
|
||||
|
||||
var overlapsTries =
|
||||
(from team in teams.OrderByDescending(t => t.Students.Count).Take(overlapTriesStudents)
|
||||
//from ts in timeSlots
|
||||
from tsi in Enumerable.Range(0, timeSlots.Length)
|
||||
let ts = timeSlots[tsi]
|
||||
let tss = ts.SelectMany(t => t.Students)
|
||||
select Tuple.Create(ts, tsi, team, team.Students.Count(tss.Contains)))
|
||||
.OrderBy(t => t.Item4)
|
||||
.ThenBy(t => t.Item1.Count);
|
||||
//private static Team[][] Recursive(Team[][] timeSlots, Team[] teams, int overlapTriesStudents = 4)
|
||||
//{
|
||||
// if (!teams.Any())
|
||||
// return timeSlots;
|
||||
|
||||
var minOverlaps =
|
||||
(from o in overlapsTries
|
||||
group o by o.Item4
|
||||
into oo
|
||||
orderby oo.Key
|
||||
select oo).First();
|
||||
// var overlapsTries =
|
||||
// (from team in teams.OrderByDescending(t => t.Students.Count).Take(overlapTriesStudents)
|
||||
// //from ts in timeSlots
|
||||
// from tsi in Enumerable.Range(0, timeSlots.Length)
|
||||
// let ts = timeSlots[tsi]
|
||||
// let tss = ts.SelectMany(t => t.Students)
|
||||
// select Tuple.Create(ts, tsi, team, team.Students.Count(tss.Contains)))
|
||||
// .OrderBy(t => t.Item4)
|
||||
// .ThenBy(t => t.Item1.Length);
|
||||
|
||||
var first = minOverlaps.First();
|
||||
// var minOverlaps =
|
||||
// (from o in overlapsTries
|
||||
// group o by o.Item4
|
||||
// into oo
|
||||
// orderby oo.Key
|
||||
// select oo).First();
|
||||
|
||||
var results = new List<Tuple<IList<Team>[], int>>();
|
||||
// var first = minOverlaps.First();
|
||||
|
||||
foreach (var minOverlap in minOverlaps)
|
||||
{
|
||||
var timeSlotsAfterAdd = CopyTimeSlots(timeSlots);
|
||||
timeSlotsAfterAdd[first.Item2].Add(first.Item3);
|
||||
var remainingTeams = teams.Where(t => t != first.Item3).ToList();
|
||||
// var results = new List<Tuple<List<Team>[]>, int>>();
|
||||
|
||||
var result = Recursive(timeSlotsAfterAdd, remainingTeams);
|
||||
// foreach (var minOverlap in minOverlaps)
|
||||
// {
|
||||
// var timeSlotsAfterAdd = CopyTimeSlots(timeSlots);
|
||||
// timeSlotsAfterAdd[first.Item2].Add(first.Item3);
|
||||
// var remainingTeams = teams.Where(t => t != first.Item3).ToArray();
|
||||
|
||||
results.Add(Tuple.Create(result, Team.GetStudentTeamOverlapCount(result)));
|
||||
if (minOverlap.Item4 == 0)
|
||||
break;
|
||||
}
|
||||
// var result = Recursive(timeSlotsAfterAdd.Select(e => e.ToArray()).ToArray(), remainingTeams);
|
||||
|
||||
return results.OrderByDescending(r => r.Item2).First().Item1;
|
||||
}
|
||||
// results.Add(Tuple.Create(result, TeamSchedulerSolution.GetStudentTeamOverlapCount(result)));
|
||||
// if (minOverlap.Item4 == 0)
|
||||
// break;
|
||||
// }
|
||||
|
||||
// return results.OrderByDescending(r => r.Item2).First().Item1;
|
||||
//}
|
||||
}
|
||||
Reference in New Issue
Block a user