Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CLASS CHROMOSOME
- ___________________________________________________________________________________________________________
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Određivanje_Koeficijenata
- {
- public class Kromosom:IComparable<Kromosom>
- {
- public List<double> Alele;
- private double tempFitnes;
- private double tempSelection;
- private double lowerBound;
- private double upperBound;
- private int nrOfHits;
- private int chromosomeLenght=11;
- public double TempFitnes { get { return tempFitnes; } set { tempFitnes = value; } }
- public double TempSelection { get { return tempSelection; } set { tempSelection = value; } }
- public double LowerBound { get { return lowerBound; } set { lowerBound = value; } }
- public double UpperBound { get { return upperBound; } set { upperBound = value; } }
- public int NrOfHits { get { return nrOfHits; } set { nrOfHits = value; } }
- public int ChromosomeLength { get { return chromosomeLenght; } set { chromosomeLenght = value; } }
- private static double[,] rez_pokusa = new double[15, 4];
- static Kromosom()
- { // Rezultati pokusa
- rez_pokusa[0, 0] = 165; rez_pokusa[0, 1] = 0.3; rez_pokusa[0, 2] = 2.0; rez_pokusa[0, 3] = 0.56;
- rez_pokusa[1, 0] = 180; rez_pokusa[1, 1] = 0.24; rez_pokusa[1, 2] = 2.7; rez_pokusa[1, 3] = 0.34;
- rez_pokusa[2, 0] = 165; rez_pokusa[2, 1] = 0.3; rez_pokusa[2, 2] = 0.82; rez_pokusa[2, 3] = 0.42;
- rez_pokusa[3, 0] = 190; rez_pokusa[3, 1] = 0.3; rez_pokusa[3, 2] = 2.0; rez_pokusa[3, 3] = 0.45;
- rez_pokusa[4, 0] = 165; rez_pokusa[4, 1] = 0.4; rez_pokusa[4, 2] = 2.0; rez_pokusa[4, 3] = 1.15;
- rez_pokusa[5, 0] = 165; rez_pokusa[5, 1] = 0.2; rez_pokusa[5, 2] = 2.0; rez_pokusa[5, 3] = 0.23;
- rez_pokusa[6, 0] = 180; rez_pokusa[6, 1] = 0.36; rez_pokusa[6, 2] = 2.7; rez_pokusa[6, 3] = 0.88;
- rez_pokusa[7, 0] = 150; rez_pokusa[7, 1] = 0.36; rez_pokusa[7, 2] = 1.3; rez_pokusa[7, 3] = 0.97;
- rez_pokusa[8, 0] = 150; rez_pokusa[8, 1] = 0.24; rez_pokusa[8, 2] = 2.7; rez_pokusa[8, 3] = 0.47;
- rez_pokusa[9, 0] = 140; rez_pokusa[9, 1] = 0.3; rez_pokusa[9, 2] = 2.0; rez_pokusa[9, 3] = 0.92;
- rez_pokusa[10, 0] = 150; rez_pokusa[10, 1] = 0.24; rez_pokusa[10, 2] = 1.3; rez_pokusa[10, 3] = 0.39;
- rez_pokusa[11, 0] = 180; rez_pokusa[11, 1] = 0.36; rez_pokusa[11, 2] = 1.3; rez_pokusa[11, 3] = 0.77;
- rez_pokusa[12, 0] = 150; rez_pokusa[12, 1] = 0.36; rez_pokusa[12, 2] = 2.7; rez_pokusa[12, 3] = 1.1;
- rez_pokusa[13, 0] = 165; rez_pokusa[13, 1] = 0.3; rez_pokusa[13, 2] = 3.18; rez_pokusa[13, 3] = 0.81;
- rez_pokusa[14, 0] = 180; rez_pokusa[14, 1] = 0.24; rez_pokusa[14, 2] = 1.3; rez_pokusa[14, 3] = 0.28;
- }
- public Kromosom(Random rand)
- {
- Alele = new List<double>();
- for (int i = 0; i < ChromosomeLength; i++)
- {
- Alele.Add(rand.NextDouble() * 2000 - 1000);
- }
- }
- // Konstruktor ua inicijalnu generaciju
- //public Kromosom(Random rand,int nr)
- //{
- // Alele = new List<double>();
- // if
- // do{
- // for (int i = 0; i < ChromosomeLength; i++)
- // Alele.Add(rand.NextDouble() * 2000 - 1000);
- // }while();
- //}
- public Kromosom(Kromosom kromosom)
- {
- this.Alele = new List<double>();
- this.TempFitnes = kromosom.TempFitnes;
- for (int i = 0; i < ChromosomeLength; i++)
- {
- Alele.Add(kromosom.Alele[i]);
- }
- }
- public Kromosom(List<double> Alele)
- {
- this.Alele = new List<double>();
- for (int i = 0; i < ChromosomeLength; i++)
- {
- this.Alele.Add(Alele[i]);
- }
- }
- public int CompareTo(Kromosom kromosom)
- {
- return TempSelection.CompareTo(kromosom.TempSelection);
- }
- public double RacunajFitnesKromosoma(List<double> Alele)
- {
- List<double> tempLSM = new List<double>();
- double tempFitnes = 0.0;
- for (int i = 0; i < rez_pokusa.GetLength(0); i++)
- {
- tempLSM.Add(Alele[0] + Alele[1] * rez_pokusa[i, 0]
- + Alele[2] * rez_pokusa[i, 1] + Alele[3] * rez_pokusa[i, 2]
- + Alele[4] * Math.Pow(rez_pokusa[i, 0], 2)
- + Alele[5] * Math.Pow(rez_pokusa[i, 1], 2)
- + Alele[6] * Math.Pow(rez_pokusa[i, 2], 2)
- + Alele[7] * rez_pokusa[i, 0] * rez_pokusa[i, 1]
- + Alele[8] * rez_pokusa[i, 0] * rez_pokusa[i, 2]
- + Alele[9] * rez_pokusa[i, 1] * rez_pokusa[i, 2]
- + Alele[10] * rez_pokusa[i, 0] * rez_pokusa[i, 1] * rez_pokusa[i, 2]);
- }
- for (int i = 0; i < rez_pokusa.GetLength(0); i++)
- tempFitnes += Math.Pow(rez_pokusa[i, 3] - tempLSM[i], 2);
- tempFitnes /= rez_pokusa.Length;
- return 1/tempFitnes;
- }
- }
- }
- CLASS GENOTIPE
- ___________________________________________________________________________________________________________
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Određivanje_Koeficijenata
- {
- public class Genotip
- {
- private static double[,] rez_pokusa = new double[15, 4];
- static Genotip()
- { // Rezultati pokusa
- rez_pokusa[0, 0] = 165; rez_pokusa[0, 1] = 0.3; rez_pokusa[0, 2] = 2.0; rez_pokusa[0, 3] = 0.56;
- rez_pokusa[1, 0] = 180; rez_pokusa[1, 1] = 0.24; rez_pokusa[1, 2] = 2.7; rez_pokusa[1, 3] = 0.34;
- rez_pokusa[2, 0] = 165; rez_pokusa[2, 1] = 0.3; rez_pokusa[2, 2] = 0.82; rez_pokusa[2, 3] = 0.42;
- rez_pokusa[3, 0] = 190; rez_pokusa[3, 1] = 0.3; rez_pokusa[3, 2] = 2.0; rez_pokusa[3, 3] = 0.45;
- rez_pokusa[4, 0] = 165; rez_pokusa[4, 1] = 0.4; rez_pokusa[4, 2] = 2.0; rez_pokusa[4, 3] = 1.15;
- rez_pokusa[5, 0] = 165; rez_pokusa[5, 1] = 0.2; rez_pokusa[5, 2] = 2.0; rez_pokusa[5, 3] = 0.23;
- rez_pokusa[6, 0] = 180; rez_pokusa[6, 1] = 0.36; rez_pokusa[6, 2] = 2.7; rez_pokusa[6, 3] = 0.88;
- rez_pokusa[7, 0] = 150; rez_pokusa[7, 1] = 0.36; rez_pokusa[7, 2] = 1.3; rez_pokusa[7, 3] = 0.97;
- rez_pokusa[8, 0] = 150; rez_pokusa[8, 1] = 0.24; rez_pokusa[8, 2] = 2.7; rez_pokusa[8, 3] = 0.47;
- rez_pokusa[9, 0] = 140; rez_pokusa[9, 1] = 0.3; rez_pokusa[9, 2] = 2.0; rez_pokusa[9, 3] = 0.92;
- rez_pokusa[10, 0] = 150; rez_pokusa[10, 1] = 0.24; rez_pokusa[10, 2] = 1.3; rez_pokusa[10, 3] = 0.39;
- rez_pokusa[11, 0] = 180; rez_pokusa[11, 1] = 0.36; rez_pokusa[11, 2] = 1.3; rez_pokusa[11, 3] = 0.77;
- rez_pokusa[12, 0] = 150; rez_pokusa[12, 1] = 0.36; rez_pokusa[12, 2] = 2.7; rez_pokusa[12, 3] = 1.1;
- rez_pokusa[13, 0] = 165; rez_pokusa[13, 1] = 0.3; rez_pokusa[13, 2] = 3.18; rez_pokusa[13, 3] = 0.81;
- rez_pokusa[14, 0] = 180; rez_pokusa[14, 1] = 0.24; rez_pokusa[14, 2] = 1.3; rez_pokusa[14, 3] = 0.28;
- }
- public List<Kromosom> kromosom;
- Random random;
- private const double a = 0.7;
- public Genotip(int nrOfChro)
- {
- kromosom = new List<Kromosom>();
- random = new Random();
- for (int i = 0; i < nrOfChro; i++)
- {
- kromosom.Add(new Kromosom(random));
- }
- }
- // Konstruktor za 1. generaciju kromosoma
- public Genotip(int nr, string hello)
- {
- kromosom = new List<Kromosom>();
- Kromosom jedinka; //prethodnikJedinke;
- random = new Random();
- //double fitnesJedinke = 0.0, fitnesPrethodnika = 0.0;
- //double omjerVeći = 0.0, omjerManji = 0.0;
- //List<double> listaPrethodnihFitnesa = new List<double>();
- for (int i = 0; i < nr; i++)
- {
- jedinka = VratiRazlicitKromosom(kromosom);
- kromosom.Add(jedinka);
- }
- //if (i == 0)
- //{
- // kromosom.Add(new Kromosom(random));
- //}
- //else
- //{
- // do
- // {
- // jedinka = new Kromosom(random);
- // fitnesJedinke = jedinka.RacunajFitnesKromosoma(jedinka.Alele);
- // //for (int d = 0; d < kromosom.Count; d++)
- // //{
- // // listaPrethodnihFitnesa.Add (kromosom[d].TempFitnes);
- // //}
- // prethodnikJedinke = kromosom[i-1];
- // fitnesPrethodnika = prethodnikJedinke.RacunajFitnesKromosoma(prethodnikJedinke.Alele);
- // omjerVeći = fitnesJedinke > fitnesPrethodnika ? fitnesJedinke : fitnesPrethodnika;
- // omjerManji = fitnesJedinke < fitnesPrethodnika ? fitnesJedinke : fitnesPrethodnika;
- // }
- // while (omjerManji / omjerVeći > 0.01);
- // kromosom.Add(jedinka);
- //}
- }
- public void RacunajFunkcijuFitnesa(List<Kromosom> kromosom)
- {
- List<double> tempLSM = new List<double>();
- double tempFitnes = 0;
- for (int k = 0; k < kromosom.Count; k++)
- {
- for (int i = 0; i < rez_pokusa.GetLength(0); i++)
- {
- tempLSM.Add(kromosom[k].Alele[0] + kromosom[k].Alele[1] * rez_pokusa[i, 0]
- + kromosom[k].Alele[2] * rez_pokusa[i, 1] + kromosom[k].Alele[3] * rez_pokusa[i, 2]
- + kromosom[k].Alele[4] * Math.Pow(rez_pokusa[i, 0], 2)
- + kromosom[k].Alele[5] * Math.Pow(rez_pokusa[i, 1], 2)
- + kromosom[k].Alele[6] * Math.Pow(rez_pokusa[i, 2], 2)
- + kromosom[k].Alele[7] * rez_pokusa[i, 0] * rez_pokusa[i, 1]
- + kromosom[k].Alele[8] * rez_pokusa[i, 0] * rez_pokusa[i, 2]
- + kromosom[k].Alele[9] * rez_pokusa[i, 1] * rez_pokusa[i, 2]
- + kromosom[k].Alele[10] * rez_pokusa[i, 0] * rez_pokusa[i, 1] * rez_pokusa[i, 2]);
- }
- for (int i = 0; i < rez_pokusa.GetLength(0); i++)
- tempFitnes += Math.Pow(rez_pokusa[i,3]-tempLSM[i],2);
- tempFitnes /= rez_pokusa.Length;
- kromosom[k].TempFitnes = 1 / tempFitnes;
- tempLSM.Clear();
- }
- }
- public void RacunajFunkcijuSelekcije(List<Kromosom> kromosom)
- {
- double tempFitnessAll = 0.0;
- for (int k = 0; k < kromosom.Count; k++)
- {
- tempFitnessAll += kromosom[k].TempFitnes;
- }
- for (int k = 0; k < kromosom.Count; k++)
- {
- kromosom[k].TempSelection = kromosom[k].TempFitnes / tempFitnessAll;
- }
- kromosom.Sort();
- for (int k = 0; k < kromosom.Count; k++)
- {
- if (k == 0)
- {
- kromosom[k].LowerBound = 0.0;
- kromosom[k].UpperBound = kromosom[k].TempSelection;
- continue;
- }
- kromosom[k].LowerBound = kromosom[k - 1].UpperBound;
- kromosom[k].UpperBound = kromosom[k].LowerBound + kromosom[k].TempSelection;
- }
- }
- public List<Kromosom> RacunajFunkcijuRuleta(List<Kromosom> kromosom)
- {
- List<Kromosom> kromosomNovi = new List<Kromosom>();
- Kromosom tempKromosom;
- kromosom.Sort();
- double tempHit = 0.0;
- for (int i = 0; i < kromosom.Count; i++)
- {
- tempHit = random.NextDouble();
- tempKromosom = kromosom.Find(x=>x.LowerBound<tempHit&&x.UpperBound>=tempHit);
- tempKromosom.NrOfHits++;
- }
- int k = 0;
- for (int i = 0; i < kromosom.Count; i++)
- {
- for (int j = 0; j < kromosom[i].NrOfHits; j++)
- {
- kromosomNovi.Add(new Kromosom(kromosom[i]));
- kromosomNovi[k].TempFitnes = kromosom[i].TempFitnes;
- k++;
- }
- }
- return kromosomNovi;
- }
- public List<Kromosom> RacunajFunkcijuRuleta(List<Kromosom> kromosom, int maxPojavljivanja)
- {
- List<Kromosom> noviKromosom = new List<Kromosom>();
- Kromosom tempKromosom;
- int nrOfSameChromosomes = Convert.ToInt32(maxPojavljivanja * 0.1);
- int counterOfOldChromosomes = kromosom.Count;
- kromosom.Sort();
- double tempHit = 0.0;
- while(counterOfOldChromosomes > 0)
- {
- do{
- tempHit = random.NextDouble();
- tempKromosom = kromosom.Find(x => x.LowerBound < tempHit & x.UpperBound >= tempHit);
- }while(tempKromosom.NrOfHits>=nrOfSameChromosomes);
- tempKromosom.NrOfHits++;
- noviKromosom.Add(new Kromosom(tempKromosom));
- counterOfOldChromosomes--;
- }
- return noviKromosom;
- }
- public List<Kromosom> ProbabilisticBinaryTournamentSelection_2(List<Kromosom> kromosom)
- {
- List<Kromosom> noviKromosom = new List<Kromosom>();
- Kromosom pobjednikTournamenta;
- double probabilityOfTournament = 0.8, međa;
- Kromosom kro1, kro2;
- int pozicija_kro1, pozicija_kro2;
- while (noviKromosom.Count != kromosom.Count)
- {
- pozicija_kro1 = random.Next(kromosom.Count);
- do
- {
- pozicija_kro2 = random.Next(kromosom.Count);
- } while (pozicija_kro1 == pozicija_kro2);
- kro1 = kromosom[pozicija_kro1];
- kro2 = kromosom[pozicija_kro2];
- međa = random.NextDouble();
- if (međa < probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
- {
- pobjednikTournamenta = kro1;
- noviKromosom.Add(kro1);
- }
- else
- {
- if (međa < probabilityOfTournament & kro1.TempFitnes > kro2.TempFitnes)
- {
- pobjednikTournamenta = kro2;
- noviKromosom.Add(kro2);
- }
- else
- {
- if (međa > probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
- {
- pobjednikTournamenta = kro2;
- noviKromosom.Add(kro2);
- }
- else
- {
- pobjednikTournamenta = kro1;
- noviKromosom.Add(kro1);
- }
- }
- }
- }
- return noviKromosom;
- }
- public List<Kromosom> ProbabilisticBinaryTournamentSelection(List<Kromosom> kromosom)
- {
- List<Kromosom> noviKromosom = new List<Kromosom>();
- Kromosom pobjednikTournamenta, veći, manji;
- double probabilityOfTournament = 0.72, međa;
- Kromosom kro1, kro2;
- int pozicija_kro1, pozicija_kro2;
- while (noviKromosom.Count != kromosom.Count)
- {
- pozicija_kro1 = random.Next(kromosom.Count);
- do{
- pozicija_kro2 = random.Next(kromosom.Count);
- }while(pozicija_kro1 == pozicija_kro2);
- kro1 = kromosom[pozicija_kro1];
- kro2 = kromosom[pozicija_kro2];
- međa= random.NextDouble();
- veći = kro1.TempFitnes >= kro2.TempFitnes ? kro1 : kro2;
- manji = kro1.TempFitnes < kro2.TempFitnes ? kro1 : kro2;
- if (međa < probabilityOfTournament)
- //pobjednikTournamenta = veći;
- noviKromosom.Add(veći);
- else
- //pobjednikTournamenta = manji;
- noviKromosom.Add(manji);
- //if (međa < probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
- //{
- // pobjednikTournamenta = kro1;
- // noviKromosom.Add(kro1);
- //}
- //else
- //{
- // if (međa < probabilityOfTournament & kro1.TempFitnes > kro2.TempFitnes)
- // {
- // pobjednikTournamenta = kro2;
- // noviKromosom.Add(kro2);
- // }
- // else
- // {
- // if (međa > probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
- // {
- // pobjednikTournamenta = kro2;
- // noviKromosom.Add(kro2);
- // }
- // else
- // {
- // pobjednikTournamenta = kro1;
- // noviKromosom.Add(kro1);
- // }
- // }
- //}
- }
- return noviKromosom;
- }
- public List<Kromosom> Crossover(List<Kromosom> kromosom)
- {
- List<Kromosom> crossoverKromosom = new List<Kromosom>();
- int brojKromosoma= kromosom.Count;
- int pozicijaZadnjegKromosoma = brojKromosoma - 1;
- int pozicijaPredzadnjegKromosoma=pozicijaZadnjegKromosoma-1;
- while (kromosom.Count != 0)
- {
- if (brojKromosoma == kromosom.Count)
- {
- crossoverKromosom.Add(kromosom[brojKromosoma - 1]);
- kromosom.Remove(kromosom[brojKromosoma - 1]);
- pozicijaZadnjegKromosoma--;
- pozicijaPredzadnjegKromosoma--;
- continue;
- }
- if (kromosom.Count > 2)
- {
- while (kromosom[pozicijaZadnjegKromosoma].TempFitnes == kromosom[pozicijaPredzadnjegKromosoma].TempFitnes & pozicijaPredzadnjegKromosoma>0)
- pozicijaPredzadnjegKromosoma--;
- if (pozicijaPredzadnjegKromosoma == 0)
- pozicijaPredzadnjegKromosoma = pozicijaZadnjegKromosoma - 1;
- RazmjeniGene(kromosom[pozicijaZadnjegKromosoma], kromosom[pozicijaPredzadnjegKromosoma]);
- crossoverKromosom.Add(kromosom[pozicijaZadnjegKromosoma]);
- crossoverKromosom.Add( kromosom[pozicijaPredzadnjegKromosoma]);
- kromosom.Remove(kromosom[pozicijaZadnjegKromosoma]);
- kromosom.Remove(kromosom[pozicijaPredzadnjegKromosoma]);
- pozicijaZadnjegKromosoma=kromosom.Count-1;
- pozicijaPredzadnjegKromosoma = pozicijaPredzadnjegKromosoma - 1;
- continue;
- }
- if (kromosom.Count == 2)
- {
- RazmjeniGene(kromosom[0], kromosom[1]);
- crossoverKromosom.Add(kromosom[0]);
- crossoverKromosom.Add(kromosom[1]);
- kromosom.Remove(kromosom[0]);
- kromosom.Remove(kromosom[0]);
- }
- }
- return crossoverKromosom;
- }
- public List<Kromosom> Crossover_2(List<Kromosom> kromosom)
- {
- int parent_1,parent_2;
- Kromosom otac, majka;
- List<Kromosom> crossoverKromosom = new List<Kromosom>();
- List<Kromosom> potomci = new List<Kromosom>();
- RazbacajListu(kromosom);
- while(kromosom.Count>0){
- parent_1 = random.Next(kromosom.Count);
- otac = kromosom[parent_1];
- do{
- parent_2 = random.Next(kromosom.Count);
- majka = kromosom[parent_2];
- }while(parent_2==parent_1);
- potomci = Razmnozi(otac,majka);
- crossoverKromosom.Add(potomci[0]);
- crossoverKromosom.Add(potomci[1]);
- kromosom.Remove(otac);
- kromosom.Remove(majka);
- }
- return crossoverKromosom;
- }
- private List<Kromosom> Razmnozi(Kromosom otac, Kromosom majka)
- {
- int crossOverChance = random.Next(11);
- List<Kromosom> potomci = new List<Kromosom>();
- Kromosom sin = new Kromosom(otac.Alele);
- Kromosom kćer = new Kromosom(majka.Alele);
- bool[] maska = new bool[otac.Alele.Count];
- for (int i = 0; i < otac.Alele.Count; i++)
- {
- maska[i] = Convert.ToBoolean(random.Next(2));
- }
- if (crossOverChance < 8)
- {
- for (int i = 0; i < sin.Alele.Count; i++)
- {
- if (maska[i] == true)
- sin.Alele[i] = otac.Alele[i];
- else
- sin.Alele[i] = majka.Alele[i];
- }
- for (int i = 0; i < otac.Alele.Count; i++)
- {
- maska[i] = Convert.ToBoolean(random.Next(2));
- }
- //Kromosom temp = otac;
- //otac = majka;
- //majka = temp;
- for (int i = 0; i < kćer.Alele.Count; i++)
- {
- if (maska[i] == true)
- kćer.Alele[i] = otac.Alele[i];
- else
- kćer.Alele[i] = majka.Alele[i];
- }
- }
- potomci.Add(sin);
- potomci.Add(kćer);
- return potomci;
- }
- private Kromosom Razmnozi_2(Kromosom otac, Kromosom majka)
- {
- int crossOverChance = random.Next(11);
- Kromosom potomak = new Kromosom(otac.Alele);
- if (crossOverChance < 8)
- {
- for (int i = 0; i < otac.Alele.Count; i++)
- {
- potomak.Alele[i] = (otac.Alele[i] + majka.Alele[i]) / 2;
- }
- }
- else
- potomak = Convert.ToBoolean( random.Next(2)) ? otac : majka;
- return potomak;
- }
- private void RazmjeniGene(Kromosom prvi, Kromosom drugi)
- {
- //////List<double> parent1 = new List<double>();
- //////List<double> parent2 = new List<double>();
- //////double[] djete1 = new double[11];
- //////double[] djete2 = new double[11];
- //////if (random.Next(11) < 5)
- //////{
- ////// parent1 = prvi.Alele;
- ////// parent2 = drugi.Alele;
- ////// for (int i = 0; i < parent1.Count; i++)
- ////// {
- ////// djete1[i] = a * parent1[i] + (1 - a) * parent2[i];
- ////// djete2[i] = (1 - a) * parent1[i] + a * parent2[i];
- ////// }
- ////// List<double> offspring1 = djete1.OfType<double>().ToList();
- ////// List<double> offspring2 = djete2.OfType<double>().ToList();
- ////// prvi.Alele = offspring1;
- ////// drugi.Alele = offspring2;
- // List<double> offspring1 = djete1.OfType<double>().ToList();
- // List<double> offspring2 = djete2.OfType<double>().ToList();
- // kromosomiCrossover.Add(new Kromosom(offspring1));
- // kromosomiCrossover.Add(new Kromosom(offspring2));
- // //kromosomiCrossover.Add(new Kromosom(offspring1));
- // //kromosomiCrossover.Add(new Kromosom(offspring2));
- int crossOverChance = random.Next(11);
- if(crossOverChance<8){
- for (int i = 0; i < prvi.Alele.Count; i++)
- {
- int flipCoin=random.Next(2);
- if (flipCoin == 0)
- prvi.Alele[i] = drugi.Alele[i];
- if(flipCoin==1)
- drugi.Alele[i]=prvi.Alele[i];
- }
- }
- //////////////////////////int mjestoCrosssovera = random.Next(11);
- //////////////////////////if (mjestoCrosssovera <= 7)
- //////////////////////////{
- ////////////////////////// for (int j = 0; j < mjestoCrosssovera; j++)
- ////////////////////////// {
- ////////////////////////// //prvi.Alele[j] = drugi.Alele[j];
- ////////////////////////// //if (mjestoCrosssovera > 0)
- ////////////////////////// //{
- ////////////////////////// // for (int i = mjestoCrosssovera; i < prvi.Alele.Count; i++)
- ////////////////////////// // drugi.Alele[i] = prvi.Alele[i];
- ////////////////////////// //}
- ////////////////////////// }
- //////////////////////////}
- }
- public void Mutation(List<Kromosom> kromosom, int korak)
- {
- double tempMutation = 0.0;
- double f = 0.0;
- int tempRandLocation;
- for (int i = 0; i < kromosom.Count; i++)
- {
- tempMutation = random.NextDouble();
- if (korak < 10)
- {
- if (tempMutation < 0.3)
- {
- tempRandLocation = random.Next(11);
- f = random.NextDouble() * 2000 - 1000;
- kromosom[i].Alele[tempRandLocation] = f;
- }
- }
- else
- {
- if (tempMutation < 0.05)
- {
- for (int l = 0; l < kromosom[i].Alele.Count; l++)
- {
- //tempRandLocation = random.Next(11);
- f = random.NextDouble() * 2000 - 1000;
- kromosom[i].Alele[l] = f;
- }
- }
- }
- //if (korak < 5)
- //{
- // if (tempMutation <= 0.3)
- // {
- // int tempRandLocation = random.Next(11);
- // kromosom[i].Alele[tempRandLocation] -= kromosom[i].Alele[tempRandLocation] * 0.5;
- // }
- //}
- //else
- //{
- // if (tempMutation <= 0.1)
- // {
- // int tempRandLocation = random.Next(11);
- // kromosom[i].Alele[tempRandLocation] -= kromosom[i].Alele[tempRandLocation] * 0.3;
- // }
- //}
- }
- }
- public double RacunajRazlikuFitnesaGeneracija(List<Kromosom> prvaGeneracija, List<Kromosom> drugaGeneracija)
- {
- double tempPrvaGeneracija = 0;
- foreach (var kromosom in prvaGeneracija)
- tempPrvaGeneracija += kromosom.TempFitnes;
- tempPrvaGeneracija /= prvaGeneracija.Count;
- double tempDrugaGeneracija = 0;
- foreach (var kromosom in drugaGeneracija)
- tempDrugaGeneracija += kromosom.TempFitnes;
- tempDrugaGeneracija /= drugaGeneracija.Count;
- double t=Math.Abs (tempDrugaGeneracija - tempPrvaGeneracija);
- double m = 1 / t;
- return m;
- }
- public bool StoppageCriterion(Kromosom najboljiKromosom, List<Kromosom> njegoviSuborci)
- {
- int konvergirani = 0; //nekonvergirani=0;
- foreach (var kromosom in njegoviSuborci)
- {
- if (kromosom.TempFitnes >= najboljiKromosom.TempFitnes*0.99)
- konvergirani++;
- //if (kromosom.TempFitnes < najboljiKromosom.TempFitnes * 0.99)
- // nekonvergirani++;
- }
- double omjer = Convert.ToDouble( konvergirani) / Convert.ToDouble( njegoviSuborci.Count);
- if (omjer >= 0.95)
- return true;
- else
- return false;
- }
- public void RazbacajListu(List<Kromosom> kromosom)
- {
- int n = kromosom.Count;
- while (n > 1)
- {
- int k = (random.Next(0, n) % n);
- n--;
- Kromosom value = kromosom[k];
- kromosom[k] = kromosom[n];
- kromosom[n] = value;
- }
- }
- public double RacunajVarijancu(List<Kromosom> kromosom)
- {
- double meanOfThePopulation = 0.0;
- for (int i = 0; i <kromosom.Count ; i++)
- {
- meanOfThePopulation += kromosom[i].TempFitnes;
- }
- meanOfThePopulation /= kromosom.Count;
- double zbrojKvadrataRazlika = 0.0;
- for (int i = 0; i < kromosom.Count; i++)
- {
- zbrojKvadrataRazlika += Math.Pow((kromosom[i].TempFitnes-meanOfThePopulation),2);
- }
- double varijance = zbrojKvadrataRazlika / kromosom.Count;
- return varijance;
- }
- private Kromosom VratiRazlicitKromosom(List<Kromosom> kromosom)
- {
- Kromosom novaJedinka;
- do
- {
- novaJedinka = new Kromosom(random);
- }while(CheckSimilarFitnes(kromosom,novaJedinka)==true);
- return novaJedinka;
- }
- private bool CheckSimilarFitnes(List<Kromosom> kromosom, Kromosom zaIspitat)
- {
- Boolean flag=false;
- double fitIzListe, fitIzJedinke;
- double fitVeći,fitManji;
- int counter = 0;
- foreach (var jedinka in kromosom)
- {
- fitIzListe = jedinka.RacunajFitnesKromosoma(jedinka.Alele);
- fitIzJedinke = zaIspitat.RacunajFitnesKromosoma(zaIspitat.Alele);
- fitVeći = fitIzListe >= fitIzJedinke ? fitIzListe : fitIzJedinke;
- fitManji = fitIzListe < fitIzJedinke ? fitIzListe : fitIzJedinke;
- if ((fitVeći / fitManji) < 1.5)
- counter++;
- }
- if (counter <= 2)
- return false;
- else return true;
- }
- public bool ProvjeriKonvergenciju(List<Kromosom> kromosom, Kromosom najbolji)
- {
- double avgFitnesSvih = 0.0;
- foreach (var jedinka in kromosom)
- {
- avgFitnesSvih += jedinka.TempFitnes;
- }
- avgFitnesSvih /= kromosom.Count;
- if (avgFitnesSvih > najbolji.TempFitnes * 0.95)
- return true;
- else
- return false;
- }
- }
- }
- CLASS FORM1 (WIN FORMS)
- ___________________________________________________________________________________________________________
- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace Određivanje_Koeficijenata
- {
- public partial class Form1 : Form
- {
- List<Kromosom> ruletKromosom, crossoverKromos, prethodnaGeneracijaKromosom;
- Kromosom najboljiKromosomUGeneraciji, najboljiKromosomUPrethodnojGeneraciji;
- Genotip genotip;
- public Form1()
- {
- InitializeComponent();
- //ruletKromosom = new List<Kromosom>();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- genotip = new Genotip((int)numericUpDown_nrOfChrmosomes.Value,"Ave maria");
- genotip.RacunajFunkcijuFitnesa(genotip.kromosom);
- double varijancaInicijalna = genotip.RacunajVarijancu(genotip.kromosom);
- int k = 0;
- for (int i = 0; i < genotip.kromosom.Count; i++)
- {
- k = i + 1;
- chart_initalPopulation.Series[0].Points.AddXY(k,genotip.kromosom[i].TempFitnes);
- }
- double tempMax = 0;
- foreach (var kromosom in genotip.kromosom)
- {
- if (kromosom.TempFitnes > tempMax)
- {
- tempMax = kromosom.TempFitnes;
- najboljiKromosomUPrethodnojGeneraciji = kromosom;
- }
- }
- int korak=0;
- double tempMaxFitnes=0.0;
- double varijancePrethodneGene = 0.0, varijance = 0.0;
- TextWriter tw_0 = new StreamWriter("varijance.txt");
- tw_0.Write("Varijanca prve generacije: ");
- tw_0.WriteLine(varijancaInicijalna);
- string varijanca = "";
- do
- {
- if(korak!=0)
- //najboljiKromosomUPrethodnojGeneraciji = najboljiKromosomUGeneraciji;
- varijancePrethodneGene = genotip.RacunajVarijancu(genotip.kromosom);
- genotip.RacunajFunkcijuSelekcije(genotip.kromosom);
- //prethodnaGeneracijaKromosom = genotip.kromosom;
- ruletKromosom = genotip.ProbabilisticBinaryTournamentSelection(genotip.kromosom);
- //ruletKromosom = genotip.RacunajFunkcijuRuleta(genotip.kromosom,(int)numericUpDown_nrOfChrmosomes.Value);
- //ruletKromosom.Sort();
- //crossoverKromos = genotip.Crossover(ruletKromosom);
- crossoverKromos = genotip.Crossover_2(ruletKromosom);
- genotip.Mutation(crossoverKromos,korak);
- genotip.RacunajFunkcijuFitnesa(crossoverKromos);
- varijance= genotip.RacunajVarijancu(crossoverKromos);
- varijanca += varijance + "\n\r";
- //crossoverKromos.Sort();
- //if(crossoverKromos[crossoverKromos.Count-1].TempFitnes>najboljiKromosomUGeneraciji.TempFitnes)
- //najboljiKromosomUGeneraciji = crossoverKromos[crossoverKromos.Count - 1];
- foreach (var kromosom in crossoverKromos)
- {
- if (kromosom.TempFitnes > tempMaxFitnes)
- {
- tempMaxFitnes = kromosom.TempFitnes;
- najboljiKromosomUGeneraciji = kromosom;
- }
- }
- //List<Kromosom> tempListaKromosoma = new List<Kromosom>(genotip.kromosom);
- genotip.kromosom = crossoverKromos;
- korak++;
- } while (genotip.ProvjeriKonvergenciju(genotip.kromosom,najboljiKromosomUGeneraciji)==false);
- tw_0.Write("Varijanca zadnje generacije: ");
- tw_0.WriteLine(varijanca);
- tw_0.Close();
- int p = 0;
- for (int i = 0; i < genotip.kromosom.Count; i++)
- {
- p = i + 1;
- chart_lastPopulation.Series[0].Points.AddXY(p, genotip.kromosom[i].TempFitnes);
- }
- TextWriter tw = new StreamWriter("beta.txt");
- for (int i = 0; i < najboljiKromosomUGeneraciji.Alele.Count; i++)
- {
- tw.Write(najboljiKromosomUGeneraciji.Alele[i] + " ");
- }
- tw.Close();
- //najboljiKromosomUGeneraciji.TempFitnes!=najboljiKromosomUPrethodnojGeneraciji.TempFitnes
- MessageBox.Show("Rjesenje nadjeno", "BINGO");
- MessageBox.Show("Pronadjeni su koeficijenti\n b0:"+najboljiKromosomUGeneraciji.Alele[0]+
- "\n b1:"+najboljiKromosomUGeneraciji.Alele[1]+
- "\n b2:"+najboljiKromosomUGeneraciji.Alele[2]+
- "\n b3:"+najboljiKromosomUGeneraciji.Alele[3]+
- "\n b4:"+najboljiKromosomUGeneraciji.Alele[4]+
- "\n b5:"+najboljiKromosomUGeneraciji.Alele[5]+
- "\n b6:"+najboljiKromosomUGeneraciji.Alele[6]+
- "\n b7:"+najboljiKromosomUGeneraciji.Alele[7]+
- "\n b8:"+najboljiKromosomUGeneraciji.Alele[8]+
- "\n b9:"+najboljiKromosomUGeneraciji.Alele[9]+
- "\n b10:"+najboljiKromosomUGeneraciji.Alele[10]);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement