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;
}
Antwort
Ist das nicht Ihre Funktion entspricht dies:
score = timeTable.Exams.SelectMany(exam=>exam.Students)
.GroupBy(s=>s)
.Select(g=>Connections(g.Count()))
.Sum();
mit Helferfunktion
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;
}
Dies sollte in timeTable.Exams.Sum(exam=>exam.Student.Count())
lineare Laufzeit sein, während Ihr quadratische sieht mich.
Ok Zeitplan ist eine Liste von Prüfungsobjekten mit jeder Prüfung, die eine Liste von Studenten enthält. Ich möchte die Anzahl der Prüfungen zählen, die Studenten mit der gleichen ID enthalten. Dies würde mir effektiv eine Anzahl von Konflikten geben. Wie auch immer, mein aktueller Code bewegt sich sehr langsam, wenn ich versuche, das Ergebnis dem Stundenplan zuzuordnen. Fitness –
@user: Gibt dein Code andere Ergebnisse als meins? Ich berechne, in wie vielen Prüfungen jeder Student ist, und benutze dann die "Connections" -Funktion, um schnell die Kollisionszahl für jeden Schüler zu berechnen, und summiere sie dann. – CodesInChaos
Ich bekomme eine mehrdeutige Referenz auf g.count –
die variable Zuweisung ist der Engpass Ihrer Anwendung? – BrokenGlass
Es ist schwierig, Verbesserungen vorzuschlagen, ohne die beteiligten Typen, die Beziehungen usw. zu kennen. Ich bin mir sicher, dass es einen besseren Ansatz gibt, aber wir können nicht wirklich viel ohne weitere Details helfen. –
Ich glaube nicht ... das ist eine App für körperliche Fitness, also sollte sie Leuten helfen, die Flaschenhals haben. – Crisfole