function geneticoptimize($domain, $origin, $people, $flights, $destination, $popsize = 50, $step=1, $mutprob=0.2, $elite=0.2, $maxiter = 100) { function mutate($vec, $domain, $step) { $i = rand(0, (count($domain) - 1)); $rand = rand(1,10000)/10000; if(($rand < 0.5) && ($vec[$i] > $domain[$i][0])) { $vec[$i] = $vec[$i] - $step; return $vec; } elseif($vec[$i] < $domain[$i][1]) { $vec[$i] = $vec[$i] + $step; return $vec; } } function crossover($r1, $r2, $domain) { $i = rand(1, (count($domain) - 2)); for($k = 0; $k < $i; $k++){ $r2[$k] = $r1[$k]; } return $r2; } $pop = array(); for($y = 0; $y < $popsize; $y++){ $vec = array(); for($s = 0; $s < count($domain); $s++) { $vec[] = rand($domain[$s][0], $domain[$s][1]); } $pop[] = $vec; } $topelite = floor($elite*$popsize); for($g=0; $g<$maxiter; $g++){ $scores = array(); foreach($pop as $key => $v){ if(!empty($v)){ $scores[]=array(schedulecost($v, $origin, $people, $flights, $destination), $v); } } sort($scores); $pop = $ranked = array(); foreach($scores as $key => $v) { $ranked[] = $v[1]; } foreach($ranked as $v){ $pop[] = $v; if(count($pop) == $topelite) { break; } } while(count($pop) <= $popsize) { $randrand = rand(1,10000)/10000; if($randrand < $mutprob){ $c = rand(0, $topelite); $pop[] = mutate($ranked[$c], $domain, $step); }else{ $c1 = rand(0, $topelite); $c2 = rand(0, $topelite); $pop[] = crossover($ranked[$c1], $ranked[$c2], $domain); } } print $scores[0][0] . '<br />'; } return $scores[0][1]; } $result = geneticoptimize($domain, $origin, $people, $flights, $destination, $popsize = 50, $step=1, $mutprob=0.2, $elite=0.2, $maxiter = 100); var_dump($result); die(); $cost = schedulecost($result, $origin, $people, $flights, $destination); var_dump($cost); $schedule = printschedule($result, $people, $flights, $destination); var_dump($schedule);