コード例 #1
0
ファイル: RekombinacjaTSP.cs プロジェクト: lqasz/BiPA
        public override ReprezentacjaRozwiazania Krzyzowanie(ReprezentacjaRozwiazania genotyp1, ReprezentacjaRozwiazania genotyp2)
        {
            // zwrócenie rozwiązań dla wektora rozwiązania Problemu Komiwojażera
            ushort[] przodek1 = genotyp1.ZwrocGenotyp1Wymiarowy(),
            przodek2 = genotyp2.ZwrocGenotyp1Wymiarowy(),
            potomek  = new ushort[przodek1.Length];

            // określenie rodzaju krzyżowania dla Problemu Komiwojażera
            switch (rodzajKrzyzowania)
            {
            case "PMX":
                potomek = (ushort[])PMX(przodek1, przodek2).Clone();
                break;

            case "OX":
                potomek = (ushort[])OX(przodek1, przodek2).Clone();
                break;

            case "CX":
                potomek = (ushort[])CX(przodek1, przodek2).Clone();
                break;

            default:
                throw new Exception();
            }

            return(new ReprezentacjaRozwiazania((ushort[])Mutacja(potomek).Clone()));
        }
コード例 #2
0
        public override ReprezentacjaRozwiazania Krzyzowanie(ReprezentacjaRozwiazania genotyp1, ReprezentacjaRozwiazania genotyp2)
        {
            // pobranie wektorów rozwiązań dla Problemu Plecakowego
            ushort[] przodek1 = genotyp1.ZwrocGenotyp1Wymiarowy(),
            przodek2 = genotyp2.ZwrocGenotyp1Wymiarowy(),
            dzieciak = new ushort[przodek1.Length];

            // punkt w którym tniemy dwa wektory rozwiązań
            int ciecie = losowy.Next(0, przodek1.Length);

            dzieciak = (ushort[])przodek1.Clone(); // przepisanie 1 do 1 genów z pierwszego przodka
            for (int i = 0; i < ciecie; i++)
            {
                try
                {
                    dzieciak[i] = przodek2[i]; // od puktu cięcia zmiana genów na te z przo drugiego
                } catch (System.Exception e)
                {
                    System.Console.WriteLine(e);
                    System.Console.WriteLine(dzieciak.Length + " " + dzieciak[i]);
                    System.Console.WriteLine(przodek2.Length + " " + przodek2[i]);
                }
            }

            ReprezentacjaRozwiazania genotypDziecka = new ReprezentacjaRozwiazania((ushort[])Mutacja(dzieciak).Clone());

            if (czySprawdzacOgraniczenia)
            {
                return(SprawdzNaruszenieOgraniczen(genotypDziecka)); // sprawdzanie czy nie przekraczamy wagi plecaka
            }

            return(genotypDziecka);
        }
コード例 #3
0
        protected override ReprezentacjaRozwiazania SprawdzNaruszenieOgraniczen(ReprezentacjaRozwiazania genotyp)
        {
            ushort[] geny         = genotyp.ZwrocGenotyp1Wymiarowy();
            float[]  ograniczenie = rozwiazanie.ZwrocInstancjeProblemu().ZwrocOgraniczeniaProblemu();

            // naprawa genów do momentu spełniania ograniczeń
            while (rozwiazanie.FunkcjaDopasowania(genotyp)["min"][0] > ograniczenie[0])
            {
                genotyp.ZmienGenotyp((ushort[])NaprawGenotypKP(geny).Clone());
            }

            return(genotyp);
        }
コード例 #4
0
ファイル: OsobnikKP.cs プロジェクト: lqasz/BiPA
        public override string DekodujRozwiazanie(ReprezentacjaRozwiazania reprezentacjaGenotypu)
        {
            string wynik = "";

            ushort[] genotyp = reprezentacjaGenotypu.ZwrocGenotyp1Wymiarowy();

            // każdy z wybranych przedmiotów jest zapisywany w rozwiązaniu po spacji
            for (int i = 1; i <= genotyp.Length; i++)
            {
                // tylko wybrane przedmioty
                if (genotyp[i - 1] == 1)
                {
                    wynik += (i + " ");
                }
            }

            return(wynik);
        }
コード例 #5
0
ファイル: OsobnikKP.cs プロジェクト: lqasz/BiPA
 public override Dictionary <string, float[]> FunkcjaDopasowania(ReprezentacjaRozwiazania reprezentacjaGenotypu)
 {
     return(problemOptymalizacyjny.ObliczZysk(Fenotyp(reprezentacjaGenotypu.ZwrocGenotyp1Wymiarowy())));
 }
コード例 #6
0
 public override string DekodujRozwiazanie(ReprezentacjaRozwiazania reprezentacjaGenotypu)
 {
     // kolejność wyboru miast zapisywana jest po spacjach
     return(string.Join(" ", reprezentacjaGenotypu.ZwrocGenotyp1Wymiarowy()));
 }
コード例 #7
0
ファイル: RekombinacjaTTP.cs プロジェクト: lqasz/BiPA
        public override ReprezentacjaRozwiazania Krzyzowanie(ReprezentacjaRozwiazania genotyp1, ReprezentacjaRozwiazania genotyp2)
        {
            ushort[][] przodek1 = genotyp1.ZwrocGenotyp2Wymiarowy(),
            przodek2      = genotyp2.ZwrocGenotyp2Wymiarowy(),
            potomekTTP    = new ushort[przodek1.Length][],
            przodkowieTSP = new ushort[2][];
            ushort[][][] przodkowieKP = new ushort[przodek1.Length][][];

            for (int i = 0; i < przodkowieTSP.Length; i++)
            {
                przodkowieTSP[i] = new ushort[przodek1.Length];
                przodkowieKP[i]  = new ushort[przodek1.Length][];

                for (int j = 0; j < przodek1.Length; j++)
                {
                    przodkowieTSP[i][j] = (i == 0) ? przodek1[j][0] : przodek2[j][0];

                    int index = ((przodkowieTSP[i][j] - 1) == 0 && j != 0) ? przodek1.Length - 1 : przodkowieTSP[i][j] - 1;
                    przodkowieKP[i][index] = new ushort[przodek1[0].Length - 1];

                    for (int k = 1; k <= przodkowieKP[i][index].Length; k++)
                    {
                        przodkowieKP[i][index][k - 1] = (i == 0) ? przodek1[j][k] : przodek2[j][k];
                    }
                }
            }

            ReprezentacjaRozwiazania przodekTSP1       = new ReprezentacjaRozwiazania(przodkowieTSP[0]),
                                     przodekTSP2       = new ReprezentacjaRozwiazania(przodkowieTSP[1]),
                                     genotypPotomkaTSP = rekombinacjaTSP.Krzyzowanie(przodekTSP1, przodekTSP2);

            ushort[]   potomekTSP   = genotypPotomkaTSP.ZwrocGenotyp1Wymiarowy();
            ushort[][] potomkowieKP = new ushort[przodek1.Length][];

            for (int i = 0; i < przodek1.Length; i++)
            {
                ReprezentacjaRozwiazania przodekKP1 = new ReprezentacjaRozwiazania(przodkowieKP[0][i]),
                                         przodekKP2 = new ReprezentacjaRozwiazania(przodkowieKP[1][i]);

                potomkowieKP[i] = new ushort[przodkowieKP[0].Length];
                ReprezentacjaRozwiazania genotypPotomkaKP = rekombinacjaKP.Krzyzowanie(przodekKP1, przodekKP2);
                potomkowieKP[i] = genotypPotomkaKP.ZwrocGenotyp1Wymiarowy();
            }

            ushort[][] dostepnoscPrzedmiotow = rozwiazanie.ZwrocInstancjeProblemu().ZwrocDostepnePrzedmioty();

            for (int i = 0; i < potomekTSP.Length; i++)
            {
                int index = potomekTSP[i] - 1;
                potomekTTP[i]    = new ushort[potomkowieKP[0].Length + 1];
                potomekTTP[i][0] = potomekTSP[i];

                for (int j = 1; j <= potomkowieKP[0].Length; j++)
                {
                    potomekTTP[i][j] = potomkowieKP[index][(j - 1)];
                }

                potomekTTP[i] = (ushort[])(Mutacja(potomekTTP[i], dostepnoscPrzedmiotow[index]).Clone());
            }

            return(SprawdzNaruszenieOgraniczen(new ReprezentacjaRozwiazania(potomekTTP)));
        }