
Vamos por isso corrigir o código apresentado.
def latin_hypercube(domain, size):
"""One individual by hypercube."""
numb_segments = size ** (1.0/len(domain))
vectors = []
for dom_i in domain:
dist = (dom_i[1] - dom_i[0])/ numb_segments
vectors.append(list(frange(dom_i[0],dom_i[1], dist)))
pairs = []
for vector in vectors:
pairs_from_vector = [[vector[i], vector[i+1]] for i in range(len(vector)-1)]
pairs.append(pairs_from_vector)
hyper_cubes = gen_cross_all(pairs)
data_points = [generate_one(hc) for hc in hyper_cubes]
return data_points
Agora, depois de definirmos o número de segmentos, calculamos as coordenadas de todos os hipercubos, que armazenamos em hyper_cubes. De seguida fabricamos os pontos dentro de cada hipercubo, que armazenamos em data_points.
Cada ponto é gerado a partir de uma distribuição uniforme.
def generate_one(domain):
return [random.uniform(dom_i[0],dom_i[1]) for dom_i in domain]
A geração das coordenadas para os hipercubos tem a sua dificuldade se queremos ter um programa genérico que funcione para uma dimensão qualquer e não apenas para duas dimensões.
A solução mais simples é recursiva.
def gen_cross_all(values):
partial = [[elem] for elem in values[0]]
remaining = values[1:]
return gen_cross(partial, remaining)
def gen_cross(partial,remaining):
"""partial = list of points with dimension k.
remaining = list of n-k dimensions."""
if remaining == []:
return partial
else:
partial = expand(partial,remaining[0])
return gen_cross(partial,remaining[1:])
def expand(partial, dimension):
new_partial = []
for segment in dimension:
new_partial.extend(cross(partial,segment))
return new_partial
def cross(partial,segment):
return [elem + [segment] for elem in partial]
A função gen_cross recebe uma lista parcial, com as coordenadas para um subconjunto k de dimensões, e a lista das dimensões restantes. Esta função é chamada por gen_cross_all, que converte a primeira dimensão numa primeira lista parcial e invoca depois a função que vai fazer todo o trabalho, isto é gen_cross.
Ao executar o código corrigido já conseguimos uma inicialização da população com as propriedades pretendidas.

Sem comentários:
Enviar um comentário