55 {
"ALGORITMO", 1, 1, 1,
"Algoritmo base a executar.", {
"Algoritmo base"} },
56 {
"NIVEL_DEBUG", 0, 0, 4,
"Nível de debug, de reduzido a completo.",
57 {
"NADA",
"ATIVIDADE",
"PASSOS",
"DETALHE",
"COMPLETO" } },
58 {
"SEMENTE", 1, 1, 1000000000,
"Semente aleatória para inicializar a sequência de números pseudo-aleatórios." },
59 {
"LIMITE_TEMPO", 10, 1, 3600,
"Limite de tempo em segundos. " },
60 {
"LIMITE_ITERACOES", 0, 0, 1000000000,
"Limite de número de iterações (0 não há limite). " }
65 {
"Resultado",
"Resultado do algoritmo, interpretado conforme o algoritmo (sucesso/insucesso, custo, qualidade, valor, etc.).",
IND_RESULTADO },
66 {
"Tempo(ms)",
"Tempo em milissegundos da execução (medida de esforço computacional).",
IND_TEMPO },
67 {
"Iterações",
"Iterações do algoritmo, interpretadas conforme o algoritmo (medida de esforço independente do hardware).",
IND_ITERACOES }
91 Debug(
ATIVIDADE,
false,
"\nTProcura::Debug() método não redefinido.");
114 printf(
"\n%s", *nome);
119 "┌─ %-2sMenu ─────────┬────────────────┬─────────────────────┬──────────────┐\n"
122 "└───────────────────┴────────────────┴─────────────────────┴──────────────┘",
123 Icon(EIcon::MENU), Icon(EIcon::INST), Icon(EIcon::EXP), Icon(EIcon::PARAM),
124 Icon(EIcon::SOL), Icon(EIcon::IND), Icon(EIcon::EXEC), Icon(EIcon::CONF),
139 printf(
"\n═╤═ %-2s Execução iniciada ═══", Icon(EIcon::EXEC));
146 printf(
"\n═╧═ %-2s Execução terminada %-2s %s ═══",
147 Icon(EIcon::FIM), Icon(EIcon::TEMPO),
157 default:
Mensagem(Icon(EIcon::IMP),
"Opção não definida.");
break;
184 if (
tokens.Count() < 3 || indice < 0)
192 "\n ├─ %-2sSoluções:%d %-2sInstâncias: %d.",
193 Icon(EIcon::SUCESSO),
solucoes.Count(),
214 "\n ├─ %-2s:%d %-2s %-2s %-2s %-2s %d",
215 Icon(EIcon::INST), inst,
216 Icon(EIcon::SUCESSO),
217 Icon(EIcon::VALOR), Icon(EIcon::IMP),
218 Icon(EIcon::TEMPO),
tempo);
227 "\n ├─ %-2s:%d %-2s %-2s %d",
228 Icon(EIcon::INST), inst,
230 Icon(EIcon::TEMPO),
tempo);
252 "\n ├─ %-2s:%d %-2s %-2s %d %-2s %d",
253 Icon(EIcon::INST), inst,
254 Icon(EIcon::SUCESSO),
256 Icon(EIcon::TEMPO),
tempo);
264 "\n ├─ %-2s:%d %-2s %-2s %d",
265 Icon(EIcon::INST), inst,
267 Icon(EIcon::TEMPO),
tempo);
303 if (
res.valor[0] > 0 &&
res.valor[1] == 0) {
305 if (
res.valor[2] >= 0)
307 if (
res.valor[3] >= 0)
312 if (
res.valor[1] > 0) {
320 "\n ├─ %-2sVálidas:%d %-2sInstâncias: %d.",
325 "\n ├─ %-2sMelhor:%d %-2sPior: %d.",
330 "\n ├─ %-2sTempo(ms):%d.",
352 "\n ├─ %-2s %.1f%% (%-2s %.1f%% %-2s %.1f%% %-2s %.1f%%)",
359 "\n ├─ %-2s %.1f%% (%-2s %.1f%% %-2s %.1f%%)",
373 for (
int i = 0;
i <
titulo.Count();
i++) {
374 unsigned int len = (
unsigned int)(
412 printf(
"│ %s", *
titulo[
i]);
break;
414 if (
i == 0) { printf(
"\n%*s└",
identacao,
"");
break; }
435 bool aberta,
int identacao,
const char* icon)
443 unsigned int len = (
unsigned int)(
481 printf(
"─ %s ─", *
titulo);
534 float f = (2 *
l - 1);
535 float c = (1 - (
f < 0 ? -
f :
f)) *
s;
537 float h60 =
h / 60.0f;
543 if (
h < 60) {
r =
c;
g =
x;
b = 0; }
544 else if (
h < 120) {
r =
x;
g =
c;
b = 0; }
545 else if (
h < 180) {
r = 0;
g =
c;
b =
x; }
546 else if (
h < 240) {
r = 0;
g =
x;
b =
c; }
547 else if (
h < 300) {
r =
x;
g = 0;
b =
c; }
548 else {
r =
c;
g = 0;
b =
x; }
550 printf(
"\x1b[%d;2;%d;%d;%dm", (
fundo ? 48 : 38),
551 (
int)((
r +
m) * 255), (
int)((
g +
m) * 255), (
int)((
b +
m) * 255));
574 for (
int i = 0;
i < nElementos;
i++) {
610 col += printf(
"%*s", (30 -
col),
"");
621 col += printf(
"%*s", (40 -
col),
"");
632 if (
i < nElementos - 1) {
643 col += printf(
" | ");
688 int opcao = 0, valor;
695 printf(
"\nParâmetro inativo.");
715 printf(
"Intervalo: %s a %s",
728 if (valor !=
NAO_LIDO || valor == 0)
872 " id / -id " COR_LEVE "- Seleciona configuração como atual ou apaga 'id'" COR_RESET,
873 " Pk = <conj.> " COR_LEVE "- Varia Pk na configuração atual (gera N configs)" COR_RESET,
874 " Pk = <conj.> x Pw = <conj.> " COR_LEVE "- produto externo (gera NxM configs)" COR_RESET,
912 if (
token[0] ==
'P') {
914 auto par =
token.tok(
"=");
915 if (par.Count() == 2) {
922 if (
valores.Last().Count() == 2) {
925 int valor =
valores.Last().Last();
930 if (
valores.Last().Count() <= 2)
935 else if (
token[0] ==
'x') {
963 for (
int i = 1;
i <
lista.Count();
i++)
995 printf(
"\n═╪═ Configurações ═══");
998 str.
printf(
"%-2s [%d]", Icon(EIcon::PARAM),
i + 1);
1009 printf(
"\n═╧═══════════════════");
1019 for (
int i = 0;
i <= 2;
i++)
1027 printf(
"#%d",
valores.Count());
1042 printf(
"\n\n═╤═ Instâncias ═══");
1047 printf(
"\n═╤═ %-2s Início do Teste (%-2s%d) ═══",
1048 Icon(EIcon::TESTE), Icon(EIcon::PROCESSO),
mpiID);
1055 printf(
"\n═╧═ %-2s Fim do Teste (%-2s%d %-2s%s) ═══",
1056 Icon(EIcon::FIM), Icon(EIcon::PROCESSO),
mpiID, Icon(EIcon::TEMPO),
1080 "\n ├─ %-2sTarefas:%s %-2sInstâncias: %s %-2sConfigurações: %s %-2sProcessos: %s.",
1097 "\n ├─ %-2s%-15s %-2s%-5s %-2s%-5s %-2s%-5s %-2s%-5s %-2s",
1101 Icon(EIcon::CONF), *
MostraInt(configuracao + 1),
1138 "\n ├─ %-2s Ficheiro %s.csv gravado.\n"
1139 " │ %-2s Tempo real: %s",
1157 int dados[3] = { 0, 0, 0 };
1188 tarefas += { inst, configuracao };
1191 Debug(
ATIVIDADE,
false,
"\n ├─ %-2sTarefas:%s %-2sInstâncias: %s %-2sConfigurações: %s %-2sProcessos: %s.",
1234 "\n ├─ %-2s%-15s %-2s%-5s %-2s%-5s %-2s%-5s %-2s%-5s %-2s ",
1281 "\n ├─ %-2s Ficheiro %s.csv gravado.\n"
1282 " │ %-2s Tempo real: %s",
1291 Debug(
ATIVIDADE,
false,
"\n │ %-2s Utilização:\n │ - Total: %.1f%%\n │ - Gestor: %.1f%%\n │ - Trabalhadores: %.1f%% ",
1302 int dados[3] = { 0, 0, 0 };
1374 mpiID == 0 &&
Debug(
COMPLETO,
false,
"%-2s%-2s", Icon(EIcon::SUCESSO), Icon(EIcon::IMP));
1381 printf(
"%-2s ", Icon(EIcon::IND));
1383 printf(
"%" PRId64 " ", ind);
1425 for (
int i = 2;
i <
argc;
i++) {
1516 "Uso: %s <instâncias> [opções]\n"
1517 " <instâncias> Conjunto de IDs: A | A,B,C | A:B[:C]\n"
1519 " -R <ficheiro> Nome do CSV de resultados (omissão: resultados.csv)\n"
1520 " -S solucoes [custoMin,custoMax,tempoMin,tempoMax [<ids>]]\n"
1521 " caso exista ficheiro de soluções, pretende-se apenas validação\n"
1522 " pode-se dar referências de custo min/max e tempo min/max para indicador de desempenho\n"
1523 " <ids> - identificação das instâncias impossíveis\n"
1524 " -F <prefixo> Prefixo para leitura da instância por ficheiro (omissão: vazio)\n"
1525 " -FG <prefixo> Prefixo para gravação da instância em ficheiro (omissão: vazio)\n"
1526 " -M <modo> Modo MPI: 0 = divisão estática, 1 = gestor-trabalhador\n"
1527 " -G <0/1> Gravar solução (sequência de ações): 0 = não grava, 1 = grava\n"
1528 " -I <ind> Lista de indicadores (e.g. 2,1,3)\n"
1529 " -K <modo> 1 - ativa formatação humana de números (K/M/G/T), 0 - desativa\n"
1531 " -P <expr> Parâmetros (e.g. P1=1:3 x P2=0:2) - valores para cada parâmetro, distintos dos por omissão\n"
1532 "Exemplo: %s 1:5 -R out -F fich_ -I 3,1,4,2 -P P1=1:5 x P6=1,2 \n"
1533 " Executar sem argumentos entra em modo interativo, para explorar todos os parâmetros e indicadores\n",
1557 linhas.Last().printf(
"Solução");
1561 linhas.Last().printf(
"Válidas;Inválidas;Melhor;Pior;Tempo(ms)");
1573 linhas.Last().printf(
"%d:%s;",
1580 if (!
res.solucao.Empty()) {
1581 for (
auto&
acao :
res.solucao)
1612 col += printf(
" | ");
1627 for (
int i = 0;
i <
total.Count();
i++) {
1650 total[
res.configuracao].instancia++;
1652 str[0].printf(
"%d",
res.instancia);
1653 str[1].printf(
"%d",
res.configuracao + 1);
1668 for (
int i = 0;
i <
total.Count();
i++) {
1671 str.
printf(
"%-2s Total %-2s%d", Icon(EIcon::TAXA), Icon(EIcon::CONF),
i + 1);
1720 printf(
"%-2sinativo ", Icon(EIcon::NSEL));
1722 printf(
"%-2s%dº lugar ", Icon(EIcon::SEL),
indicador[
i].indice + 1);
1745 printf(
"\n%-2s Torneio (#instâncias melhores):", Icon(EIcon::TORNEIO));
1747 for (
int i = 0;
i <
pontos.Count();
i++) {
1748 printf(
"\n%2d",
i + 1);
1749 for (
int j = 0;
j <
pontos.Count();
j++)
1763 if (
res.configuracao == configuracao)
1774 printf(
"-%02d-|",
i + 1);
1806 Mensagem(Icon(EIcon::INSUC),
" Tempo excedido");
1808 Mensagem(Icon(EIcon::INSUC),
" Memória esgotada");
1814 printf(
"\nSolução: ");
1815 for (
auto&
x : solucao)
1861 if (
c ==
'\n' ||
c ==
'\r') {
1868 if (
c == 127 ||
c == 8) {
1883 while (!
buffer.Empty()) {
1894 while (!
buffer.Empty()) {
1927 texto =
NovoTexto(
"\nNovo ID (ENTER mantém) ou novo prefixo (texto): ");
1934 else if (
texto.Count() < 256)
1968 TString prefixo,
int modoCor,
bool duplaColuna)
1972 printf(
"\n%s%-4s ", *
prefixo, *tipo);
1973 for (
int i = 0;
i < 10 &&
i <
tabela.Count();
i++)
1974 printf(
"%4d ",
i + 1);
1975 printf(
"\n%s────┼", *
prefixo);
1976 for (
int i = 0;
i < 10 &&
i <
tabela.Count();
i++)
1978 for (
int i = 0;
i <
tabela.Count();
i++) {
2013 for (
int j = 1;
j <
linhas.Count();
j++)
2066 Mensagem(Icon(EIcon::INSUC),
" Erro ao executar o comando.");
2069 else if (
error != 0) {
2070 Mensagem(Icon(EIcon::INSUC),
" O comando retornou um código de erro: %d",
error);
constexpr int BUFFER_SIZE
constexpr int BUFFER_SIZE
constexpr int RES_INVALIDO
@ IND_TEMPO
tempo em milissegundos consumidos
@ IND_ITERACOES
número de iterações consumidas
@ IND_RESULTADO
resultado do algoritmo (>=0 custo da solução, -1 impossível, -2 não resolvido)
constexpr int COR_LEVE_TAM
constexpr int RES_NAO_RESOLVIDO
ENivelDebug
Níveis de detalhamento para debug.
@ ATIVIDADE
Apenas eventos principais.
@ COMPLETO
Mostra toda a execução detalhadamente.
@ NADA
Sem informações de debug.
@ DETALHE
Debug detalhada sobre estados e decisões.
constexpr int RES_IMPOSSIVEL
@ CONT_TESTE
Tempo total do teste (todas as execuções)
@ CONT_REPORTE
Tempo entre mensagens durante o teste.
@ CONT_ALGORITMO
Tempo da execução do algoritmo por instância.
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
@ LIMITE_TEMPO
Tempo limite em segundos.
ECaixaParte
Define as partes de uma caixa de texto para exibição formatada.
TVector< int > _TV(const char *str)
TVector< int64_t > indValores
void ResetParametros()
Reset parâmetros, assumindo variáveis da classe definidas.
int ExecutaAlgoritmo()
Executa o algoritmo e extrai os indicadores.
int64_t Indicador(int id)
retorna indicadores após execução
TVector< TString > indPrefixo
TVector< TIndicador > ind
TVector< TString > parPrefixo
TVector< TParametro > par
virtual void MostrarSolucao()
definir para visualizar a solução
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
static void MostraCaixa(TVector< TString > titulo, ECaixaParte parte, TVector< int > largura, bool aberta=true, int identacao=0)
virtual void Debug(bool completo=true)
Mostra o estado no ecrã, para debug.
int Parametro(int id) const
virtual int ExecutaAlgoritmo()
Executa o algoritmo com os parametros atuais.
static int Dominio(int &variavel, int min=INT_MIN, int max=INT_MAX)
Limita o domínio de um parâmetro inteiro.
virtual void RelatorioValidacao(TVector< TResultado > resultados, TVector< int > referencias)
static int modoMPI
Modo MPI.
virtual void Inicializar(void)
Coloca o objeto no estado inicial da procura.
static TVector< TVector< int > > configuracoes
Conjuntos de configurações para teste empírico.
static int resultado
Resultado retornado pelo algoritmo na última execução.
void BarraTorneio(bool nomes)
Mostra a barra de progresso ou nomes do torneio.
void ExecutaTarefa(TVector< TResultado > &resultados, int inst, int conf)
Executa uma tarefa num teste empírico.
void AjudaUtilizacao(TString programa)
Mostra ajuda de utilização do programa.
void MostrarTorneio(TVector< TVector< int > > &torneio, bool jogo=false)
Mostra os resultados do torneio.
static TString ficheiroInstancia
prefixo do nome do ficheiro de uma instância - editado pelo utilizador Caso não seja nulo,...
static int mpiID
MPI - rank do processo.
void MostrarConfiguracoes(int detalhe, int atual=-1)
Mostra as configurações disponíveis.
void MostraParametros(int detalhe=1, TVector< int > *idParametros=NULL, TString titulo="")
Mostra os parâmetros atuais.
virtual int64_t Indicador(int id)
Retorna um indicador, após a execução do algoritmo.
virtual TVector< TString > Solucao()
retorna uma solução no formato do TResultado, para ser gravada em ficheiro de soluções,...
static TString NovoTexto(TString prompt)
static int gravarSolucao
Gravar solução CSV (todas as ações)
static TString ficheiroGravar
prefixo do nome do ficheiro para gravar a instância para ficheiro (terá sido gerada)
TVector< TResultado > ExtrairConfiguracao(TVector< TResultado > &resultados, int configuracao)
Extrai resultados de uma determinada configuração.
virtual void Gravar(void)
void TesteInicio(TVector< int > &instancias, TVector< int > &configAtual)
arranque de teste, auxiliar aos Testes Empíricos
static int iteracoes
Número total de iterações realizadas na última execução.
static void FinalizaMPI()
Finaliza o ambiente MPI, se aplicável.
virtual void TesteValidacao(TVector< int > instancias, TVector< int > impossiveis, TVector< int > referencias, TString fichSolucoes, TString fichResultados="")
Executa testes de validação, executando cada solução na instância respetiva, e verificando a sua vali...
int NovaConfiguracao(TVector< int > ¶metros)
Adiciona uma nova configuração se ainda não existir.
static TString MostraInt(int64_t valor, bool cor=true)
Mostra inteiro grande num formato humano.
TVector< int > SolicitaInstancias()
Solicita ao utilizador uma lista de instâncias.
virtual void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
virtual void TesteEmpiricoTrabalhador(TVector< int > instancias, TString ficheiro="")
Teste empírico com modo mestre-escravo (este é o escravo)
virtual bool Parar(void)
Verifica se a procura deve ser interrompida.
bool JuntarCSV(TString ficheiro)
Juntar ficheiros CSV gerados por diferentes processos MPI em um único ficheiro.
static int NovoValor(TString prompt)
bool ParametroAtivo(int id, TVector< int > *valores=NULL) const
virtual void TesteManual(TString nome)
Inicializa a interação com o utilizador.
static TString MostraTempo(double segundos)
Mostra tempo num formato humano.
virtual void ExecucaoTerminada()
Chamar após a execução do algoritmo. Grava o tempo consumido.
virtual void main(int argc, char *argv[], TString nome)
Inicializa a interação com o utilizador.
void MostraRelatorio(TVector< TResultado > &resultados, bool ultimo=false)
Mostra um relatório dos resultados.
bool EditarIndicadores()
Permite ao utilizador editar os indicadores a utilizar.
static int mpiCount
MPI - número de processos.
static void InicializaMPI(int argc, char *argv[])
Inicializa o ambiente MPI, se aplicável.
void MostraIndicadores()
Mostra os indicadores definidos.
static void Mensagem(TString titulo, const char *fmt,...)
static TVector< TIndicador > indicador
Indicadores que podem ser calculados após a execução, quer com informação da instância,...
virtual void TesteEmpiricoGestor(TVector< int > instancias, TString ficheiro="")
Teste empírico com modo mestre-escravo (este é o mestre)
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...
bool RelatorioCSV(TVector< TResultado > &resultados, TString ficheiro, bool parametros=true)
Gera um relatório CSV com os resultados.
virtual bool Validar(TVector< TString > solucao)
Verifica a validade de uma solução para a instância atual.
static clock_t instanteFinal
Instante final (deadline) da corrida atual.
void EditarParametros()
Permite ao utilizador editar os parâmetros.
void InserirConfiguracoes(TString str, TVector< int > &base)
Insere configurações a partir de uma string.
int MelhorResultado(TResultado base, TResultado alternativa)
Compara dois resultados para determinar o melhor.
virtual void Explorar()
definir para explorar manualmente os dados (não definido em TProcura, apenas em TProcuraConstrutiva)
static void DebugHSL(float h=-1, float s=1.0, float l=0.2, bool fundo=true)
Muda a cor (fundo/letra) com HSL.
void CalculaTorneio(TVector< TResultado > &resultados)
Calcula o torneio entre várias configurações.
void ConfiguracaoAtual(TVector< int > ¶metros, int operacao)
Grava ou lê a configuração atual.
static TVector< int > indAtivo
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
virtual TVector< int64_t > CodificarSolucao()
retorna um vetor de inteiros com a codificação da solução (esta codificação será adicionada aos indic...
static double Cronometro(enum ECronometro id=CONT_ALGORITMO, bool inicializar=false)
retorna o tempo em segundos desde que o cronómetro foi inicializado
void InserirRegisto(TVector< TResultado > &resultados, int inst, int conf)
Insere um novo registo de resultados.
virtual void TesteEmpirico(TVector< int > instancias, TString ficheiro="")
Executa testes empíricos, em todas as configurações guardadas, nas instâncias selecionadas.
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
void EditarConfiguracoes()
Permite ao utilizador editar as configurações.
int64_t Registo(TResultado &resultado, int id)
Procura um registo com determinado id.
virtual void LimparEstatisticas()
Chamar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo ...
void SolicitaInstancia()
Solicita ao utilizador o ID da instância a utilizar, permitindo alterar também o prefixo do ficheiro.
static int modoKMGT
Modo KMGT - Kilo, Mega, Giga, Tera.
static double tempo
tempo consumido na última execução.
static void MostraConjunto(TVector< int > valores, const char *etiqueta)
TVector< TString > tok(const char *delim=" \t\n\r") const
TString & printf(const char *fmt,...)
TVector< TString > readLines()
TString & writeLines(const TVector< TString > &lines, bool append=false)
TVector< Item > & Delete(int i)
Remove o elemento na posição i deslocando os seguintes.
Item * Data()
Acesso direto.
virtual bool Empty() const
int ContaUTF8(const char *str)
Estrutura para registo de um parâmetro.
int valor
valor do parâmetro
int max
valor máximo que o parâmetro pode tomar
int min
valor mínimo que o parÂmetro pode tomar