//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; }
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)); } } }
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; } }
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); }
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; } }
//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); }
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]); }
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]; }
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)); } } } }
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; }
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; }
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); }
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); }