Расписание состоит из 8 команд, каждая из которых будет встречаться с другой командой еженедельно (4 матча) в течение 16 недель.
Столбец 1: номер недели
Столбец 2: совпадение 1
Столбец 3: совпадение 2
и т. д.
Я пытаюсь равномерно распределить матчи по «X» локациям, где «X» соответствует количеству матчей в неделю.
Первоначальный алгоритм, который я придумал, заключался в том, чтобы отслеживать, сколько раз команда проводила матчи в определенной локации, чтобы присвоить локации взвешенное значение. Алгоритм выбирает местоположение с наименьшим значением веса.
schedule.GetAllScheduledRecords().ForEach(sr =>
{
var availableLocations = new List(locationKeys);
sr.GetAllLeagueMatches().ForEach(lm =>
{
var weights = new List();
availableLocations .ForEach(location =>
weights.Add(new Tuple(locationWeight[lm.GetAwayTeam()][location] + locationWeight[lm.GetHomeTeam()][location], location)));
var lowestWeight = weights.Min(x => x.Item1);
var lowestLocations = weights.Where(x => x.Item1 == lowestWeight).ToList();
var locationIndex = rng.Next(lowestLocations.Count);
var chosenLocation = lowestLocations [tableIndex].Item2;
availableLocations .Remove(chosenLocation);
locationAssignments[chosenLocation ][sr.GetLeagueWeek() - 1] = lm;
locationWeight[lm.GetAwayTeam()][chosenLocation]++;
locationWeight[lm.GetHomeTeam()][chosenLocation]++;
});
});
По большей части это работает, но иногда результат не такой ровный, каким мог бы быть.
В этом примере команда 1 играет на локации 1 пять раз, когда: в этом случае распределение должно быть таким, чтобы команды играли в каждой локации по 4 раза, и иногда это приводит к такому результату.
Как я могу изменить этот алгоритм распределения, чтобы он был максимально равномерным? Алгоритм также должен быть масштабируемым в случае, если в сеансе будет больше или меньше совпадений в неделю и/или больше или меньше недель. Например, в другом расписании 12 команд (6 матчей в неделю = 6 локаций), поэтому распределение должно быть 3, 3, 3, 3, 2, 2.
В качестве входных данных у меня есть расписание лиг в формате CSV: [code] 1,2 @ 1,7 @ 4,5 @ 6,3 @ 8 2,4 @ 2,1 @ 3,8 @ 5,6 @ 7 3,4 @ 1,5 @ 3,2 @ 6,7 @ 8 4,8 @ 2,6 @ 4,1 @ 5,3 @ 7 5,6 @ 1,2 @ 3,7 @ 5,4 @ 8 6,5 @ 2,3 @ 4,8 @ 6,1 @ 7 7,8 @ 1,6 @ 3,4 @ 5,2 @ 7 8,1 @ 2,8 @ 3,6 @ 5,4 @ 7 9,3 @ 1,2 @ 4,7 @ 6,5 @ 8 10,6 @ 2,1 @ 4,3 @ 5,8 @ 7 11,5 @ 1,7 @ 3,4 @ 6,2 @ 8 12,3 @ 2,8 @ 4,1 @ 6,5 @ 7 13,7 @ 1,4 @ 3,2 @ 5,6 @ 8 14,7 @ 2,5 @ 4,3 @ 6,1 @ 8 15,2 @ 1,7 @ 4,5 @ 6,3 @ 8 16,4 @ 2,1 @ 3,8 @ 5,6 @ 7 [/code] Расписание состоит из 8 команд, каждая из которых будет встречаться с другой командой еженедельно (4 матча) в течение 16 недель. [list] [*]Столбец 1: номер недели [*]Столбец 2: совпадение 1 [*]Столбец 3: совпадение 2 и т. д. [/list] Я пытаюсь равномерно распределить матчи по «X» локациям, где «X» соответствует количеству матчей в неделю. Первоначальный алгоритм, который я придумал, заключался в том, чтобы отслеживать, сколько раз команда проводила матчи в определенной локации, чтобы присвоить локации взвешенное значение. Алгоритм выбирает местоположение с наименьшим значением веса. [code] schedule.GetAllScheduledRecords().ForEach(sr => { var availableLocations = new List(locationKeys); sr.GetAllLeagueMatches().ForEach(lm => { var weights = new List(); availableLocations .ForEach(location => weights.Add(new Tuple(locationWeight[lm.GetAwayTeam()][location] + locationWeight[lm.GetHomeTeam()][location], location)));
var lowestWeight = weights.Min(x => x.Item1); var lowestLocations = weights.Where(x => x.Item1 == lowestWeight).ToList(); var locationIndex = rng.Next(lowestLocations.Count); var chosenLocation = lowestLocations [tableIndex].Item2; availableLocations .Remove(chosenLocation);
locationAssignments[chosenLocation ][sr.GetLeagueWeek() - 1] = lm; locationWeight[lm.GetAwayTeam()][chosenLocation]++; locationWeight[lm.GetHomeTeam()][chosenLocation]++; }); }); [/code] По большей части это работает, но иногда результат не такой ровный, каким мог бы быть. В этом примере команда 1 играет на локации 1 пять раз, когда: в этом случае распределение должно быть таким, чтобы команды играли в каждой локации по 4 раза, и иногда это приводит к такому результату. [img]https://i.sstatic.net/BHYOniOz.png[/img]
Как я могу изменить этот алгоритм распределения, чтобы он был максимально равномерным? Алгоритм также должен быть масштабируемым в случае, если в сеансе будет больше или меньше совпадений в неделю и/или больше или меньше недель. Например, в другом расписании 12 команд (6 матчей в неделю = 6 локаций), поэтому распределение должно быть 3, 3, 3, 3, 2, 2.