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())); }
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); }
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); }
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); }
public override Dictionary <string, float[]> FunkcjaDopasowania(ReprezentacjaRozwiazania reprezentacjaGenotypu) { return(problemOptymalizacyjny.ObliczZysk(Fenotyp(reprezentacjaGenotypu.ZwrocGenotyp1Wymiarowy()))); }
public override string DekodujRozwiazanie(ReprezentacjaRozwiazania reprezentacjaGenotypu) { // kolejność wyboru miast zapisywana jest po spacjach return(string.Join(" ", reprezentacjaGenotypu.ZwrocGenotyp1Wymiarowy())); }
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))); }