Quantcast
Channel: Programação - GUJ
Viewing all articles
Browse latest Browse all 33090

Implementação

$
0
0

@Maycon_Jhonanthan escreveu:

onde esta o erro desse codigo.....

include "Util.h"

include

include

include

include

include

include "Descida.h"

include "Util.h"

include "SA.h"

include "Arquivos.h"

include "Estruturas.h"

include "Listas.h"

include "BT.h"

float BT(int n,
int *s,
float **d,
int tamanho_maximo_lista,
int BTmax)
{
int melhor_i, melhor_j;
struct lista *inicio_tabu, *final_tabu, *tabu;
int iterBT = 0; // numero corrente de iteracoes da Busca Tabu
int MelhorIter = 0; // Iteracao em que ocorreu a melhor solucao
int *s_star;
float fo, fo_star;
clock_t inicio_CPU, fim_CPU;

s_star = cria_vetor(n);
inicializa_vetor(s_star,n);
atualiza_vetor(s_star, s, n);
fo_star = fo = calcula_fo(n,s,d);

printf("\nIniciando a Busca Tabu com fo = %8.2f\n", fo);
inicio_tabu = final_tabu = NULL;
inicio_CPU = fim_CPU = clock();
limpa_arquivo("BTsaida.txt");
limpa_arquivo("BTsaidaMelhorfo.txt");

imprime_fo("BTsaida.txt", (float)(fim_CPU - inicio_CPU)/CLOCKS_PER_SEC, fo, iterBT);

imprime_fo("BTsaidaMelhorfo.txt", (float)(fim_CPU - inicio_CPU)/CLOCKS_PER_SEC, fo_star, iterBT);
while (iterBT - MelhorIter < BTmax) {
iterBT++;
    float fo_viz = melhor_vizinho_BT(n,s,d,fo,&melhor_i,&melhor_j,fo_star,&inicio_tabu,&final_tabu);
//printf("\nMelhor vizinho = %8.2f Troca realizada: pos %d <-> pos %d Cidades: %d <-> %d\n",
    //         fo_viz, melhor_i, melhor_j,s[melhor_i], s[melhor_j]);
tabu = (struct lista *)malloc(sizeof(struct lista));
if (!tabu) {
   printf("Faltando memoria ...\n"); getchar();
   exit(1);
	}
      /* vou inserir um registro na lista tabu */
tabu->campo1  = melhor_i;
tabu->campo2  = melhor_j;
	insere_final_lista(tabu, &inicio_tabu, &final_tabu);
     /* vou calcular o tamanho da lista tabu e imprimi-la */
//printf("Tamanho da lista tabu = %2d\n",
    //       tamanho_lista(&inicio_tabu, &final_tabu));
	//mostra_lista(&inicio_tabu, &final_tabu);

   /* vou manter uma lista tabu com tamanho_maximo_lista_tabu elementos,
          isto e', se a lista tiver mais que essa quantidade de elementos,
          vou apagar o primeiro registro da lista */
if (tamanho_lista(&inicio_tabu, &final_tabu) > tamanho_maximo_lista){
      	/* vou apagar o primeiro registro da lista tabu */
	   apaga_registro(inicio_tabu, &inicio_tabu, &final_tabu);
	   //printf("Tamanho da lista tabu = %2d\n",
       //       tamanho_lista(&inicio_tabu, &final_tabu));
   //mostra_lista(&inicio_tabu, &final_tabu);
	}

    /* Vou fazer o movimento */
    int aux = s[melhor_j];
    s[melhor_j] = s[melhor_i];
    s[melhor_i] = aux;
    fo = fo_viz;
    //getchar();

fim_CPU = clock();
    imprime_fo("BTsaida.txt", (float)(fim_CPU - inicio_CPU)/CLOCKS_PER_SEC, fo, iterBT);
    if (fo < fo_star){
       MelhorIter = iterBT;
   atualiza_vetor(s_star, s, n);
       fo_star = fo;
       printf("fo_star = %8.2f \n",fo_star);
    }
    imprime_fo("BTsaidaMelhorfo.txt", (float)(fim_CPU - inicio_CPU)/CLOCKS_PER_SEC, fo_star, iterBT);
}
fim_CPU = clock();
imprime_fo("BTsaida.txt", (float)(fim_CPU - inicio_CPU)/CLOCKS_PER_SEC, fo, iterBT);
imprime_fo("BTsaidaMelhorfo.txt", (float)(fim_CPU - inicio_CPU)/CLOCKS_PER_SEC, fo_star, iterBT);
printf("********** Melhor Solucao Obtida *************** \n");
printf("Saindo da Busca Tabu com fo_star = %8.2f\n",fo_star);
printf("Numero de iteracoes realizadas = %d \n",iterBT);
printf("******************************************** \n");
getchar();
atualiza_vetor(s, s_star, n);
libera_vetor(s_star);
fo = fo_star;
apaga_lista(&inicio_tabu, &final_tabu);
return fo;

}

float melhor_vizinho_BT(int n,
int *s,
float **d,
float fo,
int *melhor_i,
int *melhor_j,
float fo_star,
struct lista **inicio,
struct lista **final)
{
int aux;
float fo_melhor_viz = INT_MAX;

float fo_viz;
for(int i=0 ; i < n - 1 ; i++){
for(int j=i+1 ; j < n ; j++) {
// Calcula a variacao de energia com a realizacao do movimento
float delta1 = calcula_delta(n,s,d,i,j);

  // Faz o movimento
  aux = s[j];
  s[j] = s[i];
  s[i] = aux;

  float delta2 = calcula_delta(n,s,d,i,j);

  // Calcular a nova distancia
  fo_viz = fo - delta1 + delta2;

  bool estanalista = esta_lista_tabu(i,j,inicio);

  /* Armazenar o melhor movimento (melhor troca) que nao seja tabu
     ou, se tabu, que melhore a função objetivo estrela */
  if(!estanalista || (estanalista && fo_viz < fo_star)){
    if (estanalista && fo_viz < fo_star){
       printf("\nAspirando, isto e, realizando o movimento tabu que troca a cidade %2d que esta na posicao %2d com a cidade %2d que esta na posicao %2d\n",s[i],i,s[j],j);
       printf("fo_viz = %10.4f fo_star = %10.4f \n\n",fo_viz,fo_star);
       //getchar();
    }
    if (fo_viz < fo_melhor_viz){
       *melhor_i = i;
       *melhor_j = j;
       fo_melhor_viz = fo_viz;
    }
  }

  // Desfaz o movimento
  aux = s[j];
  s[j] = s[i];
  s[i] = aux;

}

}

// retornar a distancia do melhor vizinho
return fo_melhor_viz;

}//melhor_vizinho_BT

/* Verifica se posicao esta na lista tabu */
bool esta_lista_tabu(int posicao1, int posicao2, struct lista **inicio)
{
struct lista *registro = *inicio;

while(registro) {
if (registro->campo1 == posicao1 && registro->campo2 == posicao2)
return true;
registro = registro->proximo; /* obtem novo registro */
}
return false; /* nao encontrou */
}

Mensagens: 1

Participantes: 1

Ler tópico completo


Viewing all articles
Browse latest Browse all 33090


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>