Равномерное распределение совпадений по локациямC#

Место общения программистов C#
Ответить
Anonymous
 Равномерное распределение совпадений по локациям

Сообщение Anonymous »

В качестве входных данных у меня есть расписание лиг в формате CSV:

Код: Выделить всё

 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
Расписание состоит из 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.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -locations
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»