30 "Algoritmo Genético",
31 "Algoritmo Evolutivo" };
45 "Avaliação partilhada",
57 {
"POPULACAO", 20, 2, 1000000,
"Número de elementos em cada geração",
NULL,
_TV(
"0,2,3") },
58 {
"PROB_CRUZAR",100,0,100,
"Probabilidade de um estado ser cruzado",
NULL,
_TV(
"0,3") },
59 {
"PROB_MUTAR",50,0,100,
"Probabilidade de um estado sofrer uma mutação após gerado",
NULL,
_TV(
"0,3") },
60 {
"SELECAO",1,1,3,
"Método de seleção dos pais para cruzamento",
nomesSelecao,
_TV(
"0,3") },
61 {
"PRESSAO",150,100,200,
62"Pressão da seleção (1.0 a 2.0 > 100 a 200). \
63Controla a diferença de probabilidade entre o melhor e o pior indivÃduo no método Ranking Selection.\n\
64Valores próximos de 1 (100) dão probabilidades quase iguais; valores próximos de 2 (200) favorecem fortemente os melhores.",
NULL,
TVector<int>({8,1}) },
65 {
"TAMANHO_TORNEIO",2,2,100,
"Tamanho do torneio, caso a sobrevivência seja do tipo torneio.",
NULL,
TVector<int>({8,2}) },
66 {
"PROB_MELHOR_TORNEIO",100,0,100,
"Probabilidade do melhor ganhar o torneio.",
NULL,
TVector<int>({8,2}) },
67 {
"SOBREVIVENCIA",1,1,3,
"Método de seleção dos elementos que sobrevivem à nova geração, utilizado nos Algoritmos Genéticos",
nomesSobrevivencia,
_TV(
"0,3") },
68 {
"PERC_DESCENDENTES",100,0,100,
"Número de descendentes a substituirem elementos na população, em percentagem (100 toda a população é substituÃda, 0 apenas um elemento)",
NULL,
_TV(
"0,3") },
69 {
"Q_ROUND_ROBIN",3,2,100,
"Número de elementos no round-robin (valor de q)",
NULL,
TVector<int>({12,3}) },
70 {
"ELITISMO",1,0,100,
"Número absoluto de indivÃduos melhores, que se mantêm na geração seguinte, excepto se há descendência com valor igual ou superior",
NULL,
_TV(
"0,3") },
71 {
"IMIGRANTES",1,0,100,
"Número absoluto de indivÃduos imigrantes, substituindo quaisquer outros na população.",
NULL,
_TV(
"0,3") },
73 {
"DIST_MINIMA",0,0,1000,
"Distância mÃnima imposta entre elementos da população",
NULL,
_TV(
"0,2,3") },
79 {
"Épocas",
"Número de épocas decorridas num algoritmo evolutivo. Uma época é uma geração única.",
IND_EPOCAS },
80 {
"Gerações",
"número de estados gerados",
IND_GERACOES }
110 while (!
melhor->Parar()) {
118 while (!
melhor->Parar()) {
268 while (!
melhor->Parar()) {
348 Debug(
PASSOS,
false,
"\nÉpoca %d #%d - %d|%d [%d-%d]",
364 valor -=
pesos[pai++];
409 if (
Debug(
PASSOS,
false,
"\n%s Época %d, população %d",
424 Debug(
DETALHE,
false,
" [d: %d a %d (média %d, melhor/pior %d)]",
455 for (
int i = 0;
i <
id.Count();
i += 2)
474 int& minDist,
int& maxDist,
int& avgDist,
int& melhorPior)
535 peso.Count(
id.Count());
537 for (
int i = 0;
i <
id.Count();
i++)
538 peso[
id[
i]] =
id.Count() -
i;
572 Debug(
COMPLETO,
false,
" - Torneio, tamanho %d, probabilidade melhor %d.",
608 Debug(
COMPLETO,
false,
"\nFASE Reproduzir %d pais\nPais emparelhados:",
pais.Count());
619 while (!
pais.Empty()) {
661 Debug(
COMPLETO,
false,
"\nFilhos (g) - %d cruzamentos, %d mutações",
736 for (
int j = 0;
j <
q;
j++) {
797 Debug(
COMPLETO,
false,
"\nFASE Diversidade - avaliação partilhada");
801 for (
int i = 0;
i <
id.Count() &&
i < 20;
i++)
813 Debug(
COMPLETO,
false,
" (%d penalizações aplicadas)", count);
825 for (
int i = 0;
i <
id.Count() &&
i < 20;
i++)
901 opcao =
NovoValor(
"\nOperação (1 - Mutar, 2 - Cruzar, 3 - Vizinhos): ");
916 else if (
opcao == 2) {
937 else if (
opcao == 3) {
constexpr int BUFFER_SIZE
@ IND_GERACOES
número de estados gerados durante a procura
@ IND_EPOCAS
Número de épocas decorridas num algoritmo evolutivo. Uma época é uma geração única.
TProcuraMelhorativa * TPonto
@ PASSOS
Exibe passos intermediários.
@ EXTRA_DEBUG
Nível extra para debug muito detalhado (uso interno).
@ ATIVIDADE
Apenas eventos principais.
@ COMPLETO
Mostra toda a execução detalhadamente.
@ DETALHE
Debug detalhada sobre estados e decisões.
@ CONT_ALGORITMO
Tempo da execução do algoritmo por instância.
@ ALGORITMO
Algoritmo base a executar.
@ LIMITE_ITERACOES
Número máximo de iterações (0 significa sem limite).
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
@ LIMITE_TEMPO
Tempo limite em segundos.
TVector< int > _TV(const char *str)
TVector< TPonto > SelecionarSobreviventesAE(TVector< TPonto > &populacao, TVector< TPonto > &descendentes)
void ObterExtremos(TVector< TPonto > &populacao, int &minCusto, int &maxCusto)
static int epocas
Número de épocas decorridas num algoritmo evolutivo. Uma época é uma geração única.
void LibertarVector(TVector< TPonto > &vector, int excepto=-1)
TVector< TPonto > SelecionarPaisAE(TVector< TPonto > &populacao)
virtual void Cruzamento(TPonto a, TPonto b)
void DebugPopulacaoAE(TVector< TPonto > &populacao, const char *titulo)
virtual void Copiar(TPonto objecto)
Fica com uma cópia do objecto.
void DebugPassoAG(int pop, int min, int max)
void CalcularAvaliacoes(TVector< TPonto > &vizinhos, int &melhorValor, int &melhorIndice)
virtual void NovaSolucao(void)
TPonto MelhorAtual(TPonto &atual, TVector< TPonto > &vizinhos, int indice)
void DebugOptimoLocal(TPonto solucao)
TVector< TPonto > AplicarDiversidadeAE(TVector< TPonto > &populacao)
TVector< TPonto > CompletarPopulacaoAE(TVector< TPonto > &populacao)
TVector< TPonto > ReproduzirAE(TVector< TPonto > &pais, TVector< TPonto > &populacao)
void DiversidadeAE(TVector< TPonto > &populacao, int &minDist, int &maxDist, int &avgDist, int &melhorPior)
void LimparEstatisticas()
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para...
void DebugMelhorEncontrado(TPonto ponto)
void Explorar() override
definir para explorar manualmente os dados (não definido em TProcura, apenas em TProcuraConstrutiva)
virtual int Avaliar(void)
void DebugGeracaoAE(int epoca, TVector< TPonto > &populacao)
int MelhorCusto(TVector< TPonto > &populacao, bool inverter=false)
int64_t Indicador(int id) override
Redefinição. Ver TProcura::Indicador().
void DebugPassoEM(TPonto solucao)
void DebugInicioEM(int ID, TPonto solucao)
int custo
Custo total, atualizada após Avaliar()
static int lowerBound
Lower Bound, se existir.
virtual int Distancia(TPonto a)
TProcuraMelhorativa(void)
void Selecao(int &pai, int &mae, TVector< int > &pesos, int total)
void DebugCruzamentoAG(int gPai, int gMae, int gFilho, int mutou)
virtual void Vizinhanca(TVector< TPonto > &vizinhos)
~TProcuraMelhorativa(void)
void ResetParametros() override
Inicializa os parametros, indicadores e instâncias.
bool Parar(void)
Verifica se a procura deve ser interrompida.
void VerificaMelhor(TPonto &melhor, TPonto atual)
void OrdemValor(TVector< TPonto > &populacao, TVector< int > &id)
int ExecutaAlgoritmo()
Executa o algoritmo com os parametros atuais.
virtual TPonto Duplicar(void)=0
Cria um objecto que é uma cópia deste.
static int geracoes
Número de estados gerados.
virtual void Debug(bool completo=true)
Mostra o estado no ecrã, para debug.
int Parametro(int id) const
static int Dominio(int &variavel, int min=INT_MIN, int max=INT_MAX)
Limita o domínio de um parâmetro inteiro.
static int resultado
Resultado retornado pelo algoritmo na última execução.
virtual int64_t Indicador(int id)
Retorna um indicador, após a execução do algoritmo.
static char * MostraTempo(double segundos)
Mostra tempo num formato humano.
static int iteracoes
Número total de iterações realizadas na última execução.
virtual void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
static int NovoValor(const char *prompt)
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 ...
void DebugTabela(ENivelDebug nivel, TVector< int >tabela, const char *tipo="")
Mostra uma tabela de inteiros, 10 elementos por linha, apenas se o nível de debug for igual ou superior...
static TVector< int > indAtivo
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
static double Cronometro(enum ECronometro id=CONT_ALGORITMO, bool inicialiar=false)
retorna o tempo em segundos desde que o cronómetro foi inicializado
virtual void LimparEstatisticas()
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para...
TVector< Item > & RandomOrder()
Coloca os elementos em ordem aleatória (Fisher–Yates shuffle).
TVector< Item > & Sort(TVector< int > *idxvect=nullptr)
Ordena todo o vetor, opcionalmente devolvendo Ãndices ordenados.
TVector< Item > & Reset(Item const &i)
Preenche todo o vetor com um mesmo valor.
int Find(Item &i, bool binary=false, int left=0, int right=-1)
Procura um elemento no vetor.
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.