我无法在代码中找到错误以使mu,lambda ES的Rosenbrock函数收敛于最小值。 我的代码是
def rosenbrock(x):
return np.sum((1-x[:-1])**2 + 100*(x[1:] - x[:-1]**2)**2, axis=0)
def ES(N=5, mu=2, lambda_=100, generations=100, epsilon0=0.001):
eps0 = epsilon0
mu = mu
lamb = lambda_
leng = N
tau = 1 / np.power(leng,0.5)
taup = 1 / np.power(leng,0.25)
gens = generations
epsilon = 0.0
epsilonp = 0.0
pop = []
run_stats = []
for pare in range(mu):
init_gen = init_generation(leng)
pop.append(init_gen)
for gen in range(gens):
kids = generate_children(pop, lamb, tau, taup, eps0)
pop, fitness = get_fittest(kids, mu, leng)
run_stats.append(fitness)
return run_stats
def get_fittest(kids, mu, leng):
new_pop = []
fittest = []
best_fitness = []
tot_len = leng *2
for k in kids:
tot_len = int(len(k)/2)
fitness = rosenbrock(k[:tot_len])
fittest.append(fitness)
for min_fit in range(mu):
minpos = fittest.index(min(fittest))
best_fitness.append(min(fittest))
par = kids[minpos]
new_pop.append(par)
del fittest[minpos]
del kids[minpos]
b_fit = best_fitness[0]
return new_pop, b_fit
def generate_children(pop, lam, tau, taup, eps0):
children = []
pop_mem = int(len(pop))
for x in range(lam):
cur_p = np.random.randint(pop_mem)
child = mutate_child(pop[cur_p], tau, taup, eps0)
children.append(child)
return children
def mutate_child(child, tau, taup, eps0):
ch_len = int(len(child)/2)
sig_values = child[ch_len:]
old_omega= child[:ch_len]
e_si = np.random.uniform(0, tau, size=(ch_len))
e_si_prime = np.random.uniform(0, taup, size=(ch_len))
new_sig = []
new_omega = []
for pos in range(ch_len):
sig_prime = sig_values[pos] * np.exp(e_si[pos]+e_si_prime[pos])
if sig_prime < eps0 and sig_prime > 0:
sig_prime = eps0
if sig_prime > - eps0 and sig_prime < 0:
sig_prime = - eps0
new_sig.append(sig_prime)
for pos in range(ch_len):
omega_prime = old_omega[pos] + new_sig[pos] * np.random.uniform(0, 1)
if omega_prime < -5:
omega_prime = -5
if omega_prime > 10:
omega_prime = 10
new_omega.append(omega_prime)
child = np.concatenate((new_omega, new_sig), axis=None)
return child
我知道目前代码还不是“干净的”,但是在我这样做之前,我想了解为什么当我遍历x个生成时,为什么它没有收敛。
任何人都能发现错误吗?
谢谢
罗马
答案 0 :(得分:0)
Rosenbrock的设计难以优化。我不希望能够找到100个突变的5维Rosenbrock的全局最小值。如果您在附近的任何地方,那么您在那段时间内所做的事就可以完成。