35 parametro[
ALGORITMO] = {
"ALGORITMO",1,1,1,
"Escolha do algoritmo base a executar.",{
"Algoritmo Evolutivo" }};
39 {
"POPULACAO", 20, 2, 1000000,
"Número de elementos em cada geração" },
40 {
"PROB_CRUZAR",100,0,100,
"Probabilidade de um estado ser cruzado" },
41 {
"PROB_MUTAR",50,0,100,
"Probabilidade de um estado sofrer uma mutação após gerado" },
42 {
"SELECAO",1,1,3,
"Método de seleção dos pais para cruzamento", {
47 {
"PRESSAO",150,100,200,
48"Pressão da seleção (1.0 a 2.0 > 100 a 200). \
49Controla a diferença de probabilidade entre o melhor e o pior indivíduo no método Ranking Selection.\n\
50Valores próximos de 1 (100) dão probabilidades quase iguais; valores próximos de 2 (200) favorecem fortemente os melhores.",
"", {
SELECAO,1}},
51 {
"TAMANHO_TORNEIO",2,2,100,
"Tamanho do torneio, caso a sobrevivência seja do tipo torneio.",
"", {
SELECAO,2}},
52 {
"PROB_MELHOR_TORNEIO",100,0,100,
"Probabilidade do melhor ganhar o torneio.",
"", {
SELECAO,2}},
53 {
"SOBREVIVENCIA",1,1,3,
"Método de seleção dos elementos que sobrevivem à nova geração, utilizado nos Algoritmos Genéticos", {
58 {
"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)" },
59 {
"Q_ROUND_ROBIN",3,2,100,
"Número de elementos no round-robin (valor de q)",
"", {
SOBREVIVENCIA,3}},
60 {
"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" },
61 {
"IMIGRANTES",1,0,100,
"Número absoluto de indivíduos imigrantes, substituindo quaisquer outros na população." },
62 {
"DIVERSIDADE",3,1,3,
"Estratégia de diversidade. ", {
64 "Avaliação partilhada",
67 {
"DIST_MINIMA",0,0,1000,
"Distância mínima imposta entre elementos da população" }
72 {
"Épocas",
"Número de épocas decorridas num algoritmo evolutivo. Uma época é uma geração única.",
IND_EPOCAS },
103 while (!
melhor->Parar()) {
111 while (!
melhor->Parar()) {
261 while (!
melhor->Parar()) {
341 Debug(
PASSOS,
false,
"\nÉpoca %d #%d - %d|%d [%d-%d]",
357 valor -=
pesos[pai++];
417 Debug(
DETALHE,
false,
" [%-2s%d-%d (μ=%d, melhor/pior %d)]",
425 Debug(
DETALHE,
false,
"\n │ └──────────────────────────────────── ");
440 printf(
"\n │ ├───── %s ───── ", *
titulo);
442 printf(
"\n │ │ %-2s", Icon(EIcon::ELEMENTO));
445 printf(
" %-2s", Icon(EIcon::VALOR));
454 printf(
"\n │ ├───── %s ───── ", *
titulo);
456 printf(
"\n │ │ %-2s ", Icon(EIcon::ELEMENTO));
461 printf(
"\n │ │ ────┼");
474 printf(
"\n │ │ ────┴");
483 printf(
"\n │ │ %-2s %-2s %-2s \n │ │ ────┼────┼────┼",
484 Icon(EIcon::ELEMENTO), Icon(EIcon::ELEMENTO), Icon(EIcon::DIST));
485 for (
int i = 0;
i <
id.Count();
i += 2) {
492 printf(
"\n │ │ ────┴────┴────┴");
504 int& minDist,
int& maxDist,
int& avgDist,
int& melhorPior)
559 Debug(
COMPLETO,
false,
"\n │ ├─┬─── FASE %-2s Selecionar %d %-2spais ───── ",
560 Icon(EIcon::SEL_PAIS),
descendentes, Icon(EIcon::PAIS));
568 peso.Count(
id.Count());
570 for (
int i = 0;
i <
id.Count();
i++)
571 peso[
id[
i]] =
id.Count() -
i;
605 Debug(
COMPLETO,
false,
"\n │ │ ├───── Torneio, tamanho %d, probabilidade melhor %d ───── ",
624 Debug(
COMPLETO,
false,
"\n │ │ ├───── Número de seleções ───── ");
634 Debug(
COMPLETO,
false,
"\n │ │ └──────────────────────────────────── ");
646 Debug(
COMPLETO,
false,
"\n │ ├─┬─── FASE %-2s Reproduzir %d pais ───── ", Icon(EIcon::CRUZAR),
pais.Count());
647 Debug(
COMPLETO,
false,
"\n │ │ ├───── Pais (%-2s) ───── ", Icon(EIcon::PAIS));
658 while (!
pais.Empty()) {
716 for (
int j =
i;
j <=
i + 1;
j++)
725 Debug(
COMPLETO,
false,
"\n │ │ ├───── Pais (%-2s) ───── ", Icon(EIcon::VALOR));
727 Debug(
COMPLETO,
false,
"\n │ │ ├───── Filhos (%-2s) %-2s%d %-2s%d ───── %-2s%d %-2s%d %-2s%d",
732 Icon(EIcon::EMPATE),
igual,
733 Icon(EIcon::LB),
pior);
735 Debug(
COMPLETO,
false,
"\n │ │ └──────────────────────────────────── ");
747 Debug(
COMPLETO,
false,
"\n │ ├─┬─── FASE %-2s Sobrevivência ───── ", Icon(EIcon::SOBREVIVENCIA));
762 Debug(
COMPLETO,
false,
"\n │ │ ├───── %-2s Idade ───── ", Icon(EIcon::IDADE));
774 Debug(
COMPLETO,
false,
"\n │ │ ├───── Substituir piores ───── ");
780 Debug(
COMPLETO,
false,
"\n │ │ ├───── Custos em ambas gerações ───── ");
797 Debug(
COMPLETO,
false,
"\n │ │ ├───── Round Robin (q: %d) ───── ",
q);
803 Debug(
COMPLETO,
false,
"\n │ │ ├───── Custos em ambas gerações ───── ",
q);
810 for (
int j = 0;
j <
q;
j++) {
819 Debug(
COMPLETO,
false,
"\n │ │ ├───── Número de perdas ───── ");
836 Icon(EIcon::IMIGRANTES));
843 Debug(
COMPLETO,
false,
" %d✖ →🆕", idx + 1, Icon(EIcon::APAGADO), Icon(EIcon::IMIGRANTES));
862 Icon(EIcon::ELITE),
idElite[
i] + 1, idx + 1);
874 Debug(
COMPLETO,
false,
"\n │ │ └──────────────────────────────────── ");
888 Debug(
COMPLETO,
false,
"\n │ ├───── FASE %-2s Diversidade - avaliação partilhada ───── ",
889 Icon(EIcon::DIVERSIDADE));
893 for (
int i = 0;
i <
id.Count() &&
i < 20;
i++)
905 Debug(
COMPLETO,
false,
" (%d penalizações aplicadas)", count);
908 Debug(
COMPLETO,
false,
"\n │ └────────────────────────────────────── ");
915 Debug(
COMPLETO,
false,
"\n │ └───── FASE %-2s Diversidade - limpeza ───── ",
916 Icon(EIcon::DIVERSIDADE));
920 for (
int i = 0;
i <
id.Count() &&
i < 20;
i++)
945 if (
Debug(
ATIVIDADE,
false,
"\n │ %-2s %-2s%s %-2sg:%d\n─┴───────────────────",
947 Icon(EIcon::VALOR),
custo))
950 printf(
"\n─┬───────────────────");
1004 printf(
" │ ┌───── %-2s ───── ", Icon(EIcon::MUTAR));
1005 printf(
"\n │ │ %-2s [1-%d]: ", Icon(EIcon::ELEMENTO),
populacao.Count());
1008 printf(
" │ │ %-2s ", Icon(EIcon::ELEMENTO));
1011 printf(
"\n │ │ %-2s ", Icon(EIcon::MUTAR));
1016 printf(
"\n │ └────────────── ");
1018 else if (
opcao == 2) {
1019 printf(
" │ ┌───── %-2s ───── ", Icon(EIcon::CRUZAR));
1020 printf(
"\n │ │ %-2sPai [1-%d]: ", Icon(EIcon::ELEMENTO),
populacao.Count());
1022 printf(
" │ │ %-2sMãe [1-%d]: ", Icon(EIcon::ELEMENTO),
populacao.Count());
1024 printf(
" │ │ %-2sFilho [1-%d]: ", Icon(EIcon::ELEMENTO),
populacao.Count());
1030 printf(
"\n │ │ %-2sPai ", Icon(EIcon::ELEMENTO));
1032 printf(
"\n │ │ %-2sMãe ", Icon(EIcon::ELEMENTO));
1035 printf(
"\n │ │ %-2sFilho ", Icon(EIcon::CRUZAR));
1040 printf(
"\n │ └────────────── ");
1042 else if (
opcao == 3) {
1043 printf(
" │ ┌───── %-2s ───── ", Icon(EIcon::VIZINHO));
1044 printf(
"\n │ │ %-2s[1-%d]: ", Icon(EIcon::ELEMENTO),
populacao.Count());
1047 printf(
" │ │ %-2s ", Icon(EIcon::ELEMENTO));
1052 printf(
"\n │ │ %-2s[1-%d]: ", Icon(EIcon::ELEMENTO),
vizinhos.Count());
1062 printf(
"\n │ └────────────── ");
1067 printf(
" └──────────────── ");
@ 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< 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)
virtual void Copiar(TPonto objecto)
Fica com uma cópia do objecto.
void DebugID(int id, int pop)
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()
Chamar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo ...
void DebugMelhorEncontrado(TPonto ponto)
void Explorar() override
definir para explorar manualmente os dados (não definido em TProcura, apenas em TProcuraConstrutiva)
void DebugPopulacaoAE(TVector< TPonto > &populacao, TString titulo)
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)
void DebugDiversidadeAE(TVector< TPonto > &populacao, TString titulo)
virtual void Vizinhanca(TVector< TPonto > &vizinhos)
~TProcuraMelhorativa(void)
void ResetParametros() override
Inicializa os parâmetros, indicadores e instâncias.
static const char * debugPrefixo
Utilizar como prefixo em cada linha no método Debug() do estado.
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 int iteracoes
Número total de iterações realizadas na última execução.
virtual void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
static int NovoValor(TString prompt)
static TString MostraTempo(double segundos)
Mostra tempo num formato humano.
static TVector< TIndicador > indicador
Indicadores que podem ser calculados após a execução, quer com informação da instãncia,...
void DebugTabela(ENivelDebug nivel, TVector< int >tabela, TString tipo="", TString prefixo="", int modoCor=0, bool duplaColuna=false)
Mostra uma tabela de inteiros, 10 elementos por linha, apenas se o nível de debug for igual ou superi...
static void DebugHSL(float h=-1, float s=1.0, float l=0.2, bool fundo=true)
Muda a cor (fundo/letra) com HSL.
static TVector< int > indAtivo
static double Cronometro(enum ECronometro id=CONT_ALGORITMO, bool inicializar=false)
retorna o tempo em segundos desde que o cronómetro foi inicializado
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
virtual void LimparEstatisticas()
Chamar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo ...
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.