コード例 #1
0
        private double Dobrota(KromosomDouble kromosom)
        {
            double rez = (_nn.CalculateError(kromosom.PoljeRjesenja, _data) - _nn.CalculateError(_worstPop.PoljeRjesenja, _data))
                         / (_nn.CalculateError(_best.PoljeRjesenja, _data) - _nn.CalculateError(_worstPop.PoljeRjesenja, _data));     //TODO kazna(vk) = max{dobrota(vk)} - dobrota(vk)

            return(rez);
        }
コード例 #2
0
        private KromosomDouble HeuristicCrossover(KromosomDouble kromosom1, KromosomDouble kromosom2)
        {
            double         a       = GenerirajSelekcija(1, _rand);
            KromosomDouble dijete1 = new KromosomDouble();

            KromosomDouble bolji, losiji;

            if (kromosom1._dobrota < kromosom2._dobrota)
            {
                bolji  = kromosom2;
                losiji = kromosom1;
            }
            else
            {
                bolji  = kromosom1;
                losiji = kromosom2;
            }

            for (int i = 0; i < _dimenzionalnost; i++)
            {
                double val = a * (bolji.Rjesenje(i) - losiji.Rjesenje(i)) + bolji.Rjesenje(i);
                if (Math.Abs(val) > 20)                                          // WARNING, heuristicni zna izletit
                {
                    val = GenerirajSelekcija(1, _rand);
                }
                dijete1.PostaviRjesenje(i, val);
            }

            return(dijete1);
        }
コード例 #3
0
        private void NadjiBest(KromosomDouble[] p)
        {
            for (int k = 0; k < _velicinaPop; k++)              //nadji best
            {
                if (p[k]._dobrota > _best._dobrota)
                {
                    _best          = p[k];                      //najbolja jedinka
                    _best._dobrota = p[k]._dobrota;
                    continue;
                }
                if (p[k]._dobrota < _worstPop._dobrota)
                {
                    _worstPop          = p[k];                  //najgora jedinka
                    _worstPop._dobrota = p[k]._dobrota;
                    continue;
                }
            }


            if (t > 1 && (_oldBest != _best))
            {
                _oldBest          = _best;
                _oldBest._dobrota = _best._dobrota;


                if (_verbose)
                {
                    Console.WriteLine(">>>>>>> {0} >>> Nova najbolja jedinka:", _imeAlg);
                    Console.WriteLine("\tGeneracija: {0}", (int)t / _velicinaPop);
                    Console.WriteLine("\tIteracija: {0}", t);
                    Console.Write("\tVrijednost funkcije: {0} \n\tParametri:", _nn.CalculateError(_best.PoljeRjesenja, _data));
                    for (int i = 0; i < _dimenzionalnost; i++)
                    {
                        if (i % 12 == 0)
                        {
                            Console.Write("\n");
                        }
                        Console.Write("{0:0.00} \t", _best.Rjesenje(i));
                        if (i == _dimenzionalnost - 1)
                        {
                            Console.Write("\n");
                        }
                    }
                }

                else
                {
                    Console.Write(">>> {0}: Nova najbolja jedinka:", _imeAlg);
                    Console.Write("\tGeneracija: {0}", (int)t / _velicinaPop);
                    Console.WriteLine("\tVrijednost funkcije: {0}", _nn.CalculateError(_best.PoljeRjesenja, _data));
                }
            }
            else if (t <= 1)
            {
                _oldBest = _best;
            }
        }
コード例 #4
0
        private KromosomDouble SimulatedBinaryCrossover(KromosomDouble kromosom1, KromosomDouble kromosom2)
        {
            double         alfa    = GenerirajSelekcija(1, _rand);
            KromosomDouble dijete1 = new KromosomDouble();

            for (int i = 0; i < _dimenzionalnost; i++)
            {
                double val = alfa * kromosom1.Rjesenje(i) + (1 - alfa) * kromosom2.Rjesenje(i);
                dijete1.PostaviRjesenje(i, val);
            }

            return(dijete1);
        }
コード例 #5
0
        private KromosomDouble[] ZamijeniDijeteZaWorst(KromosomDouble[] p0, KromosomDouble dijete, KromosomDouble _worst)
        {
            for (int i = 0; i < _velicinaPop; i++)
            {
                if (p0[i] == _worst)
                {
                    p0[i] = dijete;
                    return(p0);
                }
            }

            throw new Exception("ne radi kako bi trebalo");
        }
コード例 #6
0
        private KromosomDouble Mutacija1(KromosomDouble kr)
        {
            for (int i = 0; i < _dimenzionalnost; i++)
            {
                double vjv = GenerirajSelekcija(1, _rand);
                if (vjv <= _vjvMutKomp1)
                {
                    var val = Distribucije.Normalna(0, _sigma1);
                    kr.PostaviRjesenje(i, val);
                }
            }

            return(kr);
        }
コード例 #7
0
        private KromosomDouble NadjiWorst(List <KromosomDouble> tr)
        {
            KromosomDouble worst = tr[0];

            worst._dobrota = tr[0]._dobrota;
            for (int k = 0; k < 3; k++)
            {
                if (tr[k]._dobrota < worst._dobrota)
                {
                    worst          = tr[k];
                    worst._dobrota = tr[k]._dobrota;
                }
            }

            return(worst);
        }
コード例 #8
0
        private KromosomDouble[] GenerirajPocetnu(int _velicinaPop)
        {
            KromosomDouble[] P_0 = new KromosomDouble[_velicinaPop];
            for (int i = 0; i < _velicinaPop; i++)
            {
                P_0[i] = new KromosomDouble();
            }

            for (int i = 0; i < _velicinaPop; i++)
            {
                for (int j = 0; j < _dimenzionalnost; j++)
                {
                    P_0[i].PostaviRjesenje(j, _rand.NextDouble() * (_gg - (_dg)) + (_dg));
                }
            }
            return(P_0);
        }
コード例 #9
0
 private void IspisiRjesenje(KromosomDouble _best)
 {
     Console.WriteLine("============================================================");
     Console.WriteLine("\n>>>>>>> Algoritam {0} zaustavljen:", _imeAlg);
     Console.WriteLine("\tBroj iteracija: {0}", _brojIteracija);
     Console.WriteLine("\tGeneracija: {0}", (int)t / _velicinaPop);
     Console.Write("\tVrijednost funkcije: {0} \n\tParametri:", _nn.CalculateError(_best.PoljeRjesenja, _data));
     for (int i = 0; i < _dimenzionalnost; i++)
     {
         Console.Write(" {0}  ", _best.Rjesenje(i));
         if (i == _dimenzionalnost - 1)
         {
             Console.Write("\n");
         }
     }
     Console.WriteLine("============================================================\n");
 }
コード例 #10
0
        private KromosomDouble Mutacija(KromosomDouble pt)
        {
            double vjv = GenerirajSelekcija(1, _rand);

            if (vjv <= _vjvMut)
            {
                vjv = GenerirajSelekcija(1, _rand);
                if (vjv <= _vjvOdabiraMut1)
                {
                    pt = Mutacija1(pt);
                }
                else
                {
                    pt = Mutacija2(pt);
                }
            }
            return(pt);
        }
コード例 #11
0
        private KromosomDouble SimpleArithmeticRecombination(KromosomDouble kromosom1, KromosomDouble kromosom2)
        {
            int            position = (int)GenerirajSelekcija(_dimenzionalnost, _rand);
            KromosomDouble dijete1  = new KromosomDouble();
            KromosomDouble dijete2  = new KromosomDouble();

            for (int i = 0; i < position; i++)
            {
                dijete1.PostaviRjesenje(i, kromosom1.Rjesenje(i));
            }
            for (int i = position; i < _dimenzionalnost; i++)
            {
                double val = (kromosom1.Rjesenje(i) + kromosom2.Rjesenje(i)) / 2;
                dijete1.PostaviRjesenje(i, val);
            }

            return(dijete1);
        }
コード例 #12
0
        internal void InspectOutput(KromosomDouble param, Dataset dataset)
        {
            Console.WriteLine("\nIsprobavanje mreze:");

            while (true)
            {
                Console.WriteLine("Unesite x [0, 63]:");
                var broj   = int.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);
                var output = CalculateOutput(param.PoljeRjesenja, dataset.ExampleAtIndex(broj));

                if (broj == -1)
                {
                    break;
                }

                Console.WriteLine("Izlaz mreze: {0} {1} {2}", output[0], output[1], output[2]);
                Console.WriteLine("Stvarni iznos: {0} {1} {2}", dataset.ExampleAtIndex(broj)[2], dataset.ExampleAtIndex(broj)[3], dataset.ExampleAtIndex(broj)[4]);
            }
        }
コード例 #13
0
        internal void InspectClassification(KromosomDouble param, Dataset dataset)
        {
            Console.WriteLine("\nIspitivanje mreze:");
            int N        = dataset.DatasetLength;
            int korektno = 0;
            int pogresno = 0;

            for (int broj = 0; broj < N; broj++)
            {
                var output = CalculateOutput(param.PoljeRjesenja, dataset.ExampleAtIndex(broj));

                Console.Write(">Uzorak {0} {1}:", dataset.ExampleAtIndex(broj)[0], dataset.ExampleAtIndex(broj)[1]);
                Console.Write("Izlaz: {0} {1} {2}: ", dataset.ExampleAtIndex(broj)[2], dataset.ExampleAtIndex(broj)[3], dataset.ExampleAtIndex(broj)[4]);

                for (int j = 0; j < 3; j++)
                {
                    if (output[j] > 0.5)
                    {
                        output[j] = 1;
                    }
                    else
                    {
                        output[j] = 0;
                    }
                }

                Console.Write("Izlaz mreze: {0} {1} {2}: ", output[0], output[1], output[2]);

                if (output[0] == dataset.ExampleAtIndex(broj)[2] && output[1] == dataset.ExampleAtIndex(broj)[3] && output[2] == dataset.ExampleAtIndex(broj)[4])
                {
                    korektno++;
                    Console.Write("Korektno klas.\n");
                }
                else
                {
                    pogresno++;
                    Console.Write("Pogresno klas.\n");
                }
            }
            Console.WriteLine(">> Broj korektno klasificiranih: {0}", korektno);
            Console.WriteLine(">> Broj pogresno klasificiranih: {0}", pogresno);
        }
コード例 #14
0
 private void InitialWorstBest(KromosomDouble[] p)
 {
     _best     = p[0];
     _worstPop = p[1];
     for (int k = 0; k < _velicinaPop; k++)              //nadji best
     {
         if (_nn.CalculateError(p[k].PoljeRjesenja, _data) < _nn.CalculateError(_best.PoljeRjesenja, _data))
         {
             _best = p[k];                               //najbolja jedinka
         }
         if (_nn.CalculateError(p[k].PoljeRjesenja, _data) > _nn.CalculateError(_worstPop.PoljeRjesenja, _data))
         {
             _worstPop = p[k];                               //najbolja jedinka
         }
     }
     //sad kad znamo koji je best, koji worst, svima spremi dobrote
     for (int k = 0; k < _velicinaPop; k++)
     {
         p[k]._dobrota = Dobrota(p[k]);
     }
 }
コード例 #15
0
        internal void WriteParamsToFile(KromosomDouble param, string filenameN1, string filenameN2)
        {
            int paramIndex = 0;

            using (FileStream fs = File.Open(filenameN1, FileMode.Create))
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    for (int i = 2; i < _architecture[1] + 2; i++)  //od 2 do architecture[1] + 2
                    {
                        //             w1  s1  w2 s2 w1/s1 w2/s2
                        sw.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", param.PoljeRjesenja[paramIndex].ToString(CultureInfo.InvariantCulture), param.PoljeRjesenja[paramIndex + 1].ToString(CultureInfo.InvariantCulture),
                                     param.PoljeRjesenja[paramIndex + 2].ToString(CultureInfo.InvariantCulture), param.PoljeRjesenja[paramIndex + 3].ToString(CultureInfo.InvariantCulture),
                                     (param.PoljeRjesenja[paramIndex] / param.PoljeRjesenja[paramIndex + 1]).ToString(CultureInfo.InvariantCulture),
                                     (param.PoljeRjesenja[paramIndex + 2] / param.PoljeRjesenja[paramIndex + 3]).ToString(CultureInfo.InvariantCulture));
                        paramIndex += 4;
                    }
                }

            using (FileStream fs = File.Open(filenameN2, FileMode.Create))
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    int currentLayer = 2;
                    int paramNumPerSingleNeuronT2;
                    for (int j = currentLayer; j < _numberOfLayers; j++)    //j == trenutni sloj
                    {
                        //ostali slojevi, neuroni tipa 2
                        paramNumPerSingleNeuronT2 = _architecture[j - 1] + 1;    // w-ovi + w0

                        for (int i = 0; i < _architecture[j]; i++)
                        {
                            for (int k = 0; k < paramNumPerSingleNeuronT2; k++)
                            {
                                sw.Write("{0}\t", param.PoljeRjesenja[paramIndex + k].ToString(CultureInfo.InvariantCulture));
                            }
                            sw.WriteLine();
                            paramIndex += paramNumPerSingleNeuronT2;
                        }
                    }
                }
        }
コード例 #16
0
        public KromosomDouble ZapocniAlgoritam()
        {
            t = 0;
            KromosomDouble[]      P0         = GenerirajPocetnu(_velicinaPop); //generiraj početnu populaciju potencijalnih rješenja P(0);
            List <KromosomDouble> tournament = new List <KromosomDouble>(3);
            KromosomDouble        dijete;

            InitialWorstBest(P0);
            while (UvjetIspunjen() && t < _brojIteracija)
            {
                t = t + 1;
                NadjiBest(P0);
                tournament = SelektirajIz(P0);
                _worst     = NadjiWorst(tournament);
                tournament.Remove(_worst);
                dijete = Krizanje(tournament);
                dijete = Mutacija(dijete);

                if (_nn.CalculateError(dijete.PoljeRjesenja, _data) < _nn.CalculateError(_best.PoljeRjesenja, _data))
                {
                    _best          = dijete;
                    _best._dobrota = dijete._dobrota;
                }
                else if (_nn.CalculateError(dijete.PoljeRjesenja, _data) > _nn.CalculateError(_worstPop.PoljeRjesenja, _data))
                {
                    _worstPop          = dijete;
                    _worstPop._dobrota = dijete._dobrota;
                }

                dijete._dobrota = Dobrota(dijete); //samo evaluiraj novo dijete

                P0 = ZamijeniDijeteZaWorst(P0, dijete, _worst);
            }
            NadjiBest(P0);
            IspisiRjesenje(_best);

            return(_best);
        }