Advertisement
TunAntun

Untitled

Sep 22nd, 2012
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 37.58 KB | None | 0 0
  1. CLASS CHROMOSOME
  2. ___________________________________________________________________________________________________________
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7.  
  8. namespace Određivanje_Koeficijenata
  9. {
  10.     public class Kromosom:IComparable<Kromosom>
  11.     {
  12.         public List<double> Alele;
  13.         private double tempFitnes;
  14.         private double tempSelection;
  15.         private double lowerBound;
  16.         private double upperBound;
  17.         private int nrOfHits;
  18.         private int chromosomeLenght=11;
  19.  
  20.         public double TempFitnes { get { return tempFitnes; } set { tempFitnes = value; } }
  21.         public double TempSelection { get { return tempSelection; } set { tempSelection = value; } }
  22.         public double LowerBound { get { return lowerBound; } set { lowerBound = value; } }
  23.         public double UpperBound { get { return upperBound; } set { upperBound = value; } }
  24.         public int NrOfHits { get { return nrOfHits; } set { nrOfHits = value; } }
  25.         public int ChromosomeLength { get { return chromosomeLenght; } set { chromosomeLenght = value; } }
  26.  
  27.         private static double[,] rez_pokusa = new double[15, 4];
  28.         static Kromosom()
  29.         {   // Rezultati pokusa
  30.             rez_pokusa[0, 0] = 165; rez_pokusa[0, 1] = 0.3; rez_pokusa[0, 2] = 2.0; rez_pokusa[0, 3] = 0.56;
  31.             rez_pokusa[1, 0] = 180; rez_pokusa[1, 1] = 0.24; rez_pokusa[1, 2] = 2.7; rez_pokusa[1, 3] = 0.34;
  32.             rez_pokusa[2, 0] = 165; rez_pokusa[2, 1] = 0.3; rez_pokusa[2, 2] = 0.82; rez_pokusa[2, 3] = 0.42;
  33.             rez_pokusa[3, 0] = 190; rez_pokusa[3, 1] = 0.3; rez_pokusa[3, 2] = 2.0; rez_pokusa[3, 3] = 0.45;
  34.             rez_pokusa[4, 0] = 165; rez_pokusa[4, 1] = 0.4; rez_pokusa[4, 2] = 2.0; rez_pokusa[4, 3] = 1.15;
  35.             rez_pokusa[5, 0] = 165; rez_pokusa[5, 1] = 0.2; rez_pokusa[5, 2] = 2.0; rez_pokusa[5, 3] = 0.23;
  36.             rez_pokusa[6, 0] = 180; rez_pokusa[6, 1] = 0.36; rez_pokusa[6, 2] = 2.7; rez_pokusa[6, 3] = 0.88;
  37.             rez_pokusa[7, 0] = 150; rez_pokusa[7, 1] = 0.36; rez_pokusa[7, 2] = 1.3; rez_pokusa[7, 3] = 0.97;
  38.             rez_pokusa[8, 0] = 150; rez_pokusa[8, 1] = 0.24; rez_pokusa[8, 2] = 2.7; rez_pokusa[8, 3] = 0.47;
  39.             rez_pokusa[9, 0] = 140; rez_pokusa[9, 1] = 0.3; rez_pokusa[9, 2] = 2.0; rez_pokusa[9, 3] = 0.92;
  40.             rez_pokusa[10, 0] = 150; rez_pokusa[10, 1] = 0.24; rez_pokusa[10, 2] = 1.3; rez_pokusa[10, 3] = 0.39;
  41.             rez_pokusa[11, 0] = 180; rez_pokusa[11, 1] = 0.36; rez_pokusa[11, 2] = 1.3; rez_pokusa[11, 3] = 0.77;
  42.             rez_pokusa[12, 0] = 150; rez_pokusa[12, 1] = 0.36; rez_pokusa[12, 2] = 2.7; rez_pokusa[12, 3] = 1.1;
  43.             rez_pokusa[13, 0] = 165; rez_pokusa[13, 1] = 0.3; rez_pokusa[13, 2] = 3.18; rez_pokusa[13, 3] = 0.81;
  44.             rez_pokusa[14, 0] = 180; rez_pokusa[14, 1] = 0.24; rez_pokusa[14, 2] = 1.3; rez_pokusa[14, 3] = 0.28;
  45.         }
  46.  
  47.  
  48.         public Kromosom(Random rand)
  49.         {
  50.             Alele = new List<double>();
  51.             for (int i = 0; i < ChromosomeLength; i++)
  52.             {
  53.                 Alele.Add(rand.NextDouble() * 2000 - 1000);
  54.             }
  55.         }
  56.  
  57.         // Konstruktor ua inicijalnu generaciju
  58.         //public Kromosom(Random rand,int nr)
  59.         //{
  60.         //    Alele = new List<double>();
  61.         //    if
  62.         //    do{
  63.  
  64.         //    for (int i = 0; i < ChromosomeLength; i++)
  65.         //        Alele.Add(rand.NextDouble() * 2000 - 1000);
  66.  
  67.         //    }while();
  68.         //}
  69.  
  70.         public Kromosom(Kromosom kromosom)
  71.         {
  72.             this.Alele = new List<double>();
  73.             this.TempFitnes = kromosom.TempFitnes;
  74.  
  75.             for (int i = 0; i < ChromosomeLength; i++)
  76.             {
  77.                 Alele.Add(kromosom.Alele[i]);
  78.             }
  79.         }
  80.  
  81.         public Kromosom(List<double> Alele)
  82.         {
  83.             this.Alele = new List<double>();
  84.  
  85.             for (int i = 0; i < ChromosomeLength; i++)
  86.             {
  87.                 this.Alele.Add(Alele[i]);
  88.             }
  89.         }
  90.  
  91.         public int CompareTo(Kromosom kromosom)
  92.         {
  93.             return TempSelection.CompareTo(kromosom.TempSelection);
  94.         }
  95.  
  96.         public double RacunajFitnesKromosoma(List<double> Alele)
  97.         {
  98.             List<double> tempLSM = new List<double>();
  99.             double tempFitnes = 0.0;
  100.             for (int i = 0; i < rez_pokusa.GetLength(0); i++)
  101.             {
  102.                 tempLSM.Add(Alele[0] + Alele[1] * rez_pokusa[i, 0]
  103.                             + Alele[2] * rez_pokusa[i, 1] + Alele[3] * rez_pokusa[i, 2]
  104.                             + Alele[4] * Math.Pow(rez_pokusa[i, 0], 2)
  105.                             + Alele[5] * Math.Pow(rez_pokusa[i, 1], 2)
  106.                             + Alele[6] * Math.Pow(rez_pokusa[i, 2], 2)
  107.                             + Alele[7] * rez_pokusa[i, 0] * rez_pokusa[i, 1]
  108.                             + Alele[8] * rez_pokusa[i, 0] * rez_pokusa[i, 2]
  109.                             + Alele[9] * rez_pokusa[i, 1] * rez_pokusa[i, 2]
  110.                             + Alele[10] * rez_pokusa[i, 0] * rez_pokusa[i, 1] * rez_pokusa[i, 2]);
  111.             }
  112.             for (int i = 0; i < rez_pokusa.GetLength(0); i++)
  113.                 tempFitnes += Math.Pow(rez_pokusa[i, 3] - tempLSM[i], 2);
  114.  
  115.             tempFitnes /= rez_pokusa.Length;
  116.             return 1/tempFitnes;
  117.         }
  118.  
  119.     }
  120. }
  121.  
  122. CLASS GENOTIPE
  123. ___________________________________________________________________________________________________________
  124. using System;
  125. using System.Collections.Generic;
  126. using System.Linq;
  127. using System.Text;
  128.  
  129. namespace Određivanje_Koeficijenata
  130. {
  131.     public class Genotip
  132.     {
  133.         private static double[,] rez_pokusa = new double[15, 4];
  134.         static Genotip()
  135.         {   // Rezultati pokusa
  136.             rez_pokusa[0, 0] = 165; rez_pokusa[0, 1] = 0.3; rez_pokusa[0, 2] = 2.0; rez_pokusa[0, 3] = 0.56;
  137.             rez_pokusa[1, 0] = 180; rez_pokusa[1, 1] = 0.24; rez_pokusa[1, 2] = 2.7; rez_pokusa[1, 3] = 0.34;
  138.             rez_pokusa[2, 0] = 165; rez_pokusa[2, 1] = 0.3; rez_pokusa[2, 2] = 0.82; rez_pokusa[2, 3] = 0.42;
  139.             rez_pokusa[3, 0] = 190; rez_pokusa[3, 1] = 0.3; rez_pokusa[3, 2] = 2.0; rez_pokusa[3, 3] = 0.45;
  140.             rez_pokusa[4, 0] = 165; rez_pokusa[4, 1] = 0.4; rez_pokusa[4, 2] = 2.0; rez_pokusa[4, 3] = 1.15;
  141.             rez_pokusa[5, 0] = 165; rez_pokusa[5, 1] = 0.2; rez_pokusa[5, 2] = 2.0; rez_pokusa[5, 3] = 0.23;
  142.             rez_pokusa[6, 0] = 180; rez_pokusa[6, 1] = 0.36; rez_pokusa[6, 2] = 2.7; rez_pokusa[6, 3] = 0.88;
  143.             rez_pokusa[7, 0] = 150; rez_pokusa[7, 1] = 0.36; rez_pokusa[7, 2] = 1.3; rez_pokusa[7, 3] = 0.97;
  144.             rez_pokusa[8, 0] = 150; rez_pokusa[8, 1] = 0.24; rez_pokusa[8, 2] = 2.7; rez_pokusa[8, 3] = 0.47;
  145.             rez_pokusa[9, 0] = 140; rez_pokusa[9, 1] = 0.3; rez_pokusa[9, 2] = 2.0; rez_pokusa[9, 3] = 0.92;
  146.             rez_pokusa[10, 0] = 150; rez_pokusa[10, 1] = 0.24; rez_pokusa[10, 2] = 1.3; rez_pokusa[10, 3] = 0.39;
  147.             rez_pokusa[11, 0] = 180; rez_pokusa[11, 1] = 0.36; rez_pokusa[11, 2] = 1.3; rez_pokusa[11, 3] = 0.77;
  148.             rez_pokusa[12, 0] = 150; rez_pokusa[12, 1] = 0.36; rez_pokusa[12, 2] = 2.7; rez_pokusa[12, 3] = 1.1;
  149.             rez_pokusa[13, 0] = 165; rez_pokusa[13, 1] = 0.3; rez_pokusa[13, 2] = 3.18; rez_pokusa[13, 3] = 0.81;
  150.             rez_pokusa[14, 0] = 180; rez_pokusa[14, 1] = 0.24; rez_pokusa[14, 2] = 1.3; rez_pokusa[14, 3] = 0.28;
  151.         }
  152.  
  153.         public List<Kromosom> kromosom;
  154.         Random random;
  155.         private const double a = 0.7;
  156.  
  157.         public Genotip(int nrOfChro)
  158.         {
  159.             kromosom = new List<Kromosom>();
  160.             random = new Random();
  161.  
  162.             for (int i = 0; i < nrOfChro; i++)
  163.             {
  164.                 kromosom.Add(new Kromosom(random));
  165.             }
  166.         }
  167.  
  168.         // Konstruktor za 1. generaciju kromosoma
  169.  
  170.         public Genotip(int nr, string hello)
  171.         {
  172.             kromosom = new List<Kromosom>();
  173.             Kromosom jedinka; //prethodnikJedinke;
  174.             random = new Random();
  175.             //double fitnesJedinke = 0.0, fitnesPrethodnika = 0.0;
  176.             //double omjerVeći = 0.0, omjerManji = 0.0;
  177.             //List<double> listaPrethodnihFitnesa = new List<double>();
  178.  
  179.             for (int i = 0; i < nr; i++)
  180.             {
  181.                 jedinka = VratiRazlicitKromosom(kromosom);
  182.                 kromosom.Add(jedinka);
  183.             }
  184.                 //if (i == 0)
  185.                 //{
  186.                 //    kromosom.Add(new Kromosom(random));
  187.                 //}
  188.                 //else
  189.                 //{
  190.                 //    do
  191.                 //    {
  192.                 //        jedinka = new Kromosom(random);
  193.                 //        fitnesJedinke = jedinka.RacunajFitnesKromosoma(jedinka.Alele);
  194.                 //        //for (int d = 0; d < kromosom.Count; d++)
  195.                 //        //{
  196.                 //        //    listaPrethodnihFitnesa.Add (kromosom[d].TempFitnes);
  197.                 //        //}
  198.                 //        prethodnikJedinke = kromosom[i-1];
  199.                 //        fitnesPrethodnika = prethodnikJedinke.RacunajFitnesKromosoma(prethodnikJedinke.Alele);
  200.                 //        omjerVeći = fitnesJedinke > fitnesPrethodnika ? fitnesJedinke : fitnesPrethodnika;
  201.                 //        omjerManji = fitnesJedinke < fitnesPrethodnika ? fitnesJedinke : fitnesPrethodnika;
  202.                 //    }
  203.                 //    while (omjerManji / omjerVeći > 0.01);
  204.                 //    kromosom.Add(jedinka);
  205.                 //}
  206.            
  207.         }
  208.  
  209.         public void RacunajFunkcijuFitnesa(List<Kromosom> kromosom)
  210.         {
  211.             List<double> tempLSM = new List<double>();
  212.             double tempFitnes = 0;
  213.             for (int k = 0; k < kromosom.Count; k++)
  214.             {
  215.                 for (int i = 0; i < rez_pokusa.GetLength(0); i++)
  216.                 {
  217.                     tempLSM.Add(kromosom[k].Alele[0] + kromosom[k].Alele[1] * rez_pokusa[i, 0]
  218.                                 + kromosom[k].Alele[2] * rez_pokusa[i, 1] + kromosom[k].Alele[3] * rez_pokusa[i, 2]
  219.                                 + kromosom[k].Alele[4] * Math.Pow(rez_pokusa[i, 0], 2)
  220.                                 + kromosom[k].Alele[5] * Math.Pow(rez_pokusa[i, 1], 2)
  221.                                 + kromosom[k].Alele[6] * Math.Pow(rez_pokusa[i, 2], 2)
  222.                                 + kromosom[k].Alele[7] * rez_pokusa[i, 0] * rez_pokusa[i, 1]
  223.                                 + kromosom[k].Alele[8] * rez_pokusa[i, 0] * rez_pokusa[i, 2]
  224.                                 + kromosom[k].Alele[9] * rez_pokusa[i, 1] * rez_pokusa[i, 2]
  225.                                 + kromosom[k].Alele[10] * rez_pokusa[i, 0] * rez_pokusa[i, 1] * rez_pokusa[i, 2]);
  226.                 }
  227.                 for (int i = 0; i < rez_pokusa.GetLength(0); i++)
  228.                     tempFitnes += Math.Pow(rez_pokusa[i,3]-tempLSM[i],2);
  229.  
  230.                 tempFitnes /= rez_pokusa.Length;
  231.                 kromosom[k].TempFitnes = 1 / tempFitnes;
  232.                 tempLSM.Clear();
  233.                
  234.              }
  235.         }
  236.  
  237.         public void RacunajFunkcijuSelekcije(List<Kromosom> kromosom)
  238.         {
  239.             double tempFitnessAll = 0.0;
  240.             for (int k = 0; k < kromosom.Count; k++)
  241.             {
  242.                 tempFitnessAll += kromosom[k].TempFitnes;
  243.             }
  244.             for (int k = 0; k < kromosom.Count; k++)
  245.             {
  246.                 kromosom[k].TempSelection = kromosom[k].TempFitnes / tempFitnessAll;
  247.             }
  248.  
  249.             kromosom.Sort();
  250.  
  251.             for (int k = 0; k < kromosom.Count; k++)
  252.             {
  253.                 if (k == 0)
  254.                 {
  255.                     kromosom[k].LowerBound = 0.0;
  256.                     kromosom[k].UpperBound = kromosom[k].TempSelection;
  257.                     continue;
  258.                 }
  259.                 kromosom[k].LowerBound = kromosom[k - 1].UpperBound;
  260.                 kromosom[k].UpperBound = kromosom[k].LowerBound + kromosom[k].TempSelection;
  261.             }
  262.         }
  263.  
  264.         public List<Kromosom> RacunajFunkcijuRuleta(List<Kromosom> kromosom)
  265.         {
  266.             List<Kromosom> kromosomNovi = new List<Kromosom>();
  267.             Kromosom tempKromosom;
  268.  
  269.             kromosom.Sort();
  270.             double tempHit = 0.0;
  271.             for (int i = 0; i < kromosom.Count; i++)
  272.             {
  273.                 tempHit = random.NextDouble();
  274.                 tempKromosom = kromosom.Find(x=>x.LowerBound<tempHit&&x.UpperBound>=tempHit);
  275.  
  276.                 tempKromosom.NrOfHits++;
  277.             }
  278.  
  279.             int k = 0;
  280.             for (int i = 0; i < kromosom.Count; i++)
  281.             {
  282.                 for (int j = 0; j < kromosom[i].NrOfHits; j++)
  283.                 {
  284.                     kromosomNovi.Add(new Kromosom(kromosom[i]));
  285.                     kromosomNovi[k].TempFitnes = kromosom[i].TempFitnes;
  286.                     k++;  
  287.                 }
  288.             }
  289.  
  290.             return kromosomNovi;
  291.         }
  292.  
  293.         public List<Kromosom> RacunajFunkcijuRuleta(List<Kromosom> kromosom, int maxPojavljivanja)
  294.         {
  295.             List<Kromosom> noviKromosom = new List<Kromosom>();
  296.             Kromosom tempKromosom;
  297.             int nrOfSameChromosomes = Convert.ToInt32(maxPojavljivanja * 0.1);
  298.             int counterOfOldChromosomes = kromosom.Count;
  299.  
  300.             kromosom.Sort();
  301.  
  302.             double tempHit = 0.0;
  303.             while(counterOfOldChromosomes > 0)
  304.             {
  305.                 do{
  306.                     tempHit = random.NextDouble();
  307.                     tempKromosom = kromosom.Find(x => x.LowerBound < tempHit & x.UpperBound >= tempHit);
  308.                 }while(tempKromosom.NrOfHits>=nrOfSameChromosomes);
  309.  
  310.                 tempKromosom.NrOfHits++;
  311.                 noviKromosom.Add(new Kromosom(tempKromosom));
  312.                 counterOfOldChromosomes--;
  313.             }
  314.  
  315.             return noviKromosom;
  316.         }
  317.  
  318.         public List<Kromosom> ProbabilisticBinaryTournamentSelection_2(List<Kromosom> kromosom)
  319.         {
  320.             List<Kromosom> noviKromosom = new List<Kromosom>();
  321.             Kromosom pobjednikTournamenta;
  322.             double probabilityOfTournament = 0.8, međa;
  323.             Kromosom kro1, kro2;
  324.             int pozicija_kro1, pozicija_kro2;
  325.  
  326.            
  327.  
  328.             while (noviKromosom.Count != kromosom.Count)
  329.             {
  330.                 pozicija_kro1 = random.Next(kromosom.Count);
  331.                 do
  332.                 {
  333.                     pozicija_kro2 = random.Next(kromosom.Count);
  334.                 } while (pozicija_kro1 == pozicija_kro2);
  335.  
  336.                 kro1 = kromosom[pozicija_kro1];
  337.                 kro2 = kromosom[pozicija_kro2];
  338.  
  339.                 međa = random.NextDouble();
  340.  
  341.                 if (međa < probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
  342.                 {
  343.                     pobjednikTournamenta = kro1;
  344.                     noviKromosom.Add(kro1);
  345.                 }
  346.                 else
  347.                 {
  348.                     if (međa < probabilityOfTournament & kro1.TempFitnes > kro2.TempFitnes)
  349.                     {
  350.                         pobjednikTournamenta = kro2;
  351.                         noviKromosom.Add(kro2);
  352.                     }
  353.                     else
  354.                     {
  355.                         if (međa > probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
  356.                         {
  357.                             pobjednikTournamenta = kro2;
  358.                             noviKromosom.Add(kro2);
  359.                         }
  360.                         else
  361.                         {
  362.                             pobjednikTournamenta = kro1;
  363.                             noviKromosom.Add(kro1);
  364.                         }
  365.                     }
  366.                 }
  367.             }
  368.             return noviKromosom;
  369.         }
  370.  
  371.         public List<Kromosom> ProbabilisticBinaryTournamentSelection(List<Kromosom> kromosom)
  372.         {
  373.             List<Kromosom> noviKromosom = new List<Kromosom>();
  374.             Kromosom pobjednikTournamenta, veći, manji;
  375.             double probabilityOfTournament = 0.72, međa;
  376.             Kromosom kro1, kro2;
  377.             int pozicija_kro1, pozicija_kro2;
  378.  
  379.             while (noviKromosom.Count != kromosom.Count)
  380.             {
  381.                 pozicija_kro1 = random.Next(kromosom.Count);
  382.                 do{
  383.                     pozicija_kro2 = random.Next(kromosom.Count);
  384.                 }while(pozicija_kro1 == pozicija_kro2);
  385.  
  386.                 kro1 = kromosom[pozicija_kro1];
  387.                 kro2 = kromosom[pozicija_kro2];
  388.  
  389.                 međa= random.NextDouble();
  390.                 veći = kro1.TempFitnes >= kro2.TempFitnes ? kro1 : kro2;
  391.                 manji = kro1.TempFitnes < kro2.TempFitnes ? kro1 : kro2;
  392.  
  393.                 if (međa < probabilityOfTournament)
  394.                
  395.                     //pobjednikTournamenta = veći;
  396.                     noviKromosom.Add(veći);
  397.                
  398.                 else
  399.                     //pobjednikTournamenta = manji;
  400.                     noviKromosom.Add(manji);
  401.  
  402.                 //if (međa < probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
  403.                 //{
  404.                 //    pobjednikTournamenta = kro1;
  405.                 //    noviKromosom.Add(kro1);
  406.                 //}
  407.                 //else
  408.                 //{
  409.                 //    if (međa < probabilityOfTournament & kro1.TempFitnes > kro2.TempFitnes)
  410.                 //    {
  411.                 //        pobjednikTournamenta = kro2;
  412.                 //        noviKromosom.Add(kro2);
  413.                 //    }
  414.                 //    else
  415.                 //    {
  416.                 //        if (međa > probabilityOfTournament & kro1.TempFitnes < kro2.TempFitnes)
  417.                 //        {
  418.                 //                pobjednikTournamenta = kro2;
  419.                 //                noviKromosom.Add(kro2);
  420.                 //        }
  421.                 //        else
  422.                 //        {
  423.                 //                pobjednikTournamenta = kro1;
  424.                 //                noviKromosom.Add(kro1);
  425.                 //        }
  426.                 //    }
  427.                 //}
  428.             }
  429.             return noviKromosom;
  430.         }
  431.  
  432.         public List<Kromosom> Crossover(List<Kromosom> kromosom)
  433.         {
  434.             List<Kromosom> crossoverKromosom = new List<Kromosom>();
  435.  
  436.             int brojKromosoma= kromosom.Count;
  437.             int pozicijaZadnjegKromosoma = brojKromosoma - 1;
  438.             int pozicijaPredzadnjegKromosoma=pozicijaZadnjegKromosoma-1;
  439.             while (kromosom.Count != 0)
  440.             {
  441.                 if (brojKromosoma == kromosom.Count)
  442.                 {
  443.                     crossoverKromosom.Add(kromosom[brojKromosoma - 1]);
  444.                     kromosom.Remove(kromosom[brojKromosoma - 1]);
  445.                     pozicijaZadnjegKromosoma--;
  446.                     pozicijaPredzadnjegKromosoma--;
  447.                     continue;
  448.                 }
  449.                 if (kromosom.Count > 2)
  450.                 {
  451.                     while (kromosom[pozicijaZadnjegKromosoma].TempFitnes == kromosom[pozicijaPredzadnjegKromosoma].TempFitnes & pozicijaPredzadnjegKromosoma>0)
  452.                         pozicijaPredzadnjegKromosoma--;
  453.  
  454.                     if (pozicijaPredzadnjegKromosoma == 0)
  455.                         pozicijaPredzadnjegKromosoma = pozicijaZadnjegKromosoma - 1;
  456.                     RazmjeniGene(kromosom[pozicijaZadnjegKromosoma], kromosom[pozicijaPredzadnjegKromosoma]);
  457.                     crossoverKromosom.Add(kromosom[pozicijaZadnjegKromosoma]);
  458.                     crossoverKromosom.Add( kromosom[pozicijaPredzadnjegKromosoma]);
  459.                     kromosom.Remove(kromosom[pozicijaZadnjegKromosoma]);
  460.                     kromosom.Remove(kromosom[pozicijaPredzadnjegKromosoma]);
  461.                     pozicijaZadnjegKromosoma=kromosom.Count-1;
  462.                     pozicijaPredzadnjegKromosoma = pozicijaPredzadnjegKromosoma - 1;
  463.                     continue;
  464.                 }
  465.                 if (kromosom.Count == 2)
  466.                 {
  467.                     RazmjeniGene(kromosom[0], kromosom[1]);
  468.                     crossoverKromosom.Add(kromosom[0]);
  469.                     crossoverKromosom.Add(kromosom[1]);
  470.                     kromosom.Remove(kromosom[0]);
  471.                     kromosom.Remove(kromosom[0]);
  472.                 }
  473.             }
  474.            
  475.             return crossoverKromosom;
  476.         }
  477.  
  478.         public List<Kromosom> Crossover_2(List<Kromosom> kromosom)
  479.         {
  480.            
  481.             int parent_1,parent_2;
  482.             Kromosom otac, majka;
  483.             List<Kromosom> crossoverKromosom = new List<Kromosom>();
  484.             List<Kromosom> potomci = new List<Kromosom>();
  485.  
  486.             RazbacajListu(kromosom);
  487.  
  488.             while(kromosom.Count>0){
  489.  
  490.                 parent_1 = random.Next(kromosom.Count);
  491.                 otac = kromosom[parent_1];
  492.                 do{
  493.                     parent_2 = random.Next(kromosom.Count);
  494.                     majka = kromosom[parent_2];
  495.                 }while(parent_2==parent_1);
  496.  
  497.                 potomci = Razmnozi(otac,majka);
  498.                 crossoverKromosom.Add(potomci[0]);
  499.                 crossoverKromosom.Add(potomci[1]);
  500.  
  501.                 kromosom.Remove(otac);
  502.                 kromosom.Remove(majka);
  503.             }
  504.  
  505.             return crossoverKromosom;
  506.         }
  507.  
  508.         private List<Kromosom> Razmnozi(Kromosom otac, Kromosom majka)
  509.         {
  510.             int crossOverChance = random.Next(11);
  511.             List<Kromosom> potomci = new List<Kromosom>();
  512.             Kromosom sin = new Kromosom(otac.Alele);
  513.             Kromosom kćer = new Kromosom(majka.Alele);
  514.  
  515.             bool[] maska = new bool[otac.Alele.Count];
  516.             for (int i = 0; i < otac.Alele.Count; i++)
  517.             {
  518.                 maska[i] = Convert.ToBoolean(random.Next(2));
  519.             }
  520.  
  521.             if (crossOverChance < 8)
  522.             {
  523.                 for (int i = 0; i < sin.Alele.Count; i++)
  524.                 {
  525.                     if (maska[i] == true)
  526.                         sin.Alele[i] = otac.Alele[i];
  527.                     else
  528.                         sin.Alele[i] = majka.Alele[i];
  529.                 }
  530.  
  531.                 for (int i = 0; i < otac.Alele.Count; i++)
  532.                 {
  533.                     maska[i] = Convert.ToBoolean(random.Next(2));
  534.                 }
  535.  
  536.                 //Kromosom temp = otac;
  537.                 //otac = majka;
  538.                 //majka = temp;
  539.  
  540.                 for (int i = 0; i < kćer.Alele.Count; i++)
  541.                 {
  542.                     if (maska[i] == true)
  543.                         kćer.Alele[i] = otac.Alele[i];
  544.                     else
  545.                         kćer.Alele[i] = majka.Alele[i];
  546.                 }
  547.             }
  548.  
  549.             potomci.Add(sin);
  550.             potomci.Add(kćer);
  551.             return potomci;
  552.         }
  553.  
  554.         private Kromosom Razmnozi_2(Kromosom otac, Kromosom majka)
  555.         {
  556.             int crossOverChance = random.Next(11);
  557.             Kromosom potomak = new Kromosom(otac.Alele);
  558.  
  559.             if (crossOverChance < 8)
  560.             {
  561.                 for (int i = 0; i < otac.Alele.Count; i++)
  562.                 {
  563.                     potomak.Alele[i] = (otac.Alele[i] + majka.Alele[i]) / 2;
  564.                 }
  565.             }
  566.             else
  567.                 potomak = Convert.ToBoolean( random.Next(2)) ? otac : majka;
  568.  
  569.             return potomak;
  570.  
  571.         }
  572.  
  573.         private void RazmjeniGene(Kromosom prvi, Kromosom drugi)
  574.         {
  575.            
  576.  
  577.             //////List<double> parent1 = new List<double>();
  578.             //////List<double> parent2 = new List<double>();
  579.             //////double[] djete1 = new double[11];
  580.             //////double[] djete2 = new double[11];
  581.  
  582.             //////if (random.Next(11) < 5)
  583.             //////{
  584.             //////    parent1 = prvi.Alele;
  585.             //////    parent2 = drugi.Alele;
  586.             //////    for (int i = 0; i < parent1.Count; i++)
  587.             //////    {
  588.             //////        djete1[i] = a * parent1[i] + (1 - a) * parent2[i];
  589.             //////        djete2[i] = (1 - a) * parent1[i] + a * parent2[i];
  590.             //////    }
  591.  
  592.             //////    List<double> offspring1 = djete1.OfType<double>().ToList();
  593.             //////    List<double> offspring2 = djete2.OfType<double>().ToList();
  594.  
  595.             //////    prvi.Alele = offspring1;
  596.             //////    drugi.Alele = offspring2;
  597.                 //    List<double> offspring1 = djete1.OfType<double>().ToList();
  598.                 //    List<double> offspring2 = djete2.OfType<double>().ToList();
  599.  
  600.                 //    kromosomiCrossover.Add(new Kromosom(offspring1));
  601.                 //    kromosomiCrossover.Add(new Kromosom(offspring2));
  602.  
  603.                 //    //kromosomiCrossover.Add(new Kromosom(offspring1));
  604.                 //    //kromosomiCrossover.Add(new Kromosom(offspring2));
  605.  
  606.             int crossOverChance = random.Next(11);
  607.            
  608.             if(crossOverChance<8){
  609.                 for (int i = 0; i < prvi.Alele.Count; i++)
  610.                 {
  611.                     int flipCoin=random.Next(2);
  612.                     if (flipCoin == 0)
  613.                         prvi.Alele[i] = drugi.Alele[i];
  614.                     if(flipCoin==1)
  615.                         drugi.Alele[i]=prvi.Alele[i];
  616.                 }
  617.             }
  618.             //////////////////////////int mjestoCrosssovera = random.Next(11);
  619.             //////////////////////////if (mjestoCrosssovera <= 7)
  620.             //////////////////////////{
  621.             //////////////////////////    for (int j = 0; j < mjestoCrosssovera; j++)
  622.             //////////////////////////    {
  623.  
  624.  
  625.  
  626.             //////////////////////////        //prvi.Alele[j] = drugi.Alele[j];
  627.  
  628.             //////////////////////////        //if (mjestoCrosssovera > 0)
  629.             //////////////////////////        //{
  630.             //////////////////////////        //    for (int i = mjestoCrosssovera; i < prvi.Alele.Count; i++)
  631.             //////////////////////////        //        drugi.Alele[i] = prvi.Alele[i];
  632.             //////////////////////////        //}
  633.             //////////////////////////    }
  634.             //////////////////////////}
  635.         }
  636.  
  637.         public void Mutation(List<Kromosom> kromosom, int korak)
  638.         {
  639.             double tempMutation = 0.0;
  640.             double f = 0.0;
  641.             int tempRandLocation;
  642.  
  643.             for (int i = 0; i < kromosom.Count; i++)
  644.             {
  645.                 tempMutation = random.NextDouble();
  646.                 if (korak < 10)
  647.                 {
  648.                     if (tempMutation < 0.3)
  649.                     {
  650.                         tempRandLocation = random.Next(11);
  651.                         f = random.NextDouble() * 2000 - 1000;
  652.                         kromosom[i].Alele[tempRandLocation] = f;
  653.                        
  654.                     }
  655.                 }
  656.                 else
  657.                 {
  658.                     if (tempMutation < 0.05)
  659.                     {
  660.                         for (int l  = 0; l < kromosom[i].Alele.Count; l++)
  661.                         {
  662.                             //tempRandLocation = random.Next(11);
  663.                             f = random.NextDouble() * 2000 - 1000;
  664.                             kromosom[i].Alele[l] = f;
  665.                         }
  666.                     }
  667.                 }
  668.  
  669.                 //if (korak < 5)
  670.                 //{
  671.                 //    if (tempMutation <= 0.3)
  672.                 //    {
  673.                 //        int tempRandLocation = random.Next(11);
  674.                 //        kromosom[i].Alele[tempRandLocation] -= kromosom[i].Alele[tempRandLocation] * 0.5;
  675.                 //    }
  676.                 //}
  677.                 //else
  678.                 //{
  679.                 //    if (tempMutation <= 0.1)
  680.                 //    {
  681.                 //        int tempRandLocation = random.Next(11);
  682.                 //        kromosom[i].Alele[tempRandLocation] -= kromosom[i].Alele[tempRandLocation] * 0.3;
  683.                 //    }
  684.                 //}
  685.             }
  686.         }
  687.  
  688.         public double RacunajRazlikuFitnesaGeneracija(List<Kromosom> prvaGeneracija, List<Kromosom> drugaGeneracija)
  689.         {
  690.             double tempPrvaGeneracija = 0;
  691.             foreach (var kromosom in prvaGeneracija)
  692.                 tempPrvaGeneracija += kromosom.TempFitnes;
  693.             tempPrvaGeneracija /= prvaGeneracija.Count;
  694.            
  695.             double tempDrugaGeneracija = 0;
  696.             foreach (var kromosom in drugaGeneracija)
  697.                 tempDrugaGeneracija += kromosom.TempFitnes;
  698.             tempDrugaGeneracija /= drugaGeneracija.Count;
  699.  
  700.             double t=Math.Abs (tempDrugaGeneracija - tempPrvaGeneracija);
  701.             double m = 1 / t;
  702.             return m;
  703.         }
  704.  
  705.         public bool StoppageCriterion(Kromosom najboljiKromosom, List<Kromosom> njegoviSuborci)
  706.         {
  707.             int konvergirani = 0; //nekonvergirani=0;
  708.             foreach (var kromosom in njegoviSuborci)
  709.             {
  710.                 if (kromosom.TempFitnes >= najboljiKromosom.TempFitnes*0.99)
  711.                     konvergirani++;
  712.                 //if (kromosom.TempFitnes < najboljiKromosom.TempFitnes * 0.99)
  713.                 //    nekonvergirani++;
  714.             }
  715.  
  716.             double omjer = Convert.ToDouble( konvergirani) / Convert.ToDouble( njegoviSuborci.Count);
  717.             if (omjer >= 0.95)
  718.                 return true;
  719.             else
  720.                 return false;
  721.         }
  722.  
  723.         public void RazbacajListu(List<Kromosom> kromosom)
  724.         {
  725.             int n = kromosom.Count;
  726.            
  727.             while (n > 1)
  728.             {
  729.                 int k = (random.Next(0, n) % n);
  730.                 n--;
  731.                 Kromosom value = kromosom[k];
  732.                 kromosom[k] = kromosom[n];
  733.                 kromosom[n] = value;
  734.             }
  735.         }
  736.  
  737.         public double RacunajVarijancu(List<Kromosom> kromosom)
  738.         {
  739.             double meanOfThePopulation = 0.0;
  740.             for (int i = 0; i <kromosom.Count ; i++)
  741.             {
  742.                 meanOfThePopulation += kromosom[i].TempFitnes;
  743.             }
  744.             meanOfThePopulation /= kromosom.Count;
  745.  
  746.             double zbrojKvadrataRazlika = 0.0;
  747.             for (int i = 0; i < kromosom.Count; i++)
  748.             {
  749.                 zbrojKvadrataRazlika += Math.Pow((kromosom[i].TempFitnes-meanOfThePopulation),2);
  750.             }
  751.  
  752.             double varijance = zbrojKvadrataRazlika / kromosom.Count;
  753.             return varijance;
  754.         }
  755.  
  756.         private Kromosom VratiRazlicitKromosom(List<Kromosom> kromosom)
  757.         {
  758.             Kromosom novaJedinka;
  759.  
  760.             do
  761.             {
  762.                 novaJedinka = new Kromosom(random);
  763.                
  764.             }while(CheckSimilarFitnes(kromosom,novaJedinka)==true);
  765.  
  766.             return novaJedinka;
  767.         }
  768.  
  769.         private bool CheckSimilarFitnes(List<Kromosom> kromosom, Kromosom zaIspitat)
  770.         {
  771.             Boolean flag=false;
  772.             double fitIzListe, fitIzJedinke;
  773.             double fitVeći,fitManji;
  774.             int counter = 0;
  775.  
  776.             foreach (var jedinka in kromosom)
  777.             {  
  778.                 fitIzListe = jedinka.RacunajFitnesKromosoma(jedinka.Alele);
  779.                 fitIzJedinke = zaIspitat.RacunajFitnesKromosoma(zaIspitat.Alele);
  780.                 fitVeći = fitIzListe >= fitIzJedinke ? fitIzListe : fitIzJedinke;
  781.                 fitManji = fitIzListe < fitIzJedinke ? fitIzListe : fitIzJedinke;
  782.  
  783.                 if ((fitVeći / fitManji) < 1.5)
  784.                     counter++;
  785.             }
  786.  
  787.             if (counter <= 2)
  788.                 return false;
  789.             else return true;
  790.            
  791.         }
  792.  
  793.         public bool ProvjeriKonvergenciju(List<Kromosom> kromosom, Kromosom najbolji)
  794.         {
  795.             double avgFitnesSvih = 0.0;
  796.             foreach (var jedinka in kromosom)
  797.             {
  798.                 avgFitnesSvih += jedinka.TempFitnes;
  799.             }
  800.             avgFitnesSvih /= kromosom.Count;
  801.  
  802.             if (avgFitnesSvih > najbolji.TempFitnes * 0.95)
  803.                 return true;
  804.             else
  805.                 return false;
  806.         }
  807.     }
  808. }
  809. CLASS FORM1 (WIN FORMS)
  810. ___________________________________________________________________________________________________________
  811. using System;
  812. using System.IO;
  813. using System.Collections.Generic;
  814. using System.ComponentModel;
  815. using System.Data;
  816. using System.Drawing;
  817. using System.Linq;
  818. using System.Text;
  819. using System.Windows.Forms;
  820.  
  821. namespace Određivanje_Koeficijenata
  822. {
  823.     public partial class Form1 : Form
  824.     {
  825.         List<Kromosom> ruletKromosom, crossoverKromos, prethodnaGeneracijaKromosom;
  826.         Kromosom najboljiKromosomUGeneraciji, najboljiKromosomUPrethodnojGeneraciji;
  827.         Genotip genotip;
  828.         public Form1()
  829.         {
  830.             InitializeComponent();
  831.             //ruletKromosom = new List<Kromosom>();
  832.  
  833.         }
  834.  
  835.         private void button1_Click(object sender, EventArgs e)
  836.         {
  837.             genotip = new Genotip((int)numericUpDown_nrOfChrmosomes.Value,"Ave maria");
  838.             genotip.RacunajFunkcijuFitnesa(genotip.kromosom);
  839.             double varijancaInicijalna = genotip.RacunajVarijancu(genotip.kromosom);
  840.  
  841.             int k = 0;
  842.             for (int i = 0; i < genotip.kromosom.Count; i++)
  843.             {
  844.                 k = i + 1;
  845.                 chart_initalPopulation.Series[0].Points.AddXY(k,genotip.kromosom[i].TempFitnes);
  846.             }
  847.  
  848.             double tempMax = 0;
  849.             foreach (var kromosom in genotip.kromosom)
  850.             {
  851.                 if (kromosom.TempFitnes > tempMax)
  852.                 {
  853.                     tempMax = kromosom.TempFitnes;
  854.                     najboljiKromosomUPrethodnojGeneraciji = kromosom;
  855.                 }
  856.             }
  857.          
  858.             int korak=0;
  859.             double tempMaxFitnes=0.0;
  860.             double varijancePrethodneGene = 0.0, varijance = 0.0;
  861.             TextWriter tw_0 = new StreamWriter("varijance.txt");
  862.             tw_0.Write("Varijanca prve generacije: ");
  863.             tw_0.WriteLine(varijancaInicijalna);
  864.             string varijanca = "";
  865.  
  866.             do
  867.             {
  868.                 if(korak!=0)
  869.                 //najboljiKromosomUPrethodnojGeneraciji = najboljiKromosomUGeneraciji;
  870.                 varijancePrethodneGene = genotip.RacunajVarijancu(genotip.kromosom);
  871.                 genotip.RacunajFunkcijuSelekcije(genotip.kromosom);
  872.                 //prethodnaGeneracijaKromosom = genotip.kromosom;
  873.                 ruletKromosom = genotip.ProbabilisticBinaryTournamentSelection(genotip.kromosom);
  874.                 //ruletKromosom = genotip.RacunajFunkcijuRuleta(genotip.kromosom,(int)numericUpDown_nrOfChrmosomes.Value);
  875.                 //ruletKromosom.Sort();
  876.                 //crossoverKromos = genotip.Crossover(ruletKromosom);
  877.                 crossoverKromos = genotip.Crossover_2(ruletKromosom);
  878.                 genotip.Mutation(crossoverKromos,korak);
  879.                 genotip.RacunajFunkcijuFitnesa(crossoverKromos);
  880.  
  881.                
  882.                 varijance= genotip.RacunajVarijancu(crossoverKromos);
  883.                 varijanca += varijance + "\n\r";
  884.                
  885.  
  886.                 //crossoverKromos.Sort();
  887.                
  888.                 //if(crossoverKromos[crossoverKromos.Count-1].TempFitnes>najboljiKromosomUGeneraciji.TempFitnes)
  889.                 //najboljiKromosomUGeneraciji = crossoverKromos[crossoverKromos.Count - 1];
  890.                
  891.                 foreach (var kromosom in crossoverKromos)
  892.                 {
  893.                     if (kromosom.TempFitnes > tempMaxFitnes)
  894.                     {
  895.                        
  896.                         tempMaxFitnes = kromosom.TempFitnes;
  897.                         najboljiKromosomUGeneraciji = kromosom;
  898.                     }
  899.                 }
  900.  
  901.                 //List<Kromosom> tempListaKromosoma = new List<Kromosom>(genotip.kromosom);
  902.                 genotip.kromosom = crossoverKromos;
  903.                 korak++;
  904.  
  905.                 } while (genotip.ProvjeriKonvergenciju(genotip.kromosom,najboljiKromosomUGeneraciji)==false);
  906.  
  907.             tw_0.Write("Varijanca zadnje generacije: ");
  908.             tw_0.WriteLine(varijanca);
  909.             tw_0.Close();
  910.  
  911.             int p = 0;
  912.             for (int i = 0; i < genotip.kromosom.Count; i++)
  913.             {
  914.                 p = i + 1;
  915.                 chart_lastPopulation.Series[0].Points.AddXY(p, genotip.kromosom[i].TempFitnes);
  916.             }
  917.  
  918.             TextWriter tw = new StreamWriter("beta.txt");
  919.             for (int i = 0; i < najboljiKromosomUGeneraciji.Alele.Count; i++)
  920.  
  921.             {
  922.                 tw.Write(najboljiKromosomUGeneraciji.Alele[i] + " ");
  923.             }
  924.  
  925.             tw.Close();
  926.             //najboljiKromosomUGeneraciji.TempFitnes!=najboljiKromosomUPrethodnojGeneraciji.TempFitnes
  927.             MessageBox.Show("Rjesenje nadjeno", "BINGO");
  928.            
  929.             MessageBox.Show("Pronadjeni su koeficijenti\n b0:"+najboljiKromosomUGeneraciji.Alele[0]+
  930.                             "\n b1:"+najboljiKromosomUGeneraciji.Alele[1]+
  931.                             "\n b2:"+najboljiKromosomUGeneraciji.Alele[2]+
  932.                             "\n b3:"+najboljiKromosomUGeneraciji.Alele[3]+
  933.                             "\n b4:"+najboljiKromosomUGeneraciji.Alele[4]+
  934.                             "\n b5:"+najboljiKromosomUGeneraciji.Alele[5]+
  935.                             "\n b6:"+najboljiKromosomUGeneraciji.Alele[6]+
  936.                             "\n b7:"+najboljiKromosomUGeneraciji.Alele[7]+
  937.                             "\n b8:"+najboljiKromosomUGeneraciji.Alele[8]+
  938.                             "\n b9:"+najboljiKromosomUGeneraciji.Alele[9]+
  939.                             "\n b10:"+najboljiKromosomUGeneraciji.Alele[10]);
  940.             }
  941.     }
  942. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement