Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <omp.h>
  4. #include <sys/time.h>
  5.  
  6. #define MAX_NUM_OBJ 100
  7.  
  8. int num_obj = 0;
  9. int capacity;
  10. int weight[MAX_NUM_OBJ];
  11. int utility[MAX_NUM_OBJ];
  12.  
  13. void read_problem(char *filename){
  14. char line[256];
  15.  
  16. FILE *problem = fopen(filename,"r");
  17. if (problem == NULL){
  18. fprintf(stderr,"File %s not found.\n",filename);
  19. exit(-1);
  20. }
  21.  
  22. while (fgets(line, 256, problem) != NULL){
  23. switch(line[0]){
  24. case 'c': // capacity
  25. if (sscanf(&(line[2]),"%d\n", &capacity) != 1){
  26. fprintf(stderr,"Error in file format in line:\n");
  27. fprintf(stderr, "%s", line);
  28. exit(-1);
  29. }
  30. break;
  31.  
  32. case 'o': // graph size
  33. if (num_obj >= MAX_NUM_OBJ){
  34. fprintf(stderr,"Too many objects (%d): limit is %d\n", num_obj, MAX_NUM_OBJ);
  35. exit(-1);
  36. }
  37. if (sscanf(&(line[2]),"%d %d\n", &(weight[num_obj]), &(utility[num_obj])) != 2){
  38. fprintf(stderr,"Error in file format in line:\n");
  39. fprintf(stderr, "%s", line);
  40. exit(-1);
  41. }
  42. else
  43. num_obj++;
  44. break;
  45.  
  46. default:
  47. break;
  48. }
  49. }
  50. if (num_obj == 0){
  51. fprintf(stderr,"Could not find any object in the problem file. Exiting.");
  52. exit(-1);
  53. }
  54.  
  55. }
  56. int max(int x, int y){
  57. if (x >= y) return x;
  58. else return y;
  59. }
  60.  
  61. int min(int x, int y){
  62. if (x >= y) return y;
  63. else return x;
  64. }
  65.  
  66. int capacite(int ** S, int * M, int N, int j){
  67. int u = S[0][j];
  68. int somme;
  69. int m;
  70. if (u != 0) {
  71. somme = M[0];
  72. m = M[0];
  73. }
  74. else {
  75. somme = 0;
  76. m = 0;
  77. }
  78. for (int i=0; i<N-1; i++){
  79. if (m < S[i+1][j]) {
  80. somme += M[i+1];
  81. }
  82. m = M[i+1];
  83. }
  84. return somme;
  85. }
  86.  
  87. int ** matUtiliteMax(int * M, int * U, int N, int c){
  88.  
  89. // Création matrice s
  90. int ** S = malloc(N*sizeof(int*));
  91. for (int i=0; i<N; i++)
  92. S[i] = malloc((c+1)*sizeof(int));
  93.  
  94. // Remplissage première ligne
  95. for (int j=0; j<c+1; j++){
  96. if (M[0] <= j) S[0][j] = U[0];
  97. else S[0][j] = 0;
  98. }
  99.  
  100. // Remplissage des lignes 1 à N
  101. for (int i=1; i<N; i++){
  102. for (int j=0; j<c+1; j++){
  103. if (j >= M[i]){
  104. if ((S[i-1][j-M[i]] + U[i])-S[i-1][j] >= 0){
  105. S[i][j] = S[i-1][j-M[i]] + U[i];
  106. }
  107. else S[i][j] = S[i-1][j];
  108. }
  109.  
  110. else S[i][j] = S[i-1][j];
  111. }
  112. }
  113.  
  114. return S;
  115.  
  116. }
  117.  
  118. int * utilityMax(int ** S, int * Poid, int * utilite, int nbl, int nbc){
  119. int * E = malloc(nbl*sizeof(int));
  120. for(int i = 0; i<nbl; i++) E[i] = 0;
  121. int j = nbc;
  122. int i = nbl - 1;
  123. int itmp = nbl - 1;
  124. int jtmp = nbc;
  125. while (j > 0 && i > 0){
  126. if (S[i][j] > S[i-1][j]) E[i] = 1;
  127. i -= 1;
  128. while ((S[i][j] != (S[itmp][jtmp] - Poid[itmp])) && j > 0) {
  129. j -= 1;
  130. }
  131. itmp = i;
  132. jtmp = j;
  133. }
  134. return E;
  135. }
  136.  
  137. void afficherMat(int ** mat, int nbl, int nbc){
  138. for (int i = 0; i<nbl; i++){
  139. for (int j = 0; j<nbc; j++){
  140. printf(" %d |",mat[i][j]);
  141. }
  142. printf("\n");
  143. }
  144. }
  145.  
  146. void afficherTab(int * tab, int nbc){
  147. for (int j = 0; j<nbc; j++){
  148. printf(" %d |",tab[j]);
  149. }
  150. }
  151.  
  152. void main(int argc, char * argv[]){
  153. read_problem(argv[1]);
  154. int ** S = matUtiliteMax(weight,utility,num_obj,capacity);
  155. /*afficherMat(S, num_obj, capacity);*/
  156. int * E = malloc(num_obj*sizeof(int));
  157. for(int i = 0; i<num_obj; i++) E[i] = 0;
  158. int j = capacity;
  159. int i = num_obj - 1;
  160. int itmp = num_obj - 1;
  161. int jtmp = capacity;
  162. while (j > 0 && i > 0){
  163. if (S[itmp][jtmp] > S[i-1][j]){
  164. E[i] = 1;
  165. itmp = i;
  166. while ((S[i][j] != (S[itmp][jtmp] - utility[itmp])) && j > 0) {
  167. j -= 1;
  168. }
  169. }
  170. i -= 1;
  171. itmp = i;
  172. jtmp = j;
  173. }
  174. afficherTab(E,num_obj);
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement