Example #1
0
        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);
        }
Example #2
0
        /// <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();
        }