float descida_parcial(int n, int *s, float **d, float percentual)
{
  int aux, melhor_i, melhor_j, num_vizinhos;
  float fo_viz, fo;
  bool melhorou;
  clock_t inicio_CPU, fim_CPU;

  num_vizinhos = (int) percentual * n / 100;
  fo = fo_viz = calcula_fo(n, s, d);
  limpa_arquivo("Descida.txt");
  inicio_CPU = fim_CPU = clock();
  imprime_fo("Descidaparcialsaida.txt", (fim_CPU - inicio_CPU)/CLK_TCK,fo,0);
  do{
     melhorou = false;
     fo_viz = melhor_vizinho_parcial(n, s, d, fo, &melhor_i, &melhor_j, num_vizinhos);
     if (fo_viz < fo){
          //printf("Rota antes:  Fo antes = %f \n", fo);
          //imprime_rota(s,n);

          aux = s[melhor_j];
          s[melhor_j] = s[melhor_i];
          s[melhor_i] = aux;
          fo = fo_viz;
          melhorou = true;
          fim_CPU = clock();
          imprime_fo("Descidaparcialsaida.txt", (fim_CPU - inicio_CPU)/CLK_TCK,fo,0);

          //printf("Vou trocar %d com %d \n",melhor_i,melhor_j);
          //printf("Rota depois do movimento: Fo melhor vizinho = %f \n", fo_viz);
          //imprime_rota(s,n);
          //getchar();
     }
  } while (melhorou == true);
  fim_CPU = clock();
  imprime_fo("Descidaparcialsaida.txt", (fim_CPU - inicio_CPU)/CLK_TCK,fo,0);
  return fo;
}


float melhor_vizinho_parcial(int n, int *s, float **d, float fo, int *melhor_i, int *melhor_j, int num_vizinhos)
{
  int aux;
  float fo_melhor_viz = fo;
  int *vet;
  float fo_viz;

  vet = cria_vetor(n);
  for (int j=0; j < n; j++) vet[j]=j;
  embaralha_vetor(vet,n);

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

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

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

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

      // Armazenar o melhor movimento (melhor troca)
      if(fo_viz < fo_melhor_viz){
        *melhor_i = vet[i];
        *melhor_j = vet[j];
        fo_melhor_viz = fo_viz;
      }

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

    }
  }
  libera_vetor(vet);
  // retornar a distancia do melhor vizinho
  return fo_melhor_viz;

}//melhor_vizinho
