| 4 | |
| 5 | |
| 6 | def evolution_strategy( |
| 7 | f, |
| 8 | population_size, |
| 9 | sigma, |
| 10 | lr, |
| 11 | initial_params, |
| 12 | num_iters): |
| 13 | |
| 14 | # assume initial params is a 1-D array |
| 15 | num_params = len(initial_params) |
| 16 | reward_per_iteration = np.zeros(num_iters) |
| 17 | |
| 18 | params = initial_params |
| 19 | for t in range(num_iters): |
| 20 | N = np.random.randn(population_size, num_params) |
| 21 | R = np.zeros(population_size) # stores the reward |
| 22 | |
| 23 | # loop through each "offspring" |
| 24 | for j in range(population_size): |
| 25 | params_try = params + sigma*N[j] |
| 26 | R[j] = f(params_try) |
| 27 | |
| 28 | m = R.mean() |
| 29 | A = (R - m) / R.std() |
| 30 | reward_per_iteration[t] = m |
| 31 | params = params + lr/(population_size*sigma) * np.dot(N.T, A) |
| 32 | |
| 33 | return params, reward_per_iteration |
| 34 | |
| 35 | |
| 36 | def reward_function(params): |