Ir ao conteúdo
  • Cadastre-se

Ture

Membro Júnior
  • Posts

    5
  • Cadastrado em

  • Última visita

Reputação

1
  1. Olá pessoal. Tudo bem!? Estou enfrentando um problema simples mas que está me esquentando a cabeça, a questão é a seguinte: Quero fazer uma função que receba dois vetores. um vetor de distâncias que chamarei de "dist" que pode ser iniciado aleatoriamente para testes. A função também recebe um outro vetor que é o de agrupamento, que chamarei de "grupo", ambos os vetores tem o mesmo tamanho e o vetor grupo obrigatoriamente tem valores inteiros contínuos(fora de ordem)começando em 0. A saída dessa função é a soma das distâncias conforme o agrupamento grupo A saída desejada da função é a seguinte: EX: dist = [5,5,10,3,2,7] grupo = [1,1,2,2,0,0] vetorsaida = [2+7, 5+5, 10+3] ---> O índice do vetor grupo representa o valor do vetor distância que eu quero somar. Então todos os índices que possuem valor 0 no vetor devem ser somados(dist) e colocados na posição 0 da minha saída, todos os índices que possuírem valor 1 devem ser somados e colocados na posição 1 da minha saída. Se puderem mandar as dicas e códigos em C, Python ou pseudo-código eu ficaria grato, mas caso alguém queira mandar a solução em outras linguagens também será bem vindo! Outro ex de execução: dist = [3,4,5,6,7,8,9] grupo = [2,1,1,1,0,0,0] vetorsaida = [7+8+9, 4+5+6, 3] Espero que tenha ficado claro, agradeço pela atenção. Ture! adicionado 34 minutos depois Problema resolvido, para os interessados segue o código da resolução: dist = [1,2,3,4,5,6] grupo = [0,0,1,1,2,2] vetorsaida = [0,0,0] for i in range(len(grupo)): for j in range(len(grupo)): if (i!=j and grupo[i] == grupo[j]): vetorsaida[grupo[i]]+= dist[j]
  2. @fspjonny Opa. darei uma olhada, o conteúdo parece bastante interessante. Caso alguém ai esteja interessado em algoritmos genéticos achei esse link aqui do CdH mesmo que dá uma explicação sucinta mas boa do que se trata: https://www.clubedohardware.com.br/forums/topic/116581-algoritmos-genéticos/ Abraço a todos!
  3. Sim, trabalho com data science entre um punhado de outras coisas. O problema foi exatamente esse. Eu estava alterando toda vez o mesmo endereço da memória e adicionando na minha lista, como se estes fossem diferentes objetos na minha memória. O deepcopy foi a maneira mais simples que vi solucionar o problema, não realizei testes quanto a parte de custo mas no geral o crossover é uma das operações "leves" dentro de um algoritmo genético então não me preocupei muito com isso; Como funcionou eu fui por ai mesmo. A área é realmente bem instigante, estou começando a mexer com isso e é realmente satisfatório quando tu consegues aplicar teus algoritmos em soluções mais complexas. No algoritmo em questão eu faço seleção de features individual para cada cluster(similar ao bi-clustering) juntamente com o processo de clusterização de um bocado de dados com um bocado de features hehehe. Obrigado pela resposta! Abraço.
  4. Pode fechar o post. Resolvido. O problema é que classes em python são passadas por referência e não por cópia como tratei ela. Precisei usar o método deepcopy para driblar o problema. Para os interessados segue a solução: def crossover(agents, population): offspring = [] filho1 = agents[0] filho2 = agents[0] for i in range((population - len(agents)) // 2): mask = [] for _ in range(len(agents[0])): mask.append(random.choice([0,1])) pai, mae = random.sample(agents, 2) for bit in range(len(mask)): if mask[bit] == 0: filho1.indiv[bit] = pai.indiv[bit] filho2.indiv[bit] = mae.indiv[bit] else: filho1.indiv[bit] = mae.indiv[bit] filho2.indiv[bit] = pai.indiv[bit] offspring.append(deepcopy(filho1)) offspring.append(deepcopy(filho2)) agents.extend(offspring) return agents
  5. Olá, estou implementando um GA do zero mas encontrei uma pedra: Na operação de crossover minha função acaba retornando diversos indivíduos iguais e não consigo identificar o porquê; Segue partes importantes para identificar o problema: Notem que atribuo fitness randômicas a fim de teste e o código é relativamente maior mas o meu problema parece se encontrar aqui! Peço que ignorem a "cara" dos meus indivíduos, é um GA para um problema bem específico incluindo um step de clusterização e seleção de features de cada cluster. import random import string import pandas as pd import numpy as np class Agent: def __init__(self, Ncluster, Nfeatures, Nsamples): self.tamanho = Ncluster * Nfeatures self.Ncluster = Ncluster self.Nfeatures = Nfeatures self.Nsamples = Nsamples self.indiv = [] for _ in range(self.tamanho): self.indiv.append(random.choice([0,1])) for _ in range(Nsamples): self.indiv.append(random.choice(range(Ncluster))) self.fitness = random.choice([0,1]) def __str__(self): return 'Features: ' + f'{self.indiv[:self.Ncluster*self.Nfeatures]}' +' Cluster/Sample: ' + f'{self.indiv[self.Ncluster*self.Nfeatures:]}' def __len__(self): return self.Ncluster * self.Nfeatures + self.Nsamples def init_agents(population,Ncluster, Nfeatures, Nsamples): return [Agent(Ncluster, Nfeatures, Nsamples) for _ in range(population)] def crossover(agents, population): offspring = [] filho1 = agents[0] filho2 = agents[0] for _ in range((population - len(agents)) // 2): mask = [] for _ in range(len(agents[0])): mask.append(random.choice([0,1])) pai, mae = random.sample(agents, 2) for bit in range(len(mask)): if mask[bit] == 1: filho1.indiv[bit] = pai.indiv[bit] else: filho1.indiv[bit] = mae.indiv[bit] if mask[bit] == 1: filho2.indiv[bit] = mae.indiv[bit] else: filho2.indiv[bit] = pai.indiv[bit] offspring.append(filho1) offspring.append(filho2) agents.extend(offspring) return agents Antes de executar o crossover eu executo um processo de seleção de indivíduos, então o crossover é o responsável por criar novos indivíduos baseado nos selecionados(que é a própria lista agents) até o meu número "population" (que é o total de indivíduos de cada geração)

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...