
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização:
- procuras construtivas
- procuras melhorativas (evolutivas e locais)
- procuras adversas (minimax, alfa-beta, iterativo)
Documentação completa em:
👉 TProcura - Documentação
📑 Sumário
Sobre o Projeto
O TProcura junta testes paramétricos e implementação genérica de algoritmos de procura.
Em vez de alterar macros e recompilar a cada teste de mudança de parâmetros, propõe-se:
- Estrutura para uma lista de parâmetros, gerida na superclasse
- Gerar automaticamente todas as combinações de parâmertros que o utilizador desejar
- Executar instâncias para cada combinação de parâmetros, e recolher indicadores solicitados
- Exportar resultados em CSV para análises em Excel, R ou Python
A arquitetura baseia-se em superclasses que já implementam algoritmos de procura. O utilizador só precisa de:
- Herdar a classe adequada
- Redefinir métodos de geração de sucessores, avaliação ou operadores, para o problema concreto, conforme adequado
- Declarar novos parâmetros e indicadores, se desejar
Este projeto é utilizado nas Unidades Curriculares:
Funcionalidades
- Modo interativo, linha de comando ou MPI
- Geração automática de combinações de parâmetros
- Recolha de indicadores (tempo, custo, iterações, etc.)
- Exportação de resultados em CSV
- Procuras Construtivas:
- Largura / Profundidade / Custo uniforme
- Melhor-primeiro / A* / IDA* / Branch-and-Bound
- Procuras melhorativas:
- Algoritmos Evolutivos - (futuro: Scatter Search, sistemas artificiais imunes, inteligência de enxames)
- Escalada do Monte - (futuro: pesquisa tabu, arrefecimento simulado, GRASP, procura com vizinhança variável e muito alargada)
- Procuras adversas:
- Minimax / Alfa-beta / iterativo / Hash-table de estados explorados (futuro: MCTS)
📦 Estrutura do Repositório
O repositório inclui 4 projetos principais, cada um com uma superclasse base para implementação de novos problemas:
TProcura
├─ TProcuraConstrutiva
│ └─ TProcuraAdversa
└─ TProcuraMelhorativa
- TProcura: modos de execução (interativo, linha de comandos, MPI), gestão de parâmetros e indicadores, execução de testes.
- TProcuraConstrutiva / TProcuraAdversa: algoritmos construtivos e adversos, exigem implementação de sucessores e heurística.
- TProcuraMelhorativa: algoritmos melhorativos (solução inicial, vizinhança, mutação, cruzamento, avaliação).
Subclasses já fornecem operadores para diferentes representações, restando apenas implementar a avaliação.
── TProcuraMelhorativa
├─ TRepresentacaoBinaria
├─ TRepresentacaoInteira
├─ TRepresentacaoPermutacao
├─ TRepresentacaoReal
└─ TRepresentacaoArvore
Estrutura de Pastas
A estrutura do repositório é a seguinte:
TProcura
├─ Adversa/Construtiva/Melhorativa # pastas de projetos principais
│ └─ Teste # projeto de teste (não necessário para usar a biblioteca)
│ ├─ CasosTeste # ficheiros para testes de validação de alterações ao código
│ ├─ Resultados # ficheiros CSV de execução (não colocados no repositório)
│ └─ bin/x64 # (fora do repositório) pasta bin criada na compilação em linux ou x64 no Visual Studio
│ ├─ Debug
│ ├─ MPI
│ └─ Release
├─ Teste # mesma estrutura em todos os projetos
│ └─ ...
├─ docs # documentação em Markdown
└─ styles # estilos doxygen
Compilação e Execução
Na pasta <projeto>/Teste
do projeto respetivo:
- Linux:
- Pré-requisito para MPI: instalar o Open MPI
sudo apt-get update
sudo apt-get install -y openmpi-bin libopenmpi-dev
- Compilação:
make
ou make mpi
- Windows (Visual Studio): selecionar a configuração desejada (Debug, Release ou MPI).
⚠️ Para MPI é necessário instalar previamente o MS MPI.
Executar o projeto:
- Interativo:
./Executavel
- Linha de comando:
./Executavel <argumentos>
(ajuda: ./Executavel -h
)
- MPI:
mpiexec -n 4 ./Executavel <argumentos>
Onde fica o executável:
- Linux:
<projeto>/Teste/bin/[Debug|MPI|Release]
- Windows (Visual Studio):
<projeto>/Teste/x64/[Debug|MPI|Release]
ℹ️ Os Makefile
estão localizados em <projeto>/Teste
, pois destinam-se apenas à compilação dos projetos de teste.
ℹ️ Os ficheiros CSV de resultados podem ser gravados em Resultados/
usando o parâmetro -R Resultados/<nome>
.
Instalação
Clonar o projeto, compilar um dos projetos de teste e executar.
Opção 1 - Clonar o Repositório
git clone https://github.com/jcoelho72/TProcura.git
ou
Aceder a página do repositório e clique em **"Code" → "Open with Visual Studio"**.
Opção 2 - Download Manual
Aceder a página do repositório e clique em **"Code" → "Download ZIP"**.
Extraia os arquivos e siga as instruções de compilação (por exemplo, via Makefile, Visual Studio etc., conforme seu ambiente).
Opção 3 - Utilizar como Submódulo
Para integrar o TProcura como parte de outro projeto, utilize um submódulo:
git submodule add https://github.com/jcoelho72/TProcura.git
Uso
Para implementar um novo problema utilizando uma das superclasses pode:
- identificar a superclasse mais adequada, e redefinir, criando uma subclasse;
- readaptar um problema similar já implementado.
Superclasses:
- TProcura - caso o problema não seja de procura, poderá utilizar esta classe para fazer testes paramétricos
- TProcuraConstrutiva - indicado caso tenha um problema de procura, e adopte a abordagem construtiva
- TProcuraMelhorativa - indicado caso tenha um problema de procura ou muito grande, e opte pela abordagem melhorativa
- TCodificacaoBinaria, TCodificacaoInteira, TCodificacaoPermutacao, TCodificacaoReal, TCodificacaoArvore - na abordagem melhorativa, caso a representação do seu problema encaixe numa destas (as mais comuns), utilize estas classes de modo a ter os operadores já disponíveis, basta implementar a avaliação.
- TProcuraAdversa - indicado para procuras adversas, ou seja jogos
Exemplos
Problemas de exemplo da classe TProcura:
- TesteTVetor
Problemas de exemplo da classe TProcuraConstrutiva:
- Aspirador (parte 1, parte 2)
- Puzzle 8
- 8 Damas
- Partição
- Artificial
Problemas de exemplo da classe TProcuraMelhorativa:
- 8 Damas CI (TCodificacaoInteira)
- 8 Damas CP (TCodificacaoPermutacao)
- Partição CB (TCodificacaoBinaria)
- ? (TCodificacaoReal)
- ? (TCodificacaoArvore)
Problemas de exemplo da classe TProcuraAdversa:
- Jogo do Galo
- Jogo em Linha
Esses exemplos servem tanto para testar o repositório quanto para servir de base para novas implementações.
Bibliografia
Licença
Distribuído sob a licença MIT. Veja o arquivo LICENSE para mais informações.