Разрешение узких мест в фитнес-функции, C # - PullRequest
0 голосов
/ 12 января 2011
private  void CalculateFitness(TimeTable timeTable)
{
    int score = 0, DAYS_NUM = 5;

    score = timeTable.Exams.SelectMany(exam => exam.Students)
         .GroupBy(s => s)
         .Select(g => Connections(g.Count()))
         .Sum();
    timeTable.Fitness = score;
}

int Connections(int corners)
{
    // 0+1+2+...+(corners-1)
    return corners * (corners - 1) / 2;
}

1 Ответ

1 голос
/ 12 января 2011

Разве ваша функция не эквивалентна этой:

score = timeTable.Exams.SelectMany(exam=>exam.Students)
                 .GroupBy(s=>s)
                 .Select(g=>Connections(g.Count()))
                 .Sum();

с вспомогательной функцией

int Connections(int corners)
{
  //Formula for number of sides in a complete graph
  //http://en.wikipedia.org/wiki/Complete_graph
  // 0+1+2+...+(corners-1)
  return corners*(corners-1)/2;
}

Это должно быть линейное время выполнения в timeTable.Exams.Sum(exam=>exam.Student.Count()), тогда как ваше выглядит для меня квадратичным.

...