Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- protected function doOnePtCrossover(Chromosome $Chrom1, Chromosome $Chrom2) {
- $genesX = /* @var $Chrom1 Solution */ $Chrom1->genes;
- $genesY = /* @var $Chrom2 Solution */ $Chrom2->genes;
- $chromsLeftX = array();
- $chromsLeftY = array();
- $lPoint = mt_rand(1, $this->chromosomeDim - 2);
- $rPoint = $this->chromosomeDim - 1;
- for ($i = $lPoint; $i < $rPoint; ++$i){
- $tmpX = $genesX[$i];
- $tmpY = $genesY[$i];
- $genesX[$i] = $tmpY;
- $genesY[$i] = $tmpX;
- @$chromsLeftX[$tmpX] -= 1;
- @$chromsLeftX[$tmpY] += 1;
- @$chromsLeftY[$tmpY] -= 1;
- @$chromsLeftY[$tmpX] += 1;
- }
- //remove dulicates, satisfy demands
- $minIdxX = $rPoint;
- $minIdxY = $rPoint;
- $chromsLeftX = array_filter($chromsLeftX);
- $chromsLeftY = array_filter($chromsLeftY);
- arsort($chromsLeftX);
- arsort($chromsLeftY);
- for ($run = true, $i = 0; $run && $i <= $rPoint; ++$i) {
- $run = false;
- if(!empty($chromsLeftX)){
- $tmpX = $genesX[$i];
- if (isset($chromsLeftX[$tmpX]) && $chromsLeftX[$tmpX] > 0) {
- end($chromsLeftX);
- $genesX[$i] = ($key = key($chromsLeftX));
- if (--$chromsLeftX[$tmpX] === 0) unset($chromsLeftX[$tmpX]);
- if (++$chromsLeftX[$key] === 0) unset($chromsLeftX[$key]);
- if ($i < $minIdxX) $minIdxX = $i;
- }
- $run = true;
- }
- if(!empty($chromsLeftY)){
- $tmpY = $genesY[$i];
- if (isset($chromsLeftY[$tmpY]) && $chromsLeftY[$tmpY] > 0) {
- end($chromsLeftY);
- $genesY[$i] = ($key = key($chromsLeftY));
- if (--$chromsLeftY[$tmpY] === 0) unset($chromsLeftY[$tmpY]);
- if (++$chromsLeftY[$key] === 0) unset($chromsLeftY[$key]);
- if ($i < $minIdxY) $minIdxY = $i;
- }
- $run = true;
- }
- }
- $Chrom1->recalculateHighlyFitPatterns($minIdxX);
- $Chrom2->recalculateHighlyFitPatterns($minIdxY);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement