//vraca polje boolova velicine varijable.Count
 public static bool[] genetskiAlgoritam(int velicinaPopulacije, int brojGeneracija, double vjrojatnostKrizanja, double vjerojatnostMutacije, bool rouletteWheel, bool uniformno, List<int> varijable, List<Zagrada> Formula, Dictionary<int, List<Zagrada>> veze_var_zagrada)
 {
     Random rand = new Random();
     Populacija trenutna = new Populacija(velicinaPopulacije, varijable.Count, varijable, veze_var_zagrada, rand);
     List<Zagrada> mojDioFormule = mojeZagrade(varijable, veze_var_zagrada);
     trenutna.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
     if (trenutna.populacija[0].dobrota == 1) return trenutna.populacija[0].bitovi;
     double[] vjerojatnosti = new double[varijable.Count];
     for (int i = 1; i <= brojGeneracija; i++)
     {
         azurirajVjerojatnosti(vjerojatnosti, varijable, veze_var_zagrada);
         Populacija novaGeneracija = new Populacija(velicinaPopulacije);
         trenutna.KopirajElitu(novaGeneracija, 2, vjerojatnosti, varijable, veze_var_zagrada, rand);
         for (int j = 2; j < velicinaPopulacije; j += 2)
         {
             Jedinka prviRoditelj = trenutna.OdaberiRoditelja(true, rand);
             Jedinka drugiRoditelj = trenutna.OdaberiRoditelja(true, rand);
             Jedinka prvoDijete = new Jedinka(varijable.Count);
             Jedinka drugoDijete = new Jedinka(varijable.Count);
             trenutna.Krizanje(vjrojatnostKrizanja, prviRoditelj, drugiRoditelj, prvoDijete, drugoDijete, false, veze_var_zagrada, varijable, rand);
             prvoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
             drugoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
             novaGeneracija.populacija[j] = prvoDijete;
             novaGeneracija.populacija[j + 1] = drugoDijete;
         }
         novaGeneracija.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
         trenutna = novaGeneracija;
         Console.WriteLine("{0}\n", trenutna.VratiNajboljuDobrotu());
         if (trenutna.populacija[0].dobrota == 1) return trenutna.populacija[0].bitovi;
     }
     bool[] ret = null;
     return ret;
 }
Exemple #2
0
 public void Krizanje(double vjerojatnostKrizanja, Jedinka prviRoditelj, Jedinka drugiRoditelj, Jedinka prvoDijete, Jedinka drugoDijete, bool krizanjeJednomTockom, Dictionary<int,List<Zagrada>> veze_var_zagrada, List<int> varijable, Random rand)
 {
     int ukupanBrojBitova = prviRoditelj.bitovi.Length;
     if (krizanjeJednomTockom)
     {
         if (rand.NextDouble() <= vjerojatnostKrizanja)
         {
             int tockaPrijeloma = rand.Next(ukupanBrojBitova + 1);
             for (int i = 0; i < tockaPrijeloma; i++)
             {
                 prvoDijete.bitovi[i] = prviRoditelj.bitovi[i];
                 drugoDijete.bitovi[i] = drugiRoditelj.bitovi[i];
             }
             for (int i = tockaPrijeloma; i < ukupanBrojBitova; i++)
             {
                 prvoDijete.bitovi[i] = drugiRoditelj.bitovi[i];
                 drugoDijete.bitovi[i] = prviRoditelj.bitovi[i];
             }
         }
         else
         {
             for (int i = 0; i < ukupanBrojBitova; i++)
             {
                 prvoDijete.bitovi[i] = prviRoditelj.bitovi[i];
                 drugoDijete.bitovi[i] = drugiRoditelj.bitovi[i];
             }
         }
     }
     else
     {
         bool[] r = new bool[ukupanBrojBitova];
         bool[] rKomp = new bool[ukupanBrojBitova];
         for (int i = 0; i < ukupanBrojBitova; i++)
         {
             if (rand.Next(2) == 1)
             {
                 r[i] = true;
                 rKomp[i] = false;
             }
             else
             {
                 r[i] = false;
                 rKomp[i] = true;
             }
         }
         bool prviAndDrugiRoditelj;
         bool prviXorDrugiRoditelj;
         for (int i = 0; i < ukupanBrojBitova; i++)
         {
             prviAndDrugiRoditelj = (bool)(prviRoditelj.bitovi[i] & drugiRoditelj.bitovi[i]);
             prviXorDrugiRoditelj = (bool)(prviRoditelj.bitovi[i] ^ drugiRoditelj.bitovi[i]);
             if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(varijable[i]) && veze_var_zagrada[varijable[i]].Count == 0)) prvoDijete.bitovi[i] = false;
             else if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(-varijable[i]) && veze_var_zagrada[-varijable[i]].Count == 0)) prvoDijete.bitovi[i] = true;
             else prvoDijete.bitovi[i] = (bool)(prviAndDrugiRoditelj | (bool)(r[i] & prviXorDrugiRoditelj));
             if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(varijable[i]) && veze_var_zagrada[varijable[i]].Count == 0)) drugoDijete.bitovi[i] = false;
             else if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(-varijable[i]) && veze_var_zagrada[-varijable[i]].Count == 0)) drugoDijete.bitovi[i] = true;
             else drugoDijete.bitovi[i] = (bool)(prviAndDrugiRoditelj | (bool)(rKomp[i] & prviXorDrugiRoditelj));
         }
     }
 }
Exemple #3
0
 public void KopirajElitu(Populacija novaGeneracija, int velicinaElite, double[] vjerojatnosti, List<int> varijable, Dictionary<int, List<Zagrada>> veze_var_zagrada, Random rand)
 {
     for (int i = 0; i < velicinaElite; i += 2)
     {
         novaGeneracija.populacija[i] = this.populacija[i];
         Jedinka pomocna = new Jedinka(varijable.Count);
         for (int j = 0; j < populacija[i].bitovi.Length; j++)
         {
             pomocna.bitovi[j] = populacija[i].bitovi[j];
         }
         pomocna.UsmjerenaMutacija(vjerojatnosti, varijable, veze_var_zagrada, rand);
         novaGeneracija.populacija[i + 1] = pomocna;
     }
 }
Exemple #4
0
        public int CompareTo(object obj)
        {
            Jedinka druga = (Jedinka)obj;

            if (this.dobrota < druga.dobrota)
            {
                return(1);
            }
            if (this.dobrota > druga.dobrota)
            {
                return(-1);
            }
            return(0);
        }
Exemple #5
0
 public void KopirajElitu(Populacija novaGeneracija, int velicinaElite, double[] vjerojatnosti, List <int> varijable, Dictionary <int, List <Zagrada> > veze_var_zagrada, Random rand)
 {
     for (int i = 0; i < velicinaElite; i += 2)
     {
         novaGeneracija.populacija[i] = this.populacija[i];
         Jedinka pomocna = new Jedinka(varijable.Count);
         for (int j = 0; j < populacija[i].bitovi.Length; j++)
         {
             pomocna.bitovi[j] = populacija[i].bitovi[j];
         }
         pomocna.UsmjerenaMutacija(vjerojatnosti, varijable, veze_var_zagrada, rand);
         novaGeneracija.populacija[i + 1] = pomocna;
     }
 }
Exemple #6
0
        //vraca polje boolova velicine varijable.Count
        public static bool[] genetskiAlgoritam(int velicinaPopulacije, int brojGeneracija, double vjrojatnostKrizanja, double vjerojatnostMutacije, bool rouletteWheel, bool uniformno, List <int> varijable, List <Zagrada> Formula, Dictionary <int, List <Zagrada> > veze_var_zagrada)
        {
            Random         rand          = new Random();
            Populacija     trenutna      = new Populacija(velicinaPopulacije, varijable.Count, varijable, veze_var_zagrada, rand);
            List <Zagrada> mojDioFormule = mojeZagrade(varijable, veze_var_zagrada);

            trenutna.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
            if (trenutna.populacija[0].dobrota == 1)
            {
                return(trenutna.populacija[0].bitovi);
            }
            double[] vjerojatnosti = new double[varijable.Count];
            for (int i = 1; i <= brojGeneracija; i++)
            {
                azurirajVjerojatnosti(vjerojatnosti, varijable, veze_var_zagrada);
                Populacija novaGeneracija = new Populacija(velicinaPopulacije);
                trenutna.KopirajElitu(novaGeneracija, 2, vjerojatnosti, varijable, veze_var_zagrada, rand);
                for (int j = 2; j < velicinaPopulacije; j += 2)
                {
                    Jedinka prviRoditelj  = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka drugiRoditelj = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka prvoDijete    = new Jedinka(varijable.Count);
                    Jedinka drugoDijete   = new Jedinka(varijable.Count);
                    trenutna.Krizanje(vjrojatnostKrizanja, prviRoditelj, drugiRoditelj, prvoDijete, drugoDijete, false, veze_var_zagrada, varijable, rand);
                    prvoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    drugoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    novaGeneracija.populacija[j]     = prvoDijete;
                    novaGeneracija.populacija[j + 1] = drugoDijete;
                }
                novaGeneracija.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
                trenutna = novaGeneracija;
                Console.WriteLine("{0}\n", trenutna.VratiNajboljuDobrotu());
                if (trenutna.populacija[0].dobrota == 1)
                {
                    return(trenutna.populacija[0].bitovi);
                }
            }
            bool[] ret = null;
            return(ret);
        }
Exemple #7
0
 public Jedinka OdaberiRoditelja(bool rouletteWheel, Random rand)
 {
     Jedinka[] kandidatiZaRoditelja = new Jedinka[3];
     for (int i = 0; i < 3; i++)
     {
         double random      = rand.NextDouble();
         double sumaDobrote = 0;
         for (int j = 0; j < populacija.Length; j++)
         {
             sumaDobrote += populacija[j].dobrota / this.dobrotaPopulacije;
             if (random <= sumaDobrote)
             {
                 if (rouletteWheel)
                 {
                     return(populacija[j]);
                 }
                 kandidatiZaRoditelja[i] = populacija[j];
                 break;
             }
         }
     }
     Array.Sort(kandidatiZaRoditelja);
     return(kandidatiZaRoditelja[0]);
 }
Exemple #8
0
 public Jedinka OdaberiRoditelja(bool rouletteWheel, Random rand)
 {
     Jedinka[] kandidatiZaRoditelja = new Jedinka[3];
     for (int i = 0; i < 3; i++)
     {
         double random = rand.NextDouble();
         double sumaDobrote = 0;
         for (int j = 0; j < populacija.Length; j++)
         {
             sumaDobrote += populacija[j].dobrota / this.dobrotaPopulacije;
             if (random <= sumaDobrote)
             {
                 if (rouletteWheel) return populacija[j];
                 kandidatiZaRoditelja[i] = populacija[j];
                 break;
             }
         }
     }
     Array.Sort(kandidatiZaRoditelja);
     return kandidatiZaRoditelja[0];
 }
Exemple #9
0
        public void Krizanje(double vjerojatnostKrizanja, Jedinka prviRoditelj, Jedinka drugiRoditelj, Jedinka prvoDijete, Jedinka drugoDijete, bool krizanjeJednomTockom, Dictionary <int, List <Zagrada> > veze_var_zagrada, List <int> varijable, Random rand)
        {
            int ukupanBrojBitova = prviRoditelj.bitovi.Length;

            if (krizanjeJednomTockom)
            {
                if (rand.NextDouble() <= vjerojatnostKrizanja)
                {
                    int tockaPrijeloma = rand.Next(ukupanBrojBitova + 1);
                    for (int i = 0; i < tockaPrijeloma; i++)
                    {
                        prvoDijete.bitovi[i]  = prviRoditelj.bitovi[i];
                        drugoDijete.bitovi[i] = drugiRoditelj.bitovi[i];
                    }
                    for (int i = tockaPrijeloma; i < ukupanBrojBitova; i++)
                    {
                        prvoDijete.bitovi[i]  = drugiRoditelj.bitovi[i];
                        drugoDijete.bitovi[i] = prviRoditelj.bitovi[i];
                    }
                }
                else
                {
                    for (int i = 0; i < ukupanBrojBitova; i++)
                    {
                        prvoDijete.bitovi[i]  = prviRoditelj.bitovi[i];
                        drugoDijete.bitovi[i] = drugiRoditelj.bitovi[i];
                    }
                }
            }
            else
            {
                bool[] r     = new bool[ukupanBrojBitova];
                bool[] rKomp = new bool[ukupanBrojBitova];
                for (int i = 0; i < ukupanBrojBitova; i++)
                {
                    if (rand.Next(2) == 1)
                    {
                        r[i]     = true;
                        rKomp[i] = false;
                    }
                    else
                    {
                        r[i]     = false;
                        rKomp[i] = true;
                    }
                }
                bool prviAndDrugiRoditelj;
                bool prviXorDrugiRoditelj;
                for (int i = 0; i < ukupanBrojBitova; i++)
                {
                    prviAndDrugiRoditelj = (bool)(prviRoditelj.bitovi[i] & drugiRoditelj.bitovi[i]);
                    prviXorDrugiRoditelj = (bool)(prviRoditelj.bitovi[i] ^ drugiRoditelj.bitovi[i]);
                    if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(varijable[i]) && veze_var_zagrada[varijable[i]].Count == 0))
                    {
                        prvoDijete.bitovi[i] = false;
                    }
                    else if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(-varijable[i]) && veze_var_zagrada[-varijable[i]].Count == 0))
                    {
                        prvoDijete.bitovi[i] = true;
                    }
                    else
                    {
                        prvoDijete.bitovi[i] = (bool)(prviAndDrugiRoditelj | (bool)(r[i] & prviXorDrugiRoditelj));
                    }
                    if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(varijable[i]) && veze_var_zagrada[varijable[i]].Count == 0))
                    {
                        drugoDijete.bitovi[i] = false;
                    }
                    else if (!veze_var_zagrada.ContainsKey(varijable[i]) || (veze_var_zagrada.ContainsKey(-varijable[i]) && veze_var_zagrada[-varijable[i]].Count == 0))
                    {
                        drugoDijete.bitovi[i] = true;
                    }
                    else
                    {
                        drugoDijete.bitovi[i] = (bool)(prviAndDrugiRoditelj | (bool)(rKomp[i] & prviXorDrugiRoditelj));
                    }
                }
            }
        }
Exemple #10
0
        public static bool[] genetskiAlgoritamSekvencijalni(int velicinaPopulacije, int brojGeneracija, double vjrojatnostKrizanja, double vjerojatnostMutacije, bool rouletteWheel, bool uniformno, List<int> varijable, List<Zagrada> Formula, Dictionary<int, List<Zagrada>> veze_var_zagrada)
        {
            double epsilon = 0.000002;
            int counter = 0;
            double bestOne, bestTwo;
            Random rand = new Random();
            Populacija trenutna = new Populacija(velicinaPopulacije, varijable.Count, varijable, veze_var_zagrada, rand);
            List<Zagrada> mojDioFormule = mojeZagrade(varijable, veze_var_zagrada);
            trenutna.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
            if (trenutna.populacija[0].dobrota == 1) return trenutna.populacija[0].bitovi;
            double[] vjerojatnosti = new double[varijable.Count];
            for (int i = 1; i <= brojGeneracija; i++)
            {
                azurirajVjerojatnosti(vjerojatnosti, varijable, veze_var_zagrada);
                Populacija novaGeneracija = new Populacija(velicinaPopulacije);
                trenutna.KopirajElitu(novaGeneracija, 2, vjerojatnosti, varijable, veze_var_zagrada, rand);
                bestOne = trenutna.VratiNajboljuDobrotu();
                for (int j = 2; j < velicinaPopulacije; j += 2)
                {
                    Jedinka prviRoditelj = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka drugiRoditelj = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka prvoDijete = new Jedinka(varijable.Count);
                    Jedinka drugoDijete = new Jedinka(varijable.Count);
                    trenutna.Krizanje(vjrojatnostKrizanja, prviRoditelj, drugiRoditelj, prvoDijete, drugoDijete, false, veze_var_zagrada, varijable, rand);
                    prvoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    drugoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    novaGeneracija.populacija[j] = prvoDijete;
                    novaGeneracija.populacija[j + 1] = drugoDijete;
                }
                novaGeneracija.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
                trenutna = novaGeneracija;
                bestTwo = trenutna.VratiNajboljuDobrotu();
                Console.WriteLine("{0}\n", bestTwo - bestOne);
                if (trenutna.populacija[0].dobrota == 1) return trenutna.populacija[0].bitovi;

                if (Math.Abs(bestOne - bestTwo) < epsilon*0.0001)
                    counter++;
                else
                    counter = 0;

                if (counter > (int)(0.001 * brojGeneracija))
                {
                    Console.WriteLine("Vec 15% generacija dobrota se krece u intervalu ispod zadanog epsilona");
                    Console.WriteLine("Zelite li mozda korigirati neke parametre prije nastavka?");
                    Console.WriteLine("U slucaju da ne zelite mjenjati postojece stanje upiste NO inace YES");
                    if (Console.ReadLine() == "YES")
                    {
                        Console.Write(" Unesite novu vjerojatnost za krizanje : ");
                        vjrojatnostKrizanja = double.Parse(Console.ReadLine());
                        Console.Write("\n Unesite novu vjerojatnost ua mutaciju : ");
                        vjerojatnostMutacije = double.Parse(Console.ReadLine());
                        counter = 0;
                    }
                }
            }
            bool[] ret = null;
            return ret;
        }
Exemple #11
0
        public static bool[] genetskiAlgoritamParalelno(Intracommunicator comm, int MyRank,int brojEmigranata, int velicinaPopulacije, int brojGeneracija, double vjrojatnostKrizanja, double vjerojatnostMutacije, bool rouletteWheel, bool uniformno, List<int> varijable, List<Zagrada> Formula, Dictionary<int, List<Zagrada>> veze_var_zagrada)
        {
            Random rand = new Random();
            double postotak = 0.1;
            int count = 0;
            int PaziOdKudaIdeNova;
            Populacija trenutna = new Populacija(velicinaPopulacije, varijable.Count, varijable, veze_var_zagrada, rand);
            List<Zagrada> mojDioFormule = mojeZagrade(varijable, veze_var_zagrada);
            trenutna.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
            if (trenutna.populacija[0].dobrota == 1) return trenutna.populacija[0].bitovi;
            double[] vjerojatnosti = new double[varijable.Count];
            for (int i = 1; i <= brojGeneracija; i++)
            {
                PaziOdKudaIdeNova = brojEmigranata;
                azurirajVjerojatnosti(vjerojatnosti, varijable, veze_var_zagrada);
                Populacija novaGeneracija = new Populacija(velicinaPopulacije);
                trenutna.KopirajElitu(novaGeneracija, brojEmigranata, vjerojatnosti, varijable, veze_var_zagrada, rand);
                if (count > (int)brojGeneracija * postotak)
                {
                    Console.WriteLine(MyRank);
                    count = 0;
                    postotak += 0.1;
                    PaziOdKudaIdeNova = 2 * brojEmigranata;
                    for (int k = brojEmigranata, l = 0; k < 2 * brojEmigranata ; k++, l++)
                    {
                        if (MyRank == 0)
                        {
                            comm.Send(novaGeneracija.populacija[l].bitovi, 1, 0);
                            comm.Send(novaGeneracija.populacija[l].brojVarijabli, 1, 0);
                            comm.Send(novaGeneracija.populacija[l].brojZadovoljenihZagrada, 1, 0);
                            comm.Send(novaGeneracija.populacija[l].dobrota, 1, 0);

                            bool[] b = new bool[varijable.Count];
                            double fit;
                            int brZagovoljenih, brVar;
                            comm.Receive(comm.Size - 1, 0, ref b);
                            brVar = comm.Receive<int>(comm.Size - 1, 0);
                            brZagovoljenih = comm.Receive<int>(comm.Size - 1, 0);
                            fit = comm.Receive<double>(comm.Size - 1, 0);
                            novaGeneracija.populacija[k] = new Jedinka(b, fit, brZagovoljenih, brVar);
                        }
                        else
                        {
                            bool[] b = new bool[varijable.Count];
                            double fit;
                            int brZagovoljenih, brVar;
                            comm.Receive(MyRank - 1, 0, ref b);
                            brVar = comm.Receive<int>(MyRank - 1, 0);
                            brZagovoljenih = comm.Receive<int>(MyRank - 1, 0);
                            fit = comm.Receive<double>(MyRank - 1, 0);
                            novaGeneracija.populacija[k] = new Jedinka(b, fit, brZagovoljenih, brVar);

                            comm.Send(novaGeneracija.populacija[l].bitovi, (MyRank + 1) % comm.Size, 0);
                            comm.Send(novaGeneracija.populacija[l].brojVarijabli, (MyRank + 1) % comm.Size, 0);
                            comm.Send(novaGeneracija.populacija[l].brojZadovoljenihZagrada, (MyRank + 1) % comm.Size, 0);
                            comm.Send(novaGeneracija.populacija[l].dobrota, (MyRank + 1) % comm.Size, 0);
                        }
                    }
                    if (MyRank == 1) Console.WriteLine("Sad sam razmijenio podatke");
                }
                count++;
                for (int j = PaziOdKudaIdeNova ; j < velicinaPopulacije; j += 2)
                {
                    Jedinka prviRoditelj = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka drugiRoditelj = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka prvoDijete = new Jedinka(varijable.Count);
                    Jedinka drugoDijete = new Jedinka(varijable.Count);
                    trenutna.Krizanje(vjrojatnostKrizanja, prviRoditelj, drugiRoditelj, prvoDijete, drugoDijete, false, veze_var_zagrada, varijable, rand);
                    prvoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    drugoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    novaGeneracija.populacija[j] = prvoDijete;
                    novaGeneracija.populacija[j + 1] = drugoDijete;
                }
                novaGeneracija.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
                trenutna = novaGeneracija;
                if (MyRank == 1) Console.WriteLine(trenutna.VratiNajboljuDobrotu());
                if (trenutna.populacija[0].dobrota == 1) return trenutna.populacija[0].bitovi;
            }
            bool[] ret = null;
            return ret;
        }
Exemple #12
0
        public static bool[] genetskiAlgoritamParalelno(Intracommunicator comm, int MyRank, int brojEmigranata, int velicinaPopulacije, int brojGeneracija, double vjrojatnostKrizanja, double vjerojatnostMutacije, bool rouletteWheel, bool uniformno, List <int> varijable, List <Zagrada> Formula, Dictionary <int, List <Zagrada> > veze_var_zagrada)
        {
            Random         rand     = new Random();
            double         postotak = 0.1;
            int            count    = 0;
            int            PaziOdKudaIdeNova;
            Populacija     trenutna      = new Populacija(velicinaPopulacije, varijable.Count, varijable, veze_var_zagrada, rand);
            List <Zagrada> mojDioFormule = mojeZagrade(varijable, veze_var_zagrada);

            trenutna.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
            if (trenutna.populacija[0].dobrota == 1)
            {
                return(trenutna.populacija[0].bitovi);
            }
            double[] vjerojatnosti = new double[varijable.Count];
            for (int i = 1; i <= brojGeneracija; i++)
            {
                PaziOdKudaIdeNova = brojEmigranata;
                azurirajVjerojatnosti(vjerojatnosti, varijable, veze_var_zagrada);
                Populacija novaGeneracija = new Populacija(velicinaPopulacije);
                trenutna.KopirajElitu(novaGeneracija, brojEmigranata, vjerojatnosti, varijable, veze_var_zagrada, rand);
                if (count > (int)brojGeneracija * postotak)
                {
                    Console.WriteLine(MyRank);
                    count             = 0;
                    postotak         += 0.1;
                    PaziOdKudaIdeNova = 2 * brojEmigranata;
                    for (int k = brojEmigranata, l = 0; k < 2 * brojEmigranata; k++, l++)
                    {
                        if (MyRank == 0)
                        {
                            comm.Send(novaGeneracija.populacija[l].bitovi, 1, 0);
                            comm.Send(novaGeneracija.populacija[l].brojVarijabli, 1, 0);
                            comm.Send(novaGeneracija.populacija[l].brojZadovoljenihZagrada, 1, 0);
                            comm.Send(novaGeneracija.populacija[l].dobrota, 1, 0);

                            bool[] b = new bool[varijable.Count];
                            double fit;
                            int    brZagovoljenih, brVar;
                            comm.Receive(comm.Size - 1, 0, ref b);
                            brVar          = comm.Receive <int>(comm.Size - 1, 0);
                            brZagovoljenih = comm.Receive <int>(comm.Size - 1, 0);
                            fit            = comm.Receive <double>(comm.Size - 1, 0);
                            novaGeneracija.populacija[k] = new Jedinka(b, fit, brZagovoljenih, brVar);
                        }
                        else
                        {
                            bool[] b = new bool[varijable.Count];
                            double fit;
                            int    brZagovoljenih, brVar;
                            comm.Receive(MyRank - 1, 0, ref b);
                            brVar          = comm.Receive <int>(MyRank - 1, 0);
                            brZagovoljenih = comm.Receive <int>(MyRank - 1, 0);
                            fit            = comm.Receive <double>(MyRank - 1, 0);
                            novaGeneracija.populacija[k] = new Jedinka(b, fit, brZagovoljenih, brVar);

                            comm.Send(novaGeneracija.populacija[l].bitovi, (MyRank + 1) % comm.Size, 0);
                            comm.Send(novaGeneracija.populacija[l].brojVarijabli, (MyRank + 1) % comm.Size, 0);
                            comm.Send(novaGeneracija.populacija[l].brojZadovoljenihZagrada, (MyRank + 1) % comm.Size, 0);
                            comm.Send(novaGeneracija.populacija[l].dobrota, (MyRank + 1) % comm.Size, 0);
                        }
                    }
                    if (MyRank == 1)
                    {
                        Console.WriteLine("Sad sam razmijenio podatke");
                    }
                }
                count++;
                for (int j = PaziOdKudaIdeNova; j < velicinaPopulacije; j += 2)
                {
                    Jedinka prviRoditelj  = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka drugiRoditelj = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka prvoDijete    = new Jedinka(varijable.Count);
                    Jedinka drugoDijete   = new Jedinka(varijable.Count);
                    trenutna.Krizanje(vjrojatnostKrizanja, prviRoditelj, drugiRoditelj, prvoDijete, drugoDijete, false, veze_var_zagrada, varijable, rand);
                    prvoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    drugoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    novaGeneracija.populacija[j]     = prvoDijete;
                    novaGeneracija.populacija[j + 1] = drugoDijete;
                }
                novaGeneracija.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
                trenutna = novaGeneracija;
                if (MyRank == 1)
                {
                    Console.WriteLine(trenutna.VratiNajboljuDobrotu());
                }
                if (trenutna.populacija[0].dobrota == 1)
                {
                    return(trenutna.populacija[0].bitovi);
                }
            }
            bool[] ret = null;
            return(ret);
        }
Exemple #13
0
        public static bool[] genetskiAlgoritamSekvencijalni(int velicinaPopulacije, int brojGeneracija, double vjrojatnostKrizanja, double vjerojatnostMutacije, bool rouletteWheel, bool uniformno, List <int> varijable, List <Zagrada> Formula, Dictionary <int, List <Zagrada> > veze_var_zagrada)
        {
            double         epsilon = 0.000002;
            int            counter = 0;
            double         bestOne, bestTwo;
            Random         rand          = new Random();
            Populacija     trenutna      = new Populacija(velicinaPopulacije, varijable.Count, varijable, veze_var_zagrada, rand);
            List <Zagrada> mojDioFormule = mojeZagrade(varijable, veze_var_zagrada);

            trenutna.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
            if (trenutna.populacija[0].dobrota == 1)
            {
                return(trenutna.populacija[0].bitovi);
            }
            double[] vjerojatnosti = new double[varijable.Count];
            for (int i = 1; i <= brojGeneracija; i++)
            {
                azurirajVjerojatnosti(vjerojatnosti, varijable, veze_var_zagrada);
                Populacija novaGeneracija = new Populacija(velicinaPopulacije);
                trenutna.KopirajElitu(novaGeneracija, 2, vjerojatnosti, varijable, veze_var_zagrada, rand);
                bestOne = trenutna.VratiNajboljuDobrotu();
                for (int j = 2; j < velicinaPopulacije; j += 2)
                {
                    Jedinka prviRoditelj  = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka drugiRoditelj = trenutna.OdaberiRoditelja(true, rand);
                    Jedinka prvoDijete    = new Jedinka(varijable.Count);
                    Jedinka drugoDijete   = new Jedinka(varijable.Count);
                    trenutna.Krizanje(vjrojatnostKrizanja, prviRoditelj, drugiRoditelj, prvoDijete, drugoDijete, false, veze_var_zagrada, varijable, rand);
                    prvoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    drugoDijete.Mutacija(vjerojatnostMutacije, varijable, veze_var_zagrada, rand);
                    novaGeneracija.populacija[j]     = prvoDijete;
                    novaGeneracija.populacija[j + 1] = drugoDijete;
                }
                novaGeneracija.EvaluirajPopulacijuSTezinama(mojDioFormule, varijable, veze_var_zagrada);
                trenutna = novaGeneracija;
                bestTwo  = trenutna.VratiNajboljuDobrotu();
                Console.WriteLine("{0}\n", bestTwo - bestOne);
                if (trenutna.populacija[0].dobrota == 1)
                {
                    return(trenutna.populacija[0].bitovi);
                }

                if (Math.Abs(bestOne - bestTwo) < epsilon * 0.0001)
                {
                    counter++;
                }
                else
                {
                    counter = 0;
                }

                if (counter > (int)(0.001 * brojGeneracija))
                {
                    Console.WriteLine("Vec 15% generacija dobrota se krece u intervalu ispod zadanog epsilona");
                    Console.WriteLine("Zelite li mozda korigirati neke parametre prije nastavka?");
                    Console.WriteLine("U slucaju da ne zelite mjenjati postojece stanje upiste NO inace YES");
                    if (Console.ReadLine() == "YES")
                    {
                        Console.Write(" Unesite novu vjerojatnost za krizanje : ");
                        vjrojatnostKrizanja = double.Parse(Console.ReadLine());
                        Console.Write("\n Unesite novu vjerojatnost ua mutaciju : ");
                        vjerojatnostMutacije = double.Parse(Console.ReadLine());
                        counter = 0;
                    }
                }
            }
            bool[] ret = null;
            return(ret);
        }