From f0a4beae8badcf08de30ff67a68fd18accd4057f Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sun, 4 Jun 2017 13:46:33 -0300 Subject: [PATCH 01/20] =?UTF-8?q?Add=20fun=C3=A7=C3=A3o=20para=20calcular?= =?UTF-8?q?=20altura=20do=20grafo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/filha.c | 9 +++++++++ libs/grafo.c | 34 ++++++++++++++++++++++++++++++++-- libs/grafo.h | 2 ++ libs/jogador.c | 27 ++++++++++++++++----------- libs/no.c | 4 ++++ libs/vertice.c | 1 + libs/vertice.h | 1 + main.c | 2 +- 8 files changed, 66 insertions(+), 14 deletions(-) diff --git a/libs/filha.c b/libs/filha.c index 841081d..29a6673 100644 --- a/libs/filha.c +++ b/libs/filha.c @@ -26,6 +26,7 @@ No primeiroNoFilha(Filha f) { } No n = f->primeiro; f->primeiro = getSucessorNo(f->primeiro); + --f->tamanho; setSucessorNo(n, NULL); setAntecessorNo(n, NULL); return n; @@ -37,6 +38,7 @@ No ultimoNoFilha(Filha f) { } No n = f->ultimo; f->ultimo = getAntecessorNo(f->ultimo); + --f->tamanho; setSucessorNo(n, NULL); setAntecessorNo(n, NULL); return n; @@ -48,7 +50,14 @@ No insereFilha(void *conteudo, Filha f) { if(!novo) return NULL; setConteudo(novo, conteudo); + + if(f->tamanho == 0) { + f->primeiro = novo; + } + setAntecessorNo(novo, f->ultimo); + setSucessorNo(f->ultimo, novo); + ++f->tamanho; return f->ultimo = novo; } diff --git a/libs/grafo.c b/libs/grafo.c index 160a15e..79bbc3a 100644 --- a/libs/grafo.c +++ b/libs/grafo.c @@ -127,6 +127,36 @@ void floodFill(Tblr t, Vertice v, int i, int j){ return; } +#include "filha.h" +void calculaAltura(Grafo g, Lista raiz) { + for(No n = primeiroNoLista(g->vertices); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + v->altura = -1; + } + + Filha fila = constroiFilha(); + for(No n = primeiroNoLista(raiz); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + v->altura = 0; + insereFilha(v, fila); + } + + while(tamanhoFilha(fila) > 0) { + No n = primeiroNoFilha(fila); + if(!n) { + continue; + }; + Vertice v = (Vertice) getConteudo(n); + for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { + Vertice filho = (Vertice) getConteudo(m); + if(filho->altura == -1) { + filho->altura = v->altura+1; + insereFilha(filho, fila); + } + } + } +} + void destroiGrafo(Grafo g) { destroiLista(g->vertices, destroiVertice); free(g); @@ -144,10 +174,10 @@ void grafoParaDot(Grafo g, Lista grupo, FILE* fp) { // Imprime o grafo for(No n = primeiroNoLista(g->vertices); n; n = getSucessorNo(n)) { Vertice pai = (Vertice) getConteudo(n); - fprintf(fp, "\t\"%p\" [label=\"cor=%d,peso=%d\"];\n", pai, pai->cor, pai->peso); + fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\naltura=%d\"];\n", pai, pai->cor, pai->peso, pai->altura); for(No m = primeiroNoLista(pai->filhos); m; m = getSucessorNo(m)) { Vertice filho = (Vertice) getConteudo(m); - fprintf(fp, "\t\"%p\" [label=\"cor=%d,peso=%d\"];\n", filho, filho->cor, filho->peso); + fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\naltura=%d\"];\n", filho, filho->cor, filho->peso, filho->altura); fprintf(fp, "\t\"%p\" -- \"%p\";\n", pai, filho); } } diff --git a/libs/grafo.h b/libs/grafo.h index ad9a4a2..847f6f7 100644 --- a/libs/grafo.h +++ b/libs/grafo.h @@ -19,6 +19,8 @@ void tabuleiroParaGrafo(Tblr t, Grafo g); void floodFill(Tblr t, Vertice v, int i, int j); +void calculaAltura(Grafo g, Lista raiz); + void destroiGrafo(Grafo g); void grafoParaDot(Grafo g, Lista grupo, FILE* fp); diff --git a/libs/jogador.c b/libs/jogador.c index ba91ac2..310b94e 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -29,8 +29,12 @@ Lista Joga(Grafo g, Lista grupo){ for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); // TODO: tratar empates! - if((v->peso + v->bonus) > (maior->peso + maior->bonus)) { + if((v->bonus) > (maior->bonus)) { maior = v; + } else if(v->bonus == maior->bonus) { + if(v->peso > maior->peso) { + maior = v; + } } } insereLista(maior->cor, jogadas); @@ -46,16 +50,17 @@ Lista Joga(Grafo g, Lista grupo){ // Limpa as coisas destroiLista(filhos, NULL); destroiLista(coresFilhos, destroiVertice); - - // // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo - // char str[32]; - // sprintf(str, "./jogada%d.out", counter ); - // FILE* debug = fopen(str, "w+"); - // if(debug) { - // grafoParaDot(g, grupo, debug); - // } - // fclose(debug); - // ++counter; + + calculaAltura(g, grupo); + // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo + char str[32]; + sprintf(str, "./jogada%d.out", counter ); + FILE* debug = fopen(str, "w+"); + if(debug) { + grafoParaDot(g, grupo, debug); + } + fclose(debug); + ++counter; } while(tamanhoLista(grupo) < tamanhoLista(g->vertices)); return jogadas; diff --git a/libs/no.c b/libs/no.c index b88cfce..7627f4e 100644 --- a/libs/no.c +++ b/libs/no.c @@ -15,18 +15,22 @@ No criaNo() { } No getSucessorNo(No n) { + if(!n) return NULL; return n->proximo; } void setSucessorNo(No n, No p) { + if(!n) return; n->proximo = p; } No getAntecessorNo(No n) { + if(!n) return NULL; return n->anterior; } void setAntecessorNo(No n, No p) { + if(!n) return; n->anterior = p; } diff --git a/libs/vertice.c b/libs/vertice.c index 35fb0e5..2dd4590 100644 --- a/libs/vertice.c +++ b/libs/vertice.c @@ -9,6 +9,7 @@ Vertice criaVertice() { v->cor = -1; v->peso = 0; v->bonus = 0; + v->altura = -1; v->grupo = false; v->pais = constroiLista(); v->filhos = constroiLista(); diff --git a/libs/vertice.h b/libs/vertice.h index 9ee344e..c740ffc 100644 --- a/libs/vertice.h +++ b/libs/vertice.h @@ -7,6 +7,7 @@ struct Vertice { int cor; int peso; int bonus; + int altura; bool grupo; Lista pais; Lista filhos; diff --git a/main.c b/main.c index 8d59c2b..64059a9 100644 --- a/main.c +++ b/main.c @@ -17,7 +17,7 @@ int main(int argc, char *argv[]) { puts("Erro na leitura do tabuleiro"); return -1; } - + // Se colocar UMA e APENAS UMA coisa depois do main if(argc == 2) { // Calcula e imprime o número mínimo e máximo de jogadas -- GitLab From 1929bf379934a90fbefb224f0f3cf485fea7d9fd Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sun, 4 Jun 2017 22:30:12 -0300 Subject: [PATCH 02/20] =?UTF-8?q?Add=20coisas=20para=20definir=20altura=20?= =?UTF-8?q?da=20=C3=A1rvore=20de=20busca?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Makefile | 2 +- customTests/14x14-1.txt | 28 ++-- libs/grafo.c | 18 ++- libs/grafo.h | 3 +- libs/jogador.c | 77 ++++++++-- libs/jogador.h | 4 +- tests/floodit_h1 | Bin 0 -> 22888 bytes tests/floodit_h2 | Bin 0 -> 22888 bytes tests/runTests.sh | 53 ++++--- tests/tabuleiros.out | 322 ++++++++++++++++++++++++++++++++++++++++ 11 files changed, 455 insertions(+), 53 deletions(-) create mode 100755 tests/floodit_h1 create mode 100755 tests/floodit_h2 create mode 100644 tests/tabuleiros.out diff --git a/.gitignore b/.gitignore index 0b30b8a..ce9f7b9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ tests/*.txt tests/*.png massif.out* *.out +!tests/tabuleiros.out diff --git a/Makefile b/Makefile index 7c05fe5..1f81904 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -CFLAGS = -std=c99 -O2 -W -Wall -g +CFLAGS = -std=c99 -O2 -W -Wall -g .PHONY: all clean diff --git a/customTests/14x14-1.txt b/customTests/14x14-1.txt index 0aac78f..cfc40f2 100644 --- a/customTests/14x14-1.txt +++ b/customTests/14x14-1.txt @@ -1,15 +1,15 @@ 14 14 9 - 0 0 1 2 2 3 4 4 1 1 5 3 5 3 - 3 4 0 0 1 2 2 4 1 1 5 4 2 1 - 0 0 0 2 4 0 2 3 5 0 1 5 1 5 - 1 3 3 3 4 4 0 0 4 0 0 0 5 2 - 3 0 4 0 2 4 2 4 3 3 4 4 2 2 - 3 5 2 2 5 1 5 2 5 3 0 1 2 0 - 1 4 3 3 5 1 4 1 2 2 0 2 5 1 - 5 2 1 0 4 0 2 5 1 2 2 5 3 4 - 1 3 2 1 3 0 5 0 0 2 3 4 5 0 - 0 4 2 0 1 4 4 4 0 1 3 1 1 2 - 0 0 3 2 5 5 4 3 3 5 3 4 5 0 - 0 1 1 5 4 0 1 5 4 4 3 0 1 3 - 4 3 5 5 4 2 2 5 2 1 5 1 5 5 - 3 1 2 2 2 1 1 1 5 1 1 3 2 1 +1 1 2 3 3 4 5 5 2 2 6 4 6 4 +4 5 1 1 2 3 3 5 2 2 6 5 3 2 +1 1 1 3 5 1 3 4 6 1 2 6 2 6 +2 4 4 4 5 5 1 1 5 1 1 1 6 3 +4 1 5 1 3 5 3 5 4 4 5 5 3 3 +4 6 3 3 6 2 6 3 6 4 1 2 3 1 +2 5 4 4 6 2 5 2 3 3 1 3 6 2 +6 3 2 1 5 1 3 6 2 3 3 6 4 5 +2 4 3 2 4 1 6 1 1 3 4 5 6 1 +1 5 3 1 2 5 5 5 1 2 4 2 2 3 +1 1 4 3 6 6 5 4 4 6 4 5 6 1 +1 2 2 6 5 1 2 6 5 5 4 1 2 4 +5 4 6 6 5 3 3 6 3 2 6 2 6 6 +4 2 3 3 3 2 2 2 6 2 2 4 3 2 diff --git a/libs/grafo.c b/libs/grafo.c index 79bbc3a..dd81194 100644 --- a/libs/grafo.c +++ b/libs/grafo.c @@ -1,6 +1,7 @@ #include <stdlib.h> #include "grafo.h" #include "lista.h" +#include "filha.h" #include "vertice.h" #include "tabuleiro.h" #include <stdio.h> @@ -42,6 +43,9 @@ Floodfill(celula, vertice) */ void tabuleiroParaGrafo(Tblr t, Grafo g) { + g->x = t->x; + g->y = t->y; + g->cores = t->cores; //Para cada celula do tabuleiro for(int i=0; i < t->x; ++i) { for(int j=0; j < t->y; ++j) { @@ -127,8 +131,8 @@ void floodFill(Tblr t, Vertice v, int i, int j){ return; } -#include "filha.h" -void calculaAltura(Grafo g, Lista raiz) { +int calculaAltura(Grafo g, Lista raiz) { + int alturaMax = 0; for(No n = primeiroNoLista(g->vertices); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); v->altura = -1; @@ -151,10 +155,16 @@ void calculaAltura(Grafo g, Lista raiz) { Vertice filho = (Vertice) getConteudo(m); if(filho->altura == -1) { filho->altura = v->altura+1; + if(filho->altura > alturaMax) { + alturaMax = filho->altura; + } insereFilha(filho, fila); } } + free(n); } + destroiFilha(fila, NULL); + return alturaMax; } void destroiGrafo(Grafo g) { @@ -174,10 +184,10 @@ void grafoParaDot(Grafo g, Lista grupo, FILE* fp) { // Imprime o grafo for(No n = primeiroNoLista(g->vertices); n; n = getSucessorNo(n)) { Vertice pai = (Vertice) getConteudo(n); - fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\naltura=%d\"];\n", pai, pai->cor, pai->peso, pai->altura); + fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\nbonus=%d\naltura=%d\"];\n", pai, pai->cor, pai->peso, pai->bonus, pai->altura); for(No m = primeiroNoLista(pai->filhos); m; m = getSucessorNo(m)) { Vertice filho = (Vertice) getConteudo(m); - fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\naltura=%d\"];\n", filho, filho->cor, filho->peso, filho->altura); + fprintf(fp, "\t\"%p\" [label=\"cor=%d\npeso=%d\nbonus=%d\naltura=%d\"];\n", filho, filho->cor, filho->peso, filho->bonus, filho->altura); fprintf(fp, "\t\"%p\" -- \"%p\";\n", pai, filho); } } diff --git a/libs/grafo.h b/libs/grafo.h index 847f6f7..189edbf 100644 --- a/libs/grafo.h +++ b/libs/grafo.h @@ -4,6 +4,7 @@ #include <stdio.h> struct Grafo { + int x, y, cores; Lista vertices; }; @@ -19,7 +20,7 @@ void tabuleiroParaGrafo(Tblr t, Grafo g); void floodFill(Tblr t, Vertice v, int i, int j); -void calculaAltura(Grafo g, Lista raiz); +int calculaAltura(Grafo g, Lista raiz); void destroiGrafo(Grafo g); diff --git a/libs/jogador.c b/libs/jogador.c index 310b94e..eb15333 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -4,12 +4,13 @@ #include "jogador.h" #include "lista.h" #include "grafo.h" +#include <math.h> Lista Joga(Grafo g, Lista grupo){ Lista jogadas = constroiLista(); //TODO: A Logica toda do jogo vai ficar aqui int counter = 1; - do { + while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) { // Pega os filhos do grupo Lista filhos = filhosGrupo(grupo); // Monta a árvore de busca: @@ -17,7 +18,17 @@ Lista Joga(Grafo g, Lista grupo){ // - FILHOS: Cores alcancáveis a partir da raiz // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz // Só é necessário para calcular o bônus de cada filho - Lista coresFilhos = agrupaCores(filhos); + int altura = calculaAltura(g, grupo); + // printf("\tJOGADA %d\n", counter); + Lista coresFilhos = agrupaCores(filhos, g, altura, tamanhoLista(g->vertices) - tamanhoLista(grupo)); + // printf("\tAltura da árvore: %d\n", altura); + // printf("\tNúmero de grupos: %d\n", tamanhoLista(g->vertices)); + // printf("\tNúmero de grupos não consumidos: %d\n", tamanhoLista(g->vertices) - tamanhoLista(grupo)); + // printf("\tTamanho coresFilhos %d\n", tamanhoLista(coresFilhos)); + // for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) { + // Vertice v = (Vertice) getConteudo(n); + // printf("\t\tVértice - cor: %d, peso: %d, bonus: %d\n", v->cor, v->peso, v->bonus); + // } // Seleciona o melhor filho baseado em peso(filho) + bônus(filho) // (filho com a maior soma de filho e peso) // O bônus é calculado da seguinte forma: // - Soma o valor de cada neto (que não é alcançável pela raiz) @@ -31,12 +42,13 @@ Lista Joga(Grafo g, Lista grupo){ // TODO: tratar empates! if((v->bonus) > (maior->bonus)) { maior = v; - } else if(v->bonus == maior->bonus) { + } else if((v->bonus) == (maior->bonus)) { if(v->peso > maior->peso) { maior = v; } } } + // printf("\t\tCOR ESCOLHIDA: %d\n", maior->cor); insereLista(maior->cor, jogadas); // "Pinta o tablueiro" for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) { @@ -50,7 +62,7 @@ Lista Joga(Grafo g, Lista grupo){ // Limpa as coisas destroiLista(filhos, NULL); destroiLista(coresFilhos, destroiVertice); - + calculaAltura(g, grupo); // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo char str[32]; @@ -61,7 +73,7 @@ Lista Joga(Grafo g, Lista grupo){ } fclose(debug); ++counter; - } while(tamanhoLista(grupo) < tamanhoLista(g->vertices)); + } return jogadas; } @@ -80,8 +92,17 @@ Lista filhosGrupo(Lista grupoPai) { return filhos; } -Lista agrupaCores(Lista filhos) { +// TODO: primeiro agrupa, DEPOIS calcula os bônus!!! +// Para calcular o bônus, agrupa os filhos de um grupo e aí calcula o bônus +// Ou seja, 2 ou mais vértices da MESMA COR que tenham o mesmo filho (repetição) +// só contarão UMA VEZ o bônus+peso daquele filho +Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos) { Lista agrupa = constroiLista(); + double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores; + double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2); + int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); + // printf("\t\tProfundidade: %d\n", profundidade); + // printf("\t\tRazão: %f\n", (altura/sqrt(naoConsumidos))); for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); // Verifica se a cor já está na lista @@ -91,7 +112,7 @@ Lista agrupaCores(Lista filhos) { // Se está, soma o peso do vértice if(w->cor == v->cor) { w->peso += v->peso; - w->bonus += calculaBonus(v, filhos); + w->bonus += calculaBonus(v, filhos, profundidade); estaNaLista = true; } } @@ -100,22 +121,52 @@ Lista agrupaCores(Lista filhos) { Vertice w = criaVertice(); w->cor = v->cor; w->peso = v->peso; - w->bonus = calculaBonus(v, filhos); + w->bonus = calculaBonus(v, filhos, profundidade); insereLista(w, agrupa); } } + // Depois de agrupar, verifica se alguma cor vai chegar ao fim nesta jogada + for(No n = primeiroNoLista(agrupa); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + int somaCor = 0; + for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + if(!w->grupo && w->cor == v->cor) { + somaCor += w->peso; + } + } + // Se a soma de todos os vértices que não pertencem ao grupo for igual + // ao peso do vértice agrupado, esta é a última jogada com aquela cor + if(v->peso == somaCor) { + v->bonus += 100; // Mais bonus para que essa cor seja a escolhida + } + } + return agrupa; } -int calculaBonus(Vertice v, Lista filhos) { +int calculaBonus(Vertice v, Lista filhos, int profundidade) { int bonus = 0; for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) { - Vertice filho = getConteudo(n); - // Se o filho não está na lsita filhos e não está no grupo de vértices já consumidos + Vertice filho = (Vertice) getConteudo(n); + // Se o filho não está na lista filhos e não está no grupo de vértices já consumidos if(!filho->grupo && !pertenceLista(filho, filhos)) { - bonus += filho->peso; + bonus += filho->peso + calculaBonusRec(filho, v, profundidade); + } + } + return v->bonus = bonus; +} + +int calculaBonusRec(Vertice v, Vertice pai, int profundidade) { + if(profundidade <= 0) return 0; + int bonus = 0; + for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) { + Vertice filho = (Vertice) getConteudo(n); + + if(!filho->grupo && !pertenceLista(filho, pai->filhos) && (filho->altura > v->altura)) { + bonus += filho->peso + calculaBonusRec(filho, v, profundidade-1); } } - return bonus; + return v->bonus = bonus; } diff --git a/libs/jogador.h b/libs/jogador.h index aba24f9..b3d0b39 100644 --- a/libs/jogador.h +++ b/libs/jogador.h @@ -13,7 +13,7 @@ Lista Joga(Grafo g, Lista grupo); Lista filhosGrupo(Lista grupoPai); // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l -Lista agrupaCores(Lista filhos); +Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos); -int calculaBonus(Vertice v, Lista filhos); +int calculaBonus(Vertice v, Lista filhos, int profundidade); #endif diff --git a/tests/floodit_h1 b/tests/floodit_h1 new file mode 100755 index 0000000000000000000000000000000000000000..1bf1bb07d92475f1b8cdb825d5eca2382ee1a529 GIT binary patch literal 22888 zcmb<-^>JfjWMqH=CI&kO5N`s916T+`GBB(N1arZJ1A_$vCxZinJcA4a8v_FaD+2=q zOq~Oi1*3m}3}awmfYBUa6Brnn85kH?7#J8Vm>>ccOb`=bv<yU;0Y*cO0lN)kA5<E} zW{_BjK8R#sfYA&L3Sa?{evn%Q?7&<G0lNe+14b7>-LV2n!}Ni;AblE8eHu`GF!}<> zU<L*T7!C6u$ZsGV0y2PsfguFyKN#%-ww-|iMuXIXgaV$Hq=48zR6#rjh99bsaDmYw zQ2SssNG(WZ;M0;6kUK$aVz2;IQ4rKVT;cKoY9EY-avAh<GLy_q^m9^lb29TvD|9O? z%yi96^osNKjKJ{<G9RSY-7geu6DSx!?gPaJ$ju@QkTd|2Kk$0~%s<nkDz?bzwYqDp z5stF1U<K)gVXy&264?w43_@7cI^z&G!XfUBLp&0PxC9RI0tQ%0LUoib4)sAe#JO>Z z%i$20#39a*lbMtZiY7CL`1pdN%)FAc_~eXihT@{cycCA`_{`$`WJ}BV;^f4<G=`GQ z+*F46_~Mep<ZO_t__V~#9EO6@lH`oUB8J@5+~U*{hTO!Qocv^l_;`@XAhks$@wtha zc?@YqsUY3yx%qie;dlmjA5SOecq2V?ILlbi1kOgVjPy)F;l;$j#K6n|B0=c~M6)ok zGJx2O3@qTX0F=%^D#bH1c|j#nJp%&+NUTIMlM__JbVB(eV0mVSsZf5Y6iA+lVLnJR zsC=@Aln0<R$_^C+Q4$UiagZ1&J%YqQSOG~K<Q|Y12x}mTgUUFN7zi66iG$KVNDPE6 zki?P8H3uYdkefhiLD&OH99GtV!~>ATIY9zY9DyXx1r-BP2}t6gv;`6a;S3~k9*_VO zdo;h{@aSeeYN^2B(R!eS^~Gfd1_qDjBOHgJ3ZT?~(@mBN4F6TPSSm2^%R4aqR|WAi zK(a3%{Qv*|zv?PW1%?bzP`<nX<}U*AK|%QP0GK}u#0Lf4%MD=uBoH4IWG@$h`CTAB zD5zde0P~wbd{7X*Yyk7CKzvYiy(|Fpi$Hu(P`yk5^RqyFP!PQg0P~YTd{EH5bO7@o zStu~1O#nF<gdM{j!yH2$LqdZ+n%`J>^wy{dq<D0*sA_<`-|3>FVR+z$1~&r(Smwn% zHYm%Z^YDv}tPBhuokzP}R3v&U7(J5zdmMbu^dkEI|Nowy$2_`SR20CPJUZ`rbThbg zYrHrh!oc9tt?b$B#^TZGqQc?Y`h>r4D+2=qzdVCWca4gKYwQ0y3CCXd{~p~nDjbI2 zJbFc1K_T<v*uVc^F$IrqXAZ+l{PGMQ$s8WZ1uV^n7(JQ~@OX6docBoP+348J(#Pmx z`Kaar$S57p-ZB=)=HrZpmv(?61QcK0e3lno`2Am4p5php*nEJ|qxl$%i{+2f=U}(G zbiRABN`QgErSqLf=ld7=EO77Md%*;8J;>4he*gdf2Pu$aWneHo;L#nUqLJcZECUX; zQhtx-BNoxIjxmn0j&Y9hhhO~o`~N?`d<z2z7{2xFycp-v`N*UB$%lXt&*KLUs5&rs z96uNUrj9GHJ21R>{`dd?FKPVpE({Di+8q)YLOpaF91<8jnt$+lbUrPU-T^WRluQL< z_k$$<KS+a_AA1<&%QQV0e;-Ib)T8koi1s-6kJ+R1sYmArkApAlJs6L9T>Mue3O9`# zW*WadL+oLQ{SCI3<_Zi9rGlXzoljrn{r~?z_86<0xdH>@XRuBC73@F`vu7w}eLb09 zo&j#yN05g97h+#l{r~?T;U1*)*7@6``He?6d$&J}W9QjU9~GI-gO2>`&vv?~NOT_c zNIvM;dA`#}#RimC3_K1#VD{)d4q|J(`2Oerf7jOk9-XXv%@i2;`!+E$FnD$z>vraF z=}rCboBY=E;8P~ggHM<{T~sVQl8-_(yQnCD(w3{?e;8lDr}G29d;=&neHef22i0*P z3pid(`vZz!P|}v^j!}^SB}au$SC(!U6^qVThE7+G7bSoG|8KqR(djBsr|Qvp*wygc zYaUR@dvwPNcs3v7@acU2BH+*e|Gt*bygFHoOP~8#)~E=8as`J+r$z~{M>i{@nF51n z^Kp*X%^>qNj<Y^71+^X+7+ekCz7PSqpxZ~qz@wA(g{cCAN9SRm?h+LNk6s;5kAqK{ zUJF9v$D>>Jq$$Xpqa6D|^}>tWzd=rae;ni~2G7nTFHZdix#FECD98DAs%V#<fm)Xe zwa)PEi)Fw6|M%(60oxV@GOqK8OLvKi4JaI6bA$Zl)2-@gs=xrTqa38X^SwvsVTd)y z9YDF1;YB>yZf6e9PMJ3z%|{s>E#K82JI*QtwaBCShzC->0B4)ytnW-9zV_(6|3VII zz<rNS)-NUs498gyLFHbsf+bk@nJ6&4UY9ljk)Aw~SvQ&}F!Tm6c8abrQDE@s7F`LZ zSPp^HXS41^69opw!?66|k<3~MQ=b7=DB208pz1x6c>}?G(IPM<a>}FgMDq*A<De3p zp_A3bM1kQjs{M{I^DMwRL?yu#!aPMVUz7<<p_+Hx2^?^ptbdIa7{KoJNDgQ5=yvDm zG?~!s&cb-OIiH0Q*}iV}PPT4$mQFX8Zg-Z}19eJ1-EJHn-Q^sH2f*cGHxFC$Ax6he z9tMx*11y%|EcI_cBkK<h_UQZzjzv(7_hRkO|NpydL8%K8ll<#zS)j2AE6}@sf)bQ7 z2dFai=)4gfdl)(VgFQNbdvw=xy!iYBr0jn5%U3^8@_R_AXXl^b?r;{v1N$DTIxy@9 zmBfZ`4R612{Q3XCW4DV6$Q$~w`0?y^QQ_Ek2d1$3Fk`ofhT#E^=A$ex1V9=rV^mn` zZ-SE1esHDM{p0_Cr1(Jd-&wG$pvkn`m4Sb~D~rbrk6s%GaAma)ERF0pxPO$vQum`@ zN}>BFxLdsSQk}hL=O2(apyh{0=L=6}kkhXqIo+fAC{MRQw+D+$w*!aaffxQiKt2{x zvAk7(9^`|44`7N754<!2*)zfNdW{UYvZ|LdJYacl7pThSpMQYg2b7#a^#MrWGpKNe z)F&?8;*MdV!LF^B`1{s^>g?`#4p+ki9-TK{i-Gd3WdKWUwIjHqJHX>=d7-4v(!jIx zV9lGlr>>S4YCRo$v;O-g-}3HdiFWLK=c;+kqnD-GSM#%fFH5vvZ%p$SsQ+BL9lm%p zzu<A{bl`F6c3^SobPxdf%B9mm#MAO{>3v6VvNLq-3}kWa^yF~q6pxN|j5}OE6HLMD zC(q<V9=$9MKD|86ug~~&`*XZL#xKu+$j>g_;t<cwVqjqK>5k`c>~`kRJkk7vp~S1+ z%eU8=$JOxUYZ<tCj@=F%KAnd(Pn2kTHXq<=Jy5Uf*nE)D)$(HL6R2IDy)w-p*L50q z2D5Z}gPnHRr}MU};mNcKp2>$?J1>Bo<k`#8oHoIwJK~FD^9x3ZUn6*2x+7RzIwJ&J zx+6GTIwM3}El<?ne!an?JD%h9Dt>u}Zno9~b^hIcEUt!^Tn%qeXgyhH;?eCUV0g)| zn@7N-+g-q~n?=Cz04#kwcJnZRLyCv7+m8jDM=#dD>Sl9nKFsLZe2Bx*@^H;=r1*ul z&OAE*27~LT7r(#$|L>7p%ixoo%Hr91w9~?+Gl9jU^LMu^hsVL^%#NVS>H1et<>U#f zoD5xhi~oBbe8S|>dDQT>=fP*pkb26qJ6FJ?`7no1=kpgUzW)F3WBJ*m(?yn{^jWk| z=L=}#<#5^r$B<CNx53@)hPORC|A5LHXnFwUQ-S8gj2_)K8XnC@IbMAJ^8df1rHo4b zQ_t=i6@eFzzx@9n?bG=@)-mSg^)H|X5V)R2um3q(zwx)MU|?YA{QiOg>@{o8&VL}E zyb$~fs^!0VbUF*vRk?ImgS_i%_ykh#c_#n&>eYD)s^!2r`N<cM;{V>AE>9WiEL;u0 zxf;F&rGJlZX93^N?~ct!89keivG_3CXuNpw<^TVg->W&m@gNQ|+12uW{Z*H4W5-?> z6-LkIBaAMVA8Ofry0ZmdPXm>Epv($w%^CiGk@4mK|IXtt0>AwK|I!E4x<M*`K>qXS z{0C}M8y*M^_U!z#|0$?t*ZhX#MZ%Z=|2=z4R9L`5pz;7JzyTAm0|_MCsCab#1qT7& zm;e7;--4=cfx24P?i>{sa9abZJ>{AF*RR*)FFYLXd<KQXTdz)*-*py9<r6r*JUZWj zZ34wx^HCNrW)lO$120a3w1CWZw7gq?-LYFo#j)3&(X;tDqveZQcF*n@6@k|?&_V%` z|H2$Y4G%bmgzkHx>c9}(Ee=YG{wyxt?i}Ef-qrA}tKqj7p`ZW%?-m9XQgx8_ez!A= ztKk#Fx2*^2HD8Az^1tDMeV<gJwZseg&;S2}Bkl-`Wj0HlJ}5Gqt2wy5x>+=wx<wS~ zFB%>|)D<s2d_q=Ue-T_kI5r<+^aLf)q)-3<yI306x56S5T;GD?tJjSY6km>=XG4QM zl5cq=U-Rs|1B!y?HyR$@{sKO|JXb*h-07ks)9d!%vGcoY=ON$TLJp6EkC{BWMJ|F` ztgp4f?R8N1pbu1bd35^<cy)_#c9%%~@o0X{;%NDmzqOHpfx)r)4Wmn^h*Y;LLvO%; z7t3FDTwdKGhA!4RQYDq$t}ML){~ax_)Czlahk^{?a<R^lV&QL@%)r0^>eS4Gh=*|f z0O=_0?=Df1aP7R{()rS*^N~mAd!J4p6#<vd5EY&m3jaZA;fYT-NTfSNg@?aC4b*XI zKB55&1IKt!RpP?H&|RV;gTt7c|3HmHm>Dl4K`9>Izi{jgQDKB>{D*4)0#uE5|NsA= z019u<&TpXb_U!x<3Mte)n%`)=Q2O})zh|<IiX$i~f|7Z6jtWO-28(Cse^4Qp0WRKN z{P_U#(|=H*z~46=RN*CGb?wdn@6mb8qn8IX`oZ7<3IVTPp0}Vlb2WSm;!C{d@aQfU z03`%a>sP>|vqXjC#rhARf-eWuz%NnZ@akmIE4}Gzc)->0Wb4~H9Z+gByyVqw!vM}a zUfm`Ph6f<+t4<#F?rccu{i^1TOSd(s&hczMz~O57v*xf%cQ%J>=L?t4Uxo)dUxG6R zI4`{L|M366OE)t(PyBanJy2KDT@B3!|Lc`r`}4~)pr-#1@C0q0%~DG+{l7<6UIR=2 z$D!%}{r~?i*48yW;B4_C_&umCQpVzO+(iX6dcbhpMFrG>U}*iu-)8{oP=OnkJ}Mk8 z-7*{=-QEHo-Ha}sx4JbPEnk<IxpYc2TQk=2cyv2*SZnaNI509WG*`1Q)(L=u&7+&a zI)jD3#TnV0ZV?Wo7T|#wj_*NbLbo@I;Q^O!XAVR-fr^YLFO<O2pdte_<^`)i!R5wV zSHu6U2kMnx2Tni<ulMi%{|EK=J)4iRxL8-S)Ea^u11d2*ASH%I{dtrUV;`D^n)Bem zacn-q2(Hxh-hskQxuz2={6hZS|NqS{Dguli%`Pe&pzff6qoo@QfB%Jl|NnP$LkhH$ zbrN7(k1~37+bDQ8AK`d${q6t%*4i~MJi4m|UYvUS|G!7`5e<*d`-oila?9KQ|6Mz8 zbiOpav=7um2K9y#e*gdfa```~#4eDq;Wv<kJ4j;5zyJT!CV<CnI6S(;1w6W$x-~4n zmPmIRG}|+Fe)jDAUB}_k?ZjcNQDW%`iko^aNGX1pU!K9U+gSh-OQo+sqK+WDqhq0# z_;lWX`REtOe8<iYa5ud;|Lgz%*IQ89Yu)Uv2kLyg%UN6vPr4c&n9%yI&Ir`%0c9K( zj@R6f0U8#|PqmWW9IYoS-+#Xe73%c((_PMD`Kji4H#?|->e+md!_o3U&0duL3aGpQ z6&8-2UqXXB&q9i4P<a6=m_2$~zy-5s=Uq@y>;vlJf;#X59-TKlm{~4%b6B3`Z~X}> zC7NHew0;A%EIJSI_mwj;Fn|m4_m1E1g9`6nH%3t5{yK1iW49Zq1a`4}RbS!*>WhHN zS5Vpd%BS-?c>Ke)^(}v2F9QREXLpzYv@p5h*!-3eRLXlWvsiU=cyu1Je97MmYVf#p zS~+&JLCf?-FcW25I$w3Z1eqxFACwJYcGmTPRXFyBGJ@=U22%0s-~azF3qj>}cLB!) z@CZWlaYmO;HJ8pjmg8>VyxVC3N>Pa91S-@a{R76AB~QS5x-DA&*X{A?_TVr)>C<`Y zwLGL9<zkt|!r%Lkfq|j<Afrd~As)-0{4MN^3=A&TN*<lp>R;C0wLD+f>Czki-zWLF zcdv+pOXmg66P~>y6FoH#c=z%+`1ZPVf(EM~_H}!G@o0X<)9J<2?ZwjRCD84~(di}P zX?daaDR}%5RM&RGg8j8MEW8~puhztYL)I8Heh3a(&}c^|a>yD%LiQ|wtJ?qn|4~AA z2RPh7aRm?ALx15R>u7nk783R-A-mx3|NpPMAmPB@FA54`)T$9Y&UoFUS0u=@*JR?$ zhJXM6gPL@|JvzUFde5MAejGG1%iz(?&@It<>-()vfo6NgIzi9Q51lumIr)Vp$RXhT zm*m*Z+<KtS&#}9h#nteD;s4feb!MQP2+l1GuX)oZKr@Hsr&=k@`~uQv`KjiaV>fd% zs8m0|VR^h}Hz@mpdgb8uhiB)D&YOr_{9@0a|NmciAlg?{$WJFR@{>ER{NxLZUr>H3 zfX5LiZKLKVP+d(RKb3}{#P~9pX^6Z8YVRQOZ`}m23X~ZC2g*yOpau-AK4CmtQUcB& zF5L{Stq1t~f*C>mP7e;p?m!OBQ_a5^N<#SizksrPZy}H2e{k0m)LshX@a+7gd8)+B zqxl$5>m~mFTcA92oYBSdc<Ce0<O`rw<J&7T5o|c9d~@woa_!7waqRTsaOq^gm0wZw zhdFZiMY*=Vtve10B|LdU3q5b_0fz%h-uMPelJJtQ4ic6qA$0|mH~M@#PZ|D)q^sl$ zE}$kBC@Y9eM5HH|Zm%!R?-)UO-lfxv$EDkg#ii3rz@;1HOD_@2?=^Q{{sgxJ12|rO z_y_6-x-cO1_lHA%@<=`gs-iqQ4}kj*KD|6gK}}DO&cBYm1&ol&DqO&^x8lEN=N-q+ zv%bBN;I4zK;s4GO6&a6imP4I2DiW`C_~jYE{fBj+90qRwvv76$NI?4!XZc$}?ORa) z!Ikm*cNqysa7&@vm7)0sqod`4T0XCC7AY5N9SQ!HRt5%!ZdVqt#1T+m!d1Yln}x&0 zI!A(qzhybNFL9u5l1Dd4+=T<wmyjrJhNKZ_N5ZAkMMVJAo8a*2lu>yh463LYkGZx! zap?w0bo;1q_;kyt@b?En3r^==7CY1`2$WAsRAk_N6Eq_a`~x+IT~q{IdJ7mqy%ey4 zFI|xHC%Av%(s|6K^Chfv;nNwT!r{`%qVl31oUnXU1RNQU`E-LsyIE9TDxv5PcMS7{ z^v5Y^Lc9Y-2)GI1fw%oYba~eaDp0_+9B5VmrIv%WA4+SeSl)Sb7juB~aVKcB*hPf{ z(S*QgJAl=-o~(P})A`+{^OZ~Ivln82LGy1hDjeO`t^eyb`E&<^TM?IDOA_6Fh)1*^ zZfl<Q>=l{hsd)q1e&{09e(<q8gund&s$U@O2Yq7N4|3>bB>wh;i{-02irWv9!0iV| z(0KTlU{KS+qw_bS^`O!D3Z?Y`>j%8B{`>zwxbct*ZaV}ZH61KL{S0W+K?pi7hiE@w zYi}1r+S^F2haI3Cdl*rk`*uF)d<ktofVvvs_CqT|9^8KD{0}Pce0o*aNhmOcdi3go z=wQ#zZ=Ri3eKenf+eQcfGQU{<;QxP**0&`JhPPq$txxAGpU!VCo&O#Gi`?-54MbVK zhV(!{4uOubA&sYfJ`9?Mf5QQ4<bbB)85x)uG*nY`R8usqR8tffxKvZP7*tajR8thd zh>Jnhz$it5fl->-8nlK;lYxOD;=%v_3m6#~G#>u{e}a*LVaB8X{|i9$<NyC9m>3vd zJpKPagNcEG<JtfJ4NMFS63_nspTWeyVDaq#{|!tG3>nY<|3AURz|isR|NjR}3=BJ- z{r~@iiGkt7v;Y4Em>C#uJp2D&gPDOr;`#so4$KS;8PEU!&tPU?=y?ABe+M%I!;k0x z|L<UCV6b@c|NjGK28M_i|Nny)5$$;K|GxnX1H+3K|NnciFfi<R`Tu_h3j;&OtN;I3 zurM&3c=iAP0nilm>;L~ji_m7g{{P>Am4Tt+&Hw)mtPBhpZ~y;4!OFm(@$UbB4mJjc z8Snr9k6>e9c=74~{}pTu3>lyQ|9`;7z;NR8|NlSO7#JeH{r{i9&cGn?{r~?7><kPm ze*XXefSrLM<JbTH0vrqs9Dn}*PvBr+nDOub{}UVx3=#kT|Np_kz;NRK|Njo46$K0o z44`#QpvsN0Du{uxLV!`4hn-^rBf9`d9JH2A;o<-PS|9~b3=#)1QPndrs4y^q*S>AI z_y7L^kODpdH$Dk3e(rLP1_pa6Yb|3HC6KTW17r<Z#Qp#O!K*5q_yqcyocJXAn4S0( zdRd(KG<sMa`3&0F9QiDo*<JVwn7tUe_$(ax3>^71ocI)+_#~Y81f2Ld9Kp*#K;}(h zU|^_t`2W8PXig8mdG34-jLh%x7zpy;6Oeh2|NjU1ALM2b28sV+U|?u?{Qp0=iv|*e zhMx!{149KC^*W3Y_0XkpU>zWHT%c(c-TW9v28IQX|NqwktAr3B^(Bl93_BkG{|_F{ zfe3@+t%s3;VZ-D9|3QmOpu%ABC5#LVD<1#<4_=Z4l>o)h9!3U+3y=T*2e09C<P&IP za^#a}X7=GzDBzQD;S+G=;{eCu6GjGxACLe47X#^a<P&IS3gCnJ8RRw=CWw40NZyH0 zpa*158?y_aLNg0fAfJRIIDSBqkaS@J%6m`#{|B!OM6ovq#oibu28Mtqxb3Zh%Ey6> zM%e2Jw$}~SUQoELVPartc=G?hI!HYf+b}RN9ARQ$nDONQe^B|u;L0b^2XQ~doT*$e zgB-b?;cPE(VuPk}7G?$pji>+rgXZTLTtMN&l*|Q9kRW?im>C#$JpKPa9BL<s0@-WB z%)r3#?EinzkU4`B$X+KtiC$2;?_qJ|(`aLL;WKDvW6I#ua6wAvAl(cMpm48YW?*o5 z_W!>pNC@G7XORCZz#-`bk0(&RSi{V~knrsP|0_`Sc=DM$p99lUJlPDq?(+{b1H*@B z|NlQnHP4j~mT#Tm`PPTef$1Q&Tnh>Z7ZwJF8PEU!-vc$L50w9VLFoq?4sPIZSjwm2 zh!GATf3>hMFi5=k|34ozf`-WNu6!_exWL^Jz?Z;u9jm|GAu$Rv?+Ob8gT>4L|NTJm zgWo()z69ovOk8{xE_~?akt^6h69xtb6;=iYi#PxO7lZtVNbfFu3OSGj<;ch3!X3cH zC*cOpbb;KEayW*SfuZ5e|NoE`s36S@3@Ho@3?-}#3@6_F|33j&`G)YX4_^YaF!tij zi<{X9yNnArBz@gsWnlR5?*IR7AgdAX_Tp1u>V`WUDcpG27#JGf|Nq}eoV$v#+YZTE zp!6NX#=vmkBk}h4urV+MeER=?I^lE>#+ShKl#9>86(ic9{sD#a9X1Ar1)nj(*_977 zU4g=x2fKgVxS6f6%fQ0fg`I)n#8;?45&0NWenLaqiI2k@l%POmbqPD9u7{Pk(0uI5 z2XmJPD7|~|Sv0fz@;MY?%XZ*;VGlb4L&LZK|3T3OisDf`8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OLnQ<fIKiWe3=U8l=5ElC0Ei8vVS58L*dXe8L6V@cK<IvD z(Ed}95Nv<7G>F5%zyKTfl!Edlp!=y|W4AE*umAq%gOtpG?wf{<$$nsl*au!#!oa|= z11b;N>i|-}8bmNKFo62{ASP(f5{MQB5l9#`GzI2D_dCM+@ElMNg2o*|@}P}`AX*$m zfcEmTLhOf$b3pkpcf;(1P6sf+`2YSx{Ii1vqW?dX54Dcr1C&1pDi5`e<`irnJGw<_ z(0DC_(rr+B8kAlJrME%pV^I1Ulzs-Kzd>m>c8I^x?QwT@wo=dtO)AYRDOE7lGto29 zH7f=44C@Td^bAb&Of(_l3PuKoW(H;kmgq)c@R=DH8DQrKAWMRF62tc2qlz;#lt9xF zsyGV+Ed8O1v%=FIsyG`1EPbMivom0eS7rtd23UGPRnN%)OIN7kTnq}(^oA<V%>c`X zsNy^f0nqSA73XCTz!D$K415fr{gudSL2PCQeug8^d=28mFf)Sy!v(D3g79+-U}`}$ zGlLLAfI4P6U}g|zfRz&<bui4#Ai@AEA7El2nwdeA0ko|W#74%<3}Ot}(laxIIKvO< z{%%zD5)2H`{EsRw$xwh*T#5m-O%z!zh|SCZE8Rdm2nOYA7KV@iAv^>LDmNLixF1wr zGBNNm9Dts?0n-6886?htRvzmyFff3`(aUMj_$DI*!kr*@fXoVJU|?Xx5}s91b718@ zNG%Arfz@Ni%Tn;U9hm;wghL!;Kelk#2{vDdAwVBBJ%F~^VGAFSo3NP!+J?@+AdHbt zKy!|aSkeP%Ast9PMtTD|lmRo{3NwPj4Ktl+GJ?*T;9~&oP6oLRR)1K6#X%yd*c*p< z0$7}np@A0?4&X6q1_p*)sJMe5L>xRv#lXN&$%y?tiLFc^am;i(6>5$F55yeU-03Q) z_ykdiIC!pxfq`K=R6IZiA`YIrU|?W41{F_$x)VH?$-uyH873|aQ4gMjVqjpn4-=P! zh{NV!UNM5sXOP6mN1-gx@Pw)d&&@C}Fc^c)!7P71g2hq87{m)=hL|HD3$YhGm%_ln zz{>;?p8yR{@Ejfk1A{nJe1SYfJ<Pv4U~!O%sMrB4&c|>-0HPi|_sGD&;0+UphBK_a z62Zj4Ajlxa&;cz^!24Ml7#Px_;uE0au=Yb9*c?<lLA+iZ;<v%#d<+Q+5ch!RZWtIC z7C^-}K-~kI>s|{LR}g`y2haI2FfeRpg2W4Yxpx4n-hdCH9v1Hxq2dfm5OG+1f!2RO z_A7&2jll0g{$-M6sDSzxCi4es&ID-r23~W(z`(%C3<@_y{Q?U&326KVK-~kLyJlcu z&;*OaOhwSvU~xVM(D4BvQCR-+hKg_Chqxa+_sqb+kOUS7sYJ!n(DeC$8=@Z8UM&Nw z=VQ144QJRIf&1WdMx+>ap!s(v%)iib9<~;w32M#+6^Qw;bU2L}6fcPK9OkM;;P8=R zm;p5(7CxXkY9XY09K0rkfq`Ko)cgk$5c9!vsSFGZd%)r_QxWtvus9#X186vd=k^&G z7@kALH$cT<YXLq(#S@_U0ybCw59-bZP<O)8ISUJ@yh7LqV@W{6nE@J}F!igT;t5c3 zSomu|#S4TW{sPaXGcYiig2iE`B4~fGI3L3YXgLPa#lR5H!oVQNgjp_S<8UYF+zn8^ zUIFzNEc_=x%@=^052}wrw$A~X&mhIH0jeJ6uNmNSjE_M8&0ntI@WgD_Er*)l096l~ z=LMPH2ToTY78*`2Dk&~0O-s{DW{8jXat@03@eB@$k7r0pElN$#EG|hciZ98HPtM8D zOD$%Ik59>uPtVCuO3aB*DakJ?j!!JDU`Wo-EyzhNNlno+H?=Uut|&e&GcPkfv8X7q zGCno0q^Oc1ttc@!H9n;@H@A`@J|2k|pP83gf~qtpKR+e2BtFAXFPR}Xu^<ubShpZY zU)Ok7KbQD;sMBF=6a!Ki;$0&B9DO~VLB|&%j4m!oEGl7$k9YSAjd%5khnVK!62uVi z?&I&|=o9bn<`(Q45+CB|<l_pm0epT@a&alxE8x?M92{Wh6@ktpf}VSXDwvyJTvC)6 zUyzfSmk&ByDYYmu9^?atc+U{uctjwF_&S4vI3zJCCzT;3wKz4mATuW;F+Qy*Kd&S; zvnY|FI5W322WApn7-CpXW)jF?h%Hbn!M5aN<`%##Oif8FNyIp=3E^B5hIEi2V120O z$0z3(r4~aEbV6tVc{(vCKN)I4QEF~}St``4CHV#UNRAKiarE;K#ykWH)iCfOQ>a3j zdBv$kFhdJ6^T0j;c?5D~6f8*L?qz_p;uDKfLEc3<Un)L6r8qx6BQY-}CzS!>c5pZs zGsJuP#}}8RWah<}7N@2#Km!qO8u+X$RHs2tv;w6FP=aHCIu))37HZ)0uTZrn=NDvR zMkUC>kob&`Pbw~k`VbtF;79?VngtF6m@32pT?q3*2WFu=1)N0_LFq8Rm;qur*hF8) z0LNg4c(1bfAZTWH&PgmTPAz6YN`hdO$%#cpsp-&|Mm+`$VYN9lNZ~=i5Fa1n>kP}I zpcD@)R8Z18*o%<F3yl+Sc5w^x_X~0L3~~%cb`C@xgI;lEZb@PigI;k-5rocwu`=^Y zQi}>0^z!mcQuQ32JatPF)1kcdyi&cS(#)I`-OLmQJrFM=u{eW4FQqcCxH1<)mlQ!{ z%2JDpGxPIMIPpacdPS)@i69M7RzXe)gB~~m=oRFY=%weEFzA(}R+KR4fr>l^y`p?j za%Ip<&43ni87V~w9z-jow1en?v9pqk!0t)R%}izh84EI=K@VbBQgJbZUUGhJZfaf$ zT7ga;7u1ggb#Y+*6xjF(?EFPoeF`%jq!z{o(aH=A44^SDn10we3haDC^fn)?J_P9n zVM8?iu<@1>sDYsMlpu95jIJM4kAD0AKOd?bJ}v`VhYZpKb3d%z4Xa;4av<yn9TSA< zhm9NVfC^YZJq#LG1TkUyVdHmU(DMqR%HiWYAD{z?uyIF_T_6lH14P3xsGSNL^MmP! zjR%3+1t2xB@lcriVd`Ks=v+h47$S@h8#mek4X6N+Aq))Q^Eg3v!`u%QW&ri`K}uoz zVdG02Pzz!HgmU5Iv@mhd?nRJ(C#Zq2aVQ0-2H3bMhzrsKvme9;Y3T#^_aW{B@nPdt z8lV7YU|@jxA0!9DAiF>`41+d=fcynj4j<PFfC_-uNW&C^+ujfktltA#(~PViHvT05 zO4LZ>(hyyUacUTUE}Hvc<75g@{fj^cF~Srh*$)$1jHVwpo^}M<A?JiCgwp8#UkTL@ zi$B=7+Xbk8(0O!FtzZgW|3)<Zu=7M==Zu2(0)RC_33UDY(e%T{@dBV702Ww;L-nI^ z89<vN`Jj0Sqy#qp0y}pUT|GJ<w2zq|Nk42{Py%``E4q4g{zItyq1hEaeyBjC{%6p< z1=9~3XM~*#3p@W6njGQz2bTV3pxF-_kNjZ|3JuKk26I1*evhUfK5hx^z<|yfg_r~( zVftY74>bL-etrQ|Kg^vF-I(qH?SKZE1@k{_9JB$d-vXu)N`urwnP7?;JdVb|U;ySJ z2$+7*I$wk+Xv_`51Lau|OAsmUL3|jV0WJ7=U<#oUXk74Fp|HFIRRX4VK-~{I!x1C^ i%Ell!!rTulzd-pD=68@f7=8dcC>Asig_dE^?FRraZ(Lje literal 0 HcmV?d00001 diff --git a/tests/floodit_h2 b/tests/floodit_h2 new file mode 100755 index 0000000000000000000000000000000000000000..8b18fcdbf8d7c9d330d4a627f4f2558d52eca984 GIT binary patch literal 22888 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 literal 0 HcmV?d00001 diff --git a/tests/runTests.sh b/tests/runTests.sh index 46c5f05..5dbf175 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -1,13 +1,13 @@ #!/bin/bash # tempo máximo para executar, em milisegundos -tempo_max=10000 #10s +tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(4 8 16 32 64 128) +tams=(2 3 4 8 16 32) # lista de cores -cores=(2 4 8 16) +cores=(4 8 10 16) #-- Cores do terminal RED='\033[0;31m' @@ -31,19 +31,33 @@ do echo "Número de cores: ${cor}" T_soma_cor=0 T_max_cor=0 - for j in $(seq 1 $i) + N_TESTES=500 + for j in $(seq 1 ${N_TESTES}) do - echo -ne "Tabuleiro com ${i} linhas e ${cor} cores: ${i}x${j} (T max: $(($T_max_cor/1000000000))." - printf "%03d" $(($T_max_cor/1000000)) + echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))." + printf "%03d" $(($T_max_cor/1000000%1000)) echo -ne ")"\\r semente=$RANDOM # echo "Usando semente: ${semente}" - ./test $i $j $cor $semente + ./test $i $i $cor $semente T_inicial=$(date +%s%N) - ../main < "/tmp/${semente}.in" > /dev/null + ../main < "/tmp/${semente}.in" > /tmp/resp.out T_gasto=$(($(date +%s%N) - $T_inicial)) T_soma_cor=$(($T_gasto + $T_soma_cor)) T_soma_total=$(($T_gasto + $T_soma_total)) + ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out + ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out + RESP=$(cat /tmp/resp.out | head -n1) + H1=$(cat /tmp/h1.out | head -n1) + H2=$(cat /tmp/h2.out | head -n1) + if [ $RESP -gt $H1 ]; then + echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n" + echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt + fi + if [ $RESP -gt $H2 ]; then + echo -ne "${RED}Heurística h2 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H2} e nós em ${RESP}${NC}\n" + echo "${i} ${i} ${cor} ${semente} (h2: ${H2})" >> tabuleiros.txt + fi # tempo em segundos S=$(($T_gasto/1000000000)) # tempo em milisegundos @@ -52,36 +66,39 @@ do if [ $T_max_cor -lt $T_gasto ]; then T_max_cor=$T_gasto fi - if (($M>$tempo_max)); then - echo -e "\n${RED}Tabuleiro ${i} ${j} ${cor} ${semente} levou mais de ${tempo_max} milisegundos: ${S}.${M}s${NC}" - echo "${i} ${j} ${cor} ${semente}" >> tabuleiros.txt - fi + # if (($M>$tempo_max)); then + # echo -e "\n${RED}Tabuleiro ${i} ${i} ${cor} ${semente} levou mais de ${tempo_max} milisegundos: ${S}.${M}s${NC}" + # echo "${i} ${i} ${cor} ${semente}" >> tabuleiros.txt + # fi rm "/tmp/${semente}.in" + rm "/tmp/resp.out" + rm "/tmp/h1.out" + rm "/tmp/h2.out" done - T_medio_cor=$(($T_soma_cor/$i)) + T_medio_cor=$(($T_soma_cor/${N_TESTES})) S_medio_cor=$(($T_medio_cor/1000000000)) M_medio_cor=$(($T_medio_cor/1000000)) echo -ne "\n${CYAN}Tempo médio com ${cor} cores: ${S_medio_cor}." - printf "%03d" ${M_medio_cor} + printf "%03d" $((${M_medio_cor}%1000)) echo -e "s (${T_medio_cor})${NC}\n" echo -e "${i}\t${cor}\t${M_medio_cor}" >> tempos.txt echo -e "${i}\t${cor}\t$(($T_max_cor/1000000))" >> piores.txt done - T_medio_total=$(( $T_soma_total/($i * ${#cores[*]}) )) + T_medio_total=$(( $T_soma_total/(${N_TESTES} * ${#cores[*]}) )) S_medio_total=$(($T_medio_total/1000000000)) M_medio_total=$(($T_medio_total/1000000)) echo -ne "${BLUE}Tempo médio com tamanho ${i}: ${S_medio_total}." - printf "%03d" ${M_medio_total} + printf "%03d" $((${M_medio_total}%1000)) echo -e "s (${T_medio_total})${NC}\n" echo -e "${i}\t${M_medio_total}" >> medias.txt done fs=$(cat tabuleiros.txt | wc -l) if [ ${fs} -gt "1" ]; then - echo -e "${RED}${fs} tabuleiro(s) passou(passaram) do tempo limite de ${tempo_max} milisegundos:${NC}" + echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}" cat tabuleiros.txt exit 1 else - echo -e "${GREEN}Nenhum tabuleiro passou do tempo limite de ${tempo_max} milisegundos${NC}" + echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}" exit 0 fi diff --git a/tests/tabuleiros.out b/tests/tabuleiros.out new file mode 100644 index 0000000..8bc4f33 --- /dev/null +++ b/tests/tabuleiros.out @@ -0,0 +1,322 @@ +3 3 8 26909 (h1: 5) +3 3 8 26909 (h2: 5) +4 4 10 14295 (h2: 8) +4 4 10 15795 (h1: 10) +4 4 10 15795 (h2: 10) +4 4 10 20490 (h1: 10) +4 4 10 20490 (h2: 10) +4 4 10 29581 (h1: 9) +4 4 10 4049 (h1: 8) +4 4 10 4049 (h2: 8) +4 4 16 1235 (h1: 10) +4 4 4 13848 (h2: 6) +4 4 4 17004 (h1: 6) +4 4 4 23024 (h1: 6) +4 4 4 25453 (h2: 5) +4 4 4 2597 (h1: 6) +4 4 4 27649 (h1: 7) +4 4 4 27649 (h2: 7) +4 4 4 6629 (h1: 6) +4 4 4 6629 (h1: 6) +4 4 8 20898 (h1: 8) +4 4 8 22414 (h2: 8) +4 4 8 27865 (h1: 8) +4 4 8 6846 (h1: 8) +4 4 8 6846 (h2: 8) +4 4 8 934 (h1: 8) +4 4 8 934 (h2: 8) +4 4 8 9699 (h1: 9) +4 4 8 9699 (h2: 9) +8 8 10 19467 (h1: 21) +8 8 10 28993 (h2: 19) +8 8 10 7105 (h2: 20) +8 8 4 11513 (h2: 7) +8 8 4 12332 (h2: 9) +8 8 4 12593 (h2: 9) +8 8 4 13507 (h1: 9) +8 8 4 13507 (h2: 9) +8 8 4 15307 (h2: 8) +8 8 4 15554 (h2: 11) +8 8 4 15903 (h2: 8) +8 8 4 17156 (h1: 9) +8 8 4 17203 (h2: 8) +8 8 4 17614 (h1: 10) +8 8 4 17614 (h2: 10) +8 8 4 19677 (h1: 7) +8 8 4 20183 (h2: 10) +8 8 4 21208 (h2: 8) +8 8 4 21352 (h1: 10) +8 8 4 21352 (h2: 10) +8 8 4 21946 (h1: 11) +8 8 4 21946 (h2: 11) +8 8 4 22652 (h1: 10) +8 8 4 22791 (h2: 9) +8 8 4 22893 (h2: 9) +8 8 4 25309 (h2: 7) +8 8 4 26112 (h2: 10) +8 8 4 30518 (h2: 8) +8 8 4 3970 (h1: 12) +8 8 4 496 (h2: 9) +8 8 4 5020 (h1: 8) +8 8 4 5427 (h1: 9) +8 8 4 5427 (h2: 9) +8 8 4 74 (h2: 9) +8 8 4 8073 (h1: 10) +8 8 4 853 (h1: 8) +8 8 4 9982 (h2: 9) +8 8 8 1111 (h2: 19) +8 8 8 11191 (h2: 17) +8 8 8 15190 (h1: 15) +8 8 8 15820 (h2: 17) +8 8 8 20926 (h2: 13) +8 8 8 5956 (h2: 15) +8 8 8 8458 (h2: 17) +16 16 4 12080 (h2: 15) +16 16 4 17382 (h2: 18) +16 16 4 19519 (h2: 18) +16 16 4 20629 (h2: 14) +16 16 4 22277 (h2: 17) +16 16 4 23645 (h2: 16) +16 16 4 24852 (h2: 16) +16 16 4 28245 (h2: 17) +16 16 4 3916 (h2: 18) +16 16 4 5514 (h2: 16) +16 16 8 1142 (h2: 29) +16 16 8 18339 (h2: 34) +16 16 8 7218 (h2: 35) +32 32 4 6052 (h2: 30) +3 3 4 20010 (h1: 4) +3 3 4 20010 (h2: 4) +3 3 4 5987 (h1: 5) +3 3 4 5987 (h2: 5) +3 3 8 20411 (h1: 4) +4 4 10 13182 (h1: 8) +4 4 10 15113 (h1: 8) +4 4 10 15113 (h2: 8) +4 4 10 17622 (h1: 9) +4 4 10 17622 (h2: 9) +4 4 10 26074 (h1: 9) +4 4 10 26074 (h2: 9) +4 4 10 29580 (h1: 10) +4 4 10 29580 (h2: 10) +4 4 10 30396 (h1: 9) +4 4 10 30396 (h2: 9) +4 4 10 4203 (h1: 10) +4 4 10 4203 (h2: 10) +4 4 16 4021 (h1: 10) +4 4 16 4021 (h2: 10) +4 4 4 12924 (h1: 5) +4 4 4 19886 (h2: 5) +4 4 4 25409 (h1: 5) +4 4 4 25409 (h2: 5) +4 4 4 25453 (h2: 5) +4 4 4 27649 (h1: 7) +4 4 4 27649 (h2: 7) +4 4 4 4016 (h1: 6) +4 4 4 4016 (h2: 6) +4 4 4 8294 (h2: 5) +4 4 4 8672 (h1: 5) +4 4 4 8672 (h2: 5) +4 4 8 22013 (h1: 9) +4 4 8 7793 (h1: 8) +4 4 8 7793 (h2: 8) +8 8 10 15701 (h1: 20) +8 8 10 19677 (h2: 18) +8 8 10 21121 (h2: 20) +8 8 10 25173 (h2: 18) +8 8 10 25636 (h2: 19) +8 8 10 28473 (h2: 20) +8 8 10 31628 (h2: 18) +8 8 10 5599 (h2: 17) +8 8 16 14392 (h2: 24) +8 8 16 25031 (h2: 24) +8 8 16 2700 (h2: 23) +8 8 16 27020 (h2: 23) +8 8 4 10041 (h1: 10) +8 8 4 1093 (h1: 9) +8 8 4 11071 (h2: 10) +8 8 4 11355 (h1: 10) +8 8 4 11355 (h2: 10) +8 8 4 12332 (h2: 9) +8 8 4 12400 (h1: 10) +8 8 4 13881 (h2: 9) +8 8 4 13936 (h2: 8) +8 8 4 15605 (h1: 9) +8 8 4 15605 (h2: 9) +8 8 4 16964 (h1: 9) +8 8 4 20245 (h1: 7) +8 8 4 20245 (h2: 7) +8 8 4 2025 (h1: 9) +8 8 4 2025 (h2: 9) +8 8 4 21823 (h2: 10) +8 8 4 21975 (h2: 7) +8 8 4 22199 (h1: 8) +8 8 4 22199 (h2: 8) +8 8 4 22366 (h1: 9) +8 8 4 23926 (h1: 7) +8 8 4 24376 (h2: 8) +8 8 4 26014 (h2: 8) +8 8 4 2639 (h1: 10) +8 8 4 26762 (h2: 8) +8 8 4 28291 (h2: 9) +8 8 4 30577 (h2: 11) +8 8 4 30613 (h2: 9) +8 8 4 30711 (h2: 10) +8 8 4 3085 (h2: 10) +8 8 4 31339 (h1: 8) +8 8 4 31339 (h2: 8) +8 8 4 3320 (h2: 10) +8 8 4 3559 (h2: 10) +8 8 4 4900 (h2: 8) +8 8 4 4986 (h1: 8) +8 8 4 4986 (h1: 8) +8 8 4 5030 (h2: 8) +8 8 4 5949 (h2: 8) +8 8 4 5988 (h1: 10) +8 8 4 6183 (h1: 10) +8 8 4 829 (h2: 8) +8 8 4 8665 (h1: 10) +8 8 8 14824 (h2: 15) +8 8 8 1489 (h2: 16) +8 8 8 15610 (h2: 14) +8 8 8 20262 (h2: 19) +8 8 8 23461 (h1: 17) +8 8 8 23461 (h2: 17) +8 8 8 28248 (h1: 16) +8 8 8 29853 (h1: 17) +8 8 8 31307 (h2: 15) +8 8 8 31586 (h2: 15) +8 8 8 6033 (h2: 16) +8 8 8 632 (h2: 17) +16 16 4 1199 (h2: 17) +16 16 4 12747 (h2: 19) +16 16 4 16762 (h2: 16) +16 16 4 17784 (h2: 18) +16 16 4 20739 (h2: 16) +16 16 4 25688 (h2: 18) +16 16 4 29043 (h2: 17) +16 16 4 3595 (h2: 19) +16 16 4 4552 (h2: 20) +16 16 4 8715 (h2: 17) +16 16 8 2925 (h2: 29) +3 3 4 30001 (h1: 4) +3 3 4 30001 (h2: 4) +3 3 8 12831 (h1: 5) +3 3 8 12831 (h2: 5) +3 3 8 12891 (h1: 4) +3 3 8 7096 (h1: 5) +3 3 8 7096 (h2: 5) +4 4 10 11135 (h1: 7) +4 4 10 11135 (h2: 7) +4 4 10 11196 (h1: 9) +4 4 10 11196 (h2: 9) +4 4 10 18982 (h1: 10) +4 4 10 18982 (h2: 10) +4 4 10 21895 (h1: 8) +4 4 10 26585 (h1: 10) +4 4 10 26585 (h2: 10) +4 4 10 27139 (h1: 8) +4 4 10 27139 (h2: 8) +4 4 10 27793 (h2: 9) +4 4 16 15048 (h1: 10) +4 4 16 15048 (h2: 10) +4 4 16 21518 (h1: 10) +4 4 16 21518 (h2: 10) +4 4 16 27610 (h1: 10) +4 4 16 27610 (h2: 10) +4 4 4 1089 (h2: 6) +4 4 4 1293 (h2: 5) +4 4 4 19021 (h1: 6) +4 4 4 22962 (h1: 5) +4 4 4 27765 (h1: 5) +4 4 4 2845 (h1: 6) +4 4 4 2845 (h2: 6) +4 4 4 5744 (h1: 5) +4 4 4 5744 (h2: 5) +4 4 4 7524 (h1: 5) +4 4 8 1420 (h1: 9) +4 4 8 1420 (h2: 9) +4 4 8 16874 (h2: 7) +4 4 8 25928 (h1: 7) +4 4 8 25928 (h2: 7) +4 4 8 3722 (h1: 9) +4 4 8 3722 (h2: 9) +4 4 8 8603 (h1: 9) +4 4 8 8603 (h2: 9) +8 8 10 10192 (h2: 18) +8 8 10 17877 (h1: 20) +8 8 10 23653 (h2: 20) +8 8 10 23660 (h1: 19) +8 8 10 23660 (h2: 19) +8 8 10 27684 (h2: 22) +8 8 10 5660 (h2: 18) +8 8 16 15390 (h2: 22) +8 8 16 18644 (h2: 24) +8 8 4 1044 (h2: 9) +8 8 4 11514 (h2: 10) +8 8 4 1276 (h2: 10) +8 8 4 12898 (h1: 10) +8 8 4 12898 (h2: 10) +8 8 4 1488 (h1: 9) +8 8 4 15559 (h1: 10) +8 8 4 15559 (h2: 10) +8 8 4 16082 (h2: 10) +8 8 4 17637 (h2: 9) +8 8 4 20457 (h2: 8) +8 8 4 21566 (h2: 11) +8 8 4 22549 (h2: 10) +8 8 4 25045 (h2: 9) +8 8 4 27315 (h2: 10) +8 8 4 27654 (h1: 10) +8 8 4 27654 (h2: 10) +8 8 4 27719 (h1: 8) +8 8 4 27719 (h2: 8) +8 8 4 27919 (h1: 11) +8 8 4 27919 (h2: 11) +8 8 4 28078 (h2: 10) +8 8 4 28536 (h1: 7) +8 8 4 28567 (h2: 8) +8 8 4 29660 (h2: 8) +8 8 4 30049 (h2: 8) +8 8 4 30239 (h1: 9) +8 8 4 31396 (h2: 10) +8 8 4 3259 (h1: 11) +8 8 4 3259 (h2: 10) +8 8 4 3360 (h1: 10) +8 8 4 3360 (h2: 10) +8 8 4 3612 (h2: 10) +8 8 4 7576 (h2: 11) +8 8 4 914 (h2: 8) +8 8 8 10087 (h1: 17) +8 8 8 10087 (h2: 17) +8 8 8 16149 (h2: 18) +8 8 8 18904 (h2: 18) +8 8 8 19447 (h2: 16) +8 8 8 22319 (h2: 18) +8 8 8 23399 (h2: 15) +8 8 8 25477 (h2: 16) +8 8 8 26199 (h2: 16) +8 8 8 26728 (h2: 16) +8 8 8 28639 (h2: 16) +8 8 8 29967 (h2: 18) +8 8 8 5152 (h2: 16) +8 8 8 6808 (h2: 19) +8 8 8 8012 (h1: 16) +8 8 8 8375 (h2: 17) +16 16 4 14252 (h2: 16) +16 16 4 14293 (h2: 17) +16 16 4 15621 (h1: 17) +16 16 4 15621 (h2: 16) +16 16 4 16716 (h2: 15) +16 16 4 17018 (h2: 17) +16 16 4 18172 (h2: 15) +16 16 4 20105 (h2: 16) +16 16 4 22607 (h2: 16) +16 16 4 25922 (h2: 18) +16 16 4 26202 (h2: 16) +16 16 4 27227 (h2: 17) +16 16 4 28222 (h2: 16) +16 16 4 31677 (h2: 17) +16 16 4 32428 (h2: 16) +16 16 4 5418 (h2: 17) +32 32 4 5482 (h2: 34) -- GitLab From b3c9f7851281efdd232f2f1a2b631e3813ab0248 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sun, 4 Jun 2017 23:27:34 -0300 Subject: [PATCH 03/20] =?UTF-8?q?Altera=20cabe=C3=A7alho=20da=20fun=C3=A7?= =?UTF-8?q?=C3=A3o=20calculaBonus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/jogador.c | 26 +++++++++++++------------- libs/jogador.h | 2 +- tests/runTests.sh | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index eb15333..00d83b3 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -11,6 +11,7 @@ Lista Joga(Grafo g, Lista grupo){ //TODO: A Logica toda do jogo vai ficar aqui int counter = 1; while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) { + int altura = calculaAltura(g, grupo); // Pega os filhos do grupo Lista filhos = filhosGrupo(grupo); // Monta a árvore de busca: @@ -18,7 +19,6 @@ Lista Joga(Grafo g, Lista grupo){ // - FILHOS: Cores alcancáveis a partir da raiz // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz // Só é necessário para calcular o bônus de cada filho - int altura = calculaAltura(g, grupo); // printf("\tJOGADA %d\n", counter); Lista coresFilhos = agrupaCores(filhos, g, altura, tamanhoLista(g->vertices) - tamanhoLista(grupo)); // printf("\tAltura da árvore: %d\n", altura); @@ -65,14 +65,14 @@ Lista Joga(Grafo g, Lista grupo){ calculaAltura(g, grupo); // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo - char str[32]; - sprintf(str, "./jogada%d.out", counter ); - FILE* debug = fopen(str, "w+"); - if(debug) { - grafoParaDot(g, grupo, debug); - } - fclose(debug); - ++counter; + // char str[32]; + // sprintf(str, "./jogada%d.out", counter ); + // FILE* debug = fopen(str, "w+"); + // if(debug) { + // grafoParaDot(g, grupo, debug); + // } + // fclose(debug); + ++counter; } return jogadas; @@ -84,7 +84,7 @@ Lista filhosGrupo(Lista grupoPai) { Vertice pai = (Vertice) getConteudo(n); for(No m = primeiroNoLista(pai->filhos); m; m = getSucessorNo(m)) { Vertice filho = (Vertice) getConteudo(m); - if(!filho->grupo) { + if(!filho->grupo && filho->altura > pai->altura) { insereUnicoLista(filho, filhos); } } @@ -146,12 +146,12 @@ Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos) { return agrupa; } -int calculaBonus(Vertice v, Lista filhos, int profundidade) { +int calculaBonus(Vertice v, Lista irmaos, int profundidade) { int bonus = 0; for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) { Vertice filho = (Vertice) getConteudo(n); - // Se o filho não está na lista filhos e não está no grupo de vértices já consumidos - if(!filho->grupo && !pertenceLista(filho, filhos)) { + // Se o filho não está na lista irmaos e não está no grupo de vértices já consumidos + if(!filho->grupo && !pertenceLista(filho, irmaos)) { bonus += filho->peso + calculaBonusRec(filho, v, profundidade); } } diff --git a/libs/jogador.h b/libs/jogador.h index b3d0b39..5ec0b20 100644 --- a/libs/jogador.h +++ b/libs/jogador.h @@ -15,5 +15,5 @@ Lista filhosGrupo(Lista grupoPai); // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos); -int calculaBonus(Vertice v, Lista filhos, int profundidade); +int calculaBonus(Vertice v, Lista irmaos, int profundidade); #endif diff --git a/tests/runTests.sh b/tests/runTests.sh index 5dbf175..ca61958 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -4,7 +4,7 @@ tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(2 3 4 8 16 32) +tams=(3 4 8 16 32) # lista de cores cores=(4 8 10 16) -- GitLab From 113c2d1ef1e186a2de857867fe2bac51ac04280c Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Mon, 5 Jun 2017 11:43:13 -0300 Subject: [PATCH 04/20] =?UTF-8?q?Tentando=20arrumar=20o=20b=C3=B4nus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/jogador.c | 101 +++++++++++++++++++++++++++++++------------------ libs/jogador.h | 2 +- libs/lista.c | 8 +++- libs/vertice.c | 1 + libs/vertice.h | 1 + 5 files changed, 75 insertions(+), 38 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index 00d83b3..33ab053 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -10,8 +10,19 @@ Lista Joga(Grafo g, Lista grupo){ Lista jogadas = constroiLista(); //TODO: A Logica toda do jogo vai ficar aqui int counter = 1; + double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores; + double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2); while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) { + // Calcula a altura int altura = calculaAltura(g, grupo); + + int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); + int profundidade = 32; + if(altura > 10) { + profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); + if (profundidade <= 0) profundidade = 1; + } + // Pega os filhos do grupo Lista filhos = filhosGrupo(grupo); // Monta a árvore de busca: @@ -20,7 +31,7 @@ Lista Joga(Grafo g, Lista grupo){ // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz // Só é necessário para calcular o bônus de cada filho // printf("\tJOGADA %d\n", counter); - Lista coresFilhos = agrupaCores(filhos, g, altura, tamanhoLista(g->vertices) - tamanhoLista(grupo)); + Lista coresFilhos = agrupaCores(filhos, g, profundidade); // printf("\tAltura da árvore: %d\n", altura); // printf("\tNúmero de grupos: %d\n", tamanhoLista(g->vertices)); // printf("\tNúmero de grupos não consumidos: %d\n", tamanhoLista(g->vertices) - tamanhoLista(grupo)); @@ -45,6 +56,18 @@ Lista Joga(Grafo g, Lista grupo){ } else if((v->bonus) == (maior->bonus)) { if(v->peso > maior->peso) { maior = v; + } else if(v->peso == maior->peso) { + int maiorFilhoM = 0; + int maiorFilhoV = 0; + for(No m = primeiroNoLista(maior->filhos); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + if(w->altura > maiorFilhoM) maiorFilhoM = w->altura; + } + for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + if(w->altura > maiorFilhoV) maiorFilhoV = w->altura; + } + if(maiorFilhoV > maiorFilhoM) maior = v; } } } @@ -65,13 +88,13 @@ Lista Joga(Grafo g, Lista grupo){ calculaAltura(g, grupo); // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo - // char str[32]; - // sprintf(str, "./jogada%d.out", counter ); - // FILE* debug = fopen(str, "w+"); - // if(debug) { - // grafoParaDot(g, grupo, debug); - // } - // fclose(debug); + char str[32]; + sprintf(str, "./jogada%d.out", counter ); + FILE* debug = fopen(str, "w+"); + if(debug) { + grafoParaDot(g, grupo, debug); + } + fclose(debug); ++counter; } @@ -92,55 +115,61 @@ Lista filhosGrupo(Lista grupoPai) { return filhos; } -// TODO: primeiro agrupa, DEPOIS calcula os bônus!!! -// Para calcular o bônus, agrupa os filhos de um grupo e aí calcula o bônus -// Ou seja, 2 ou mais vértices da MESMA COR que tenham o mesmo filho (repetição) -// só contarão UMA VEZ o bônus+peso daquele filho -Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos) { +Lista agrupaCores(Lista vertices, Grafo g, int profundidade) { + if(profundidade < 0 ) return NULL; Lista agrupa = constroiLista(); - double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores; - double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2); - int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); - // printf("\t\tProfundidade: %d\n", profundidade); - // printf("\t\tRazão: %f\n", (altura/sqrt(naoConsumidos))); - for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) { + for(No n = primeiroNoLista(vertices); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); - // Verifica se a cor já está na lista - bool estaNaLista = false; - for(No m = primeiroNoLista(agrupa); m; m = getSucessorNo(m)) { + // Verifica se a cor já está agrupada + bool estaAgrupado = false; + for(No m = primeiroNoLista(agrupa); m && !estaAgrupado; m = getSucessorNo(m)) { Vertice w = (Vertice) getConteudo(m); // Se está, soma o peso do vértice if(w->cor == v->cor) { w->peso += v->peso; - w->bonus += calculaBonus(v, filhos, profundidade); - estaNaLista = true; + insereUnicoLista(v, w->pais); + for(No o = primeiroNoLista(v->filhos); o; o = getSucessorNo(o)) { + Vertice x = (Vertice) getConteudo(o); + if(x->altura > v->altura) insereUnicoLista(x, w->filhos); + } + estaAgrupado = true; } } - // Se não está, cria um vértice para a cor - if(!estaNaLista) { + + // Se não está agrupado... + if(!estaAgrupado) { Vertice w = criaVertice(); w->cor = v->cor; w->peso = v->peso; - w->bonus = calculaBonus(v, filhos, profundidade); + w->altura = v->altura; + insereUnicoLista(v, w->pais); + for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { + Vertice x = (Vertice) getConteudo(m); + if(x->altura > v->altura) insereUnicoLista(x, w->filhos); + } insereLista(w, agrupa); } } - // Depois de agrupar, verifica se alguma cor vai chegar ao fim nesta jogada + // Depos do laço anterior, temos uma lista de vértices agrupados + // Então, agrupamos os filhos e calculamos os bônus for(No n = primeiroNoLista(agrupa); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); - int somaCor = 0; - for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) { + Lista filhosAgrupa = agrupaCores(v->filhos, g, profundidade-1); + for(No m = primeiroNoLista(filhosAgrupa); m; m = getSucessorNo(m)) { Vertice w = (Vertice) getConteudo(m); - if(!w->grupo && w->cor == v->cor) { - somaCor += w->peso; + // TODO: verificar se W não é sobrinho de V + // para não dar o bônus duas vezes + if(!w->grupo && (w->altura > v->altura) && !w->visitado){ + v->bonus += w->peso + w->bonus; + w->visitado = true; } } - // Se a soma de todos os vértices que não pertencem ao grupo for igual - // ao peso do vértice agrupado, esta é a última jogada com aquela cor - if(v->peso == somaCor) { - v->bonus += 100; // Mais bonus para que essa cor seja a escolhida + for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + w->bonus = v->bonus; } + destroiLista(filhosAgrupa, NULL); } return agrupa; diff --git a/libs/jogador.h b/libs/jogador.h index 5ec0b20..e3c8318 100644 --- a/libs/jogador.h +++ b/libs/jogador.h @@ -13,7 +13,7 @@ Lista Joga(Grafo g, Lista grupo); Lista filhosGrupo(Lista grupoPai); // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l -Lista agrupaCores(Lista filhos, Grafo g, int altura, int naoConsumidos); +Lista agrupaCores(Lista vertices, Grafo g, int profundidade); int calculaBonus(Vertice v, Lista irmaos, int profundidade); #endif diff --git a/libs/lista.c b/libs/lista.c index 9178c23..4a3eebb 100644 --- a/libs/lista.c +++ b/libs/lista.c @@ -20,7 +20,13 @@ unsigned int tamanhoLista(Lista l) { return l->tamanho; } // devolve o primeiro nó da Lista l, // ou NULL, se l é vazia -No primeiroNoLista(Lista l) { return l->primeiro; } +No primeiroNoLista(Lista l) { + if(!l) return NULL; + if(l->tamanho == 0) { + return NULL; + } + return l->primeiro; +} //--------------------------------------------------------------------------- // cria uma Lista vazia e a devolve diff --git a/libs/vertice.c b/libs/vertice.c index 2dd4590..28dc7c0 100644 --- a/libs/vertice.c +++ b/libs/vertice.c @@ -11,6 +11,7 @@ Vertice criaVertice() { v->bonus = 0; v->altura = -1; v->grupo = false; + v->visitado = false; v->pais = constroiLista(); v->filhos = constroiLista(); return v; diff --git a/libs/vertice.h b/libs/vertice.h index c740ffc..fb225fb 100644 --- a/libs/vertice.h +++ b/libs/vertice.h @@ -9,6 +9,7 @@ struct Vertice { int bonus; int altura; bool grupo; + bool visitado; Lista pais; Lista filhos; }; -- GitLab From def4e391dbfce739357135e71f50e72fab62c833 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Wed, 7 Jun 2017 11:34:52 -0300 Subject: [PATCH 05/20] =?UTF-8?q?Fun=C3=A7=C3=A3o=20agrupa=20agora=20s?= =?UTF-8?q?=C3=B3=20agrupa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO: arrumar o cálculo do bônus --- libs/jogador.c | 63 +++++++++++--------------------------------------- libs/jogador.h | 4 ++-- 2 files changed, 16 insertions(+), 51 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index 33ab053..f6824e6 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -17,11 +17,7 @@ Lista Joga(Grafo g, Lista grupo){ int altura = calculaAltura(g, grupo); int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); - int profundidade = 32; - if(altura > 10) { - profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); - if (profundidade <= 0) profundidade = 1; - } + int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); // Pega os filhos do grupo Lista filhos = filhosGrupo(grupo); @@ -31,7 +27,7 @@ Lista Joga(Grafo g, Lista grupo){ // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz // Só é necessário para calcular o bônus de cada filho // printf("\tJOGADA %d\n", counter); - Lista coresFilhos = agrupaCores(filhos, g, profundidade); + Lista coresFilhos = agrupaCores(filhos); // printf("\tAltura da árvore: %d\n", altura); // printf("\tNúmero de grupos: %d\n", tamanhoLista(g->vertices)); // printf("\tNúmero de grupos não consumidos: %d\n", tamanhoLista(g->vertices) - tamanhoLista(grupo)); @@ -56,18 +52,6 @@ Lista Joga(Grafo g, Lista grupo){ } else if((v->bonus) == (maior->bonus)) { if(v->peso > maior->peso) { maior = v; - } else if(v->peso == maior->peso) { - int maiorFilhoM = 0; - int maiorFilhoV = 0; - for(No m = primeiroNoLista(maior->filhos); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - if(w->altura > maiorFilhoM) maiorFilhoM = w->altura; - } - for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - if(w->altura > maiorFilhoV) maiorFilhoV = w->altura; - } - if(maiorFilhoV > maiorFilhoM) maior = v; } } } @@ -115,8 +99,7 @@ Lista filhosGrupo(Lista grupoPai) { return filhos; } -Lista agrupaCores(Lista vertices, Grafo g, int profundidade) { - if(profundidade < 0 ) return NULL; +Lista agrupaCores(Lista vertices) { Lista agrupa = constroiLista(); for(No n = primeiroNoLista(vertices); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); @@ -151,40 +134,22 @@ Lista agrupaCores(Lista vertices, Grafo g, int profundidade) { } } - // Depos do laço anterior, temos uma lista de vértices agrupados - // Então, agrupamos os filhos e calculamos os bônus - for(No n = primeiroNoLista(agrupa); n; n = getSucessorNo(n)) { - Vertice v = (Vertice) getConteudo(n); - Lista filhosAgrupa = agrupaCores(v->filhos, g, profundidade-1); - for(No m = primeiroNoLista(filhosAgrupa); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - // TODO: verificar se W não é sobrinho de V - // para não dar o bônus duas vezes - if(!w->grupo && (w->altura > v->altura) && !w->visitado){ - v->bonus += w->peso + w->bonus; - w->visitado = true; - } - } - for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) { - Vertice w = (Vertice) getConteudo(m); - w->bonus = v->bonus; - } - destroiLista(filhosAgrupa, NULL); - } - return agrupa; } -int calculaBonus(Vertice v, Lista irmaos, int profundidade) { - int bonus = 0; - for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) { - Vertice filho = (Vertice) getConteudo(n); - // Se o filho não está na lista irmaos e não está no grupo de vértices já consumidos - if(!filho->grupo && !pertenceLista(filho, irmaos)) { - bonus += filho->peso + calculaBonusRec(filho, v, profundidade); +// TODO: repensar calculo do bônus +void calculaBonus(Lista grupo, int profundidade) { + for(No n = primeiroNoLista(grupo); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { + Vertice filho = (Vertice) getConteudo(m); + // Se o filho não está na lista irmaos e não está no grupo de vértices já consumidos + if(!filho->grupo && !pertenceLista(filho, grupo) && (filho->altura > v->altura)) { + v->bonus += filho->peso + calculaBonusRec(filho, v, profundidade); + } } } - return v->bonus = bonus; + return; } int calculaBonusRec(Vertice v, Vertice pai, int profundidade) { diff --git a/libs/jogador.h b/libs/jogador.h index e3c8318..d5698a3 100644 --- a/libs/jogador.h +++ b/libs/jogador.h @@ -13,7 +13,7 @@ Lista Joga(Grafo g, Lista grupo); Lista filhosGrupo(Lista grupoPai); // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l -Lista agrupaCores(Lista vertices, Grafo g, int profundidade); +Lista agrupaCores(Lista vertices); -int calculaBonus(Vertice v, Lista irmaos, int profundidade); +void calculaBonus(Lista grupo, int profundidade); #endif -- GitLab From 4f7d6ae99a6f4c8b60f78e92f4c7689e32f04048 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Thu, 8 Jun 2017 11:09:31 -0300 Subject: [PATCH 06/20] =?UTF-8?q?B=C3=B4nus=20um=20pouco=20melhor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Alguns que antes perdíamos agora não perdemos mais --- libs/jogador.c | 130 ++++++++++++++++++++++++++++++++-------------- libs/jogador.h | 2 +- libs/vertice.h | 2 +- tests/runTests.sh | 4 +- 4 files changed, 96 insertions(+), 42 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index f6824e6..d7880cf 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -8,7 +8,6 @@ Lista Joga(Grafo g, Lista grupo){ Lista jogadas = constroiLista(); - //TODO: A Logica toda do jogo vai ficar aqui int counter = 1; double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores; double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2); @@ -17,31 +16,24 @@ Lista Joga(Grafo g, Lista grupo){ int altura = calculaAltura(g, grupo); int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); - int profundidade = sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos)); + int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos))); + // if(min <= 5) profundidade=altura; - // Pega os filhos do grupo Lista filhos = filhosGrupo(grupo); - // Monta a árvore de busca: - // - RAIZ: grupo - // - FILHOS: Cores alcancáveis a partir da raiz - // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz - // Só é necessário para calcular o bônus de cada filho + // printf("\tJOGADA %d\n", counter); + // printf("\t\tProfundidade: %d\n", profundidade); Lista coresFilhos = agrupaCores(filhos); - // printf("\tAltura da árvore: %d\n", altura); - // printf("\tNúmero de grupos: %d\n", tamanhoLista(g->vertices)); - // printf("\tNúmero de grupos não consumidos: %d\n", tamanhoLista(g->vertices) - tamanhoLista(grupo)); - // printf("\tTamanho coresFilhos %d\n", tamanhoLista(coresFilhos)); - // for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) { - // Vertice v = (Vertice) getConteudo(n); - // printf("\t\tVértice - cor: %d, peso: %d, bonus: %d\n", v->cor, v->peso, v->bonus); + calculaBonus(coresFilhos, g, profundidade); + + // char prestr[32]; + // sprintf(prestr, "./prejogada%d.out", counter); + // FILE* predebug = fopen(prestr, "w+"); + // if(predebug) { + // grafoParaDot(g, grupo, predebug); // } - // Seleciona o melhor filho baseado em peso(filho) + bônus(filho) // (filho com a maior soma de filho e peso) - // O bônus é calculado da seguinte forma: - // - Soma o valor de cada neto (que não é alcançável pela raiz) - // - Em caso de empate da soma peso + bônus: - // - Escolher o filho que tem mais netos da mesma cor de um filho - // Após escolher um filho, repete o algoritmo até não terem mais filhos fora do grupo + // fclose(predebug); + Vertice maior = (Vertice) getConteudo(primeiroNoLista(coresFilhos)); for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) { @@ -57,7 +49,7 @@ Lista Joga(Grafo g, Lista grupo){ } // printf("\t\tCOR ESCOLHIDA: %d\n", maior->cor); insereLista(maior->cor, jogadas); - // "Pinta o tablueiro" + for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); if(v->cor == maior->cor && !v->grupo) { @@ -66,19 +58,18 @@ Lista Joga(Grafo g, Lista grupo){ } } - // Limpa as coisas destroiLista(filhos, NULL); destroiLista(coresFilhos, destroiVertice); calculaAltura(g, grupo); // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo - char str[32]; - sprintf(str, "./jogada%d.out", counter ); - FILE* debug = fopen(str, "w+"); - if(debug) { - grafoParaDot(g, grupo, debug); - } - fclose(debug); + // char str[32]; + // sprintf(str, "./jogada%d.out", counter ); + // FILE* debug = fopen(str, "w+"); + // if(debug) { + // grafoParaDot(g, grupo, debug); + // } + // fclose(debug); ++counter; } @@ -137,29 +128,92 @@ Lista agrupaCores(Lista vertices) { return agrupa; } -// TODO: repensar calculo do bônus -void calculaBonus(Lista grupo, int profundidade) { +bool corEstaNaLista(Lista l, int cor) { + for(No n = primeiroNoLista(l); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + if(v->cor == cor) { + return true; + } + } + return false; +} + +void calculaBonus(Lista grupo, Grafo g, int profundidade) { for(No n = primeiroNoLista(grupo); n; n = getSucessorNo(n)) { Vertice v = (Vertice) getConteudo(n); + v->bonus = 0; for(No m = primeiroNoLista(v->filhos); m; m = getSucessorNo(m)) { Vertice filho = (Vertice) getConteudo(m); - // Se o filho não está na lista irmaos e não está no grupo de vértices já consumidos - if(!filho->grupo && !pertenceLista(filho, grupo) && (filho->altura > v->altura)) { - v->bonus += filho->peso + calculaBonusRec(filho, v, profundidade); + if((filho->altura > v->altura)) { + int bonus = filho->peso + calculaBonusRec(filho, v, g, profundidade); + if(corEstaNaLista(grupo, filho->cor)) bonus += 100; + v->bonus += bonus; } } + Lista vFilhos = agrupaCores(v->filhos); + v->bonus += tamanhoLista(v->filhos) - tamanhoLista(vFilhos); + destroiLista(vFilhos, NULL); + + int menorDistancia = v->altura; + for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + if(w->grupo) continue; + if(w == v) continue; + if(w->cor == v->cor) { + if((w->altura < menorDistancia) || (menorDistancia == v->altura)) menorDistancia = w->altura; + } + } + v->bonus += (menorDistancia - v->altura)^2; + + for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) { + Vertice pai = (Vertice) getConteudo(m); + pai->bonus = v->bonus; + } } + + for(No n = primeiroNoLista(grupo); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + int somaCor = 0; + for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + if(!w->grupo && w->cor == v->cor) { + somaCor += w->peso; + } + } + // Se a soma de todos os vértices que não pertencem ao grupo consumido + // for igual ao peso do vértice agrupado, esta é a + // última jogada com aquela cor + if(v->peso == somaCor) { + v->bonus += 100; // Mais bonus para que essa cor seja a escolhida + } + } + return; } -int calculaBonusRec(Vertice v, Vertice pai, int profundidade) { +int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) { if(profundidade <= 0) return 0; int bonus = 0; for(No n = primeiroNoLista(v->filhos); n; n = getSucessorNo(n)) { Vertice filho = (Vertice) getConteudo(n); + if((filho->altura > v->altura)) { + int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1); + // for(No m = primeiroNoLista(g->vertices); m && (profundidade < 10); m = getSucessorNo(m)) { + // Vertice w = (Vertice) getConteudo(m); + // if(w == pai) continue; + // if(!w->grupo) { + // // Se existe alguém um nível acima da mesma cor... + // if((w->altura == (filho->altura - 1)) && (w->cor == filho->cor)) { + // // preBonus += 25; + // } + // // // Se existe alguém dois níves acima com a mesma cor + // // else if((w->altura == (filho->altura - 2)) && (w->cor == filho->cor)) { + // // preBonus += 15; + // // } + // } + // } - if(!filho->grupo && !pertenceLista(filho, pai->filhos) && (filho->altura > v->altura)) { - bonus += filho->peso + calculaBonusRec(filho, v, profundidade-1); + bonus += preBonus; } } return v->bonus = bonus; diff --git a/libs/jogador.h b/libs/jogador.h index d5698a3..272b762 100644 --- a/libs/jogador.h +++ b/libs/jogador.h @@ -15,5 +15,5 @@ Lista filhosGrupo(Lista grupoPai); // Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l Lista agrupaCores(Lista vertices); -void calculaBonus(Lista grupo, int profundidade); +void calculaBonus(Lista grupo, Grafo g, int profundidade); #endif diff --git a/libs/vertice.h b/libs/vertice.h index fb225fb..56336e9 100644 --- a/libs/vertice.h +++ b/libs/vertice.h @@ -6,7 +6,7 @@ struct Vertice { int cor; int peso; - int bonus; + unsigned long int bonus; int altura; bool grupo; bool visitado; diff --git a/tests/runTests.sh b/tests/runTests.sh index ca61958..bf3fd84 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -48,8 +48,8 @@ do ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out RESP=$(cat /tmp/resp.out | head -n1) - H1=$(cat /tmp/h1.out | head -n1) - H2=$(cat /tmp/h2.out | head -n1) + H1=$(cat /tmp/h1.out | tail -n2 | head -n1) + H2=$(cat /tmp/h2.out | tail -n2 | head -n1) if [ $RESP -gt $H1 ]; then echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n" echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt -- GitLab From 497a0827f0fbecd3170d8f9b3ac5b16427e69d44 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Thu, 8 Jun 2017 11:10:19 -0300 Subject: [PATCH 07/20] =?UTF-8?q?Add=20tabuleiros=20que=20agora=20d=C3=A3o?= =?UTF-8?q?=20erro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + tests/tabuleiros2.out | 194 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 tests/tabuleiros2.out diff --git a/.gitignore b/.gitignore index ce9f7b9..7354fa5 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ tests/*.png massif.out* *.out !tests/tabuleiros.out +!tests/tabuleiros2.out diff --git a/tests/tabuleiros2.out b/tests/tabuleiros2.out new file mode 100644 index 0000000..9b6ce91 --- /dev/null +++ b/tests/tabuleiros2.out @@ -0,0 +1,194 @@ +3 3 10 22600 (h1: 5) +3 3 10 22600 (h2: 5) +3 3 16 19040 (h1: 6) +3 3 16 19040 (h2: 6) +3 3 16 30956 (h1: 5) +3 3 16 30956 (h2: 5) +3 3 4 1930 (h1: 4) +3 3 4 20600 (h1: 4) +3 3 4 8366 (h1: 5) +3 3 4 8366 (h2: 5) +3 3 8 18977 (h1: 5) +3 3 8 18977 (h2: 5) +3 3 8 8012 (h1: 5) +3 3 8 8012 (h2: 5) +4 4 10 11135 (h1: 7) +4 4 10 11135 (h2: 7) +4 4 10 14928 (h1: 9) +4 4 10 14928 (h2: 9) +4 4 10 18375 (h2: 8) +4 4 10 2070 (h1: 9) +4 4 10 23470 (h2: 9) +4 4 10 24772 (h2: 7) +4 4 10 6283 (h2: 9) +4 4 10 8479 (h2: 8) +4 4 16 12402 (h2: 9) +4 4 16 18295 (h1: 9) +4 4 16 18295 (h2: 9) +4 4 16 20112 (h1: 9) +4 4 16 21473 (h2: 10) +4 4 16 4696 (h2: 7) +4 4 16 9419 (h2: 10) +4 4 4 11579 (h1: 6) +4 4 4 11579 (h2: 6) +4 4 4 13320 (h1: 6) +4 4 4 14064 (h1: 5) +4 4 4 14064 (h2: 5) +4 4 4 1611 (h1: 4) +4 4 4 1611 (h2: 4) +4 4 4 17232 (h1: 6) +4 4 4 17232 (h2: 6) +4 4 4 25522 (h1: 5) +4 4 4 25522 (h2: 5) +4 4 4 25820 (h2: 5) +4 4 4 26508 (h2: 5) +4 4 4 2835 (h1: 7) +4 4 4 2835 (h2: 7) +4 4 4 9524 (h1: 6) +4 4 4 9639 (h1: 5) +4 4 4 9639 (h2: 5) +4 4 8 10019 (h1: 7) +4 4 8 10019 (h1: 7) +4 4 8 10019 (h2: 7) +4 4 8 10019 (h2: 7) +4 4 8 12901 (h1: 9) +4 4 8 12901 (h2: 9) +4 4 8 17301 (h1: 9) +4 4 8 17301 (h2: 9) +4 4 8 17998 (h2: 10) +4 4 8 19156 (h1: 8) +4 4 8 19156 (h2: 8) +4 4 8 20112 (h1: 8) +4 4 8 21593 (h1: 9) +4 4 8 22108 (h2: 9) +4 4 8 22780 (h2: 8) +4 4 8 23041 (h1: 8) +4 4 8 23041 (h2: 8) +4 4 8 24658 (h1: 8) +4 4 8 26632 (h1: 8) +4 4 8 28676 (h1: 7) +4 4 8 28676 (h2: 7) +4 4 8 2955 (h1: 9) +4 4 8 31369 (h1: 9) +4 4 8 4677 (h1: 9) +4 4 8 4677 (h2: 9) +4 4 8 4927 (h2: 7) +4 4 8 5649 (h1: 7) +4 4 8 5649 (h2: 7) +4 4 8 7834 (h1: 7) +4 4 8 7834 (h2: 7) +8 8 10 10366 (h1: 17) +8 8 10 10366 (h2: 16) +8 8 10 13138 (h1: 19) +8 8 10 13439 (h2: 17) +8 8 10 13765 (h1: 21) +8 8 10 13992 (h2: 18) +8 8 10 14350 (h1: 19) +8 8 10 15850 (h2: 18) +8 8 10 16457 (h2: 19) +8 8 10 19856 (h2: 19) +8 8 10 20352 (h2: 22) +8 8 10 20571 (h2: 18) +8 8 10 22262 (h2: 18) +8 8 10 22774 (h2: 20) +8 8 10 24320 (h1: 19) +8 8 10 24633 (h1: 20) +8 8 10 27756 (h2: 20) +8 8 10 30292 (h1: 20) +8 8 10 3083 (h2: 18) +8 8 10 3113 (h1: 21) +8 8 10 3358 (h1: 21) +8 8 10 3358 (h2: 21) +8 8 10 3821 (h1: 18) +8 8 10 5659 (h1: 20) +8 8 10 5659 (h2: 19) +8 8 10 5674 (h1: 18) +8 8 16 14476 (h2: 22) +8 8 16 21413 (h1: 26) +8 8 16 22007 (h1: 28) +8 8 16 22007 (h2: 28) +8 8 16 24721 (h1: 28) +8 8 16 24721 (h2: 28) +8 8 16 25688 (h2: 24) +8 8 16 32360 (h2: 26) +8 8 16 4205 (h1: 24) +8 8 16 5987 (h2: 25) +8 8 16 721 (h2: 27) +8 8 16 8509 (h2: 24) +8 8 16 8998 (h2: 24) +8 8 4 11036 (h2: 8) +8 8 4 11154 (h2: 10) +8 8 4 12695 (h2: 9) +8 8 4 137 (h1: 10) +8 8 4 137 (h2: 10) +8 8 4 15454 (h1: 8) +8 8 4 16065 (h1: 9) +8 8 4 16721 (h2: 9) +8 8 4 17457 (h2: 10) +8 8 4 18390 (h2: 10) +8 8 4 18416 (h2: 9) +8 8 4 19768 (h2: 10) +8 8 4 20348 (h2: 10) +8 8 4 22393 (h1: 10) +8 8 4 23132 (h2: 10) +8 8 4 23741 (h1: 9) +8 8 4 24629 (h2: 8) +8 8 4 25573 (h1: 6) +8 8 4 2594 (h2: 10) +8 8 4 27070 (h2: 9) +8 8 4 27841 (h1: 9) +8 8 4 30356 (h2: 10) +8 8 4 3432 (h2: 9) +8 8 4 3813 (h2: 9) +8 8 4 4010 (h2: 9) +8 8 4 4243 (h2: 7) +8 8 4 5895 (h2: 10) +8 8 4 7902 (h1: 9) +8 8 4 7902 (h2: 9) +8 8 4 8800 (h2: 9) +8 8 4 9400 (h2: 11) +8 8 8 10174 (h1: 16) +8 8 8 1081 (h2: 16) +8 8 8 12147 (h2: 16) +8 8 8 14142 (h2: 15) +8 8 8 15843 (h2: 19) +8 8 8 15926 (h2: 16) +8 8 8 17466 (h1: 19) +8 8 8 17466 (h2: 17) +8 8 8 18847 (h1: 16) +8 8 8 18847 (h2: 16) +8 8 8 21161 (h2: 18) +8 8 8 22073 (h1: 19) +8 8 8 22137 (h1: 16) +8 8 8 22539 (h2: 18) +8 8 8 22587 (h1: 17) +8 8 8 25730 (h2: 17) +8 8 8 27212 (h2: 18) +8 8 8 27763 (h2: 15) +8 8 8 28275 (h1: 17) +8 8 8 30297 (h2: 15) +8 8 8 30606 (h2: 17) +8 8 8 4983 (h1: 18) +8 8 8 4983 (h2: 18) +8 8 8 5201 (h2: 16) +8 8 8 5384 (h2: 17) +8 8 8 7086 (h1: 18) +8 8 8 9756 (h1: 15) +16 16 10 32616 (h2: 42) +16 16 10 6780 (h2: 39) +16 16 4 13965 (h1: 15) +16 16 4 14363 (h2: 15) +16 16 4 14531 (h2: 15) +16 16 4 14836 (h2: 20) +16 16 4 17640 (h2: 21) +16 16 4 18264 (h1: 18) +16 16 4 29199 (h2: 15) +16 16 4 3692 (h2: 15) +16 16 4 4421 (h1: 17) +16 16 4 8795 (h2: 16) +16 16 4 9696 (h2: 17) +32 32 4 11862 (h2: 31) +32 32 4 19445 (h2: 31) +32 32 4 24151 (h2: 36) +32 32 4 26052 (h2: 34) +32 32 4 27565 (h1: 34) -- GitLab From 692f14a1d48abf0cf0ab34ca2719479847e1c852 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Thu, 8 Jun 2017 11:33:59 -0300 Subject: [PATCH 08/20] =?UTF-8?q?Melhorando=20fun=C3=A7=C3=A3o=20que=20d?= =?UTF-8?q?=C3=A1=20b=C3=B4nus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/jogador.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index d7880cf..ee8d15d 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -151,7 +151,23 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) { } } Lista vFilhos = agrupaCores(v->filhos); - v->bonus += tamanhoLista(v->filhos) - tamanhoLista(vFilhos); + v->bonus += (tamanhoLista(v->filhos) - tamanhoLista(vFilhos))*2; + // TODO: Se os filhos do grupo vão acabar na próxima jogada, dar bonus + // tabuleiro 3 3 4 1930 + for(No m = primeiroNoLista(vFilhos); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + int somaCor = 0; + for(No o = primeiroNoLista(g->vertices); o; o = getSucessorNo(o)) { + Vertice x = (Vertice) getConteudo(o); + if(x->grupo) continue; + if(x->cor == w->cor) { + somaCor += x->peso; + } + } + if(w->peso == somaCor) { + w->bonus += 150; + } + } destroiLista(vFilhos, NULL); int menorDistancia = v->altura; @@ -184,8 +200,9 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) { // for igual ao peso do vértice agrupado, esta é a // última jogada com aquela cor if(v->peso == somaCor) { - v->bonus += 100; // Mais bonus para que essa cor seja a escolhida + v->bonus += 250; // Mais bonus para que essa cor seja a escolhida } + } return; @@ -198,21 +215,6 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) { Vertice filho = (Vertice) getConteudo(n); if((filho->altura > v->altura)) { int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1); - // for(No m = primeiroNoLista(g->vertices); m && (profundidade < 10); m = getSucessorNo(m)) { - // Vertice w = (Vertice) getConteudo(m); - // if(w == pai) continue; - // if(!w->grupo) { - // // Se existe alguém um nível acima da mesma cor... - // if((w->altura == (filho->altura - 1)) && (w->cor == filho->cor)) { - // // preBonus += 25; - // } - // // // Se existe alguém dois níves acima com a mesma cor - // // else if((w->altura == (filho->altura - 2)) && (w->cor == filho->cor)) { - // // preBonus += 15; - // // } - // } - // } - bonus += preBonus; } } -- GitLab From c6bc1880c4228366027e00f3e81f69cde18bb65d Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Thu, 8 Jun 2017 11:38:47 -0300 Subject: [PATCH 09/20] =?UTF-8?q?Add=20mais=20tabuleiros=20que=20d=C3=A3o?= =?UTF-8?q?=20errado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/tabuleiros2.out | 148 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/tests/tabuleiros2.out b/tests/tabuleiros2.out index 9b6ce91..a55a515 100644 --- a/tests/tabuleiros2.out +++ b/tests/tabuleiros2.out @@ -192,3 +192,151 @@ 32 32 4 24151 (h2: 36) 32 32 4 26052 (h2: 34) 32 32 4 27565 (h1: 34) +3 3 4 18761 (h1: 5) +3 3 4 18761 (h2: 5) +3 3 4 24397 (h1: 4) +3 3 4 24397 (h2: 4) +3 3 4 6764 (h1: 4) +3 3 4 6764 (h2: 4) +3 3 8 27050 (h2: 5) +4 4 10 12057 (h1: 9) +4 4 10 12057 (h2: 9) +4 4 10 13522 (h1: 9) +4 4 10 13522 (h2: 9) +4 4 10 26187 (h1: 8) +4 4 10 460 (h1: 10) +4 4 10 460 (h2: 10) +4 4 4 14247 (h1: 6) +4 4 4 14247 (h2: 6) +4 4 4 15919 (h1: 5) +4 4 4 15919 (h2: 5) +4 4 4 17320 (h1: 6) +4 4 4 17320 (h2: 6) +4 4 4 19855 (h2: 5) +4 4 4 21364 (h1: 6) +4 4 4 21364 (h2: 6) +4 4 4 22172 (h1: 7) +4 4 4 22172 (h2: 7) +4 4 4 23024 (h1: 6) +4 4 4 23973 (h1: 5) +4 4 4 23973 (h2: 5) +4 4 4 25004 (h1: 6) +4 4 4 26671 (h1: 6) +4 4 4 26671 (h2: 6) +4 4 4 30115 (h1: 5) +4 4 4 30160 (h1: 7) +4 4 4 30160 (h2: 7) +4 4 4 31044 (h1: 6) +4 4 4 31044 (h2: 6) +4 4 4 31751 (h1: 5) +4 4 4 4124 (h1: 5) +4 4 4 8414 (h1: 6) +4 4 4 8414 (h2: 6) +4 4 4 9605 (h1: 6) +4 4 4 9605 (h2: 6) +4 4 4 972 (h1: 7) +4 4 4 972 (h2: 7) +4 4 8 10442 (h2: 7) +4 4 8 18768 (h2: 9) +4 4 8 22889 (h2: 9) +4 4 8 25600 (h1: 7) +4 4 8 25600 (h2: 7) +4 4 8 28631 (h1: 9) +4 4 8 28631 (h2: 9) +4 4 8 29725 (h1: 8) +4 4 8 29725 (h2: 8) +4 4 8 3201 (h1: 7) +4 4 8 3201 (h2: 7) +4 4 8 5994 (h1: 8) +4 4 8 5994 (h2: 8) +4 4 8 9291 (h1: 9) +4 4 8 9291 (h2: 9) +8 8 10 19855 (h1: 23) +8 8 10 21834 (h2: 17) +8 8 10 21859 (h2: 17) +8 8 10 22691 (h2: 18) +8 8 10 25784 (h2: 20) +8 8 10 30669 (h2: 17) +8 8 10 32652 (h2: 18) +8 8 10 5426 (h2: 20) +8 8 10 5972 (h2: 20) +8 8 4 10155 (h1: 11) +8 8 4 10155 (h2: 11) +8 8 4 1051 (h2: 10) +8 8 4 11565 (h2: 9) +8 8 4 11880 (h1: 9) +8 8 4 11880 (h2: 9) +8 8 4 13820 (h2: 10) +8 8 4 14100 (h2: 9) +8 8 4 14528 (h2: 10) +8 8 4 15967 (h2: 10) +8 8 4 16122 (h2: 8) +8 8 4 16129 (h1: 11) +8 8 4 16129 (h2: 11) +8 8 4 17637 (h2: 9) +8 8 4 18285 (h2: 8) +8 8 4 18490 (h2: 11) +8 8 4 19159 (h2: 9) +8 8 4 19465 (h1: 11) +8 8 4 19465 (h2: 11) +8 8 4 20298 (h2: 8) +8 8 4 20542 (h1: 8) +8 8 4 20542 (h2: 8) +8 8 4 22039 (h2: 11) +8 8 4 22714 (h2: 9) +8 8 4 22778 (h2: 9) +8 8 4 23635 (h2: 9) +8 8 4 24537 (h2: 10) +8 8 4 2516 (h1: 9) +8 8 4 25421 (h2: 12) +8 8 4 26162 (h2: 11) +8 8 4 28920 (h2: 9) +8 8 4 29070 (h2: 9) +8 8 4 3038 (h1: 8) +8 8 4 3038 (h2: 8) +8 8 4 32082 (h2: 10) +8 8 4 32295 (h1: 9) +8 8 4 32295 (h2: 9) +8 8 4 6072 (h2: 11) +8 8 4 6546 (h2: 12) +8 8 4 7653 (h1: 8) +8 8 4 7674 (h2: 10) +8 8 4 8593 (h2: 12) +8 8 4 8713 (h1: 9) +8 8 4 8713 (h2: 9) +8 8 4 9963 (h2: 11) +8 8 8 16365 (h2: 17) +8 8 8 17006 (h2: 17) +8 8 8 17072 (h2: 17) +8 8 8 20290 (h2: 17) +8 8 8 21573 (h2: 15) +8 8 8 25051 (h2: 17) +8 8 8 25544 (h1: 18) +8 8 8 30072 (h1: 17) +8 8 8 30977 (h2: 17) +8 8 8 5008 (h2: 15) +8 8 8 6761 (h2: 16) +16 16 4 1308 (h2: 17) +16 16 4 14758 (h2: 17) +16 16 4 16610 (h2: 16) +16 16 4 19109 (h2: 20) +16 16 4 22066 (h2: 17) +16 16 4 26835 (h2: 18) +16 16 4 28186 (h2: 14) +16 16 4 32029 (h2: 15) +16 16 4 3351 (h1: 19) +16 16 4 3351 (h2: 18) +16 16 4 4113 (h2: 16) +16 16 4 4581 (h1: 18) +16 16 4 5002 (h2: 18) +16 16 4 6765 (h2: 18) +16 16 4 9558 (h2: 18) +16 16 8 18547 (h2: 32) +32 32 4 1200 (h2: 28) +32 32 4 14382 (h2: 32) +32 32 4 16897 (h2: 32) +32 32 4 17065 (h2: 28) +32 32 4 21166 (h2: 34) +32 32 4 29283 (h2: 33) +32 32 4 30020 (h2: 28) +32 32 4 3836 (h2: 35) -- GitLab From 8f02a3e270b16cf4dbaf0bb33316481b3d90a941 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Thu, 8 Jun 2017 19:04:11 -0300 Subject: [PATCH 10/20] Muda os testes --- tests/runTests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/runTests.sh b/tests/runTests.sh index bf3fd84..039e32a 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -4,10 +4,10 @@ tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(3 4 8 16 32) +tams=(3 4 8 16 32 64 100) # lista de cores -cores=(4 8 10 16) +cores=(2 3 4 6 8 10) #-- Cores do terminal RED='\033[0;31m' -- GitLab From 27fe2f7532aaf2c465470ef05ed6d8ea20f72027 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Thu, 8 Jun 2017 21:11:32 -0300 Subject: [PATCH 11/20] =?UTF-8?q?Add=20outras=20heur=C3=ADsticas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/floodit_h4 | Bin 0 -> 31136 bytes tests/floodit_h6 | Bin 0 -> 31160 bytes tests/runTests.sh | 14 ++++++++++++++ 3 files changed, 14 insertions(+) create mode 100755 tests/floodit_h4 create mode 100755 tests/floodit_h6 diff --git a/tests/floodit_h4 b/tests/floodit_h4 new file mode 100755 index 0000000000000000000000000000000000000000..3b606ce4fb8e2b333d64c7db83c6f92d9e70b106 GIT binary patch literal 31136 zcmb<-^>JfjWMqH=CI&kO5N`vU16T+`GB7MC0CT~F1A_$vCxZin3WFj88v_FaD+2=q zOq~Oi1*3m}3}awmfYBUa6Brnn85kH?7#J8Vm>>ccOb`=bv<yU;0Y*cO0lN)kA5<E} zW{?<*9f)LLfYA&L3Sa?{evn%Qpz;EC31D#;odI>n0w@jB2jYVCX+ZU9K=r}s3m}6T z7#LtQ%zq%ifp7@O00stz5UBrPv<ujF1_l@nQVS9acv_MIVzZcmcnl0IW{_}!(LGT6 zU^GZANM+#Dk`$0TL2P2M08~*B)IMC{@&RfejD~U<^m8(k%uMuiQgm}N^GYjpD=f@( z%}n%)^Yx6t@d`2@q}JUp6l@bH7(ng=#RkaDA`Fl;0Fw9lmgBcPdSB*)S9k88>(euE zw{-ps(hI|21BfKz7#J9Yu&4zECpK|a9O^;QjZM7|4)xqP#FH6dDGAk4pm4xuzAFxM z1aXM-;1FlX$xKQHMTZ$faZzGk3PXH+W^sP9rDc3^a$;T@LrG?CDnopHaY<rwc6@S1 zc6?f5W)4F^X-RTMVi7|@QD$CA8bfYkPELL@Lwr2QFp%1!lK9-j%shs)qEwLX^xXVB zsBk=kyN{=nbG(tBIh<tzXBp|4GB7YOF)%SOgGo?o0P$EDKrB$mFfuTM^EN2mfcWB> znY^G9qKJWk0VE~@<})+YK>4LonVcXK+dzsz<%>NeKZDX3J5&rrNjN~nL1Liv1QG*b z1tf8p8$jY3NaCO}3M2-?21w$d^a~OLVGAU2<Z{UYNgU)RkXjJ-KoW<Q6(I2dBymoV z02D_ciE}~4KvV*fI5$WDiana&aCmgH%33Kfc(fiUVSTZifq}uJ`3T2hh=Tv7LRJb4 z|5Zh-6d3sB9T@(rg7_IA$(IlQ|NsAAmCH(jAp;atFE4=kOdvieh+ZB5^M6??Fl2y& z=H&)3{}YH03X+!#!2DMrJ}4+&P5|>Cf%u>xc-a8v-vaSL(ebhX%)bQUgM#8^0+@da z#0Lez%K$Jx$WnnJZ34)FAZ+;7v-4t{N9QAt<|iKlLOhQja4>aX@Hl?(f(eK^zKq?0 z;YIrY|Np<F@yoj~Fzl#zNMH!{(5-MtVDM=E!ROKWv`l&j$Rtqk2*&OQN&J71#xLIj z5@d)y3<{MrJs5u<NIuk~@g0cvIQWm*qw}dp=Le62FYG-Sk9l1DS0V~GjT>efzdS?i zVTk<=wt|)l3=E}$p&p%2U*!G&|3CH^>pu$x2FA}|oAxW%fgEPfP|EsxGQT_n+^~-z z4gW91zO4HH|38TB(R`$#v$n^hv$P?_qnkxl0~E2Hu0IS9c=Wnn@aR1LqDhE>0mf$L zVqoy-bX@`Ct8jq%8(@3~0Wg0DjBfzpALw?y(R_f>V}{4U2TUL{eg6Ib@6qXc!lT>u zg-16-H$$iE5|8dssJYibO8zP^FuW{gVPNp+E(M#n6BLrWKm<ryL<1z_x})1ez@yuB zM|S{^M|UaQ&EM1+7>>Kn0HwFra^0>oJZ5<GinN0DcDtVNV7zb~#AaxAox#}cdc)dv zM(wTRt}{SlFWDGD2K&D7=yqM<(Otj+(w%(4qw|6X;{gxG3t%5Ge&}WZdxqJA@q|Y= z2LZJXEMUb<9*ifz`jDN{%fsZ+T?)0W0=sQLz`71TVD@1A;L&XWu??qMgl!O4BHPAz zfv|QC#t)s0ppXIC)6HP*I)lIeH7LHiT@Q3Sa5Nua>~x)T+;sscv|xdz!2}94*8?8i z9ugpJv<NtB*EzL$9^JIHq|<dyx9f~f*99*F!RdguwpqK*;ctBb%5mLvOK^-AK<O1Z z#Vzo_NZ&Y999FdiQXGTj!8$fbsG=pSlYjsJ_dxMF7V{yg7@Yc1^BPvQ2)CR7mnz+% zOF)HDC%8=E6k%Wh33R(|fC$V1r(2YAr&R`=lvi{!v>xE^um25lq3Z@vk#m5V0a}oD z*ZxTHFtz~~mL;q&^nU*TfATP>G!6D>exu>hS$o5y+x12_sARg)?ZCpn{!pjun{L-P z;9`IoWR~|&PyxuAW30e%+!d4p7+!05bhE}7D=>72zVJxC<Z<v3vq!HC*a(n@XW){T zx!LsvW4G%IYu7h57ml+k8iN{q3=AknfA|458YG8ov>;BS^+1JeCz{dQjIbCz6=L)< zBUD#UGs5L+7Et)28(j@GdV)vu5sm0raKL$V^Co~yVGS};VCW5C>=gAhQa~<a86fJq zSq+U87@A)&cCu<1DKJcch<bGM8i94Qz;ypM#HQP$o0SWsPV^2)8XCxq7d*NdAoW2v z>tREv>AMV(P2Xauz|hTl%n<6fy&&zN$_!HeL*3@l&DsM}Cpr%#jcK|^H){@9z79j) z0o2lA=w?lUSs#sLeP`{D&eAU)-L5}8x&uIU&5v$GDnHci`lXWzB-!o2(i^}CVs!?v zzyhYT_6JA=EcYM8LXmsn(OLQcR0o5T>Vr;DYJ1Tgz~a&E`k*s_<+$q~P$B=?2*mg3 zcHrm^{R2swOdgDfK>EOfzJENDPkJ1D2&vyXnVMbyfSmE7+kwT}^-ujFm|L3PD0p<% zzSs|Hc)#%a21=zMFS-7J1U|@h#~}d$G8*h8kQw~z4}tRyxZxlS)&{csheszQFd#Y4 zqxp@12h_J9SAp_O*;jDp{Q+WUef|G`0$eHBAz)h^SUQjG4>5Is<m?y4U;qDyd0Pjh z0Av=jw=Z-vbROFu0oUO4_5Xh~51-f%YEr-8z+xjbxIqpQWd}Evet2|;f}-e!2c$$| zX9E{MU^gpsF)%>P+VchEtS{i$NJqrR7kF%300-9(h#5-!U^5;-+>WdW<aUH-+rA*e zXFDg%u7EEfAAJEu;RA3KeyQ&T#SO^O!t4wTXrTy+&T5cRooLbd0_-SQ9HLh;oyT9e zf^`uYn=3veTs!A8Mr^`jtr8Mz9vt1Se=sYy6Wt!59P|RxK*6HmLw5lv`M>b!1~ss- zDEQIM(D|wJ*!~!J60rXa3NUDzXRvnt!{1-=AMDl_;KY&vS1F2cc4zIM&e9*9p<g<E zKXkkPv3C7Z%f18DGkI+U;nuP505@NiyIp@+yMBPlia@w9Syph%9$E@Q>Yf*!rB6CT zA9VWOIqnKcF{y|k`GPG-U_J(g8CC@h-M$aHL!WdWf8qH5|Nl<cKh3p&82DRS85tNr zta`y_S8#fH0ctLOsh{wgaRSInPzC(s<rQ%I2Gq_6ng0XR0S7^9ArXQp+x&vZ1JvB^ z1f|Cp9^Dj};lR@A2#s4xOyTHs<Y><Q!3d6sFZ}%q(71-U4Kw_DMHstXpMc9~sQYoK zdC=*E<UAaT?sPhV6L2@EmIMV{r@(7QSeERp#f*GwkRn`eV?5FAz@hDWhhUWM8jVt< z{vSP}6q=_yYr&QDan~Q<!ao~U%mqPf0SQp`f!x+WuB<>M>kE%=2Z?UqACNj4+F<F% zQD;L6{6F=Jnq7Z@GTZ}DhW=6C1*^g#2@K{KcbH@JAZg42zhl6;0IjY(2DJ!Wa{Q=Y z2ek;^j@}Pyg}#t|2W~8YddZMh^$T!Q<p!jw@}d*mVz~in9KC=v3tqtc%$>(y+<gnu z4+)LV0Ey$SPr!i*YS%!5C-e!VCWSS*L3I|Q(J>FKow?cd2`Eg!PJL2;80=@H7A&-R z0}B%suskU2VT~qc(C|Sw1E?Oo^9HTTsJ{qP4wByc22y>1*c;!#t2%h7be3LeuD!xg z!qe?~rStfUdvE^#e=WEl<fj*p-u(aHdHls`hzU24L*Y6|tP>OpH$1?h0Pc6Z?1q%j zH^Auxqwj%eYIYufF%@hA^KsWVAiG|>fO<J-+Q6;p?$9@o@MHpYVP4dM+yu6_+k>O? z!p!eKJ1>BS5ty4@-+)3C)JL**eN(>y)Vl$h2}*S@`1{lT|NoENNr3wwq{gH3*#2C2 z&B_gOS-0yAkLCj`s4^d4gToRe!+|Pu9V&wyMw>xmm|@gJd>9piO@N0HsQ5(>TJ$ht zynyO3yVs!9ff6)3(Sjx)EoeNTsn4U^^#!zv1I--ZCP)E1peDTnwIsoX$;&kipiwe# z8~-KLhc7@QJU_VVtUv}qqV@+QDxs+txp;xJg{$CZo4xw~|Fs42IuWhtKQBQ(hBl$V z-3I=C(5NP)^}7!&3oekrnePXGzbnZ9(B^#On+>4o>D(Lf|NnpVLCoW=pz+`a@Mvx; zs9DwuX1X?XL+Fl)5PHIN2t8vigkG>1La$f}p*O6D&^xw6=mYy9^oipT`oeh#ed9WW zesCW`zjzL!yIVnS1BWetornj73(DON|Nj4fxfVRs1W^KNo<dllLJh(Kwb~Iec;UtW z|HoT1{{R0E%7ibY85tOkx8}gOsz_!za5Vqm<nQYMg-&-bC>&rmgNmi8AR|!Yb}Gmi zh!B$pBe+iib^$mcY=x-*=5g>DWFV5Edn-geNQepCO7ocE(cN+sY*Xj4{qNx^L*~W* z|1X;d${j!9?wIoY|NmxiU@=020@T9+3-I?J{rCSrB*FQDm4W;VSH@rs4s!nf36P;s z&;Sr*w7i7%h3<3M01z}Ef;#M-p&vSZ-?(&wTE3u;5vX>A_Ql|N=>t5l4|Th~0Jjl; zbc2RBtX;p<`GI>~pr{H3>uWy52p$!J79R+`7eM9Zn^L)M*Dt*VjNP>_x_#ethkgKQ zckBfBBoiTRRM5ad^9x36*AI1|_QMZwyh02I4L2bh46zKH3K*<i-;^qKyME}cVC?pN z(H;7x8!{Z>*m<J!V&^YVI%fF)|9^As7X}PRgUoGy#Q~}MK#l^pRS@Pv9Q_}gqu2Zc znfZZ%pj!_<V)AHy#R5vPNN)X)%dH{*;5902)Brxd;vfN@j<9z9QlbkAKTrsPL<G8h z!6PtWFM}r`_JMLA$m^{C{{Kg5f<v1}FXteN*Vpw#mWr(hDg%g73aU*ZO&9zvyYDy9 z$7A^W3qf%OY2U$$(@;=x3T<&hY7#^W_UUv5jS=BXET9Nrgrq|LR#3473%YLXi3_YA z<OPVKzF*K9ryn4E$bb^a3n260`9dC&&ON$oA0QICCnTX;VI*{ANW%31cVS^E*AtO) zIY6NSO1ThY|6?`wF)S(OfK3ApT0cPK10>USff9o|$hn}DgU|aHx*57d-+aGid7(tS zJM;r2OFaNja)DBn_6Lka>d{#W%F`bZ!(|{lz^T)t+ZQDD1MCvi<f#EIuRw-I{Y5qu zGzdn1G&6%M8X^idcwh{jXy)(hV*rh+f9S2i9o5@FQJo3*9iEhq6xEi*spmkX2vEGq zQ!6nrAteUi-^hu<05miUA2~u4LGX?dv~qZWsIlORe4jw_E4*|00K!M)-{Y=-K!aHz z9nft2q|O_}1Et_@Nbd_$<G`y%ghk+j<xZ(|x9by7_2zr0I}}tPy#R%b-T(jp8D0N? zjOun^0oQF0>ij`mB$GjP5VG?jHo@wkJEij7t`9(UTj-tc(kCFjuv+cGKd|Y|wNDr@ zoC`7(sba(7-2dGu&h3X8_<(_+D?x=MqE>^s@_#pmE3F`gcDw$8Hi(<wpvI<8r|Sif zx9|iB$TCO?euuvmnzbSI3nX$tzC{i~uzFAl4pBrn1%T{_N4-2GDm}VuFCfAPwFC$C zz@gEp42d3(Zr=+C&x1=kNZSKaf<IxXgBS}c!7+`6l;95-`1=-uv-Sf>*2ZokIBVB{ zoJ>TJwH~MoBu*(ucjyCX3InCxra$1Z)NbEDaPbQuaf4UL851(AK~~ZK9z4D33T^?$ ze@8YHwde=6QGGgnL756tA>%2_Fx#n+!V;}qgJdyyX2xi%#vz8Uh-ljil<IZ6e(9}X z^y&6}-~#I6!W+1tl}X*D0%4v1KtU%9s{Wggfab9fZC(C8&^jM92O=eCu;U;OhLs6# zN)yl=h+n-xsR6iQfN&tZkqmaAuRtKIOsN7D!OcemK&@r0K?kx4sbB%S4xHV<<=~rA z^q|A99u{=}2?gCFP+|eQ>jMK(AqH|2qI@D8VyNn2A%<`l&Jgo}x(qhT4K3b4bC;c= zcRGD<xOBQ+K}6RbNDT!~dp96_(3B-;xC}H`3MsTgajOK4Y=CQ(2hcL>4u2nL%n*^! z!FnNy28&JLsQObHiRLQ&>aXzkHGs>eJD|$Q_eyu@4UcZf{4BWJ0V(Z%f|?!CBpBQs zdZqagqveG<wQkody&jC+u3+=A8a@Y<I6?UfT9@A7@4Er+wSzjbpbjk9+n^K&tqj0{ z3-J~#@BAqR6^Ee7M~QCiL5!;YN?k>_>kW{@YOjDaz`YDEx41yw4M+1XJ_o?Ps|50H z1!#R2$n4NNh_D13yzwuncX@{aYs7*qK+1z)UxLyvq>99hSp4ddBldqcu839m`~UxI z^oYf0Fx;oe5&Iu|syX}z<l7qzM8zk_r-+<QI6hI;!{YOQH@5h+`t$$)YeMmfY#`j1 z$ngnk1);^~L(JwZqJ#jYAMj)}Xo3U0bm0MHs$A{)|Nq^-H;~gEct#aene;=}{yaGD z09r@N0PEK4fd<?lD<fX=K{`Ru#Ex&I6jUWW=yu?+JX8nj9ulhqGMVw9JM>2<XoaKe zgYM8jodE(bCqi;1vBrQcE{*RF{n73E2fXCa^#ORvr0auj2LZ+lmIv#cKw$)F?hy0` z4p%|vc0geao&|pd>NP_K8Xyx%{QZX^1q>)8Ad6KVbOvzXEZCtz{yGvisp3G4BSFp5 z2cSi6AkVQdp3rvvq3!wyJ`MtPUi}v6)Dy&M^>c6~gAUMAt!`JeWbnEc=B5;4+yov= z1-S>506^1a#Kv4_00(NY)=xljH-CQ#sLj(2HXAcYq0@&TC!!_e--ywvm$!*bP2i9P zrxCoPPT&b@u(Hx09?785Vc39i=^qFmGFr@d0zBeLY*2s`aUDg0$KNjs8ty?&li#qW z$=Jh)<=PV*!yUsMJO4X|I)?c4s_JnnFob&a>VoKC&(3e2omYJ{pMn~C9tZz2zc_#4 z|9_9xw<QXOw_)qOeL7$HbbfQ`{O|Z*<c>%4VMY(j*QKvO3+SU`9b+709pfD14^Kc? z`1vqsdHov>kP6TedqxH(2GtZU2GtY=1`X8|9n};~D-fFtA_x*!O;G@I42)6~7^I^O zav7wfjSa!15tuXvlO|x&6ik|dNpmo1U=2}g2&Ijnv@w)6fzqZ>+6+pYgJ{)aRRg0G z)nWw()nZjJ&A`CGD9vo$!N|a1z`(%p=KTNvR~Q)>)?E1ie+eT4!=j7-|AR&ZK3x0% zUxtZ+LG#A{|1L}n41qWP|4(6JU`W65|9=Y;14I9f|NoaTF)$px@&Er3CI*JLH~#;B z!o<Mfa`XRx7G?&9hMWKYt1vS#%(?mhzY8-11JAAh|5KP57_x5t|KGyQz%cdJ|Nl#v z85r1a|Nno4nStT<?f?IuFf%Y%-1+~Xg@u73`Og3UDl7~PQg{FVcVS^*$i4gjKWL*= z-u?goTUZzv93TGwzl4Q>;rzq@|BtXRFjzeL|NjXK1H<b_|Nrx_GBEf({{LSGL_hie zKZKQmA@k|~|23=(3@Ok4|DVIk!0_?K|Nnbf85kD4`v3n9i2v&U|39n@44`R788!w6 z*SG)w+psY(%zFF(e+(M~L(u#G|7+M77?!{P|9=h}14HS@|Nr-}F)%oM{{R0D8w11C z&;S4bVPjwj`S$<63_Alu*{}cqZP*zYbpQPSAH&YT(D3*F{~C4%hBN>E|DVIoz+m(L z|NkfK3=E)sQK0c^#;PC&#tH#OX&!ct35@IlAaU?sxby%2Yk?F%F-RQ5L{-ngpu)hw z08%e-?*D(#q#FaDfE%BL7e9A7M+1Ysl(m+ziV{d4NDXKY+Pw4s|NDV<Z8-7?v@tpJ zvN3zI^00G&%}HTkU^sK-|9?x+$Pi54wV9b&pAn=4WDMA@9tH-6yI24J2klH?fT>G{ zC;{06n#Fv2_5Xh{kPeu9AVU5O0|UctJo-U%*^jUO{}0;B1vkGCp`VA5f#D|}{W^>c z42;+Q{|`sDpD74z0LXnlj0_AG*Z%*vL6$EEON0HF!^pr80?G%-^5F=1(4M@2Yyba) zw@SkN$CM3L05X3KBLl;NYyba)_Nc+#&lCxlKf}ntaPQjx|Jumrr-7xx_P=3dV0d}$ z|9{Y)D1`o8umX_zJWLD>*4O|42d(2m$e)MH>o74eyubece=M^3Oc8K-A0`F{og29A z&tYO<Fu(Et|8^Apo8bC;m>3w&-T41M7)9O>F29C}fr0Vn|No4j-9)hPVg3V7L?HK{ zVPar-bnE~B%gE`B`5avS4HE;y)I0zGgNA$&{_BLB&%?~Xz<l@r|4bD7Q^4||{Gh|k zz~FQD|NqU%@~+LyOe?`kK%(Gq4q;|sxPJHlf6(4NggtR!MIduZm>C$P?*0D{-mnJq z2gsanU?pI4K<ef&GcbI*_y4~%vVTDNMiA^JusV>xLFL`k`~UxgDtd%{5W_(7pmOlQ zga7|~QNpc*31k~c9#lT+KK}oIJ+eK_tH73k<U!@;o+tnR2ZC&bxtGZYq#f*EP<i_H z$^ZX{P~`W*<w50a|I`2fC!v_%3pXEB{xUxQ{~x^56K;M0TtBE>Hhcd6KX{oWOrCi& zTtBG1KKBB*eo#5i{PO?*b13$ogzINvWnkF&>i_@KDDubP@+zzh3^8wToA1KPz%cR6 z|Nr|@!gm)ud{bB%7!2P3|E~mE`we%$EDOkkpzv*BWneJ+{Qv)U6#F;9?O(#mz;N=* z|Np@#@_umnBdiPzf4=_z?}#FA1C|Gs%}-bv7&N~B|DOtqA16M6ekLbAi9TjmK80Qu zCq9iHRu4XdHZ~7Fi)MCTK8GSc3r9W!M?MWFJ_RQ}2`4@QCq52vy`sa$z!32L|9_A- zK}KQ24eXHp#tBdwrUv9R5F1AGfH<Ii&#VyjyimT2DTFTx<-_(@OGEkK4jKakgA|l6 z0o_jx3P+F-O#bV?|M?*P4CuaTP}KzD-(ZHA586-&;_raUgBEgw_>({c0|NtWPoxBt zFAAk$6len@m<`=W2@8`CU_nGZ4BDs&5)uay3=9kpSRnSp#7{u^Fn7c318ragX@T+o z{fGFc1FHT%ln)Ef4^Vy<R34<49vHTd9o;TA=>C5(D6Iyi&7ia!ln#T^X;8WhO1DAj zX;2#7e0OJOD+P_vq|&^SQUy~z6Fmc6vr;h6u+Gp-&%i{_L=z&eU}RuuW?*Ju$)E$? zLkuzr6561>o**8$-2!5uVTk%dCI$wG`Y$|?xVxy1rVz@_WdiLu25~qT!x$JCctF~g zF)%P-vxtd<{S;^qI}2-OUI_ye3;TJH>liuYK@=0a5r|@BQv^{=tgMU-3``uXpaon^ z9PIBvXCH8YYH=n;Hc(@Ug~J4-j)V0(m|{N)I#fY{iRB&x1NeXi1}0XJ0tPm9kU4B1 zHVYeQr#KTkh|R$U%1umQLwMM9L1u7*#0A*AnHd<ExIo58FtBh`GB7Z(gO(C9arc63 z;9=qwV`O09$YEgO1F2`=NM>N-2eDW<${3ggKr9Xhc2L$~5_}KRA;2W;#K^$FCJ%Cl z2uPlRqaeSSfk_l3%)!9I0Wy%CA0#cN$jHFJD!?Ss0McOq5|RY#V6z3Wr9f;Jj^z9z z1}15c%QzU=?|_^x11cstL3I@)*r(`$&p0Q7iGhL357d|gD`1}Zr;bYs%mv9XPyA5F zoyoum4jSf(9rfHGI~c*C!#r_HJ<nrMmj@g`%oBU+c|be*8M#2NVV*dlp2r1b5I4v{ z%oBIibLTQJ@_@#ZnI<~$Sb(H>;+Pm1m?y5N=Q#i}2g==0&z;7=$P4NbF;ARP&t1U4 z$d?6HxS*bag(C+X;~;ZbI6N2`7+5$!fx;le2TE{T7#J9!2`-tDfdQ1@&{OIWP{52P zI8Y?fD#2|BHBR|p0T1r#fZ}%!sL{cdo6o?=2VyZz^Z=zTa3*1z7{Q&*zzEJJOcP@m zSU5lt%wr8QND-u1mk(0jfU-EKRAHRM3p(zEQ8g4Q0qzKaZQ=P1N?V%hObiU!P)UR? zNSfgV9ihUgI~ghs?gT;fo(0)xl+47ya1ttstQVBhcu#?pn0<swgF8TAy?j4G5;h+E z5SM~`K46JmpgdN<z-R+9mT6)J7dR8yfMS4YVhRJFDoCGW3sfJh_GX*|>hp6IFfcko z^)c|>2B~yi096U@8-Z=mU}j+8D#&MGbcHC5;3`Oga{@r2>;|zdhk+k7GQj8uQYRn) zaVfYD1vV!MWKJ#vqaP^9L2**Rz~~QB$}};9fm5EDfq^k152_2?vjXet0qH7WV2psP zECIzp>`bUiQ0WYbvqMmou@IFJAeY6#T*f&M<hwL(L5QosJuk5Nf-DRST)7O4X;4>z z!Xyo10@!cq5ED|kbBh@mGa!mG82B?m#+8GT!F{Na;LaM@NN=c-<q*{opc1D7q!jE? zK9ENnY=j^VL3p$jq$`bqu>r0!6Qr^=9jX%CnFE`@8mh7tq7v-UHi$EG7z7@If~Ob6 zl@o^80q*93buzLtFmUA<GBASWnI`6NB_lW)TscN?nG~*M1Sf%kvkK&vnT1dj!5u@e ziKQSD(-;_MLfyiZ!@xKbWI5Bs5Uyl6JAkVU&h`OC%q)nS6z(hr#@P^d26u990R!V4 z2rq|$Z$HQ<8;V3BzPJo+ficc`3AJ+rlARkMy1;fq*<d@NY_OdhA!@*OZi29(c5a67 zav1o6K=FFqRUBd`xC0CJrzIOGndCDt9*0IMS8fWN15PL>AZBEMd<13ZF!05K%sYP> zY96@53pTG4Y#sySd6;qFY<nJJMhGZ`E<o5|^Pub;27XsiJX{B9vXOwe5!^`zn|Tpz zW<CQWSRPse-hdbr!VPloO^`;Wi4hE(9Uyl-eGfGQ+<^w0!OjlyCj;YCs7jDao<WSr zVc-OH%o*PWNkVJ}cdNm=!lAm}L3DWtvVolW4x-NmWX5|4I|39sP<9Lhrv%6qe}kkT z=1Ie2cqY`mzfki)Cj3J(0m_bH5Lyi~ftxW`8e#;vXAXAKeRc*0;amnrZbpb15h9rk zj694GLo!6N5S$zaAy7+(QIau324V`h{|+|Af&*fTB-j+@i6`nn#z=vUVV-!S4rC6D zcc)HtHptu3j38ai6Cczuh=JM@9vln|;-D@eKZDRtP?9!e{3-{rXg%D=YoHbxf-Pd2 zm?50Qz-S1zhiPJpa593EAORY-h0DbVgHsMnX#|7NHIN;)j7t<Cc7PgakOJ~K)DBy? z9bm1tFk2WT--5I{Gk%3?1&=d;!$Fr55)RH#t>DmffocSYrYn?_!yuFoiW6VP?TQcw zfJY<1ru0Ki@r9ZK_M|UVBiNHL4%Cw{Zj5jm1EVh^B)<nR2t|RyIgZg&8Dax?JOgaQ z38)Qma2wJX7~`NC6BvY!fjpSPI1j23JkSBwsKo{GU<zDg4g+HfveRH3sMBCvu+vhY zHUuyTHG*s?WeihAcUm&khEli<X$*{|P>l%;Qq7=Hs|MS+8mbwTav@Q75~{fxsyPCb zJRpjhCWe5L2aFQ{Nggn+k4Pc|V-46;rinQWLX{v}x*03gA<hGj#DD|9f*TS5-N-g{ zLp6eJfN`KUz_>o3xao%a!vSPn4^&qUgV0h?Xv}AH(S%rsh^RuSb@QRtWq?eX4>cu$ zK_~ze!%G=wLN$U%e8BGf2-Ub0t}%y!aVgYBa2kSfpb-V*LNf}C8zEc-(gzA+rilT< zMX6~ZE~I#1U=Z>Eh0{jH2px#S!6Qmw`;&Me;j|HIe}r%f10#$R0E(84P{;Uyq6NnB zkO22)U|bgwaMs%dRhq*fGz}C|HyEo7AQpm$sK6GUhgx_8*+LixY~c;4DPRj>91l=I zbrUKB&Y`!UoE!$BZcymHXEZc|SOzNoAnDA87vj73$d<u4V9VY^O#xd5<A5#u0F?n- z_7Td-VUU~x3d;YCEyfVbz=LOCpY?+*%V%Kxk8Bx?6995Q0}~`dz(z7cIXMi{Mj#{E zmhdt#a5B$;4h*qyfZ|e`7bL~LA1t*3E(Iz%q@RPNIBtQZI^a^Eww`nrDD=TyO-|+s zP$_9MP$+>roSe)JFu`{qL%2cC;$&U`6=Yx(WK`u7=4R%T<`ZNTViyo+U|>>V;O4gD zX69pHV1_a|7#LXi8MwJUg&7!Fg&DcIt+=hZ8HE`b*mxP3`9K^`VNf<?7lU&d7&v$t zm^lz~oO+D*k`Tq}lAgjK+Z-gOIZ1+y;bMjBW0GKC;5LEl1aWyxP-F+n%@{6*dJg17 zbQkL}!2AmH>2xPa1_oY)IK(utC?9gjz{Nq~!jCKiGYJ}I0@&oHL&8%KH9UpjN?Fw< zAr?Rl5oU#iG^?jD$QvTifQNELp#cx&iZL>J3WJ;_uE^jitk2EBAOW=psz4Ic9;kz) zkY&(3A`P{L+f&$H666X7(69#+189_qk?}VlF9RbZBdECnO6d$~Ir;f1nI-WVCVJqu zUv6SSq8|8gIR*w!CfG=h_!DNXCwo4B{``fbbT@}VB*#RKlMGBO%o9NbM?V7-3nQBs zTMLM{8$>WQF$qEipPek-&6Fz4lq|dsB*K&_45sp-lz=Y-6AKe_MH)zy&5Mnh^9fVD zFo!UQFmpDC9<%thJ&{ae42+EBte~?4LBoKUegL}}i|b)S1I)aPXE^jZN<l6IyO>D@ z=DL>oqzSipGbsrhct5p+&>T+@ERN4l?bdSa<`A}P<`A~qyZbuAIz5<md+hdJpTCw# zQ`p;J_vhVqdyy^IfGe7B_w6%>{_gn*15`nw#muAurobUQ3mRSrc7u#$GKQIm&{GOC z?-@tB-RI^~2#hq~@Sn&OD7*j^>`72V&MJYlfgQ}`0=9$64NCDtmF#Cy5oS^aA?6Ye zA!c3$0}k<tOzKoHXD>KPzyy;Y)XgBrvF(Ifz20s;SQbn$X<=7#=KAjI*EzsmfT)9q z`8w~iy&&&_g*hHW4PEznx82wDJsiRu*LO4NfjtXWz~q2z{tl?>mo29`K#6`Lx@vRm zs`oOf3h&;%o5@N9<P#<fK8QIW4%>GS$y_xLBE<H_jzi%YQyZh?Qx1D3J>jQMIrN!2 z7$N$a86g@$qt#4o9I?ncOV~JqIHEY3nY2KTXJos^#$+H2&XtU8Pe5!YC5S{Chy#@X zvze5H?VfTdG3g2_8MN)5$fONY$HWvM0C5q>61I;JHroq3j%FqUVWt4#>m1jgGARqE zb6ihnQWn<+S(ah<c|Mbl@NO(>=0nvmS&G0F`7#9vgYqEEt)TP`bt^dH7}>zi<A8`m z*w<|hI9kyiFrP_TLW@aTn8`+%!v}8sZdgcgD1f}cWFQ3cI3#Wv**Nr&1r0!6W@H1! z0TY@+6fpx~JC4arTEa|P!W@bqXP5{xsfsX}3NxvRaOi^s41_tpfcQ!x^FdrBc`)BV znB%rKMBa`ghGRF!+O@lPGZ_gp=?Tw&1`1;)Bd}9A8ht=QAU86Xft<j|<^|%wBZ8Ut z35T#9M+`WTf(a%Y<g^FREF5dsPMioam5E6YIZk0pUT_H8?E^WZTo|qnn$1zHe8nNm z#LU3Rn3t28myuYET2+*QCJ}OS6Dt@>^NKUm^HNh3z~|5=gM^AR@{39o;1Zzemb~Qr zqSRuBG>|s%fwb;^p$g81hG;WJ3c9%^rFp5g>8W|CMVZM8y19u($r-kgvx*gT(-m~n zzz5*!78K=|q$Zc-7wHz46y@ioGw5gJ=cekXB_?Gi=H=@rXBrt;>K7L!>nAg$fSi<* zpO>xxCQzJJQjn9Fm(P%rSzN+U0;)$CiZiQHODYRe8NiCc1jzjmFM(JkX+`;YC8?Q3 zi42KF>17NhiMfe+8Tkx($@w{@d5Ogg#rZj<$%!CC^D-F<5{rxTi$Rh_V0|Dx$qc#q z#U(|F@gNK1LG6DKLob=3B)=dZEC^EoaUEDA$U?9jNJDBd*vW}`$(ayS7!Ya_i&CLt z1(|szi42)}#i>Q9@dyQwm;g(H4P;2p&n-wSN{k1^O-^QR0aSZRYH@0AL1s=yB0@8R zTadqBh^uFiV=zN<Vo_0QI#h8{YHog6YCOcjzK#Ko!3;?HLH<Lym?1g80Osz@ywbcB zs2Pbl`N_z3A)E~I6X<;8RA`_v6zAtcH5F&(mgXcvEk+7g28d~3_ZKsymFA`7BfALV zP>4ey>;NA}KmTAz96&^%AqU|Ur{<>Sm88O40e2fr0HP`#?m}=}B2+<K0}cmB$b<Ts zaA`<9KwS?P#fUmY5P~%rF(l^~#V6(!XTm%SPRyVV903eExfynDJF-&HS<kTZ&QZmg z8A_NS-8NKl76#aSKdLw@18kljRh*3hwjKagoSgyNJUTN22Lo*W9aTLi18g22Rh$bx z-;XNJ&2Ry_?g3Sthv5TOabAW6Smwc*8Tc4r=j@}J!_NR)M}aCXzz_gkUx6wv2tOwt zRa}T+f;qNu7G{90%Rp5x!T?*3fhsP_06L}^Sq#KxW)Nf0fUe&F@nM*mL7d?S^gM2u z7>H(OkYHed^=&}{P|VCA$&i6nT#5m7>@rjtoML8xttNpBff>x;)l6U}3c<`Ei^7L- zm>J|?Oca`#0W^t^A_V3zL+=s*bD#vM>%+qE5ww*aDgvQE>th%hFvAVBE{2JLkKqAY zdI0$dB(8wA?nVzZ^UJ`;fW98b1vJ#bfCwLuJ3uxEgT*o9u?lJqY<&+%EeM0oPiJJn zOb<&zGuBxAwF!qf$bM|$0NN(c2s)A94mBNuw#H)%ACQ}{nR6K=!61y0K0#Bij9Aj) zTc~=BbPjST17>~^2KQev)2AjQ=sp2H2GA+vAR}Sxgg_I-LJWKi=wn@;VD%uCs2Ftk z3%2wA3&8667|`b(YoX%kQz@N{*zXf~%mfn0%txS+Qjj~*r;T?(%}1ZPJPs8{A6B~v z6-OT%e*hInAJKdT6-S?W{SFmJpIKpMf`l{r904B_==^_4jB=oo1)?5(HozEcK4$qT z3N{}#PC&c~%n)<Xhwcq=sCNa6^D&@LR{2B4(Ff>3D?&iwk3Ovin#=%+qtBq%FflL) zGDtDN1_nV(4ngkhhKj=m7&$<K3=9mD!1h8pNYq9g;*wDRqR$0@CVxQgL0<`Q5o``0 z1Nzj`b*MP{Ncux)e4&@;pz%$R`59<)VgI1!pif-$L*0o!qaeo&O6N!(g)()S85jha zBpC|O>JclbIk3?iP`(9eaR;eqK-8zOa1Mj2N1q-~2aAJrqT))hI3EM(`T>v(XhIG| zcS6O{r<oUk#X%}iu{|_Bqpum+0#?t*fWCg>KKLFCDTWPb{sj$2gTfisu7K?oH~=-r z1v>Kqn=-k=49Z`KdIaXG2jK9LVt|cW!@}nk)EwAY9&GL1d#E`2^x!Y3IQkSnH`KrA ziwVS`;^<T5pqUa-zJLwO!_vP73-<J212rcUy5t46)aEW!9DSvX4^$j|(l`<<4ht0o z4Z80D6wc_&G@4l;=@7l$(vQQPD?#cRq!?gh{;+V~0=Acr0e!v80jPS|90V*JR)EVr zK8)2vr=jMcPXIN8;{~%Fdkd-_eW}nUa6U!&AI5qORgb<Dfg!o5q`0IsElm$}e~g!N zP`r<4a7cVSLrQ8<YI<gINorAiNp5^{PJUi$F++TON`8ELPJU8iPJBv9eo=9JVrd1q zCz+F4lA5AtZfaqQT~T~mW?p7|Vo_0IWqfL0Nl_(3T2W$dYJ5s*Zf+$*d^{2_J~J<~ z1XU^Wa5bnm1$L}kkfX0_ysMu}d^|&ZJjm%VHi`i$4Dl|JevZDL&Y-(>5Jnf5Bo>u0 z#K*h)g~q#j#6wK;a0z0FclYska`cJ!cXJDN4T%qNbn<Zp*#N#=C%L#3>=leo8R)7V z2M5^YI-rYmpqKQZ3PO8(kbYxMW)i&T81EV48;=O|5MO6dkcT8D<)k9_U=iI!lrAu$ zXAD;W?kpmliP~d@Is+7z3`m{-_|%ldl0=OAh7evbVSrpYgb)Gw6w&`hwH-QWfz%5| z88ATWEJM5E7`GUq+6BHP2~`NC#}4jiGl0o>P;Wav9^@s+?MJWy7Ld0=Zi9sh+|_6U zDh%=QC|4)N$EOtM$7dwwrR1c-I^Up?l46E<PyhJhl9bH6_|oFk6qr2-b3xZQp*kAs zO;CCQC0C4IKgfNl#n7vrP_-hDU%;)12aT3M;ygY+skj*GV{jOQ{L26ye}jYzm=6s# zxB=j73>y%FSOHcC8P<vSDvJ+-76{HciN(dB!6?K~5m+V4&=Bf9RtOK6Ljw+BZ+v`+ zuQMzkgK`0^;6cd)V2?nu4J185*hnK&py52Eu`#59D2P(zK_>>i;>z5T#3Tm2;*uf= zodIKI=9Q!t6)@=K<(H)DIXZdjmL#S_dFgqjdP$|3IVrlCDGYibUPfYZ27_KoWnOV* zE`%;Ag2<Gm78Pga=b>=oix~8ZQgaeP8lbF#oDv2-a0<{X$SKiF&o5!nD@m;=VbBAW zm<)PF`JnX6pqH8fEh95hiV!@AR!Ct9(E(#;B^QC+lbD;C%m6YLWITf&#IU5|Vg|kB z{9MrB7K2_&YEo%>d}2{zUV3UVjGLL4mJeemCM6Z6mce*AnR%%&c5w-80Vb@XA(IC6 zt3h2pSicQ6P6b+s3o=p$L?B_1S|l!mGHA^_xbF-Rg^g#y?)3wmdJK_)kg)n2!ed}C zMAHu&_bP!p2((WOrWQn_>j(Aozy1FY>Mnq!;p1a7p!#9%hwYDnwFkh885kJ+pnGAU z%HiW^JD>szP!EIl(}0*T{jhy2pnVXay)sbc@bR`AAVE<717;DF2AKh6f~hzL2GEI< zaQDN;<+7k2h1mmhKg=E&oz1|&0NOhP<HN@9I-vStqYCKm2V2g-zyKQe04as(hmG@{ z00}ZMfJUUiN@4b+`yX^G7)YrTSQTRb&jXMk0|NtWzYs`2$S>&nK}$VBVFGd=$OzcD z;RTQeq<v5zIS_^#3u1zCCwM#ux(x(mA9Q^215`hFZ!cISgaBRH0b;@EDQNm(<B$uW z4uZKCqz8o2`E$|q!}=8)p!z3)2B<(9p%`W_l*_OfO+Rd0)5R2`f)hf)Np%0OgzAUI zA8h<H0IGi@TqlHqt{)^13V)b>*gcxC`!zv(b|E?;B)WdkS>4F`VdJS2%pvMapy2@F z!FC$Kcnl0D85kJ&K>LKCLa^~D0ni1Lpp73;aTtXj{#O|o82FL&!^USNh}8cO8h+61 z3LnQ+AX5J`=oTcHe%N>~>^@Z3y{E8XfVm%*4rZX)4;vT$VGr>!Og)5$2tSxOXxkAe z{9*RP$B&^IAG){%rX9M|3t`R=H2Y!W5*bkaFn7WXfY}S<|AWR6%zjwEt^%sx0;Uj3 zqw5Eq&<Aoq=xhb35-<hR4_fgB7Jw2UwIC*p2JLBwu|eW6yasB20!#o(qpJlienuAq zDdlklkqitI(E<QnEojFXx)@03T<H4Wsj!R%5`=~|lnJIx!Q-l6CJJE`0^!=j5)OpR zfNqx~R6lz76-GfcY=A`!gbUXXGY52UDw-0oO8<N?#Q@s#4`D$_m_7)P0c;+c7r{~* tpo)!wfx!SY(9ggCZYO|>Bv|}|>H?5LQ2B<<{)jA)ECa)Lv;qg+egMVInppq< literal 0 HcmV?d00001 diff --git a/tests/floodit_h6 b/tests/floodit_h6 new file mode 100755 index 0000000000000000000000000000000000000000..5c679dea1db91e3e11db8bdd54099df9f8c4dc17 GIT binary patch literal 31160 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 Zbpc2rsC>g_e?b;VmVx0rT7iRZKLE@Om~j9A literal 0 HcmV?d00001 diff --git a/tests/runTests.sh b/tests/runTests.sh index 039e32a..2944336 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -47,9 +47,13 @@ do T_soma_total=$(($T_gasto + $T_soma_total)) ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out + ./floodit_h4 < "/tmp/${semente}.in" > /tmp/h4.out + ./floodit_h6 < "/tmp/${semente}.in" > /tmp/h6.out RESP=$(cat /tmp/resp.out | head -n1) H1=$(cat /tmp/h1.out | tail -n2 | head -n1) H2=$(cat /tmp/h2.out | tail -n2 | head -n1) + H4=$(cat /tmp/h4.out | tail -n2 | head -n1) + H6=$(cat /tmp/h6.out | tail -n2 | head -n1) if [ $RESP -gt $H1 ]; then echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n" echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt @@ -58,6 +62,14 @@ do echo -ne "${RED}Heurística h2 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H2} e nós em ${RESP}${NC}\n" echo "${i} ${i} ${cor} ${semente} (h2: ${H2})" >> tabuleiros.txt fi + if [ $RESP -gt $H4 ]; then + echo -ne "${RED}Heurística h4 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H4} e nós em ${RESP}${NC}\n" + echo "${i} ${i} ${cor} ${semente} (h4: ${H4})" >> tabuleiros.txt + fi + if [ $RESP -gt $H6 ]; then + echo -ne "${RED}Heurística h6 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H6} e nós em ${RESP}${NC}\n" + echo "${i} ${i} ${cor} ${semente} (h6: ${H6})" >> tabuleiros.txt + fi # tempo em segundos S=$(($T_gasto/1000000000)) # tempo em milisegundos @@ -74,6 +86,8 @@ do rm "/tmp/resp.out" rm "/tmp/h1.out" rm "/tmp/h2.out" + rm "/tmp/h4.out" + rm "/tmp/h6.out" done T_medio_cor=$(($T_soma_cor/${N_TESTES})) S_medio_cor=$(($T_medio_cor/1000000000)) -- GitLab From 0eda296787ffc44a5867aeb0a01542640e46bd10 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Fri, 9 Jun 2017 01:59:43 -0300 Subject: [PATCH 12/20] Muda os testes (de novo) --- .gitlab-ci.yml | 73 +++++++++++++++++++++++++++++++++++++++++++++-- Makefile | 6 ---- tests/runTests.sh | 58 ++++++++++++++++++------------------- 3 files changed, 98 insertions(+), 39 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dffaf75..e73fae9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,11 +6,78 @@ before_script: - apt-get -y install build-essential make autoconf gcc gnuplot - make -test: +h1: stage: test - script: - - make test + script: - cd tests + - gcc -std=c99 -o test geraMapa.c + - chmod +x runTests.sh + - ./runTests.sh -h "./floodit_h1" + - gnuplot "tempos.plot" + - gnuplot "medias.plot" + - gnuplot "piores.plot" + artifacts: + paths: + - tests/tabuleiros.txt + - tests/tempos.txt + - tests/medias.txt + - tests/piores.txt + - tests/tempos.png + - tests/medias.png + - tests/piores.png + tags: + - ubuntu +h2: + stage: test + script: + - cd tests + - gcc -std=c99 -o test geraMapa.c + - chmod +x runTests.sh + - ./runTests.sh -h "./floodit_h2" + - gnuplot "tempos.plot" + - gnuplot "medias.plot" + - gnuplot "piores.plot" + artifacts: + paths: + - tests/tabuleiros.txt + - tests/tempos.txt + - tests/medias.txt + - tests/piores.txt + - tests/tempos.png + - tests/medias.png + - tests/piores.png + tags: + - ubuntu + +h4: + stage: test + script: + - cd tests + - gcc -std=c99 -o test geraMapa.c + - chmod +x runTests.sh + - ./runTests.sh -h "./floodit_h4" + - gnuplot "tempos.plot" + - gnuplot "medias.plot" + - gnuplot "piores.plot" + artifacts: + paths: + - tests/tabuleiros.txt + - tests/tempos.txt + - tests/medias.txt + - tests/piores.txt + - tests/tempos.png + - tests/medias.png + - tests/piores.png + tags: + - ubuntu + +h6: + stage: test + script: + - cd tests + - gcc -std=c99 -o test geraMapa.c + - chmod +x runTests.sh + - ./runTests.sh -h "./floodit_h6" - gnuplot "tempos.plot" - gnuplot "medias.plot" - gnuplot "piores.plot" diff --git a/Makefile b/Makefile index 1f81904..6871ea6 100644 --- a/Makefile +++ b/Makefile @@ -4,12 +4,6 @@ CFLAGS = -std=c99 -O2 -W -Wall -g all: main -test: main - cd tests; \ - $(CC) -std=c99 -o test geraMapa.c; \ - chmod +x runTests.sh; \ - ./runTests.sh - main: main.c libs/jogador.o libs/tabuleiro.o libs/grafo.o libs/vertice.o libs/filha.o libs/lista.o libs/no.o $(CC) $(CFLAGS) -o $@ $^ -lm diff --git a/tests/runTests.sh b/tests/runTests.sh index 2944336..bc517cd 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -1,10 +1,29 @@ #!/bin/bash +OPTIND=1 +MAIN="../main" +HEUR="./floodit_h6" + +while getopts ":m:h:" opt; do + case "$opt" in + m) MAIN=$OPTARG + ;; + h) HEUR=$OPTARG + ;; + esac +done + +shift $((OPTIND-1)) +[ "$1" = "--" ] && shift + +echo $MAIN +echo $HEUR + # tempo máximo para executar, em milisegundos tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(3 4 8 16 32 64 100) +tams=(32 64 100) # lista de cores cores=(2 3 4 6 8 10) @@ -41,34 +60,16 @@ do # echo "Usando semente: ${semente}" ./test $i $i $cor $semente T_inicial=$(date +%s%N) - ../main < "/tmp/${semente}.in" > /tmp/resp.out + eval $MAIN < "/tmp/${semente}.in" > /tmp/resp.out T_gasto=$(($(date +%s%N) - $T_inicial)) T_soma_cor=$(($T_gasto + $T_soma_cor)) T_soma_total=$(($T_gasto + $T_soma_total)) - ./floodit_h1 < "/tmp/${semente}.in" > /tmp/h1.out - ./floodit_h2 < "/tmp/${semente}.in" > /tmp/h2.out - ./floodit_h4 < "/tmp/${semente}.in" > /tmp/h4.out - ./floodit_h6 < "/tmp/${semente}.in" > /tmp/h6.out - RESP=$(cat /tmp/resp.out | head -n1) - H1=$(cat /tmp/h1.out | tail -n2 | head -n1) - H2=$(cat /tmp/h2.out | tail -n2 | head -n1) - H4=$(cat /tmp/h4.out | tail -n2 | head -n1) - H6=$(cat /tmp/h6.out | tail -n2 | head -n1) - if [ $RESP -gt $H1 ]; then - echo -ne "${RED}Heurística h1 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H1} e nós em ${RESP}${NC}\n" - echo "${i} ${i} ${cor} ${semente} (h1: ${H1})" >> tabuleiros.txt - fi - if [ $RESP -gt $H2 ]; then - echo -ne "${RED}Heurística h2 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H2} e nós em ${RESP}${NC}\n" - echo "${i} ${i} ${cor} ${semente} (h2: ${H2})" >> tabuleiros.txt - fi - if [ $RESP -gt $H4 ]; then - echo -ne "${RED}Heurística h4 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H4} e nós em ${RESP}${NC}\n" - echo "${i} ${i} ${cor} ${semente} (h4: ${H4})" >> tabuleiros.txt - fi - if [ $RESP -gt $H6 ]; then - echo -ne "${RED}Heurística h6 fez tabuleiro ${i} ${i} ${cor} ${semente} em ${H6} e nós em ${RESP}${NC}\n" - echo "${i} ${i} ${cor} ${semente} (h6: ${H6})" >> tabuleiros.txt + eval $HEUR < "/tmp/${semente}.in" > /tmp/heur.out + RESP=$(cat /tmp/resp.out | tail -n2 | head -n1) + HRESP=$(cat /tmp/heur.out | tail -n2 | head -n1) + if [ $RESP -gt $HRESP ]; then + echo -ne "${RED}Heurística ${HEUR} fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n" + echo "${i} ${i} ${cor} ${semente} (${H1})" >> tabuleiros.txt fi # tempo em segundos S=$(($T_gasto/1000000000)) @@ -84,10 +85,7 @@ do # fi rm "/tmp/${semente}.in" rm "/tmp/resp.out" - rm "/tmp/h1.out" - rm "/tmp/h2.out" - rm "/tmp/h4.out" - rm "/tmp/h6.out" + rm "/tmp/heur.out" done T_medio_cor=$(($T_soma_cor/${N_TESTES})) S_medio_cor=$(($T_medio_cor/1000000000)) -- GitLab From fdd9484354cc952a6b2ff2fdbe343b329a5e5b99 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Fri, 9 Jun 2017 13:20:37 -0300 Subject: [PATCH 13/20] Tentando deixar melhor Harder Better Faster Stronger --- .gitlab-ci.yml | 16 ++++++++-------- libs/jogador.c | 8 +++++--- tests/runTests.sh | 39 ++++++++++++++++++++++----------------- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e73fae9..d1af058 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,7 +8,7 @@ before_script: h1: stage: test - script: + script: - cd tests - gcc -std=c99 -o test geraMapa.c - chmod +x runTests.sh @@ -18,7 +18,7 @@ h1: - gnuplot "piores.plot" artifacts: paths: - - tests/tabuleiros.txt + - tests/tabuleiros*.txt - tests/tempos.txt - tests/medias.txt - tests/piores.txt @@ -29,7 +29,7 @@ h1: - ubuntu h2: stage: test - script: + script: - cd tests - gcc -std=c99 -o test geraMapa.c - chmod +x runTests.sh @@ -39,7 +39,7 @@ h2: - gnuplot "piores.plot" artifacts: paths: - - tests/tabuleiros.txt + - tests/tabuleiros*.txt - tests/tempos.txt - tests/medias.txt - tests/piores.txt @@ -51,7 +51,7 @@ h2: h4: stage: test - script: + script: - cd tests - gcc -std=c99 -o test geraMapa.c - chmod +x runTests.sh @@ -61,7 +61,7 @@ h4: - gnuplot "piores.plot" artifacts: paths: - - tests/tabuleiros.txt + - tests/tabuleiros*.txt - tests/tempos.txt - tests/medias.txt - tests/piores.txt @@ -73,7 +73,7 @@ h4: h6: stage: test - script: + script: - cd tests - gcc -std=c99 -o test geraMapa.c - chmod +x runTests.sh @@ -83,7 +83,7 @@ h6: - gnuplot "piores.plot" artifacts: paths: - - tests/tabuleiros.txt + - tests/tabuleiros*.txt - tests/tempos.txt - tests/medias.txt - tests/piores.txt diff --git a/libs/jogador.c b/libs/jogador.c index ee8d15d..d92e656 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -11,13 +11,13 @@ Lista Joga(Grafo g, Lista grupo){ int counter = 1; double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores; double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2); + if (min < 1) min = 1; while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) { // Calcula a altura int altura = calculaAltura(g, grupo); int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos))); - // if(min <= 5) profundidade=altura; Lista filhos = filhosGrupo(grupo); @@ -160,12 +160,13 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) { for(No o = primeiroNoLista(g->vertices); o; o = getSucessorNo(o)) { Vertice x = (Vertice) getConteudo(o); if(x->grupo) continue; + if(x->altura < w->altura) continue; if(x->cor == w->cor) { somaCor += x->peso; } } if(w->peso == somaCor) { - w->bonus += 150; + v->bonus += 150; } } destroiLista(vFilhos, NULL); @@ -200,7 +201,7 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) { // for igual ao peso do vértice agrupado, esta é a // última jogada com aquela cor if(v->peso == somaCor) { - v->bonus += 250; // Mais bonus para que essa cor seja a escolhida + v->bonus += 350; // Mais bonus para que essa cor seja a escolhida } } @@ -215,6 +216,7 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) { Vertice filho = (Vertice) getConteudo(n); if((filho->altura > v->altura)) { int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1); + Lista fFilhos = agrupaCores(filho->filhos); bonus += preBonus; } } diff --git a/tests/runTests.sh b/tests/runTests.sh index bc517cd..02fa15e 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -23,7 +23,7 @@ echo $HEUR tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(32 64 100) +tams=(3 4 8 16) # lista de cores cores=(2 3 4 6 8 10) @@ -35,7 +35,9 @@ BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # Sem cor -echo -ne "" > tabuleiros.txt +TABULEIROS="tabuleiros_$(basename ${HEUR}).txt" + +echo -ne "" > $TABULEIROS echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > tempos.txt echo -ne "#Tam tabuleiro\t#Tempo médio\n" > medias.txt echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > piores.txt @@ -57,20 +59,26 @@ do printf "%03d" $(($T_max_cor/1000000%1000)) echo -ne ")"\\r semente=$RANDOM - # echo "Usando semente: ${semente}" ./test $i $i $cor $semente + T_inicial=$(date +%s%N) - eval $MAIN < "/tmp/${semente}.in" > /tmp/resp.out + + eval $MAIN < "/tmp/${semente}.in" > "/tmp/resp${semente}.out" + T_gasto=$(($(date +%s%N) - $T_inicial)) T_soma_cor=$(($T_gasto + $T_soma_cor)) T_soma_total=$(($T_gasto + $T_soma_total)) - eval $HEUR < "/tmp/${semente}.in" > /tmp/heur.out - RESP=$(cat /tmp/resp.out | tail -n2 | head -n1) - HRESP=$(cat /tmp/heur.out | tail -n2 | head -n1) + + eval $HEUR < "/tmp/${semente}.in" > "/tmp/heur${semente}.out" + + RESP=$(cat "/tmp/resp${semente}.out" | tail -n2 | head -n1) + HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1) + if [ $RESP -gt $HRESP ]; then - echo -ne "${RED}Heurística ${HEUR} fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n" - echo "${i} ${i} ${cor} ${semente} (${H1})" >> tabuleiros.txt + echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n" + echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS} fi + # tempo em segundos S=$(($T_gasto/1000000000)) # tempo em milisegundos @@ -79,13 +87,10 @@ do if [ $T_max_cor -lt $T_gasto ]; then T_max_cor=$T_gasto fi - # if (($M>$tempo_max)); then - # echo -e "\n${RED}Tabuleiro ${i} ${i} ${cor} ${semente} levou mais de ${tempo_max} milisegundos: ${S}.${M}s${NC}" - # echo "${i} ${i} ${cor} ${semente}" >> tabuleiros.txt - # fi + rm "/tmp/${semente}.in" - rm "/tmp/resp.out" - rm "/tmp/heur.out" + rm "/tmp/resp${semente}.out" + rm "/tmp/heur${semente}.out" done T_medio_cor=$(($T_soma_cor/${N_TESTES})) S_medio_cor=$(($T_medio_cor/1000000000)) @@ -105,10 +110,10 @@ do echo -e "${i}\t${M_medio_total}" >> medias.txt done -fs=$(cat tabuleiros.txt | wc -l) +fs=$(cat "${TABULEIROS}" | wc -l) if [ ${fs} -gt "1" ]; then echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}" - cat tabuleiros.txt + cat ${TABULEIROS} exit 1 else echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}" -- GitLab From 739bf3de3506d382bdacbdc3cc28e26ee86c1c4d Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Fri, 9 Jun 2017 22:06:16 -0300 Subject: [PATCH 14/20] =?UTF-8?q?Muda=20o=20status=20da=20sa=C3=ADda=20do?= =?UTF-8?q?=20arquivo=20de=20teste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/runTests.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/runTests.sh b/tests/runTests.sh index 02fa15e..6da7fb7 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -114,8 +114,6 @@ fs=$(cat "${TABULEIROS}" | wc -l) if [ ${fs} -gt "1" ]; then echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}" cat ${TABULEIROS} - exit 1 else echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}" - exit 0 fi -- GitLab From 347c044bcc15a3fb4fa11eb3d0dc52d30815576b Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Mon, 12 Jun 2017 10:27:08 -0300 Subject: [PATCH 15/20] =?UTF-8?q?Modifica=20raz=C3=A3o=20da=20profundidade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/jogador.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index d92e656..91ed395 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -17,7 +17,7 @@ Lista Joga(Grafo g, Lista grupo){ int altura = calculaAltura(g, grupo); int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); - int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * (altura/sqrt(naoConsumidos))); + int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * 1); //(altura/sqrt(naoConsumidos))); Lista filhos = filhosGrupo(grupo); @@ -44,6 +44,10 @@ Lista Joga(Grafo g, Lista grupo){ } else if((v->bonus) == (maior->bonus)) { if(v->peso > maior->peso) { maior = v; + } else if(v->peso == maior->peso) { + if(v->cor < maior->cor) { + maior = v; + } } } } @@ -146,7 +150,7 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) { Vertice filho = (Vertice) getConteudo(m); if((filho->altura > v->altura)) { int bonus = filho->peso + calculaBonusRec(filho, v, g, profundidade); - if(corEstaNaLista(grupo, filho->cor)) bonus += 100; + if(corEstaNaLista(grupo, filho->cor)) bonus += 50; v->bonus += bonus; } } @@ -169,7 +173,7 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) { v->bonus += 150; } } - destroiLista(vFilhos, NULL); + destroiLista(vFilhos, destroiVertice); int menorDistancia = v->altura; for(No m = primeiroNoLista(g->vertices); m; m = getSucessorNo(m)) { @@ -180,7 +184,6 @@ void calculaBonus(Lista grupo, Grafo g, int profundidade) { if((w->altura < menorDistancia) || (menorDistancia == v->altura)) menorDistancia = w->altura; } } - v->bonus += (menorDistancia - v->altura)^2; for(No m = primeiroNoLista(v->pais); m; m = getSucessorNo(m)) { Vertice pai = (Vertice) getConteudo(m); @@ -216,7 +219,6 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) { Vertice filho = (Vertice) getConteudo(n); if((filho->altura > v->altura)) { int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1); - Lista fFilhos = agrupaCores(filho->filhos); bonus += preBonus; } } -- GitLab From 7f10cb8dc05e6d9c027ed2b1f02b7d80c0bfd28f Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Mon, 12 Jun 2017 12:01:33 -0300 Subject: [PATCH 16/20] =?UTF-8?q?Algumas=20mudan=C3=A7as=20na=20profundida?= =?UTF-8?q?de?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/jogador.c | 4 +++- tests/runTests.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index 91ed395..3f86f45 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -17,7 +17,9 @@ Lista Joga(Grafo g, Lista grupo){ int altura = calculaAltura(g, grupo); int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); - int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * 1); //(altura/sqrt(naoConsumidos))); + double razao = (altura/sqrt(naoConsumidos)); + int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao); + if(profundidade < 1) profundidade = 1; Lista filhos = filhosGrupo(grupo); diff --git a/tests/runTests.sh b/tests/runTests.sh index 6da7fb7..42978d0 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -23,7 +23,7 @@ echo $HEUR tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(3 4 8 16) +tams=(8 16 32) # lista de cores cores=(2 3 4 6 8 10) -- GitLab From bbdd9248f68bd298435be12869c2c870b91d0660 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sun, 18 Jun 2017 01:44:35 -0300 Subject: [PATCH 17/20] =?UTF-8?q?Muda=20testes,=20arruma=20aloca=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/jogador.c | 1 - tests/runTests.sh | 23 +++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index d92e656..8cce92d 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -216,7 +216,6 @@ int calculaBonusRec(Vertice v, Vertice pai, Grafo g, int profundidade) { Vertice filho = (Vertice) getConteudo(n); if((filho->altura > v->altura)) { int preBonus = filho->peso + calculaBonusRec(filho, v, g, profundidade-1); - Lista fFilhos = agrupaCores(filho->filhos); bonus += preBonus; } } diff --git a/tests/runTests.sh b/tests/runTests.sh index 6da7fb7..2b09c06 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -23,10 +23,10 @@ echo $HEUR tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(3 4 8 16) +tams=(4 8 16 32) # lista de cores -cores=(2 3 4 6 8 10) +cores=(4 8 10) #-- Cores do terminal RED='\033[0;31m' @@ -52,12 +52,15 @@ do echo "Número de cores: ${cor}" T_soma_cor=0 T_max_cor=0 - N_TESTES=500 + N_TESTES=100 + VIT=0 + EMP=0 + DER=0 for j in $(seq 1 ${N_TESTES}) do echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))." printf "%03d" $(($T_max_cor/1000000%1000)) - echo -ne ")"\\r + echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r semente=$RANDOM ./test $i $i $cor $semente @@ -75,10 +78,18 @@ do HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1) if [ $RESP -gt $HRESP ]; then - echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n" + #echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n" echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS} + DER=$(($DER + 1)) + fi + if [ $RESP -eq $HRESP ]; then + #echo -ne "${BLUE}Empatamos com $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP}${NC}\n" + EMP=$(($EMP + 1)) + fi + if [ $RESP -lt $HRESP ]; then + #echo -ne "${GREEN}Ganhamos de $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} com ${RESP}${NC}\n" + VIT=$(($VIT + 1)) fi - # tempo em segundos S=$(($T_gasto/1000000000)) # tempo em milisegundos -- GitLab From 9a9172edbcc1221d6bb856f58eaaf37bb03785e5 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sun, 18 Jun 2017 12:50:26 -0300 Subject: [PATCH 18/20] =?UTF-8?q?Add=20passo=20para=20verificar=20a=20sa?= =?UTF-8?q?=C3=ADda?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 11 +++-------- tests/runTests.sh | 16 +++++++++------- tests/verifica | Bin 0 -> 31040 bytes 3 files changed, 12 insertions(+), 15 deletions(-) create mode 100755 tests/verifica diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d1af058..780ad00 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,13 +5,14 @@ before_script: - apt-get update - apt-get -y install build-essential make autoconf gcc gnuplot - make + - chmod +x tests/runTests.sh + - chmod +x tests/verifica + - gcc -std=c99 -o tests/test tests/geraMapa.c h1: stage: test script: - cd tests - - gcc -std=c99 -o test geraMapa.c - - chmod +x runTests.sh - ./runTests.sh -h "./floodit_h1" - gnuplot "tempos.plot" - gnuplot "medias.plot" @@ -31,8 +32,6 @@ h2: stage: test script: - cd tests - - gcc -std=c99 -o test geraMapa.c - - chmod +x runTests.sh - ./runTests.sh -h "./floodit_h2" - gnuplot "tempos.plot" - gnuplot "medias.plot" @@ -53,8 +52,6 @@ h4: stage: test script: - cd tests - - gcc -std=c99 -o test geraMapa.c - - chmod +x runTests.sh - ./runTests.sh -h "./floodit_h4" - gnuplot "tempos.plot" - gnuplot "medias.plot" @@ -75,8 +72,6 @@ h6: stage: test script: - cd tests - - gcc -std=c99 -o test geraMapa.c - - chmod +x runTests.sh - ./runTests.sh -h "./floodit_h6" - gnuplot "tempos.plot" - gnuplot "medias.plot" diff --git a/tests/runTests.sh b/tests/runTests.sh index 2b09c06..25207fc 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -23,7 +23,7 @@ echo $HEUR tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(4 8 16 32) +tams=(64 100) # lista de cores cores=(4 8 10) @@ -58,9 +58,6 @@ do DER=0 for j in $(seq 1 ${N_TESTES}) do - echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))." - printf "%03d" $(($T_max_cor/1000000%1000)) - echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r semente=$RANDOM ./test $i $i $cor $semente @@ -78,16 +75,17 @@ do HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1) if [ $RESP -gt $HRESP ]; then - #echo -ne "${RED}Heurística $(basename ${HEUR}) fez tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP} e nós em ${RESP}${NC}\n" echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS} DER=$(($DER + 1)) fi if [ $RESP -eq $HRESP ]; then - #echo -ne "${BLUE}Empatamos com $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} em ${HRESP}${NC}\n" EMP=$(($EMP + 1)) fi if [ $RESP -lt $HRESP ]; then - #echo -ne "${GREEN}Ganhamos de $(basename ${HEUR}) no tabuleiro ${i} ${i} ${cor} ${semente} com ${RESP}${NC}\n" + VALIDO=$(cat "/tmp/${semente}.in" "/tmp/resp${semente}.out" | ./verifica) + if [[ $VALIDO -eq 1 ]]; then + echo -ne "${RED}Nossa resposta para ${i} ${i} ${cor} ${semente} não é válida!!!${NC}\n\n" + fi VIT=$(($VIT + 1)) fi # tempo em segundos @@ -102,6 +100,10 @@ do rm "/tmp/${semente}.in" rm "/tmp/resp${semente}.out" rm "/tmp/heur${semente}.out" + + echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))." + printf "%03d" $(($T_max_cor/1000000%1000)) + echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r done T_medio_cor=$(($T_soma_cor/${N_TESTES})) S_medio_cor=$(($T_medio_cor/1000000000)) diff --git a/tests/verifica b/tests/verifica new file mode 100755 index 0000000000000000000000000000000000000000..2e7509c77c7151258a56cf66fccd53a4b67ce349 GIT binary patch literal 31040 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 literal 0 HcmV?d00001 -- GitLab From 5b5fe6c3ab8d9f41a85a407f70fe52565faeeb92 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sun, 18 Jun 2017 13:34:21 -0300 Subject: [PATCH 19/20] Deixa altura da busca fixa --- .gitlab-ci.yml | 58 ++++++++++++++++- libs/jogador.c | 15 +++-- tests/runTests.sh | 4 +- tests/runTests.sh.example | 132 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 9 deletions(-) create mode 100644 tests/runTests.sh.example diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 780ad00..da90b69 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ before_script: - apt-get update - apt-get -y install build-essential make autoconf gcc gnuplot - make + - mv tests/runTests.sh.example tests/runTests.sh - chmod +x tests/runTests.sh - chmod +x tests/verifica - gcc -std=c99 -o tests/test tests/geraMapa.c @@ -13,6 +14,8 @@ h1: stage: test script: - cd tests + - sed -i -e 's/tams=()/tams=(4 8 16 32 64)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(3 4 6 8 10)/g' runTests.sh - ./runTests.sh -h "./floodit_h1" - gnuplot "tempos.plot" - gnuplot "medias.plot" @@ -32,6 +35,8 @@ h2: stage: test script: - cd tests + - sed -i -e 's/tams=()/tams=(4 8 16 32 64)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(3 4 6 8 10)/g' runTests.sh - ./runTests.sh -h "./floodit_h2" - gnuplot "tempos.plot" - gnuplot "medias.plot" @@ -47,11 +52,35 @@ h2: - tests/piores.png tags: - ubuntu +h4-min: + stage: test + script: + - cd tests + - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh + - ./runTests.sh -h "./floodit_h4" + - gnuplot "tempos.plot" + - gnuplot "medias.plot" + - gnuplot "piores.plot" + artifacts: + paths: + - tests/tabuleiros*.txt + - tests/tempos.txt + - tests/medias.txt + - tests/piores.txt + - tests/tempos.png + - tests/medias.png + - tests/piores.png + tags: + - ubuntu -h4: +h4-max: stage: test script: - cd tests + - sed -i -e 's/tams=()/tams=(100)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(10)/g' runTests.sh + - sed -i -e 's/N_TESTES=100/N_TESTES=50/g' runTests.sh - ./runTests.sh -h "./floodit_h4" - gnuplot "tempos.plot" - gnuplot "medias.plot" @@ -68,10 +97,35 @@ h4: tags: - ubuntu -h6: +h6-min: + stage: test + script: + - cd tests + - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh + - ./runTests.sh -h "./floodit_h6" + - gnuplot "tempos.plot" + - gnuplot "medias.plot" + - gnuplot "piores.plot" + artifacts: + paths: + - tests/tabuleiros*.txt + - tests/tempos.txt + - tests/medias.txt + - tests/piores.txt + - tests/tempos.png + - tests/medias.png + - tests/piores.png + tags: + - ubuntu + +h6-max: stage: test script: - cd tests + - sed -i -e 's/tams=()/tams=(100)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(10)/g' runTests.sh + - sed -i -e 's/N_TESTES=100/N_TESTES=50/g' runTests.sh - ./runTests.sh -h "./floodit_h6" - gnuplot "tempos.plot" - gnuplot "medias.plot" diff --git a/libs/jogador.c b/libs/jogador.c index 3f86f45..a0a2e1c 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -12,14 +12,19 @@ Lista Joga(Grafo g, Lista grupo){ double max = 2*(g->x) + (sqrt(2*g->cores))*(g->x) + g->cores; double min = (sqrt(g->cores - 1)*g->x/2) - (g->cores/2); if (min < 1) min = 1; + int altura = calculaAltura(g, grupo); + int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); + double razao = (altura/sqrt(naoConsumidos)); + int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao); + if(profundidade < 1) profundidade = 1; while(tamanhoLista(grupo) < tamanhoLista(g->vertices)) { // Calcula a altura - int altura = calculaAltura(g, grupo); + altura = calculaAltura(g, grupo); - int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); - double razao = (altura/sqrt(naoConsumidos)); - int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao); - if(profundidade < 1) profundidade = 1; + // int naoConsumidos = tamanhoLista(g->vertices) - tamanhoLista(grupo); + // double razao = (altura/sqrt(naoConsumidos))*1.5; + // int profundidade = (sqrt(max) * (sqrt(altura) / sqrt(min)) * razao); + // if(profundidade < 1) profundidade = 1; Lista filhos = filhosGrupo(grupo); diff --git a/tests/runTests.sh b/tests/runTests.sh index 25207fc..f6e39d9 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -23,10 +23,10 @@ echo $HEUR tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(64 100) +tams=(100) # lista de cores -cores=(4 8 10) +cores=(10) #-- Cores do terminal RED='\033[0;31m' diff --git a/tests/runTests.sh.example b/tests/runTests.sh.example new file mode 100644 index 0000000..60455b6 --- /dev/null +++ b/tests/runTests.sh.example @@ -0,0 +1,132 @@ +#!/bin/bash + +OPTIND=1 +MAIN="../main" +HEUR="./floodit_h6" + +while getopts ":m:h:" opt; do + case "$opt" in + m) MAIN=$OPTARG + ;; + h) HEUR=$OPTARG + ;; + esac +done + +shift $((OPTIND-1)) +[ "$1" = "--" ] && shift + +echo $MAIN +echo $HEUR + +# tempo máximo para executar, em milisegundos +tempo_max=120000 #120s + +# tamanhos do tabuleiro +tams=() + +# lista de cores +cores=() + +#-- Cores do terminal +RED='\033[0;31m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' # Sem cor + +TABULEIROS="tabuleiros_$(basename ${HEUR}).txt" + +echo -ne "" > $TABULEIROS +echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > tempos.txt +echo -ne "#Tam tabuleiro\t#Tempo médio\n" > medias.txt +echo -ne "#Tam tabuleiro\t#N cores\t#Tempo médio\n" > piores.txt + +echo "Iniciado testes" +for i in ${tams[*]} +do + echo "Tamanho do tabuleiro: ${i}" + T_soma_total=0 + for cor in ${cores[*]} + do + echo "Número de cores: ${cor}" + T_soma_cor=0 + T_max_cor=0 + N_TESTES=100 + VIT=0 + EMP=0 + DER=0 + for j in $(seq 1 ${N_TESTES}) + do + semente=$RANDOM + ./test $i $i $cor $semente + + T_inicial=$(date +%s%N) + + eval $MAIN < "/tmp/${semente}.in" > "/tmp/resp${semente}.out" + + T_gasto=$(($(date +%s%N) - $T_inicial)) + T_soma_cor=$(($T_gasto + $T_soma_cor)) + T_soma_total=$(($T_gasto + $T_soma_total)) + + eval $HEUR < "/tmp/${semente}.in" > "/tmp/heur${semente}.out" + + RESP=$(cat "/tmp/resp${semente}.out" | tail -n2 | head -n1) + HRESP=$(cat "/tmp/heur${semente}.out" | tail -n2 | head -n1) + + if [ $RESP -gt $HRESP ]; then + echo "${i} ${i} ${cor} ${semente} (${HRESP})" >> ${TABULEIROS} + DER=$(($DER + 1)) + fi + if [ $RESP -eq $HRESP ]; then + EMP=$(($EMP + 1)) + fi + if [ $RESP -lt $HRESP ]; then + VALIDO=$(cat "/tmp/${semente}.in" "/tmp/resp${semente}.out" | ./verifica) + if [[ $VALIDO -eq 1 ]]; then + echo -ne "${RED}Nossa resposta para ${i} ${i} ${cor} ${semente} não é válida!!!${NC}\n\n" + fi + VIT=$(($VIT + 1)) + fi + # tempo em segundos + S=$(($T_gasto/1000000000)) + # tempo em milisegundos + M=$(($T_gasto/1000000)) + # tempo máximo por cor + if [ $T_max_cor -lt $T_gasto ]; then + T_max_cor=$T_gasto + fi + + rm "/tmp/${semente}.in" + rm "/tmp/resp${semente}.out" + rm "/tmp/heur${semente}.out" + + echo -ne "Tabuleiro ${i}x${i} com ${cor} cores: (${j}/${N_TESTES}) (T max: $(($T_max_cor/1000000000))." + printf "%03d" $(($T_max_cor/1000000%1000)) + echo -ne ") (${GREEN}${VIT}${NC}/${BLUE}${EMP}${NC}/${RED}${DER}${NC})"\\r + done + T_medio_cor=$(($T_soma_cor/${N_TESTES})) + S_medio_cor=$(($T_medio_cor/1000000000)) + M_medio_cor=$(($T_medio_cor/1000000)) + echo -ne "\n${CYAN}Tempo médio com ${cor} cores: ${S_medio_cor}." + printf "%03d" $((${M_medio_cor}%1000)) + echo -e "s (${T_medio_cor})${NC}\n" + echo -e "${i}\t${cor}\t${M_medio_cor}" >> tempos.txt + echo -e "${i}\t${cor}\t$(($T_max_cor/1000000))" >> piores.txt + done + T_medio_total=$(( $T_soma_total/(${N_TESTES} * ${#cores[*]}) )) + S_medio_total=$(($T_medio_total/1000000000)) + M_medio_total=$(($T_medio_total/1000000)) + echo -ne "${BLUE}Tempo médio com tamanho ${i}: ${S_medio_total}." + printf "%03d" $((${M_medio_total}%1000)) + echo -e "s (${T_medio_total})${NC}\n" + echo -e "${i}\t${M_medio_total}" >> medias.txt +done + +fs=$(cat "${TABULEIROS}" | wc -l) +if [ ${fs} -gt "1" ]; then + echo -e "${RED}${fs} tabuleiro(s) perdeu(perderam) para outras heurísticas${NC}" + cat ${TABULEIROS} +else + echo -e "${GREEN}Nenhum tabuleiro perdeu para as outras heurísticas${NC}" +fi -- GitLab From ba184bf20658dbd318dd61aadaf79223e25a1235 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sun, 18 Jun 2017 13:49:42 -0300 Subject: [PATCH 20/20] Testes melhores --- .gitlab-ci.yml | 8 ++++---- tests/runTests.sh | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index da90b69..2d59eca 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -56,8 +56,8 @@ h4-min: stage: test script: - cd tests - - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh - - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh + - sed -i -e 's/tams=()/tams=(4 8 16 32)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(3 4 8 10)/g' runTests.sh - ./runTests.sh -h "./floodit_h4" - gnuplot "tempos.plot" - gnuplot "medias.plot" @@ -101,8 +101,8 @@ h6-min: stage: test script: - cd tests - - sed -i -e 's/tams=()/tams=(16 32)/g' runTests.sh - - sed -i -e 's/cores=()/cores=(4 8 10)/g' runTests.sh + - sed -i -e 's/tams=()/tams=(4 8 16 32)/g' runTests.sh + - sed -i -e 's/cores=()/cores=(3 4 8 10)/g' runTests.sh - ./runTests.sh -h "./floodit_h6" - gnuplot "tempos.plot" - gnuplot "medias.plot" diff --git a/tests/runTests.sh b/tests/runTests.sh index f6e39d9..0e38b7a 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -23,7 +23,7 @@ echo $HEUR tempo_max=120000 #120s # tamanhos do tabuleiro -tams=(100) +tams=(64) # lista de cores cores=(10) -- GitLab