algoritmo-genetico 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- algoritmo_genetico-1.0.0/.github/workflows/publicar.yml +37 -0
- algoritmo_genetico-1.0.0/.gitignore +9 -0
- algoritmo_genetico-1.0.0/LICENSE +21 -0
- algoritmo_genetico-1.0.0/PKG-INFO +244 -0
- algoritmo_genetico-1.0.0/README.md +223 -0
- algoritmo_genetico-1.0.0/exemplos/.gitkeep +0 -0
- algoritmo_genetico-1.0.0/exemplos/base_de_dados_para_exemplos/modelo_base.xlsx +0 -0
- algoritmo_genetico-1.0.0/exemplos/exemplo_1_binario/dados_binario_1.xlsx +0 -0
- algoritmo_genetico-1.0.0/exemplos/exemplo_1_binario/dados_binario_2.xlsx +0 -0
- algoritmo_genetico-1.0.0/exemplos/exemplo_1_binario/exemplo_binario.ipynb +448 -0
- algoritmo_genetico-1.0.0/exemplos/exemplo_2_multiclasse/dados_multiclasse.xlsx +0 -0
- algoritmo_genetico-1.0.0/exemplos/exemplo_2_multiclasse/exemplo_multiclasse.ipynb +496 -0
- algoritmo_genetico-1.0.0/pyproject.toml +39 -0
- algoritmo_genetico-1.0.0/requirements.txt +3 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/__init__.py +9 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/atualizacao.py +70 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/criacao.py +35 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/cruzamento.py +38 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/divisao.py +91 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/fitness.py +152 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/leitura.py +54 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/mutacao.py +43 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/nucleo.py +261 -0
- algoritmo_genetico-1.0.0/src/algoritmo_genetico/selecao.py +79 -0
- algoritmo_genetico-1.0.0/testes/.gitkeep +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Publica no PyPI quando uma tag de versão (ex: v1.0.1) é enviada pro GitHub,
|
|
2
|
+
# ou manualmente pela aba Actions -> "Publicar no PyPI" -> Run workflow.
|
|
3
|
+
# Usa Trusted Publishing: não precisa de token, o PyPI confia neste repositório.
|
|
4
|
+
name: Publicar no PyPI
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags: ["v*"]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
montar:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
- run: python -m pip install build
|
|
20
|
+
- run: python -m build
|
|
21
|
+
- uses: actions/upload-artifact@v4
|
|
22
|
+
with:
|
|
23
|
+
name: dist
|
|
24
|
+
path: dist/
|
|
25
|
+
|
|
26
|
+
publicar:
|
|
27
|
+
needs: montar
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
environment: pypi
|
|
30
|
+
permissions:
|
|
31
|
+
id-token: write # necessário para o Trusted Publishing
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/download-artifact@v4
|
|
34
|
+
with:
|
|
35
|
+
name: dist
|
|
36
|
+
path: dist/
|
|
37
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fellipe Almassy and Matheus Gomes
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: algoritmo-genetico
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Classificador linear (binário e ordinal) treinado por algoritmo genético, feito com NumPy
|
|
5
|
+
Project-URL: Repository, https://github.com/FeAlmassy/AlgoritmoGenetico
|
|
6
|
+
Project-URL: Issues, https://github.com/FeAlmassy/AlgoritmoGenetico/issues
|
|
7
|
+
Author: Fellipe Almassy, Matheus Gomes
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: algoritmo genetico,classificacao,genetic algorithm,machine learning
|
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
|
12
|
+
Classifier: Natural Language :: Portuguese (Brazilian)
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Requires-Dist: numpy>=2.1
|
|
18
|
+
Requires-Dist: openpyxl>=3.1
|
|
19
|
+
Requires-Dist: pandas>=2.2
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
# Algoritmo Genético para Classificação
|
|
23
|
+
|
|
24
|
+
Biblioteca em Python que treina um **classificador linear usando algoritmo genético**, escrita do zero com NumPy.
|
|
25
|
+
|
|
26
|
+
Em vez de usar gradiente (como a regressão logística), o modelo **evolui** uma população de soluções: as melhores se reproduzem, sofrem mutações e, geração após geração, a classificação melhora.
|
|
27
|
+
|
|
28
|
+
Funciona para:
|
|
29
|
+
- **Classificação binária** (2 classes: 0 e 1)
|
|
30
|
+
- **Classificação ordinal** (K classes com ordem, ex: ruim < médio < bom)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Como funciona
|
|
35
|
+
|
|
36
|
+
Cada **cromossomo** é uma lista de números: um **bias** e um **peso** para cada feature. Com eles o modelo calcula uma nota para cada amostra:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
nota = bias + peso₁·x₁ + peso₂·x₂ + ... + pesoₙ·xₙ
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- **Binário:** nota ≥ 0 → classe 1, nota < 0 → classe 0
|
|
43
|
+
- **Ordinal:** a nota é dividida em faixas pelos **thresholds** (pontos de corte), e cada faixa é uma classe
|
|
44
|
+
|
|
45
|
+
### O fitness
|
|
46
|
+
|
|
47
|
+
A nota de cada cromossomo (fitness) é o **produto do recall de cada classe**:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
fitness = recall(classe 0) × recall(classe 1) × ... × recall(classe K-1)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Se o modelo errar todas as amostras de uma classe, o fitness vira 0. Isso obriga o modelo a acertar **todas** as classes, e não só a mais comum, o que é útil quando as classes são desbalanceadas.
|
|
54
|
+
|
|
55
|
+
### O ciclo do algoritmo
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
1. criar população aleatória
|
|
59
|
+
│
|
|
60
|
+
▼
|
|
61
|
+
2. calcular fitness ◄──────────────┐
|
|
62
|
+
│ │
|
|
63
|
+
▼ │
|
|
64
|
+
3. selecionar pai e mãe (roleta) │
|
|
65
|
+
│ │
|
|
66
|
+
▼ │
|
|
67
|
+
4. cruzamento (corte em 1 ponto) │
|
|
68
|
+
│ │
|
|
69
|
+
▼ │
|
|
70
|
+
5. mutação │
|
|
71
|
+
│ │
|
|
72
|
+
▼ │
|
|
73
|
+
6. trocar os piores pelos ─────────┘
|
|
74
|
+
melhores filhos
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
O ciclo para quando atinge o fitness alvo ou acaba o número de gerações.
|
|
78
|
+
|
|
79
|
+
| Etapa | O que faz |
|
|
80
|
+
|---|---|
|
|
81
|
+
| **Criação** | Gera cromossomos com genes aleatórios entre -1 e 1 |
|
|
82
|
+
| **Fitness** | Dá uma nota de 0 a 1 para cada cromossomo |
|
|
83
|
+
| **Seleção** | Sorteia pai e mãe por roleta: quem tem fitness maior tem mais chance |
|
|
84
|
+
| **Cruzamento** | O filho pega o começo do pai e o final da mãe, a partir de um ponto de corte aleatório |
|
|
85
|
+
| **Mutação** | Troca alguns genes de cada filho por valores aleatórios novos |
|
|
86
|
+
| **Atualização** | Os piores da população saem e os melhores filhos entram (elitismo) |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Instalação
|
|
91
|
+
|
|
92
|
+
Requer **Python 3.10+**.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pip install algoritmo-genetico
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Ou direto do GitHub:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
pip install git+https://github.com/FeAlmassy/AlgoritmoGenetico.git
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Para desenvolver
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
git clone https://github.com/FeAlmassy/AlgoritmoGenetico.git
|
|
108
|
+
cd AlgoritmoGenetico
|
|
109
|
+
python -m venv venv_ag
|
|
110
|
+
source venv_ag/bin/activate # no Windows: venv_ag\Scripts\activate
|
|
111
|
+
pip install -e . # modo editável: mudanças no código valem na hora
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Uso rápido
|
|
117
|
+
|
|
118
|
+
### Binário
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
from algoritmo_genetico import rodar, prever, ler_excel, dividir_treino_teste
|
|
122
|
+
|
|
123
|
+
X, y = ler_excel("exemplos/exemplo_1_binario/dados_binario_1.xlsx")
|
|
124
|
+
X_treino, X_teste, y_treino, y_teste = dividir_treino_teste(X, y, seed=0)
|
|
125
|
+
|
|
126
|
+
modelo = rodar(X_treino, y_treino, geracoes=500, fitness_alvo=0.90, seed=0)
|
|
127
|
+
|
|
128
|
+
previsoes = prever(modelo, X_teste)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
As funções de cada etapa (`criar_cromossomos`, `fitness_binario`, `selecionar_pais_roleta`, `cruzar_um_ponto`, `mutar`, `atualizar_populacao`) também podem ser usadas separadamente, importando dos seus módulos (ex: `from algoritmo_genetico.mutacao import mutar`).
|
|
132
|
+
|
|
133
|
+
### Ordinal (várias classes)
|
|
134
|
+
|
|
135
|
+
As classes precisam ser números de `0` a `K-1`, na ordem da menor para a maior. Para K classes, passe K-1 thresholds em ordem crescente:
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
import numpy as np
|
|
139
|
+
|
|
140
|
+
thresholds = np.array([-1.5, -0.5, 0.5, 1.5]) # 4 cortes -> 5 classes
|
|
141
|
+
|
|
142
|
+
modelo = rodar(X, y, thresholds=thresholds, geracoes=2000, fitness_alvo=1.0)
|
|
143
|
+
previsoes = prever(modelo, X_novo)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Parâmetros do `rodar`
|
|
147
|
+
|
|
148
|
+
| Parâmetro | Padrão | Descrição |
|
|
149
|
+
|---|---|---|
|
|
150
|
+
| `X` | — | array (amostras, features) com os dados |
|
|
151
|
+
| `y` | — | vetor com a classe de cada amostra |
|
|
152
|
+
| `qtd_cromossomos` | `6` | tamanho da população |
|
|
153
|
+
| `qtd_genes_mutados` | `1` | quantos genes mudam em cada filho |
|
|
154
|
+
| `qtd_filhos` | `3` | quantos filhos por geração |
|
|
155
|
+
| `qtd_substituicoes` | `2` | quantos piores da população são trocados pelos melhores filhos (no máximo o menor entre `qtd_cromossomos` e `qtd_filhos`) |
|
|
156
|
+
| `geracoes` | `100` | número máximo de gerações |
|
|
157
|
+
| `fitness_alvo` | `0.90` | para quando o melhor fitness chega nesse valor |
|
|
158
|
+
| `thresholds` | `None` | `None` = binário; array com K-1 cortes = ordinal |
|
|
159
|
+
| `minimo` | `-1.0` | menor valor dos genes na população inicial |
|
|
160
|
+
| `maximo` | `1.0` | maior valor dos genes na população inicial |
|
|
161
|
+
| `seed` | `None` | semente para reprodutibilidade (`None` = aleatório a cada rodada) |
|
|
162
|
+
| `verbose` | `True` | mostra o melhor fitness e a acurácia de cada geração |
|
|
163
|
+
|
|
164
|
+
O `rodar` devolve um dicionário com `cromossomo` (o melhor encontrado), `fitness`, `acuracia` (fração de acertos nos dados de treino), `geracao` (em que geração parou), `thresholds` e `historico` (listas `melhor`, `medio` e `acuracia` com a evolução por geração).
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Formato dos dados
|
|
169
|
+
|
|
170
|
+
A planilha (`.xlsx` ou `.csv`) deve seguir este layout:
|
|
171
|
+
|
|
172
|
+
| Lições | X1 | X2 | ... | Xn | CLASS |
|
|
173
|
+
|---|---|---|---|---|---|
|
|
174
|
+
| Y001 | 1 | 0 | ... | 1 | 1 |
|
|
175
|
+
| Y002 | 0 | 1 | ... | 0 | 0 |
|
|
176
|
+
|
|
177
|
+
- **Primeira coluna:** identificador da amostra (é ignorada)
|
|
178
|
+
- **Colunas do meio:** features
|
|
179
|
+
- **Última coluna:** classe
|
|
180
|
+
|
|
181
|
+
Um modelo pronto está em [`exemplos/base_de_dados_para_exemplos/modelo_base.xlsx`](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/exemplos/base_de_dados_para_exemplos/modelo_base.xlsx).
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Exemplos e resultados
|
|
186
|
+
|
|
187
|
+
| Notebook | Dataset | Classes | Acurácia no teste* |
|
|
188
|
+
|---|---|---|---|
|
|
189
|
+
| [`exemplo_binario.ipynb`](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/exemplos/exemplo_1_binario/exemplo_binario.ipynb) | `dados_binario_1.xlsx` (539 amostras, 18 features) | 2 | **87%** |
|
|
190
|
+
| [`exemplo_multiclasse.ipynb`](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/exemplos/exemplo_2_multiclasse/exemplo_multiclasse.ipynb) | `dados_multiclasse.xlsx` (261 amostras, 30 features) | 5 | **79%** |
|
|
191
|
+
|
|
192
|
+
\* Treino com 80% dos dados e teste com os 20% restantes, que o modelo nunca viu. Com `np.random.seed(0)`.
|
|
193
|
+
|
|
194
|
+
O notebook binário mostra **uma geração passo a passo**, chamando cada função na ordem do algoritmo. O multiclasse mostra como escolher a ordem das classes quando ela não é conhecida.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Estrutura do projeto
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
AlgoritmoGenetico/
|
|
202
|
+
├── src/
|
|
203
|
+
│ └── algoritmo_genetico/
|
|
204
|
+
│ ├── __init__.py # API pública: rodar, prever, ler_excel, ler_csv, dividir_treino_teste
|
|
205
|
+
│ ├── nucleo.py # loop principal (rodar) e previsão (prever)
|
|
206
|
+
│ ├── criacao.py # 1. população inicial
|
|
207
|
+
│ ├── fitness.py # 2. fitness binário, ordinal e percentual
|
|
208
|
+
│ ├── selecao.py # 3. seleção por roleta
|
|
209
|
+
│ ├── cruzamento.py # 4. cruzamento de 1 ponto
|
|
210
|
+
│ ├── mutacao.py # 5. mutação
|
|
211
|
+
│ ├── atualizacao.py # 6. troca dos piores pelos melhores filhos
|
|
212
|
+
│ ├── leitura.py # leitura de .xlsx e .csv
|
|
213
|
+
│ └── divisao.py # divisão em treino e teste (estratificada)
|
|
214
|
+
├── exemplos/ # notebooks e datasets de exemplo
|
|
215
|
+
├── testes/ # testes automáticos
|
|
216
|
+
├── pyproject.toml # configuração do pacote (nome, versão, dependências)
|
|
217
|
+
├── LICENSE # licença MIT
|
|
218
|
+
└── requirements.txt
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Cada etapa do algoritmo fica em um módulo próprio, então dá para trocar uma peça (por exemplo, testar outra seleção) sem mexer nas outras. Todas as funções verificam os parâmetros recebidos e dão mensagens de erro claras.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Próximos passos
|
|
226
|
+
|
|
227
|
+
- [x] Empacotar com `pyproject.toml` e publicar no PyPI
|
|
228
|
+
- [ ] Testes automáticos com `pytest`
|
|
229
|
+
- [ ] Classe no estilo scikit-learn (`treinar` / `prever`)
|
|
230
|
+
- [ ] Salvar e carregar modelos treinados
|
|
231
|
+
- [ ] Aceitar classes em texto (ex: `"bom"`, `"ruim"`) sem conversão manual
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Licença
|
|
236
|
+
|
|
237
|
+
Distribuído sob a licença [MIT](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/LICENSE): pode usar, modificar e redistribuir livremente, desde que mantenha o aviso de copyright.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Autores
|
|
242
|
+
|
|
243
|
+
- **Fellipe Almassy** — [GitHub](https://github.com/FeAlmassy)
|
|
244
|
+
- **Matheus Gomes** — [GitHub](https://github.com/matheos-hash)
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Algoritmo Genético para Classificação
|
|
2
|
+
|
|
3
|
+
Biblioteca em Python que treina um **classificador linear usando algoritmo genético**, escrita do zero com NumPy.
|
|
4
|
+
|
|
5
|
+
Em vez de usar gradiente (como a regressão logística), o modelo **evolui** uma população de soluções: as melhores se reproduzem, sofrem mutações e, geração após geração, a classificação melhora.
|
|
6
|
+
|
|
7
|
+
Funciona para:
|
|
8
|
+
- **Classificação binária** (2 classes: 0 e 1)
|
|
9
|
+
- **Classificação ordinal** (K classes com ordem, ex: ruim < médio < bom)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Como funciona
|
|
14
|
+
|
|
15
|
+
Cada **cromossomo** é uma lista de números: um **bias** e um **peso** para cada feature. Com eles o modelo calcula uma nota para cada amostra:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
nota = bias + peso₁·x₁ + peso₂·x₂ + ... + pesoₙ·xₙ
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- **Binário:** nota ≥ 0 → classe 1, nota < 0 → classe 0
|
|
22
|
+
- **Ordinal:** a nota é dividida em faixas pelos **thresholds** (pontos de corte), e cada faixa é uma classe
|
|
23
|
+
|
|
24
|
+
### O fitness
|
|
25
|
+
|
|
26
|
+
A nota de cada cromossomo (fitness) é o **produto do recall de cada classe**:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
fitness = recall(classe 0) × recall(classe 1) × ... × recall(classe K-1)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Se o modelo errar todas as amostras de uma classe, o fitness vira 0. Isso obriga o modelo a acertar **todas** as classes, e não só a mais comum, o que é útil quando as classes são desbalanceadas.
|
|
33
|
+
|
|
34
|
+
### O ciclo do algoritmo
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
1. criar população aleatória
|
|
38
|
+
│
|
|
39
|
+
▼
|
|
40
|
+
2. calcular fitness ◄──────────────┐
|
|
41
|
+
│ │
|
|
42
|
+
▼ │
|
|
43
|
+
3. selecionar pai e mãe (roleta) │
|
|
44
|
+
│ │
|
|
45
|
+
▼ │
|
|
46
|
+
4. cruzamento (corte em 1 ponto) │
|
|
47
|
+
│ │
|
|
48
|
+
▼ │
|
|
49
|
+
5. mutação │
|
|
50
|
+
│ │
|
|
51
|
+
▼ │
|
|
52
|
+
6. trocar os piores pelos ─────────┘
|
|
53
|
+
melhores filhos
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
O ciclo para quando atinge o fitness alvo ou acaba o número de gerações.
|
|
57
|
+
|
|
58
|
+
| Etapa | O que faz |
|
|
59
|
+
|---|---|
|
|
60
|
+
| **Criação** | Gera cromossomos com genes aleatórios entre -1 e 1 |
|
|
61
|
+
| **Fitness** | Dá uma nota de 0 a 1 para cada cromossomo |
|
|
62
|
+
| **Seleção** | Sorteia pai e mãe por roleta: quem tem fitness maior tem mais chance |
|
|
63
|
+
| **Cruzamento** | O filho pega o começo do pai e o final da mãe, a partir de um ponto de corte aleatório |
|
|
64
|
+
| **Mutação** | Troca alguns genes de cada filho por valores aleatórios novos |
|
|
65
|
+
| **Atualização** | Os piores da população saem e os melhores filhos entram (elitismo) |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Instalação
|
|
70
|
+
|
|
71
|
+
Requer **Python 3.10+**.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install algoritmo-genetico
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Ou direto do GitHub:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
pip install git+https://github.com/FeAlmassy/AlgoritmoGenetico.git
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Para desenvolver
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
git clone https://github.com/FeAlmassy/AlgoritmoGenetico.git
|
|
87
|
+
cd AlgoritmoGenetico
|
|
88
|
+
python -m venv venv_ag
|
|
89
|
+
source venv_ag/bin/activate # no Windows: venv_ag\Scripts\activate
|
|
90
|
+
pip install -e . # modo editável: mudanças no código valem na hora
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Uso rápido
|
|
96
|
+
|
|
97
|
+
### Binário
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
from algoritmo_genetico import rodar, prever, ler_excel, dividir_treino_teste
|
|
101
|
+
|
|
102
|
+
X, y = ler_excel("exemplos/exemplo_1_binario/dados_binario_1.xlsx")
|
|
103
|
+
X_treino, X_teste, y_treino, y_teste = dividir_treino_teste(X, y, seed=0)
|
|
104
|
+
|
|
105
|
+
modelo = rodar(X_treino, y_treino, geracoes=500, fitness_alvo=0.90, seed=0)
|
|
106
|
+
|
|
107
|
+
previsoes = prever(modelo, X_teste)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
As funções de cada etapa (`criar_cromossomos`, `fitness_binario`, `selecionar_pais_roleta`, `cruzar_um_ponto`, `mutar`, `atualizar_populacao`) também podem ser usadas separadamente, importando dos seus módulos (ex: `from algoritmo_genetico.mutacao import mutar`).
|
|
111
|
+
|
|
112
|
+
### Ordinal (várias classes)
|
|
113
|
+
|
|
114
|
+
As classes precisam ser números de `0` a `K-1`, na ordem da menor para a maior. Para K classes, passe K-1 thresholds em ordem crescente:
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
import numpy as np
|
|
118
|
+
|
|
119
|
+
thresholds = np.array([-1.5, -0.5, 0.5, 1.5]) # 4 cortes -> 5 classes
|
|
120
|
+
|
|
121
|
+
modelo = rodar(X, y, thresholds=thresholds, geracoes=2000, fitness_alvo=1.0)
|
|
122
|
+
previsoes = prever(modelo, X_novo)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Parâmetros do `rodar`
|
|
126
|
+
|
|
127
|
+
| Parâmetro | Padrão | Descrição |
|
|
128
|
+
|---|---|---|
|
|
129
|
+
| `X` | — | array (amostras, features) com os dados |
|
|
130
|
+
| `y` | — | vetor com a classe de cada amostra |
|
|
131
|
+
| `qtd_cromossomos` | `6` | tamanho da população |
|
|
132
|
+
| `qtd_genes_mutados` | `1` | quantos genes mudam em cada filho |
|
|
133
|
+
| `qtd_filhos` | `3` | quantos filhos por geração |
|
|
134
|
+
| `qtd_substituicoes` | `2` | quantos piores da população são trocados pelos melhores filhos (no máximo o menor entre `qtd_cromossomos` e `qtd_filhos`) |
|
|
135
|
+
| `geracoes` | `100` | número máximo de gerações |
|
|
136
|
+
| `fitness_alvo` | `0.90` | para quando o melhor fitness chega nesse valor |
|
|
137
|
+
| `thresholds` | `None` | `None` = binário; array com K-1 cortes = ordinal |
|
|
138
|
+
| `minimo` | `-1.0` | menor valor dos genes na população inicial |
|
|
139
|
+
| `maximo` | `1.0` | maior valor dos genes na população inicial |
|
|
140
|
+
| `seed` | `None` | semente para reprodutibilidade (`None` = aleatório a cada rodada) |
|
|
141
|
+
| `verbose` | `True` | mostra o melhor fitness e a acurácia de cada geração |
|
|
142
|
+
|
|
143
|
+
O `rodar` devolve um dicionário com `cromossomo` (o melhor encontrado), `fitness`, `acuracia` (fração de acertos nos dados de treino), `geracao` (em que geração parou), `thresholds` e `historico` (listas `melhor`, `medio` e `acuracia` com a evolução por geração).
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Formato dos dados
|
|
148
|
+
|
|
149
|
+
A planilha (`.xlsx` ou `.csv`) deve seguir este layout:
|
|
150
|
+
|
|
151
|
+
| Lições | X1 | X2 | ... | Xn | CLASS |
|
|
152
|
+
|---|---|---|---|---|---|
|
|
153
|
+
| Y001 | 1 | 0 | ... | 1 | 1 |
|
|
154
|
+
| Y002 | 0 | 1 | ... | 0 | 0 |
|
|
155
|
+
|
|
156
|
+
- **Primeira coluna:** identificador da amostra (é ignorada)
|
|
157
|
+
- **Colunas do meio:** features
|
|
158
|
+
- **Última coluna:** classe
|
|
159
|
+
|
|
160
|
+
Um modelo pronto está em [`exemplos/base_de_dados_para_exemplos/modelo_base.xlsx`](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/exemplos/base_de_dados_para_exemplos/modelo_base.xlsx).
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Exemplos e resultados
|
|
165
|
+
|
|
166
|
+
| Notebook | Dataset | Classes | Acurácia no teste* |
|
|
167
|
+
|---|---|---|---|
|
|
168
|
+
| [`exemplo_binario.ipynb`](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/exemplos/exemplo_1_binario/exemplo_binario.ipynb) | `dados_binario_1.xlsx` (539 amostras, 18 features) | 2 | **87%** |
|
|
169
|
+
| [`exemplo_multiclasse.ipynb`](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/exemplos/exemplo_2_multiclasse/exemplo_multiclasse.ipynb) | `dados_multiclasse.xlsx` (261 amostras, 30 features) | 5 | **79%** |
|
|
170
|
+
|
|
171
|
+
\* Treino com 80% dos dados e teste com os 20% restantes, que o modelo nunca viu. Com `np.random.seed(0)`.
|
|
172
|
+
|
|
173
|
+
O notebook binário mostra **uma geração passo a passo**, chamando cada função na ordem do algoritmo. O multiclasse mostra como escolher a ordem das classes quando ela não é conhecida.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Estrutura do projeto
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
AlgoritmoGenetico/
|
|
181
|
+
├── src/
|
|
182
|
+
│ └── algoritmo_genetico/
|
|
183
|
+
│ ├── __init__.py # API pública: rodar, prever, ler_excel, ler_csv, dividir_treino_teste
|
|
184
|
+
│ ├── nucleo.py # loop principal (rodar) e previsão (prever)
|
|
185
|
+
│ ├── criacao.py # 1. população inicial
|
|
186
|
+
│ ├── fitness.py # 2. fitness binário, ordinal e percentual
|
|
187
|
+
│ ├── selecao.py # 3. seleção por roleta
|
|
188
|
+
│ ├── cruzamento.py # 4. cruzamento de 1 ponto
|
|
189
|
+
│ ├── mutacao.py # 5. mutação
|
|
190
|
+
│ ├── atualizacao.py # 6. troca dos piores pelos melhores filhos
|
|
191
|
+
│ ├── leitura.py # leitura de .xlsx e .csv
|
|
192
|
+
│ └── divisao.py # divisão em treino e teste (estratificada)
|
|
193
|
+
├── exemplos/ # notebooks e datasets de exemplo
|
|
194
|
+
├── testes/ # testes automáticos
|
|
195
|
+
├── pyproject.toml # configuração do pacote (nome, versão, dependências)
|
|
196
|
+
├── LICENSE # licença MIT
|
|
197
|
+
└── requirements.txt
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Cada etapa do algoritmo fica em um módulo próprio, então dá para trocar uma peça (por exemplo, testar outra seleção) sem mexer nas outras. Todas as funções verificam os parâmetros recebidos e dão mensagens de erro claras.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Próximos passos
|
|
205
|
+
|
|
206
|
+
- [x] Empacotar com `pyproject.toml` e publicar no PyPI
|
|
207
|
+
- [ ] Testes automáticos com `pytest`
|
|
208
|
+
- [ ] Classe no estilo scikit-learn (`treinar` / `prever`)
|
|
209
|
+
- [ ] Salvar e carregar modelos treinados
|
|
210
|
+
- [ ] Aceitar classes em texto (ex: `"bom"`, `"ruim"`) sem conversão manual
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Licença
|
|
215
|
+
|
|
216
|
+
Distribuído sob a licença [MIT](https://github.com/FeAlmassy/AlgoritmoGenetico/blob/main/LICENSE): pode usar, modificar e redistribuir livremente, desde que mantenha o aviso de copyright.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Autores
|
|
221
|
+
|
|
222
|
+
- **Fellipe Almassy** — [GitHub](https://github.com/FeAlmassy)
|
|
223
|
+
- **Matheus Gomes** — [GitHub](https://github.com/matheos-hash)
|
|
File without changes
|
|
Binary file
|
|
Binary file
|