int main(int argc, char * argv[]){ srand(time(NULL)); //exactTest(11,200); int n1 = 0; instance_t* t = instanceCreer(10,"test"); instanceInit(t); instanceRandNC(t); //instanceAfficher(t); //instance_t* johnlogn = johnsonnlogn(t,0); //instanceAfficher(johnlogn); instance_t * sol = branch_bound(t,&n1); //printf("Solution finale :"); //instanceAfficher(sol); instanceDetruire(sol); instanceDetruire(t); return EXIT_SUCCESS; }
void exactTest(int instMax,int loop){ float c1 = 0.0; float c2 = 0.0; float c3 = 0.0; int n1 = 0; int n2 = 0; int n3 = 0; chrono(); for(int i = 0;i<instMax;i++){ for(int j = 0;j<loop;j++){ instance_t* t = instanceCreer(i,"test"); instanceInit(t); instanceRandNC(t); //instanceAfficher(t); //instance_t* johnlogn = johnsonnlogn(t,0); //instanceAfficher(johnlogn); instance_t * sol = branch_bound(t,&n1); //printf("Solution finale :"); //instanceAfficher(sol); instanceDetruire(sol); c1 += chrono(); instanceRandDE(t); sol = branch_bound(t,&n2); instanceDetruire(sol); c2 += chrono(); instanceRandM(t); sol = branch_bound(t,&n3); instanceDetruire(sol); c3 += chrono(); instanceDetruire(t); } printf("%i %.5f %.5f %.5f %i %i %i\n",i,c1/loop,c2/loop,c3/loop,n1/loop,n2/loop,n3/loop); } }
void iniciar_branch_bound(Graph *graph) { No_Cidade_Ponteiro no_inicial; no_inicial = (No_Cidade_Ponteiro) malloc(sizeof(struct No_Cidade)); no_inicial->id_cidade =0; no_inicial->cidades_visitadas = 1; no_inicial->custo = 0; no_inicial->profundidade =0; no_inicial->no_pai =NULL; printf("\n\n#### Branch and Bound ####\n"); branch_bound(graph, no_inicial); printf("\nQuantidade de Podas: %d\n", qtde_podas); }
void branch_bound(Graph *graph, No_Cidade_Ponteiro no_temporario) { int i,pos_cidade, custo; No_Cidade_Ponteiro no; if (no_temporario->profundidade == graph->numero_vertices - 1) { if (no_temporario->custo + graph->matriz_adjacencia[no_temporario->id_cidade][0] < melhor_custo) { melhor_custo = no_temporario->custo + graph->matriz_adjacencia[no_temporario->id_cidade][0]; printf("\nNova Solucao Melhor:\n"); imprimir_caminho(no_temporario); printf("-> %d", maior_id+1); printf("\nCusto Total: %d\n", maior_custo+graph->matriz_adjacencia[maior_id][no_temporario->id_cidade]); maior_custo = 0; } free(no_temporario); return; } for (i=1;i<graph->numero_vertices;++i) { pos_cidade = (int) pow(2,i); if ((no_temporario->cidades_visitadas & pos_cidade) != 0) continue; custo = no_temporario->custo + graph->matriz_adjacencia[no_temporario->id_cidade][i]; if (custo > melhor_custo) { if (custo < INFINITO) qtde_podas++; } else { no = (No_Cidade_Ponteiro) malloc(sizeof(struct No_Cidade)); no->id_cidade = i; no->cidades_visitadas = no_temporario->cidades_visitadas | pos_cidade; no->custo = custo; no->profundidade = no_temporario->profundidade +1; no->no_pai = no_temporario; branch_bound(graph, no); } } if (no_temporario) free(no_temporario); return; }