public void CalculateFitness() { //1) w danym ośrodku egzaminacyjnym nie mogą nakładac sie egzaminy waga 3 //2) egzaminatorzy nie mogą być w tym samym czasie w różnych ośrodkach waga 5 //3) egzaminator nie moze byc przydzielony do ośrodka w którym pracuje waga 1 //4) egzaminator musi być z uprawnieniem do danego egzaminu(kwalifikacji) waga 7 //5) Osrodek nie egzaminuje w weekend // Wynik chromosomu int score = 0; int numberOfCenter = NUM_EXAMS; int daySize = NUM_DAYS * numberOfCenter; string kryteriumEgzaminu; //kryterium dla poszczegolnego egzaminu w skali 0-5 int ci = 0; IDictionaryEnumerator it = mapExam.GetEnumerator(); // sprawdzić i obliczyć wyniki charakterystyczne dla każdej klasy w harmonogramie while (it.MoveNext()) { // współrzędne szczeliny czasoprzestrzeni int p = (int)it.Value; //numer slotu jako Value mapExam <Key,Value> int day = p / daySize; int time = p % daySize; int room = time / NUM_DAYS; time = time % NUM_DAYS; kryteriumEgzaminu = string.Empty; Egzaminy egzamin = ((Egzaminy)it.Key); int dur = egzamin.CzasTrwania; //// sprawdzamy kryterium 1 bool ro = false; for (int i = dur - 1; i >= 0; i--) { if (slots[p + i].Count(x => x.OsrodekKod == egzamin.OsrodekKod) > 1) { ro = true; break; } } // nakładanie się ośrodków if (!ro) { score++; kryteriumEgzaminu = "3"; } //wstawiamy wartość kryterium 1 do tablicy z kryteriami criteria[ci + 0] = !ro; //nakładanie sie egzaminatorów w tym samym dniu w innym oe bool eg = false; for (int i = dur - 1; i >= 0; i--) { for (int j = 0; j < egzamin.LiczbaEgzaminatorow; j++) { //wykluczamy nasz OE List <Egzaminy> item_egzamin = slots[p + i].Where(x => x.OsrodekKod != egzamin.OsrodekKod).ToList(); for (int k = 0; k < item_egzamin.Count; k++) { List <Egzaminatorzy> item_egzaminatorzy = item_egzamin.ElementAt(k).EgzaminatorzyList.ToList(); for (int d = 0; d < item_egzaminatorzy.Count; d++) { if (item_egzaminatorzy.ElementAt(d).EgzaminatorCKE == egzamin.EgzaminatorzyList.ElementAt(j).EgzaminatorCKE) { eg = true; } } if (eg) { break; } } if (eg) { break; } } if (eg) { break; } } if (!eg) { score++; kryteriumEgzaminu = kryteriumEgzaminu + "5"; } criteria[ci + 1] = !eg; // Egzaminator nie pracuje w tym osrodku bool po = false; for (int i = 0; i < egzamin.LiczbaEgzaminatorow; i++) { if (egzamin.EgzaminatorzyList.ElementAt(i).EgzaminatorOsrodek == egzamin.OsrodekKod) { po = true; break; } } if (!po) { score++; kryteriumEgzaminu = kryteriumEgzaminu + "1"; } criteria[ci + 2] = !po; //egzaminator ma uprawnienie w tej kwalifikacji bool go = false; for (int i = 0; i < egzamin.LiczbaEgzaminatorow; i++) { if (egzamin.EgzaminatorzyList.ElementAt(i).KwalifikacjeList.Count(x => x.KwalifikacjaKod == egzamin.KwalifikacjaKod) == 0) { go = true; break; } } if (!go) { score++; kryteriumEgzaminu = kryteriumEgzaminu + "7"; } criteria[ci + 3] = !go; egzamin.Kryterium = kryteriumEgzaminu; } //NUM_CRITERIA = NUM_EXAMS * 4; fitness = (float)score / (NUM_EXAMS * NUM_CRITERIA); }
/// <summary> /// Wykonuje mutacji na chromosomie /// </summary> public void Mutation() { // sprawdzenie prawdopodobieństwa mutacji // decision was not random mutation operation if (RandomNbr.GetRandomNbr() % 100 > mutationProbability) { return; } // number of classes int numberOfClasses = mapExam.Count; // number of time-space slots int size = slots.Capacity; // przenieść wybraną liczbę klas w dowolnej pozycji // mutationSize zróżnicowanie odnosi się do liczby punktów, aby ilość lekcji zmienności for (int i = mutationSize; i > 0; i--) { // wybierz losowo chromosom dla przemieszczenia int mpos = RandomNbr.GetRandomNbr() % numberOfClasses; int pos1 = 0; IDictionaryEnumerator it = mapExam.GetEnumerator(); // Według mpos weź i it // W celu uzyskania wymaganych kursów i punktów zmiany pozycji w przestrzeni czasowej if (it.MoveNext()) { for (; mpos > 0; it.MoveNext(), mpos--) { ; } } // Aktualna przestrzeń czasowa używana przez klase pos1 = (int)it.Value; // Get the information you need variation points Exams Egzaminy cc1 = it.Key as Egzaminy; // określa pozycję klasy losowo int nr = NUM_EXAMS; int dur = cc1.CzasTrwania; int day = RandomNbr.GetRandomNbr() % NUM_DAYS; int center = RandomNbr.GetRandomNbr() % nr; int time = RandomNbr.GetRandomNbr() % (NUM_DAYS + 1 - dur); int pos2 = (day * nr * NUM_DAYS + center * NUM_DAYS + time) % NUM_DAYS; //day-time; // przenieść wszystkie przestrzenie czasowe for (int j = dur - 1; j >= 0; j--) { // usuń class hour z bieżącej przestrzeni czasowj foreach (Egzaminy it2 in slots[pos1 + j]) { if (it2 == cc1) //(it2.QualificationId == cc1.QualificationId) { slots[pos1 + j].Remove(it2); break; } } // przedz do class hour nowej przestrzeni czasowj slots[pos2 + j].Add(cc1); } // change entry of class table to point to new time-space slots mapExam[cc1] = pos2; } // Mutated chromosome fitness value is calculated this.CalculateFitness(); }