Advertisement
anambrito

Backpack Algorithm - Exhaustion Resolution(Tentativa e Erro)

Apr 22nd, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.31 KB | None | 0 0
  1. /************************************************
  2. CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS (CEFET-MG)
  3. LAED1 - Trabalho Pratico 1
  4. Aluno: Ana Maria M. Brito
  5. Matricula: 201622040414
  6. Descricao do programa: Algoritmo de tentativa e erro que encontra a solução da mochila por exaustão através de uma sequência binária
  7. Data: 19/04/2018
  8. ************************************************/
  9.  
  10. /************************************************
  11.  
  12. FEDERAL CENTER FOR TECHNOLOGICAL EDUCATION OF MINAS GERAIS (CEFET-MG)
  13. LAED1 - Practical Work 1
  14. Student: Ana Maria M. Brito
  15. Enrollment: 201622040414
  16. Program description: Trial and error algorithm that finds the solution of the rucksack by exhaustion through a binary sequence
  17. Date: 04/19/2018
  18. ************************************************ /
  19.  
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <sys/time.h>
  23. #include <unistd.h>
  24. #include <sys/resource.h>
  25. #include <math.h>
  26.  
  27.  
  28. typedef struct ITEM{
  29.  
  30.     int peso;
  31.     int valor;
  32.     int posicao;
  33.    
  34. }item;
  35.  
  36. item mochila[100];
  37. int valorMochila = 0;
  38. unsigned int mochilaBin[64000];
  39. unsigned int vBin[64000];
  40. int tam;
  41. int capacidade;
  42.  
  43.  
  44. void escreveArquivo(int);
  45.  
  46. void binarioREC(int indice, item* vProd){
  47.  
  48.    /*
  49.     PARTE I: Criação do vetor binário
  50.    */
  51.  
  52.     int i, controle, binario, decimal, resto;
  53.     decimal = indice;
  54.  
  55.     for(i=0, binario=0; decimal>0;  decimal=decimal/2,i++){ //converte um número decimal em binário //
  56.         resto=decimal%2;
  57.         vBin[i] = resto;
  58.     }
  59.  
  60.     for(;i<tam;i++) //zera as outras posições do vBin que não estão sendo utilizadas
  61.     vBin[i]=0;
  62.  
  63.     /*
  64.     PARTE II: Combinação entre o vBin e o vProd para testar cada possibilidade
  65.     */
  66.  
  67.     int limite = pow(2, tam);
  68.     int somaValor = 0, somaPeso = 0, j;
  69.  
  70.     //printf("Indice %d\n", indice);
  71.    
  72.     if(indice <= limite){ //enquanto o indice for menor que o limite de combinações
  73.  
  74.         for(i=0;i<tam;i++){ //segundo a combinação do vBin é feita a soma dos valores dos respectivos produtos
  75.             if(vBin[i] == 1){
  76.             somaValor +=  vProd[i].valor;
  77.             somaPeso  +=  vProd[i].peso;
  78.             }
  79.         }
  80.  
  81.         if((somaValor > valorMochila) && (somaPeso <= capacidade)){ //se valor da combinação atual é maior q valorMochila,
  82.             valorMochila = somaValor;                               // e somaPeso obedece a capacidade, temos o valor ótimo
  83.             for(i=0;i<tam;i++)
  84.             mochilaBin[i] = vBin[i];
  85.         }
  86.  
  87.         indice++;
  88.         binarioREC(indice, vProd);
  89.     }
  90.  
  91.     else{ //condição de parada para salvar no arquivo o vetor solução
  92.         for(i=0, j=0;i<tam;i++){
  93.             if(mochilaBin[i] == 1){
  94.                 mochila[j].peso    = vProd[i].peso;
  95.                 mochila[j].valor   = vProd[i].valor;
  96.                 mochila[j].posicao = vProd[i].posicao;
  97.                 j++;
  98.                 escreveArquivo(j);
  99.             }
  100.         }
  101.     }
  102. }
  103.  
  104. void escreveArquivo(int tamanho){ //escreve o vetor solução no arquivo "resultadosTentativaErro.txt"
  105.  
  106.     int i;
  107.     int pesoMochila = 0;
  108.     FILE *arquivo;
  109.  
  110.     arquivo = fopen("resultadoTentativaErro.txt", "w");
  111.    
  112.     fprintf(arquivo,"Mochila - posição/peso/valor:\n");
  113.     for(i=0;i<tamanho;i++){
  114.         fprintf(arquivo,"%d %d %d\n", mochila[i].posicao, mochila[i].peso, mochila[i].valor);
  115.     }
  116.  
  117.    
  118.     fprintf(arquivo,"\nSomatório dos pesos dos itens escolhidos:\n");
  119.     for(i=0;i<tamanho;i++){
  120.         fprintf(arquivo,"%d", mochila[i].peso);
  121.         if((i+1) < tamanho)
  122.         fprintf(arquivo," + ");
  123.         pesoMochila += mochila[i].peso;
  124.     }
  125.     fprintf(arquivo, " = %d\n", pesoMochila);
  126.  
  127.     fprintf(arquivo,"\nSomatório dos valores dos itens escolhidos:\n");
  128.     for(i=0;i<tamanho;i++){
  129.         fprintf(arquivo,"%d", mochila[i].valor);
  130.         if((i+1) < tamanho)
  131.         fprintf(arquivo," + ");
  132.     }
  133.     fprintf(arquivo, " = %d\n", valorMochila);
  134.  
  135.     fclose(arquivo);
  136.  
  137. }
  138.  
  139. int main(int argc, char*argv[]) {
  140.  
  141.    
  142.     struct rusage usage;
  143.     struct timeval now, start, end;
  144.     double inicio, fim;
  145.  
  146.    
  147.     getrusage (RUSAGE_SELF, &usage);
  148.     start = usage.ru_utime;
  149.    
  150.     gettimeofday(&now,NULL);
  151.     inicio = ((double) now.tv_usec)/1000000;
  152.     inicio += ((double) now.tv_sec);
  153.    
  154.  
  155.     FILE *arquivo;    
  156.    
  157.     //Abrir arquivo
  158.     arquivo = fopen("arquivo.txt","r");
  159.     if (arquivo==NULL){
  160.         printf("Impossivel abrir o arquivo\n");
  161.         return 1;
  162.     }
  163.  
  164.     //Lê do arquivo e grava no vetor
  165.  
  166.     item vProd[100];
  167.  
  168.     fscanf(arquivo, "%d\n%d", &capacidade, &tam);
  169.  
  170.     int i;
  171.  
  172.     //carrega os produtos do arquivos no vetor struct produto
  173.  
  174.     for (i=0;i<tam;i++){
  175.         fscanf(arquivo, "%d %d\n", &vProd[i].peso, &vProd[i].valor);
  176.         vProd[i].posicao = i;
  177.     }
  178.        
  179.     fclose(arquivo);
  180.  
  181.     int indice = 1;
  182.     binarioREC(indice, vProd);
  183.  
  184.     gettimeofday(&now,NULL);
  185.     fim = ((double) now.tv_usec)/1000000 ;
  186.     fim += ((double) now.tv_sec);
  187.  
  188.     getrusage(RUSAGE_SELF, &usage);
  189.     end = usage.ru_utime;
  190.    
  191.     printf("Tempos gastos no algoritmo TENTATIVA ERRO: \n");
  192.     printf("Tempo de computação: %.4f \n", fim - inicio);
  193.     printf("Tempos de entrada e saída: %ld.%lds\n",  end.tv_sec-start.tv_sec,  end.tv_usec-start.tv_usec);
  194.  
  195.     return 0;
  196.  
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement