60 {
"ALGORITMO", 1, 1, 1,
"Algoritmo base a executar.",
nomesAlgoritmos },
61 {
"NIVEL_DEBUG", 0, 0, 4,
"Nível de debug, de reduzido a completo.",
nomesDebug },
62 {
"SEMENTE", 1, 1, 1000000,
"Semente aleatória para inicializar a sequência de números pseudo-aleatórios." },
63 {
"LIMITE_TEMPO", 10, 1, 3600,
"Limnite de tempo em segundos. " },
64 {
"LIMITE_ITERACOES", 0, 0, 1000000000,
"Limite de número de iterações (0 não há limite). " }
69 {
"Resultado",
"Resultado do algoritmo, interpretado conforme o algoritmo (sucesso/insucesso, custo, qualidade, valor, etc.).",
IND_RESULTADO },
70 {
"Tempo(ms)",
"Tempo em milisegundos da execução (medida de esforço computacional).",
IND_TEMPO },
71 {
"Iterações",
"Iterações do algoritmo, intrepretadas conforme o algoritmo (medida de esforço independente do hardware).",
IND_ITERACOES }
95 Debug(
ATIVIDADE,
false,
"\nTProcura::Debug() método não redefinido.");
124____________________________________________________________________\n\
125| 1 - Inicializar | 2 - Explorar | 3 - Parâmetros | 4 - Solução |\n\
126| 5 - Indicadores | 6 - Executar | 7 - Configurações | 8 - Teste |");
154 default:
printf(
"\nOpção não definida.");
break;
163 for (
int i = 0;
i < nElementos;
i++) {
182 if (
i < nElementos - 1) {
222 int opcao = 0, valor;
244 if (valor !=
NAO_LIDO || valor == 0)
295 'a',
'm',
's',
'd',
'h',
'\'',
'"'
338 printf(
"\nSintaxe (apenas inteiros, sem espaços):\n\
339 A ou A,B,C - único valor ou enumeração\n\
340 A:B ou A:B:C - intervalo A a B, ou com passo C\n\
363 id / -id - Seleciona configuração como atual ou apaga 'id'\n\
364 Pk=<conj.> - Varia Pk na configuração atual (gera N configurações)\n\
365 Pk=<conj.> x Pw=<conj.> - produto externo de Pk e Pw (gera NxM configurações)\n\
366Sintaxe de <conj.> (apenas inteiros, sem espaços):\n\
367 A ou A,B,C - único valor ou enumeração\n\
368 A:B ou A:B:C - intervalo A a B, ou com passo C\n\
413 if (
valores.Last().Count() == 2) {
416 int valor =
valores.Last().Last();
421 if (
valores.Last().Count() <= 2)
426 else if (*
pt ==
'x') {
454 for (
int i = 1;
i <
lista.Count();
i++)
481 printf(
"\nParâmetros comuns:");
522 "\nTeste com %d tarefas, %d instâncias, %d configurações, utilizando %d processo(s). ",
564 "\nFicheiro %s.csv gravado.\n"
582 int dados[3] = { 0, 0, 0 };
622 tarefas += { inst, configuracao };
624 Debug(
ATIVIDADE,
false,
"\nTeste com %d tarefas, %d instâncias, %d configurações, utilizando %d processo(s). ",
698 "\nFicheiro %s.csv gravado.\n"
707 Debug(
ATIVIDADE,
false,
"\nTaxa de utilização:\n- Total: %.1f%%\n- Gestor: %.1f%%\n- Trabalhadores: %.1f%% ",
717 int dados[3] = { 0, 0, 0 };
796 Debug(
COMPLETO,
false,
"Instância Impossível! (se algoritmo completo) ");
809 std::locale::global(std::locale(
""));
836 for (
int i = 2;
i <
argc;
i++) {
894 "Uso: %s <instâncias> [opções]\n"
895 " <instâncias> Conjunto de IDs: A | A,B,C | A:B[:C]\n"
897 " -R <ficheiro> Nome do CSV de resultados (omissão: resultados.csv)\n"
898 " -F <prefixo> Prefixo dos ficheiros de instância (omissão: instancia_)\n"
899 " -M <modo> Modo MPI: 0 = divisão estática, 1 = gestor-trabalhador\n"
900 " -I <ind> Lista de indicadores (e.g. 2,1,3)\n"
902 " -P <expr> Parâmetros (e.g. P1=1:3 x P2=0:2) - último campo\n"
903 "Exemplo: %s 1:5 -R out -F fich_ -I 3,1,4,2 -P P1=1:5 x P6=1,2 \n"
904 " Executar sem argumentos entra em modo interativo, para explorar todos os parametros e indicadores\n",
908 printf(
"\nLista de parâmetros:");
910 printf(
"\n\nLista de indicadores:");
926 const unsigned char bom[] = { 0xEF,0xBB,0xBF };
960 printf(
"\nErro ao gravar ficheiro %s.",
str);
985 for (
int i = 0;
i <
total.Count();
i++) {
1002 total[
res.configuracao].instancia++;
1003 printf(
"\n%3d |%3d |",
res.instancia,
res.configuracao + 1);
1018 for (
int i = 0;
i <
total.Count();
i++) {
1019 printf(
"\nTotal%3d |",
i + 1);
1082 printf(
"\nTorneio (#instâncias melhores):");
1084 for (
int i = 0;
i <
pontos.Count();
i++) {
1086 for (
int j = 0;
j <
pontos.Count();
j++)
1100 if (
res.configuracao == configuracao)
1143 printf(
" Tempo excedido.");
1145 printf(
" Memória esgotada.");
1152 for (
auto&
x : solucao)
1180 printf(
"\nID atual: %d Intervalo: [%d–%d] ",
1183 printf(
"\nNovo ID (ENTER mantém) ou novo prefixo (texto): ");
1233 Debug(nivel,
false,
"\n%4s|", tipo);
1234 for (
int i = 0;
i < 10 &&
i <
tabela.Count();
i++)
1235 Debug(nivel,
false,
"%4d|",
i + 1);
1236 Debug(nivel,
false,
"\n----|");
1237 for (
int i = 0;
i < 10 &&
i <
tabela.Count();
i++)
1238 Debug(nivel,
false,
"----|");
1239 for (
int i = 0;
i <
tabela.Count();
i++) {
1241 Debug(nivel,
false,
"\n%4d|",
i);
1265 printf(
"\nErro ao gravar ficheiro %s.", nome);
1273 printf(
"\nErro ao ler ficheiro %s.", nome);
constexpr int BUFFER_SIZE
constexpr int BUFFER_SIZE
@ IND_TEMPO
tempo em milisegundos consumidos
@ IND_ITERACOES
número de iterações consumidas
@ IND_RESULTADO
resultado do algoritmo
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.
@ 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.
@ SEMENTE
Semente aleatória para inicializar a sequência de números pseudo-aleatórios.
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
@ LIMITE_TEMPO
Tempo limite em segundos.
TVector< int > _TV(const char *str)
virtual void MostrarSolucao()
definir para visualizar a solução
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
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.
static int modoMPI
Modo MPI.
static char * NovoTexto(const char *prompt)
virtual void Inicializar(void)
Coloca o objecto no estado inicial da procura.
virtual void TesteEmpiricoTrabalhador(TVector< int > instancias, char *ficheiro=NULL)
Teste empírico com modo mestre-escravo (este é o escravo)
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 MostrarTorneio(TVector< TVector< int > > &torneio, bool jogo=false)
Mostra os resultados do torneio.
static int mpiID
MPI - rank do processo.
void MostrarConfiguracoes(int detalhe, int atual=-1)
Mostra as configurações disponíveis.
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.
TVector< TResultado > ExtrairConfiguracao(TVector< TResultado > &resultados, int configuracao)
Extrai resultados de uma determinada configuração.
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 TesteManual(const char *nome)
Inicializa a interação com o utilizador.
static char ficheiroInstancia[256]
nome do ficheiro de uma instância - editado pelo utilizador (utilizar como prefixo, concatenando com ID...
int NovaConfiguracao(TVector< int > ¶metros)
Adiciona uma nova configuração se ainda não existir.
void InserirConfiguracoes(char *str, TVector< int > &base)
Insere configurações a partir de uma string.
TVector< int > SolicitaInstancias()
Solicita ao utilizador uma lista de instâncias.
virtual void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
void MostraParametros(int detalhe=1, TVector< int > *idParametros=NULL)
Mostra os parâmetros atuais.
virtual bool Parar(void)
Verifica se a procura deve ser interrompida.
bool ParametroAtivo(int id, TVector< int > *valores=NULL) const
virtual void ExecucaoTerminada()
Chamar após a execução do algoritmo. Grava o tempo consumido.
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.
static int NovoValor(const char *prompt)
void MostraIndicadores()
Mostra os indicadores definidos.
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 ...
bool JuntarCSV(const char *ficheiro)
Juntar ficheiros CSV gerados por diferentes processos MPI em um único ficheiro.
virtual void main(int argc, char *argv[], const char *nome)
Inicializa a interação com o utilizador.
static clock_t instanteFinal
Instante final (deadline) da corrida atual.
void EditarParametros()
Permite ao utilizador editar os parâmetros.
bool RelatorioCSV(TVector< TResultado > &resultados, char *ficheiro)
Gera um relatório CSV com os resultados.
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...
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)
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 indicadores,...
void InserirRegisto(TVector< TResultado > &resultados, int inst, int conf)
Insere um novo registo de resultados.
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
void AjudaUtilizacao(const char *programa)
Mostra ajuda de utilização do programa.
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()
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para...
virtual void TesteEmpirico(TVector< int > instancias, char *ficheiro=NULL)
Executa testes empíricos, em todas as configurações guardadas, nas instâncias selecionadas.
void SolicitaInstancia()
Solicita ao utilizador o ID da instância a utilizar, permitindo alterar também o prefixo do ficheiro.
static double tempo
tempo consumido na última execução.
virtual void TesteEmpiricoGestor(TVector< int > instancias, char *ficheiro=NULL)
Teste empírico com modo mestre-escravo (este é o mestre)
TVector< Item > & Delete(int i)
Remove o elemento na posição i deslocando os seguintes.
void srand(unsigned int seed, int seq)
Inicializa a semente da geração pseudo-aleatória.
FILE * fopen(const char *filename, const char *mode)
char * strtok(char *str, const char *delim, char **context)
Estrutura para registo de um parâmetro.
int valor
valor do parametro
int max
valor máximo que o parametro pode tomar
int min
valor mínimo que o parametro pode tomar