void GenAlg::mutate(std::vector<float> &chromo) { for(int i = 0; i < chromo.size(); ++i) { if(abs(small_rand()) < mutation_rate) { chromo[i] += small_rand() * my_params.perterbation; } } }
GenAlg::GenAlg(parameters &my_params , int number_weights) : my_params(my_params) { pop_size = my_params.num_sweepers; mutation_rate = my_params.mutation_rate; crossover_rate = my_params.crossover_rate; weights_per_chromo = number_weights; total_fitness = 0; best_fitness = 0; average_fitness = 0; worst_fitness = 99999999; generation_count = 0; //generate random weights for initial population for(int i = 0; i < pop_size; ++i) { population.push_back(Genome()); for(int j = 0; j < weights_per_chromo; ++j) { population[i].weights.push_back(small_rand()); } } }
void AircraftSim::update_state() { const GlidePolar &glide_polar = task_manager.get_glide_polar(); const ElementStat stat = task_manager.get_stats().current_leg; switch (acstate) { case Cruise: case FinalGlide: if (positive(stat.solution_remaining.VOpt)) { state.TrueAirspeed = stat.solution_remaining.VOpt*speed_factor; } else { state.TrueAirspeed = glide_polar.get_VbestLD(); } state.Vario = -glide_polar.SinkRate(state.TrueAirspeed)*parms.sink_factor; update_bearing(); break; case Climb: state.TrueAirspeed = glide_polar.get_Vmin(); bearing += Angle::degrees(fixed_20+small_rand()); state.Vario = climb_rate*parms.climb_factor; break; }; state.NettoVario = state.Vario+glide_polar.SinkRate(state.TrueAirspeed); }
void GenAlg::crossover(const std::vector<float> &mother, const std::vector<float> &father, std::vector<float> &child1, std::vector<float> &child2) { if(abs(small_rand()) > crossover_rate || mother == father) { child1 = mother; child2 = father; } else { int crossover_point = rand() % weights_per_chromo - 1; for(int i = 0; i < crossover_point; ++i) { child1.push_back(mother[i]); child2.push_back(father[i]); } for(int i = crossover_point; i < mother.size(); ++i) { child1.push_back(father[i]); child2.push_back(mother[i]); } } }
void AircraftSim::update_bearing() { const ElementStat stat = task_manager.get_stats().current_leg; Angle bct = stat.solution_remaining.CruiseTrackBearing; if (goto_target && (awp>0)) { bearing = stat.solution_remaining.Vector.Bearing; if (enable_bestcruisetrack && (stat.solution_remaining.Vector.Distance>fixed_1000)) { bearing = bct; } } else { bearing = state.Location.bearing(target()); } if (positive(state.wind.norm) && positive(state.TrueAirspeed)) { const fixed sintheta = (state.wind.bearing-bearing).sin(); if (fabs(sintheta)>fixed(0.0001)) { bearing += Angle::radians(asin(sintheta * state.wind.norm / state.TrueAirspeed)); } } bearing += Angle::degrees(small_rand()); }