private KromosomDouble HeuristicCrossover(KromosomDouble kromosom1, KromosomDouble kromosom2) { double a = GenerirajSelekcija(1, _rand); KromosomDouble dijete1 = new KromosomDouble(); KromosomDouble bolji, losiji; if (kromosom1._dobrota < kromosom2._dobrota) { bolji = kromosom2; losiji = kromosom1; } else { bolji = kromosom1; losiji = kromosom2; } for (int i = 0; i < _dimenzionalnost; i++) { double val = a * (bolji.Rjesenje(i) - losiji.Rjesenje(i)) + bolji.Rjesenje(i); if (Math.Abs(val) > 20) // WARNING, heuristicni zna izletit { val = GenerirajSelekcija(1, _rand); } dijete1.PostaviRjesenje(i, val); } return(dijete1); }
private KromosomDouble SimpleArithmeticRecombination(KromosomDouble kromosom1, KromosomDouble kromosom2) { int position = (int)GenerirajSelekcija(_dimenzionalnost, _rand); KromosomDouble dijete1 = new KromosomDouble(); KromosomDouble dijete2 = new KromosomDouble(); for (int i = 0; i < position; i++) { dijete1.PostaviRjesenje(i, kromosom1.Rjesenje(i)); } for (int i = position; i < _dimenzionalnost; i++) { double val = (kromosom1.Rjesenje(i) + kromosom2.Rjesenje(i)) / 2; dijete1.PostaviRjesenje(i, val); } return(dijete1); }
private KromosomDouble SimulatedBinaryCrossover(KromosomDouble kromosom1, KromosomDouble kromosom2) { double alfa = GenerirajSelekcija(1, _rand); KromosomDouble dijete1 = new KromosomDouble(); for (int i = 0; i < _dimenzionalnost; i++) { double val = alfa * kromosom1.Rjesenje(i) + (1 - alfa) * kromosom2.Rjesenje(i); dijete1.PostaviRjesenje(i, val); } return(dijete1); }
private KromosomDouble Mutacija1(KromosomDouble kr) { for (int i = 0; i < _dimenzionalnost; i++) { double vjv = GenerirajSelekcija(1, _rand); if (vjv <= _vjvMutKomp1) { var val = Distribucije.Normalna(0, _sigma1); kr.PostaviRjesenje(i, val); } } return(kr); }