def fitness(individual, numbers, classes): """procedure to compute evolutionary fitness""" correct = 0.0 p = fernpy.point1() for index, number in enumerate(numbers): p[0] = number if individual.query(p) == classes[index]: correct += 1.0 return correct
def simulate(t_final, dt, control=None, state0=None, thrust=.5): """simulates a satellite (with event detection)""" if control is None: control = OptimalController() if state0 is None: state0 = random_state() state_tolerance = .01 y_out, t_out = [], [] solver = scipy.integrate.ode(f).set_integrator('dopri5') #vode cannot run in parallel solver.set_initial_value(state0, 0.0) #thinks state0 has only one number in it? p = fernpy.point1() max_time = time.clock() + 0.1 while solver.t < t_final and solver.successful(): #select a control mode by setting torque p[0] = solver.y[0] mode = control.query(p) if mode is 0: solver.set_f_params(0.0) elif mode is 1: solver.set_f_params(-thrust) elif mode is 2: solver.set_f_params(thrust) if sum(abs(solver.y)) < state_tolerance: #dead zone around (0,0) solver.set_f_params(0.0) #run forward as far as possible while solver.successful() and solver.t < t_final: y_out.append(solver.y) t_out.append(solver.t) solver.integrate(solver.t + dt) #if abs(solver.y[0]) > pi: # solver.set_initial_value(roll(solver.y), solver.t) p[0] = solver.y[0] if sum(abs(solver.y)) < state_tolerance: solver.set_f_params(0.0) elif control.query(p) != mode: #print p, ", stopping at t = ", solver.t break #check if simulation is done if solver.t >= t_final or time.clock() > max_time or not solver.successful(): y_out.append(solver.y) t_out.append(solver.t) break #go back one step, cut step size in half until switch time is known solver.set_initial_value(y_out[-1], t_out[-1]) bisect_step = dt / 2.0 while solver.successful(): #program hangs here somewhere y_current, t_current = solver.y, solver.t solver.integrate(solver.t + bisect_step) #if abs(solver.y[0]) > pi: #two if statements interacting to stop break # solver.set_initial_value(roll(solver.y), solver.t) p[0] = solver.y[0] #sys.stdout.write("\rstep size: %f" % bisect_step) #sys.stdout.flush() if control.query(p) != mode: if bisect_step < 0.001: break solver.set_initial_value(y_current, t_current) bisect_step /= 2.0 if time.clock() > max_time: break if time.clock() > max_time: #solver hit time limit break #if solver hit the time limit if t_out[-1] < t_final: y_out.append(solver.y*1000) t_out.append(t_final) return numpy.array(y_out), t_out