Você está na página 1de 19

UNIVERSIDADE FEDERAL DO PARANÁ

JOÃO PEDRO R. F. SOUSA


MARCOS ZELLNER

COLÔNIA DE FORMIGAS:
UMA IMPLEMENTAÇÃO DO ALGORITMO ACO E ACOC (ANT COLONY
OPTIMIZATION FOR CLUSTERING)

Curitiba,
2023
1. INTRODUÇÃO
Com o decorrer do tempo cada vez mais dados estão sendo criados, e com
isso cada vez mais estão surgindo ferramentas que permitem fazer a gerência de
utilização desses dados, sejam planilhas no Excel ou algoritmos complexos de difícil
entendimento, uma dessas funções são os de agrupamento, esses algoritmos de
agrupamento de dados desempenham um papel fundamental na área de
aprendizado de máquina e mineração de dados. Os algoritmos de agrupamento são
uma classe essencial de técnicas em aprendizado de máquina e mineração de
dados, projetados para identificar padrões naturais e estruturas subjacentes em
conjuntos de dados. Ao contrário dos algoritmos de classificação que atribuem
rótulos a dados pré-determinados, os algoritmos de agrupamento buscam agrupar
itens semelhantes com base em suas características, sem a necessidade de rótulos
predefinidos.
Quando pensamos em algoritmos relacionados à aprendizagem de
máquinas e inteligência artificial podemos achar que é algo muito complexo, existem
sim algoritmos gigantes com camadas e camadas de dados, mas sim existem
alguns que são mais simples o entendimento como é o caso do algoritmo de colônia
de formigas. Os algoritmos de colônia de formigas são inspirados no
comportamento coletivo e adaptativo de formigas reais em busca de recursos. Este
paradigma computacional faz parte de uma classe de técnicas conhecidas como
algoritmos de otimização baseados em populações, que buscam soluções eficientes
para problemas complexos através da simulação de comportamentos coletivos.
a. Algoritmo de Colônia de Formigas (ACO)
O conceito fundamental por trás dos algoritmos de colônia de formigas é a
imitação do comportamento colaborativo observado em formigas reais, onde as
interações entre indivíduos conduzem a decisões coletivas eficazes. Quando
aplicados a problemas de otimização, como o problema do caixeiro viajante, os
algoritmos de colônia de formigas buscam encontrar soluções de alta qualidade
explorando e atualizando trilhas de feromônios, que representam a qualidade das
soluções em potencial.
O algoritmo desenvolvido por Colorni, Dirigo e Maniezzo (1991) consiste em
uma formiga sendo posicionada em um nó inicial ou podem se alocadas
aleatoriamente, depois desse posicionamento a formigas deve seguir uma regra de
transição para outro nó, deixando um feromônio no caminho, depois de todas as
formigas se moverem é feita a atualização desses feromônios levando em conta a
taxa de evaporação logo após vai novamente a escolha do nó que quer chegar com
base nas trilhas de feromônios assim que esse processo é concluído é repetido o
processo até que o tempo computacional tenha sido atingido ou o número máximo
de iterações tenha sido atingido.
b. Algoritmos de Clustering
O algoritmo de Clustering ou agrupamento faz parte do universo dos
algoritmos de aprendizagem não supervisionada, de forma resumida um clustering
se baseia pela análise de centróide começa com a definição de pontos aleatórios no
meio dos dados. Então, ele verifica quais elementos estão próximos daqueles
centróides e os agrupa. Depois disso, ele reinicializa novos centróides, a partir de
cálculos envolvendo os componentes. Um desses algoritmos de agrupamento
existentes é o de K-means. Nesse método para se calcular como será feito esses
elementos próximos dos centróides normalmente é feito calculando suas distâncias,
para isso existem algumas métricas de distâncias como Euclidiana e Manhattan.
Mas isso é feito para dados numéricos, como é feito se forem valores não
numéricos como cores roxo e azul? Um meio de fazer isso é a normalização, com
criação de novas colunas de dados onde por exemplo se o dado for azul é 1 e se for
roxo é 0 e assim por diante.
c. Algoritmo de Agrupamento por Colônia de Formigas (ACOC)

O ACOC (Ant Colony Optimization for Clustering), como proposto por Kao e
Cheng (2006), tem como objetivo descobrir uma configuração de cluster ideal, de
modo que a soma total dos erros de cluster para todos os objetos de dados possa
ser minimizada.
No algoritmo ACOC, o espaço de solução é moldado como um grafo da
matriz do nó do cluster-objeto. O número de linhas é igual ao número de objetos, e o
número de colunas igual ao número de clusters. Cada nó denotado por N(i, j)
significa que este objeto de dados i seria atribuído ao cluster j. Formigas artificiais
podem ficar somente em um nó para cada objeto.
A Imagem 1 exemplifica a construção de um grafo para problemas de
agrupamento, onde círculos vazios representam nós não visitados, e círculos
sólidos indicam nós visitados. No grafo, cada formiga move-se de um nó para outro,
depositando feromônio nos nós e construindo uma solução passo a passo. A cada
etapa, uma formiga seleciona aleatoriamente um objeto não agrupado, adicionando
um novo nó à sua solução parcial. Esse processo leva em consideração tanto a
intensidade do feromônio quanto a informação heurística, calculada pela distância
euclidiana entre o objeto e o centro do cluster. Para isso, cada formiga mantém uma
matriz de centros de cluster, atualizando-os após cada etapa de agrupamento. A
lista de memória evita que um objeto de dados seja agrupado mais de uma vez por
uma formiga. Quando a lista de memória está completa, indica que a formiga
concluiu a construção da solução.
Imagem 1 - Ilustração do funcionamento do agrupamento por colônia de formigas

Nos próximos parágrafos, você encontrará o detalhamento do algoritmo,


passo a passo.

● Passo 1: Inicialize a matriz de feromônios.

Os elementos da matriz de feromônio ou pheromone matrix (PM) são


definidos para pequenos valores escolhidos arbitrariamente.

● Passo 2: Inicialize as formigas.

Comece uma nova iteração. Reinicie a lista de memoria (tbk), matriz de


centro de cluster (Ck) e a matriz de peso (Wk) para cada formiga, onde k está no
intervalo 1 ≤ k ≤ R. R é o número total de formigas, R ≤ m, sendo m o número total
de objetos de dados.
● Passo 3 Selecione objetos de dados i.

Cada formiga seleciona aleatoriamente o objeto de dados, i,que não está na


lista de memoria.

● Passo 4: Selecione o cluster j.

Para determinar j para um i selecionado, duas estratégias, “exploitação” e


exploração, podem ser aplicadas. A primeira é permitir que as formigas se movam
de maneira gananciosa para um nó cujo produto do nível de feromônio e do valor
heurístico seja o mais alto. Veja a equação 1 onde Ni é o conjunto de g nós
pertencentes ao objeto de dados i, e o valor de S é escolhido de acordo com a
equação 2.
Equação 1

A outra consiste em alocar probabilidades aos nós candidatos e então deixar


uma formiga escolher um deles de maneira estocástica de acordo com a equação 2,
onde β é o parâmetro que especifica o peso relativo de nkij,, β > 0. Quanto mais
promissor for um nó, maior será sua probabilidade.
Equação 2

Note que nkij = 1 / dk (i, j) é o valor heurístico de N(i,j) para a formiga k. A


distância entre o objeto i e o centro j da formiga k, dk(i, j), é definida na equação 3,
onde ckjv refere-se ao valor do atributo v do centro do cluster j da formiga k..
Equação 3
● Passo 5 Atualizar as informações das formigas.

Actualizar a lista de memoria (tbk), matriz de peso (Wk, use a equação 4) e a


matriz de centro de cluster (Ck, use a equação 5) para cada formiga.

Equação 4

Equação 5

● Passo 6 Cheque a lista de memória de cada formiga.

Cheque se a lista de memória de cada formiga está cheia. Se não, então


volte para o passo 3, de outra forma, vá para o passo 7.

● Passo 7 Calcule os valores da função objetiva.

Calcule o valor da função objetiva para cada formiga, Jk, usando a equação 6.
Depois disso, rankeie R (soluções) de formigas na ordem ascendente de valores Jk.
A melhor solução é chamada de melhor solução de iteração. É comparado com a
melhor solução até agora, e a melhor será a nova melhor solução até agora.

Equação 6
● Passo 8 Atualizar trilhas de feromônios.

Atualize a matriz de feromônios, PM. A regra de atualização global é aplicada


e apenas as formigas elitistas podem adicionar feromônio ao final de cada iteração.

● Passo 9 Verifique a condição de término.

Se o número de iterações exceder o número máximo de iterações, pare e


produza a melhor solução até agora, caso contrário, vá para a etapa 2.
2. IMPLEMENTAÇÃO

Ambos os algoritmos foram desenvolvidos em Python, adotando o paradigma


de orientação a objetos. O algoritmo clássico de Colônia de Formigas foi
implementado de forma simplificada para resolver o problema do caixeiro viajante
em um grafo completo. Por outro lado, uma versão do ACOC foi aplicada ao
agrupamento dos dados da base 'wine.csv' em três clusters, com a expectativa de
que esses clusters correspondam aos atributos meta associados aos vinhos.
É possível ter acesso aos códigos na íntegra por meio do repositório indicado
no apêndice.

a. ACO

Estrutura do Código

Classes Principais:

● Arris: Representa uma aresta do grafo, definindo o caminho entre dois


pontos. Calcula a avaliação da aresta, que é usada para determinar a
probabilidade de escolha dessa aresta.

● Roulette: Implementa a seleção de itens com base em uma roleta, onde a


probabilidade de seleção é proporcional à avaliação dos itens.

● Tourney: Realiza uma competição entre dois competidores escolhidos


aleatoriamente, garantindo que eles tenham avaliações diferentes.

● CompleteGraph: Representa um grafo completo, onde todos os vértices


estão interligados. Mantém uma lista de instâncias da classe Arris que
representa as arestas do grafo.

● Ant: Modela o comportamento de uma formiga, incluindo movimento e cálculo


da distância percorrida.
● ACO: A classe principal que orquestra a execução do algoritmo ACO. Inclui
métodos para inicialização, execução do algoritmo e atualização de
feromônio.

Execução

O código demonstra a execução do ACO em um exemplo específico,


resolvendo o Problema do Caixeiro Viajante para um conjunto de vértices e
distâncias definidas.

Imagem 2 - Grafo usado como base para a execução do ACO

Análise dos Resultados

Com os seguintes parâmetros definidos:


❖ Feromônio Inicial: 0,1
❖ Constante de Evaporação: 0,01
❖ Constante de Atualização: 2
❖ Número de Épocas: 50
❖ Método de Seleção: Roleta
❖ Expoente de Distância: 1
❖ Expoente de Feromônio: 2

Foi possível observar uma rápida convergência para a solução ótima, em


menos de dez iterações o modelo chegou em duas populações com todos os
indivíduos contendo a solução ótima, estabilizando depois da trigésima iteração.
Os pesos de feromônio foram ajustados dessa forma, pois após alguns testes
foi possível observar que nesse caso um peso pouco maior para o feromônio na
seleção do próximo caminho, convergia em uma estabilização mais rápida da
solução ótima.

Imagem 3 - Gráfico representando a evolução das avaliações por gerações de formigas


[método de roleta]

Imagem 4 - Gráfico representando a evolução das avaliações por gerações de formigas


[método de torneio]
O método de torneio mostrou-se ineficaz em estabilizar o modelo, mesmo
após 10.000 iterações, não conseguindo gerar exclusivamente soluções ótimas. No
entanto, essa característica não deve ser interpretada de maneira necessariamente
negativa, pois um dos integrantes da última iteração encontrou a solução ótima.
Desse modo, o método alcançou a solução ótima sem eliminar a diversidade.

Última Geração do Método de Torneio

Formiga 1
solução: ['A', 'E', 'D', 'C', 'B']
avaliação: 26
Formiga 2
solução: ['B', 'C', 'E', 'A', 'D']
avaliação: 30
Formiga 3
solução: ['C', 'B', 'A', 'D', 'E']
avaliação: 23
Formiga 4
solução: ['D', 'A', 'B', 'E', 'C']
avaliação: 32
Formiga 5
solução: ['E', 'D', 'B', 'C', 'A']
avaliação: 29
b. ACOC

Estrutura do Código

Funções

● euclidean_distance(a, b): Função que calcula a distância euclidiana entre


dois pontos.

Classes Principais

● DataObject: Classe que representa um objeto de dados.


● ACOCGraph: Classe que representa o grafo utilizado no ACOC para
armazenar feromônios.
● Cluster: Classe que representa um cluster de dados.
● Ant: Classe que modela o comportamento de uma formiga, incluindo
movimento e cálculo da distância percorrida.
● ACOC: Classe principal que controla a execução do ACOC.

Execução

O código demonstra a execução do ACOC em um exemplo específico,


realizando a tarefa de agrupamento em um conjunto de dados. No exemplo
fornecido, o ACOC é aplicado ao conjunto de dados do arquivo 'wine.csv', onde os
valores foram normalizados para garantir que todos os vetores de dados estejam na
faixa de 0 a 1. Isso é feito dividindo cada valor pelo maior valor encontrado em sua
respectiva coluna.
Contudo, é crucial notar que, em comparação com o exemplo anterior, a
execução do ACOC neste caso específico é consideravelmente mais dispendiosa,
resultando em significativo aumento no tempo de processamento.
Análise dos Resultados

Devido a onerosidade da execução foi definido um número de formigas


equivalente a aproximadamente 5% do total de objetos, os parâmetros de execução
foram:

❖ Número de Épocas: 10
❖ Número de Clusters: 3
❖ Número de Formigas: 9
❖ Expoente de Distância: 1
❖ Expoente de Feromônio: 1
❖ Número de Formigas na Elite de Cada Iteração: 2
❖ Constante de Evaporação: 0,01

A métrica de avaliação para cada formiga é determinada pela média das


distâncias euclidianas dos objetos em relação ao centro do cluster ao qual
pertencem. Em termos simplificados, calcula-se a média da distância dos objetos do
Cluster 1 em relação ao seu centro, adicionando a média das distâncias do Cluster
2 e assim por diante, até o Cluster n. Abaixo, apresenta-se a avaliação média das
formigas em cada geração:

● Média da avaliação da primeira geração: 1,1208


● Média da avaliação da segunda geração: 1,1333
● Média da avaliação da terceira geração: 1,1259
● Média da avaliação da quarta geração: 1,1250
● Média da avaliação da quinta geração: 1,1250
● Média da avaliação da sexta geração: 1,1205
● Média da avaliação da sétima geração: 1,1297
● Média da avaliação da oitava geração: 1,1251
● Média da avaliação da nona geração: 1,1293
● Média da avaliação da décima geração: 1,1271
Nota da melhor formiga: 1,1192

Detalhes da melhor formiga

Cluster 1:
centro do cluster:
[0.8852056641942009, 0.5871034482758621, 0.7513312693498452,
0.7136666666666668, 0.6037037037037036, 0.43530927835051547,
0.1608267716535433, 0.6887878787878787, 0.32530726256983233,
0.5564923061538462, 0.40163742690058485, 0.43110000000000004,
0.36990476190476196]

Total de objetos no cluster: 50


Objetos da classe 1: 0
Objetos da classe 2: 3
Objetos da classe 3: 47
-----------------
Cluster 2:
centro do cluster:
[0.8295181649335746, 0.315880217785844, 0.6889359621965129,
0.6694736842105262, 0.5781893004115228, 0.5428196780611322,
0.3730487636413869, 0.5667198298777246, 0.4172302264039988,
0.22515519568151146, 0.6279470606340413, 0.6806140350877193,
0.29519632414369257]

Total de objetos no cluster: 57


Objetos da classe 1: 0
Objetos da classe 2: 56
Objetos da classe 3: 1
-----------------
Cluster 3:
centro do cluster:
[0.9084459555715954, 0.3428363283147159, 0.754633061527057,
0.5891079812206572, 0.6542340462528256, 0.7406345288224191,
0.5887213042031716, 0.4344857020913359, 0.5500432764182864,
0.402795232936078, 0.6167531504818385, 0.7869014084507041,
0.6170942320590208]

Total de objetos no cluster: 71


Objetos da classe 1: 59
Objetos da classe 2: 12
Objetos da classe 3: 0
-----------------

Por mais que não haja uma “estabilização do modelo” como no exemplo
anterior, e isso é justificado pela maior complexidade desse problema, é possível
notar que cada Cluster corresponde parcialmente a uma classe

● Cluster 1: Composta 94% por objetos da Classe 3


● Cluster 2: Composta 98% por objetos da Classe 2
● Cluster 3:Composta 83% por objetos da Classe 1

Assim, uma aplicação prática seria a classificação de um novo registro com


base no cluster ao qual ele estaria associado, identificando o centro de cluster mais
próximo. No entanto, é fundamental ressaltar que, ao compreendermos que esta
não é a ênfase principal do projeto, optamos por não dividir os dados em conjuntos
de treinamento e teste para a classificação. Isso decorre do fato de que o propósito
principal de um algoritmo de clusterização não é categorizar com base em atributos
meta, uma vez que se trata de um algoritmo não supervisionado. A mencionada
classificação foi apresentada apenas como uma ilustração da eficácia da divisão
realizada pelo modelo.
3. CONSIDERAÇÕES FINAIS

A inteligência artificial possui diversas funcionalidades, vimos nesse relatório


uma dessa funções que é o de colônia de formigas aplicado a clustering em uma
base de dados de vinhos por conta do algoritmo necessitar de muito processamento
e a base possuir muitas informações o número de épocas pode ser considerado
“pouco” para encontrar o melhor agrupamento de dados, mesmo assim as análise
dos três cluster o algoritmo encontrou um bom caminho para o agrupamento. Porém
mesmo que o nosso poder de processamento atual o algoritmo fez um incrível
trabalho, além de ser possível aplicar para diversos ramos da ciência de dados
aplicando outros modelos que necessitem um agrupamento previamente feitos para
melhorar a qualidade de dados e lidar com outliers, diminuindo assim a
dimensionalidade e facilitando a criação de algoritmos de alta complexidade. Outro
ponto é passar ACOC pode servir de base para treinamento de IA que sua base são
treinamento semi-supervisionado pois onde você tem apenas um pequeno conjunto
de dados rotulados, algoritmos de agrupamento podem ser usados para atribuir
rótulos a dados não rotulados. Os rótulos gerados pelos algoritmos de agrupamento
podem ser usados para treinar modelos supervisionados.
REFERÊNCIAS

KAO, Yucheng; CHENG, Kevin. An ACO-based clustering algorithm. In: International


Workshop on Ant Colony Optimization and Swarm Intelligence. Berlin, Heidelberg:
Springer Berlin Heidelberg, 2006. p. 340-347. Acesso em 23 de Novembro de 2023.
Disponível em:
https://drive.google.com/file/d/1TLtACGE7mFjADs7jh0X7Vf1KbAs0T3pz/view?usp=s
haring.
APÊNDICES

APÊNDICE A: Repositório do Projeto. Disponivel em


https://github.com/o-rovida/ACO

Você também pode gostar