TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
|
Representa um estado do problema da partição. More...
#include <Particao.h>
Public Member Functions | |
CParticao (void) | |
~CParticao (void) | |
TProcuraConstrutiva * | Duplicar (void) |
Cria um objecto que é uma cópia deste. | |
void | Copiar (TProcuraConstrutiva *objecto) |
void | Inicializar (void) |
Coloca o objecto no estado inicial da procura. | |
void | Sucessores (TVector< TNo > &sucessores) |
Coloca em sucessores a lista de estados sucessores. | |
bool | SolucaoCompleta (void) |
Verifica se o estado actual é objectivo (é uma solução completa) | |
void | Debug (void) |
Mostra o estado no ecrã, para debug. | |
void | MostrarSolucao (void) |
definir para visualizar a solução | |
const char * | Acao (TProcuraConstrutiva *sucessor) |
void | Codifica (uint64_t estado[OBJETO_HASHTABLE]) |
Codifica o estado para um vetor de inteiros de 64 bits. | |
void | ResetParametros () |
Inicializa os parametros, indicadores e instâncias. | |
CParticao (void) | |
~CParticao (void) | |
TPonto | Duplicar (void) |
Cria um objecto que é uma cópia deste. | |
void | Copiar (TPonto objecto) |
Fica com uma cópia do objecto. | |
void | Inicializar (void) |
Coloca o objecto no estado inicial da procura. | |
void | Debug (void) |
Mostra o estado no ecrã, para debug. | |
void | MostrarSolucao (void) |
definir para visualizar a solução | |
void | TesteManual (const char *nome) |
Inicializa a interação com o utilizador. | |
void | NovaSolucao (void) |
int | Avaliar (void) |
void | Vizinhanca (TVector< TPonto > &vizinhos) |
void | Mutar (void) |
void | Cruzamento (TPonto a, TPonto b) |
int | Distancia (TPonto a) |
![]() | |
TProcuraConstrutiva (void) | |
virtual | ~TProcuraConstrutiva (void) |
virtual void | Copiar (TNo objecto) |
Fica com uma cópia do objecto. | |
void | Inicializar (void) override |
Coloca o objecto no estado inicial da procura. | |
void | ResetParametros () override |
Redefinição. Ver TProcura::ResetParametros(). | |
virtual const char * | Acao (TNo sucessor) |
Retorna a ação (movimento, passo, jogada, lance, etc.) que gerou o sucessor. | |
virtual int | Heuristica (void) |
Função para calcular quanto falta para o final, o valor da heurÃstica. | |
virtual bool | Acao (const char *acao) |
Executa a ação (movimento, passo, jogada, lance, etc.) no estado atual. | |
virtual bool | Distinto (TNo estado) |
Verifica se o estado actual distinto do fornecido. | |
void | MostrarSolucao (void) |
Mostrar solução, seja um caminho ou o próprio estado. | |
int | ExecutaAlgoritmo () |
Executa o algoritmo com os parametros atuais. | |
int | Indicador (int id) override |
Redefinição. Ver TProcura::Indicador(). | |
int | LarguraPrimeiro (int limite=0) |
Executa a procura em largura primeiro, algoritmo cego. | |
int | CustoUniforme (int limite=0) |
Executa a procura por custo uniforme, algoritmo cego. | |
int | ProfundidadePrimeiro (int nivel=0) |
Executa a procura em profundidade primeiro, algoritmo cego. | |
int | MelhorPrimeiro (int nivel=0) |
Executa a procura melhor primeiro, algoritmo informado. | |
int | AStar (int limite=0) |
Executa a procura A*, algoritmo informado. | |
int | IDAStar (int upperBound=0) |
Executa a procura IDA*, algoritmo informado. | |
int | BranchAndBound (int upperBound=0) |
Executa o algoritmo Branch-and-Bound, um algoritmo informado. | |
void | LimparEstatisticas (clock_t &inicio) override |
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para a execução. | |
void | ExecucaoTerminada (clock_t inicio) override |
Chamar após a execução do algoritmo. Grava o tempo consumido. | |
int | LowerBound () |
void | NovaLinha (bool tudo=true) |
![]() | |
TProcura (void) | |
virtual | ~TProcura (void) |
virtual bool | Parar (void) |
Verifica se a procura deve ser interrompida. | |
virtual void | TesteEmpirico (TVector< int > instancias, bool mostrarSolucoes=true, char *ficheiro=NULL) |
Executa testes empíricos, em todas as configurações guardadas, nas instâncias selecionadas. | |
virtual void | main (int argc, char *argv[], const char *nome) |
Inicializa a interação com o utilizador. | |
virtual TVector< int > | CodificarSolucao () |
retorna um vetor de inteiros com a codifciação da solução (esta codificação será adicionada aos indicadores, no ficheiro CSV de resultados) | |
bool | TempoExcedido () |
bool | IteracoesExcedido () |
int | Parametro (int id) |
![]() | |
TProcuraMelhorativa (void) | |
~TProcuraMelhorativa (void) | |
bool | Acao (const char *acao) |
void | ResetParametros () override |
Inicializa os parametros, indicadores e instâncias. | |
int | EscaladaDoMonte () |
int | AlgoritmoGenetico () |
void | TesteManualX (const char *nome) |
provavelmente apagar | |
void | DebugMelhorEncontrado (TPonto ponto) |
provavalmente apagar | |
int | Indicador (int id) override |
Redefinição. Ver TProcura::Indicador(). | |
void | LimparEstatisticas (clock_t &inicio) |
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para a execução. | |
Public Attributes | |
TVector< int > | numeros |
TVector< int > | esquerda |
TVector< int > | direita |
int | totalEsquerda |
int | totalDireita |
TVector< bool > | solCompleta |
![]() | |
TNo | pai |
Ponteiro para o estado pai, na árvore de procura. | |
int | custo |
Custo total acumulado desde o estado inicial. | |
int | heuristica |
Estimativa para o custo até um estado objetivo, se disponÃvel. | |
![]() | |
int | custo |
Custo total, atualizada após Avaliar() | |
int | geracoes |
Número de estados gerados. | |
int | epocas |
Número de épocas decorridas num algoritmo evolutivo. Uma época é uma geração única. | |
Additional Inherited Members | |
![]() | |
static void | LibertarVector (TVector< TNo > &vector, int excepto=-1, int maiorQue=-1) |
![]() | |
static int | NovoValor (const char *prompt) |
static char * | NovoTexto (const char *prompt) |
![]() | |
static TVector< TNo > | caminho |
Solução retornada pela procura (os estados devem ser libertados). | |
static TNo | solucao = NULL |
Estado objetivo encontrado, retornado pela procura (deve ser libertado). | |
static int | lowerBound = 0 |
Valor mÃnimo que a solução pode apresentar, obtido pela procura. | |
static int | tamanhoCodificado = OBJETO_HASHTABLE |
Número de inteiros de 64 bits utilizados para codificar um objeto (≤ OBJETO_HASHTABLE). | |
static int | expansoes = 0 |
Número de expansões efetuadas. | |
static int | geracoes = 0 |
Número de estados gerados. | |
static TVector< unsigned char > | ramo |
static int | espacosRamo = 2 |
![]() | |
static TParametro | instancia = { NULL,1,1,1, NULL, NULL } |
ID da instância atual, a ser utilizado em SolucaoVazia(). | |
static char | ficheiroInstancia [256] = "instancia_" |
nome do ficheiro de uma instância - editado pelo utilizador (utilizar como prefixo, concatenando com ID da instância) pode ser utilizado para gravar a instãncia num novo formato, colocando um indicador ativo que é chamado após a execução (pode gravar a solução para ficheiro também, mas essa é mais facilmente gravada em CVS codificada em inteiros, onde fica associada à configuração utilizada para a gerar) | |
static TVector< TParametro > | parametro |
Parâmetros a serem utilizados na configuração atual. | |
static TVector< TIndicador > | indicador |
Indicadores que podem ser calculados após a execução, quer com informação da instãncia, quer com resultado da última corrida. | |
static TVector< int > | indAtivo |
static TVector< TVector< int > > | configuracoes |
Conjuntos de configurações para teste empírico. | |
static int | resultado = 0 |
Resultado retornado pelo algoritmo na última execução. | |
static int | tempo = 0 |
tempo consumido na última execução. | |
static int | iteracoes = 0 |
Número total de iterações realizadas na última execução. | |
static clock_t | instanteFinal = 0 |
Instante final (deadline) da corrida atual. | |
static bool | memoriaEsgotada = false |
Flag indicando problemas de memória esgotada. | |
![]() | |
void | DebugExpansao (int sucessor, int sucessores, bool duplo=false) |
void | DebugCorte (int sucessores=-1, bool duplo=false) |
void | DebugSolucao (bool continuar=false) |
void | DebugChamada (void) |
void | DebugPasso (void) |
void | DebugSucessores (TVector< TNo > &sucessores) |
void | DebugIteracao (int iteracao) |
void | DebugEstado (int id=-1, int pai=-1) |
void | DebugRamo (char ramo, char folha) |
int | ObjetivoAlcancado (int item, TVector< TNo > &lista) |
int | ObjetivoAlcancado (TNo estado, bool completa=true) |
int | SolucaoEncontrada (bool continuar=false) |
void | CalculaCaminho (bool completa=true) |
void | VerificaLimites (int limite, int porProcessar, TVector< TNo > &sucessores) |
void | CalcularHeuristicas (TVector< TNo > &sucessores, TVector< int > *id=NULL, bool sortLB=false) |
int | SolucaoParcial (int i, TVector< TNo > &sucessores) |
void | Explorar () |
definir para explorar manualmente os dados (não definido em TProcura, apenas em TProcuraConstrutiva) | |
void | MostrarCaminho () |
unsigned int | Hash () |
void | LimparHT () |
bool | ExisteHT () |
virtual void | SubstituirHT (int indice) |
![]() | |
void | InserirRegisto (TVector< TResultado > &resultados, int inst, int conf) |
Insere um novo registo de resultados. | |
int | Registo (TResultado &resultado, int id) |
Procura um registo com determinado id. | |
void | Registo (TResultado &resultado, int id, int valor) |
Atualiza o valor de um registo. | |
void | MostraParametros (int detalhe=1, TVector< int > *idParametros=NULL) |
Mostra os parâmetros atuais. | |
void | MostraIndicadores () |
Mostra os indicadores definidos. | |
void | MostrarConfiguracoes (int detalhe, int atual=-1) |
Mostra as configurações disponíveis. | |
bool | EditarIndicadores () |
Permite ao utilizador editar os indicadores a utilizar. | |
void | EditarParametros () |
Permite ao utilizador editar os parâmetros. | |
void | EditarConfiguracoes () |
Permite ao utilizador editar as configurações. | |
void | MostraRelatorio (TVector< TResultado > &resultados, bool ultimo=false) |
Mostra um relatório dos resultados. | |
void | ConfiguracaoAtual (TVector< int > ¶metros, int operacao) |
Grava ou lê a configuração atual. | |
int | NovaConfiguracao (TVector< int > ¶metros) |
Adiciona uma nova configuração se ainda não existir. | |
int | MelhorResultado (TResultado base, TResultado alternativa) |
Compara dois resultados para determinar o melhor. | |
void | CalculaTorneio (TVector< TResultado > &resultados) |
Calcula o torneio entre várias configurações. | |
void | MostrarTorneio (TVector< TVector< int > > &torneio, bool jogo=false) |
Mostra os resultados do torneio. | |
void | BarraTorneio (bool nomes) |
Mostra a barra de progresso ou nomes do torneio. | |
TVector< TResultado > | ExtrairConfiguracao (TVector< TResultado > &resultados, int configuracao) |
Extrai resultados de uma determinada configuração. | |
void | SolicitaInstancia () |
Solicita ao utilizador o ID da instância a utilizar, permitindo alterar também o prefixo do ficheiro. | |
TVector< int > | SolicitaInstancias () |
Solicita ao utilizador uma lista de instâncias. | |
void | RelatorioCSV (TVector< TResultado > &resultados, FILE *f) |
Gera um relatório CSV com os resultados. | |
TVector< int > | ExtraiLista (char *str) |
Extrai uma lista de inteiros a partir de uma string. | |
void | InserirConfiguracoes (char *str, TVector< int > &base) |
Insere configurações a partir de uma string. | |
void | InserirConfiguracoes (TVector< int > &base, TVector< int > &produto, TVector< TVector< int > > &valores) |
Insere configurações gerando o produto cartesiano de valores. | |
void | AjudaUtilizacao (const char *programa) |
Mostra ajuda de utilização do programa. | |
![]() | |
void | Selecao (int &pai, int &mae, TVector< int > &pesos, int total) |
void | OrdemValor (TVector< TPonto > &populacao, TVector< int > &id) |
void | CalcularAvaliacoes (TVector< TPonto > &vizinhos, int &melhorValor, int &melhorIndice) |
void | VerificaMelhor (TPonto &melhor, TPonto atual) |
TPonto | MelhorAtual (TPonto &atual, TVector< TPonto > &vizinhos, int indice) |
void | ObterExtremos (TVector< TPonto > &populacao, int &minCusto, int &maxCusto) |
void | Explorar () override |
definir para explorar manualmente os dados (não definido em TProcura, apenas em TProcuraConstrutiva) | |
void | LibertarVector (TVector< TPonto > &vector, int excepto=-1) |
int | ExecutaAlgoritmo () |
Executa o algoritmo com os parametros atuais. | |
void | DebugVizinhos (TVector< TPonto > &vizinhos) |
void | DebugInicioEM (int ID, TPonto solucao) |
void | DebugOptimoLocal (TPonto solucao) |
void | DebugPassoEM (TPonto solucao) |
void | DebugPassoAG (int pop, int min, int max) |
void | DebugCruzamentoAG (int gPai, int gMae, int gFilho, int mutou) |
![]() | |
static int | Dominio (int &variavel, int min=INT_MIN, int max=INT_MAX) |
Limita o domínio de um parâmetro inteiro. | |
![]() | |
static uint64_t | elementosHT [TAMANHO_HASHTABLE][OBJETO_HASHTABLE] |
static int | custoHT [TAMANHO_HASHTABLE] |
static uint64_t | estadoCodHT [OBJETO_HASHTABLE] |
static int | colocadosHT = 0 |
Representa um estado do problema da partição.
Este problema consiste em dividir um conjunto de numeros naturais em duas partes cuja soma dos numeros em cada parte seja igual.
Definition at line 11 of file Particao.h.
CParticao::CParticao | ( | void | ) |
CParticao::~CParticao | ( | void | ) |
Definition at line 9 of file Particao.cpp.
CParticao::CParticao | ( | void | ) |
CParticao::~CParticao | ( | void | ) |
const char * CParticao::Acao | ( | TProcuraConstrutiva * | sucessor | ) |
Definition at line 75 of file Particao.cpp.
Reimplemented from TProcuraMelhorativa.
Definition at line 121 of file Particao.cpp.
Codifica o estado para um vetor de inteiros de 64 bits.
As variáveis de estado devem ser compactadas no vetor de inteiros de 64 bits. Todos os estados codificados têm de ser distintos de 0. Estados distintos, têm de ficar com codificações distintas.
Em diversos problemas, um mesmo estado pode ter múltiplas representações equivalentes. Por exemplo, se um conjunto de inteiros for um estado, este pode ser representado em vetor. No entanto a ordem é irrelevante, dado que é um conjunto. Assim não faz sentido guardar vários estados que sejam representações do mesmo estado. Há que normalizar o estado antes de o guardar, de modo a que seja dado como estado repetido, se uma das duas formas já tiver sido gerada. O exemplo do conjunto de inteiros, a normalização pode ser a ordenação do vetor, constituindo assim um estado único entre todas as formas que o conjunto pode ser representado em vetor. Problemas de tabuleiro, há simetrias que podem gerar várias versões da mesma posição.
Sucessores()
. Reimplemented from TProcuraConstrutiva.
Definition at line 131 of file Particao.cpp.
Fica com uma cópia do objecto.
Este método tem de ser criado na subclasse, de modo a um estado poder ficar igual a outro. As variáveis de estado, devem ser todas copiadas.
Deve garantir que as variáveis copiadas sejam suficientes para reconstruir o estado corretamente. No entanto, uma instância pode ter dados que não mudam em cada estado. Essas variáveis não precisam de estar no estado, e podem ser alocadas de forma estática na subclasse, não sendo necessário copiar nesta função.
A não ser que exista uma estrutura de dados completa, o modelo de código em baixo pode ser facilmente reproduzido para qualquer subclasse.
Reimplemented from TProcuraMelhorativa.
Definition at line 38 of file Particao.h.
|
inline |
Definition at line 24 of file Particao.h.
Reimplemented from TProcuraMelhorativa.
Definition at line 149 of file Particao.cpp.
Mostra o estado no ecrã, para debug.
Esta função deverá mostrar claramente o estado atual, em texto mas da forma mais confortável possível. O formato texto destina-se principalmente a quem implementa o problema, e não utilizadores finais. É importante poder explorar o espaço de estados, para verificar a correta implementação dos sucessores, como também possa ver a árvore de procura dos algoritmos, para árvores pequenas, e assim detectar bugs.
NovaLinha()
pode imprimir caracteres que representam os ramos da árvore de procura, criando uma visualização textual que simula a estrutura da procura.parametro[nivelDebug].valor
. Um nível menor pode mostrar informações mais sucintas, enquanto um nível maior pode detalhar todas as variáveis do estado.Reimplemented from TProcura.
Definition at line 86 of file Particao.cpp.
Mostra o estado no ecrã, para debug.
Esta função deverá mostrar claramente o estado atual, em texto mas da forma mais confortável possível. O formato texto destina-se principalmente a quem implementa o problema, e não utilizadores finais. É importante poder explorar o espaço de estados, para verificar a correta implementação dos sucessores, como também possa ver a árvore de procura dos algoritmos, para árvores pequenas, e assim detectar bugs.
NovaLinha()
pode imprimir caracteres que representam os ramos da árvore de procura, criando uma visualização textual que simula a estrutura da procura.parametro[nivelDebug].valor
. Um nível menor pode mostrar informações mais sucintas, enquanto um nível maior pode detalhar todas as variáveis do estado.Reimplemented from TProcura.
Reimplemented from TProcuraMelhorativa.
Definition at line 159 of file Particao.cpp.
|
virtual |
Cria um objecto que é uma cópia deste.
Este método tem de ser criado na subclasse, de modo a criar uma cópia do mesmo tipo. O código da subclasse geralmente segue um padrão e pode utilizar o modelo abaixo, aproveitando o método Copiar(). É especialmente útil na função de Sucessores(), na geração de um novo estado.
Implements TProcuraConstrutiva.
Definition at line 13 of file Particao.cpp.
Cria um objecto que é uma cópia deste.
Este método tem de ser criado na subclasse, de modo a criar uma cópia do mesmo tipo. O código da subclasse geralmente segue um padrão e pode utilizar o modelo abaixo, aproveitando o método Copiar(). É especialmente útil na função de Sucessores(), na geração de um novo estado.
Implements TProcuraConstrutiva.
Definition at line 29 of file Particao.h.
Coloca o objecto no estado inicial da procura.
Este método inicializa as variáveis de estado no estado inicial vazio. Representa o estado inicial antes de qualquer ação ser realizada na procura. Caso existam dados de instância, deve neste método carregar a instância. A primeira instrução deverá chamar o método da superclasse, conforme modelo em baixo.
Reimplemented from TProcura.
Definition at line 23 of file Particao.cpp.
Coloca o objecto no estado inicial da procura.
Este método inicializa as variáveis de estado no estado inicial vazio. Representa o estado inicial antes de qualquer ação ser realizada na procura. Caso existam dados de instância, deve neste método carregar a instância. A primeira instrução deverá chamar o método da superclasse, conforme modelo em baixo.
Reimplemented from TProcura.
definir para visualizar a solução
Reimplemented from TProcura.
Definition at line 38 of file Particao.h.
definir para visualizar a solução
Reimplemented from TProcura.
Definition at line 49 of file Particao.h.
Reimplemented from TProcuraMelhorativa.
Definition at line 142 of file Particao.cpp.
Reimplemented from TProcuraMelhorativa.
Definition at line 114 of file Particao.cpp.
|
virtual |
Inicializa os parametros, indicadores e instâncias.
Nesta função, a primeira instrução deverá ser a chamada da função da superclasse, para que sejam criados os parametros da superclasse antes de qualquer outra instrução.
Cada problema pode ter um algoritmo e configurações padrão que funcionam bem na maioria dos casos. Nesta função, podem ser definidos estes valores de omissão.
Novos parâmetros podem ser adicionados conforme necessário para atender às particularidades do problema. Estes parametros podem depois ser selecionados ou incluídos num teste empírico, de modo a averiguar em fase de testes, qual a melhor configuração, evitando escolhas arbitrárias ou não fundamentadas.
Nesta função deve ser redefinida a variável com informação dos IDs das instâncias disponíveis. Essa variável é do tipo TParametro, mas não está na lista de parametros, devendo ser inicializada aqui.
Existindo novos indicadores, devem ser adicionados aqui, e redefinida a função Indicador() para calcular o valor.
parametrosConstrutivos
, garantindo que novas adições na superclasse sejam automaticamente refletidas aqui.Exemplo com a alteração do valor de omissão de um parametro, e adição de dois novos parametros.
Reimplemented from TProcura.
Definition at line 151 of file Particao.cpp.
Verifica se o estado actual é objectivo (é uma solução completa)
Este método verifica se o estado atual é objetivo, e portanto temos uma solução completa. A complexidade da verificação depende do problema, podendo ser um teste simples ou envolver múltiplas condições.
Sucessores()
, garantindo que a avaliação do objetivo seja feita apenas quando necessário.Reimplemented from TProcuraConstrutiva.
Definition at line 34 of file Particao.h.
Coloca em sucessores a lista de estados sucessores.
sucessores | - variável com a lista de estados sucessores a retornar. |
Este é o método principal, que define a árvore de procura. Para o estado atual, duplicar o estado por cada ação / estado que seja sucessor. Alterar as variáveis de estado para corresponderem à ação efetuada no estado sucessor. Caso o custo não seja unitário, definir o custo da ação. Chamar o método da superclasse no final, já que irá atualizar estatÃsticas, bem como eliminar estados que sejam repetidos, dependendo da parametrização.
Reimplemented from TProcuraConstrutiva.
Definition at line 51 of file Particao.cpp.
Inicializa a interação com o utilizador.
Esta função arranca com o teste manual, orientada para o programador. A interface permite:
Reimplemented from TProcura.
Definition at line 107 of file Particao.cpp.
Reimplemented from TProcuraMelhorativa.
Definition at line 132 of file Particao.cpp.
Definition at line 19 of file Particao.h.
Definition at line 19 of file Particao.h.
Definition at line 19 of file Particao.h.
Definition at line 25 of file Particao.h.
int CParticao::totalDireita |
Definition at line 20 of file Particao.h.
int CParticao::totalEsquerda |
Definition at line 20 of file Particao.h.