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.
Files changed (25) hide show
  1. algoritmo_genetico-1.0.0/.github/workflows/publicar.yml +37 -0
  2. algoritmo_genetico-1.0.0/.gitignore +9 -0
  3. algoritmo_genetico-1.0.0/LICENSE +21 -0
  4. algoritmo_genetico-1.0.0/PKG-INFO +244 -0
  5. algoritmo_genetico-1.0.0/README.md +223 -0
  6. algoritmo_genetico-1.0.0/exemplos/.gitkeep +0 -0
  7. algoritmo_genetico-1.0.0/exemplos/base_de_dados_para_exemplos/modelo_base.xlsx +0 -0
  8. algoritmo_genetico-1.0.0/exemplos/exemplo_1_binario/dados_binario_1.xlsx +0 -0
  9. algoritmo_genetico-1.0.0/exemplos/exemplo_1_binario/dados_binario_2.xlsx +0 -0
  10. algoritmo_genetico-1.0.0/exemplos/exemplo_1_binario/exemplo_binario.ipynb +448 -0
  11. algoritmo_genetico-1.0.0/exemplos/exemplo_2_multiclasse/dados_multiclasse.xlsx +0 -0
  12. algoritmo_genetico-1.0.0/exemplos/exemplo_2_multiclasse/exemplo_multiclasse.ipynb +496 -0
  13. algoritmo_genetico-1.0.0/pyproject.toml +39 -0
  14. algoritmo_genetico-1.0.0/requirements.txt +3 -0
  15. algoritmo_genetico-1.0.0/src/algoritmo_genetico/__init__.py +9 -0
  16. algoritmo_genetico-1.0.0/src/algoritmo_genetico/atualizacao.py +70 -0
  17. algoritmo_genetico-1.0.0/src/algoritmo_genetico/criacao.py +35 -0
  18. algoritmo_genetico-1.0.0/src/algoritmo_genetico/cruzamento.py +38 -0
  19. algoritmo_genetico-1.0.0/src/algoritmo_genetico/divisao.py +91 -0
  20. algoritmo_genetico-1.0.0/src/algoritmo_genetico/fitness.py +152 -0
  21. algoritmo_genetico-1.0.0/src/algoritmo_genetico/leitura.py +54 -0
  22. algoritmo_genetico-1.0.0/src/algoritmo_genetico/mutacao.py +43 -0
  23. algoritmo_genetico-1.0.0/src/algoritmo_genetico/nucleo.py +261 -0
  24. algoritmo_genetico-1.0.0/src/algoritmo_genetico/selecao.py +79 -0
  25. 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,9 @@
1
+ venv_ag/
2
+ __pycache__/
3
+ *.pyc
4
+ .DS_Store
5
+ testes/*.ipynb
6
+ dist/
7
+ build/
8
+ *.egg-info/
9
+ .dist/
@@ -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