Esempio n. 1
0
void imprimir_caminho(No_Cidade_Ponteiro n)
{
    if (n->profundidade==0)
    {
        printf("%d ", n->id_cidade+1);
        if (maior_custo < n->custo) {
            maior_custo = n->custo;
        }
        maior_id = n->id_cidade;
        return;
    }
    imprimir_caminho(n->no_pai);
    printf("-> %d ", n->id_cidade+1);
    if (maior_custo < n->custo) {
        maior_custo = n->custo;
    }
    return;
}
Esempio n. 2
0
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;   
}
Esempio n. 3
0
static void montar_caminho(struct bstree *tree, struct bstree *destino)
{
	if (tree != NULL) {
		if (stack_isfull(caminho)) {
			char last = stack_pop(caminho);

			caminho = stack_free(caminho);
			caminho = stack_new(MAX_CAMINHO);
			stack_push(caminho, (int) last);
		}
		stack_push(caminho, token_para_simbolo(tree->value->token));
		if (tree == destino) {
			imprimir_caminho();
			return;
		}
		montar_caminho(tree->lchild, destino);
		montar_caminho(tree->rchild, destino);
		//(void) stack_pop(caminho);
	}
}