Guest User

Untitled

a guest
Nov 23rd, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. #include "kp.h"
  2.  
  3. static void solveKnapsack(knapsackT knapsack);
  4.  
  5. void knapsackMain(char *filename){
  6. knapsackT nKnapsack;
  7.  
  8. nKnapsack = readkpMatrixFromFile(filename);
  9. printKP(nKnapsack);
  10.  
  11. solveKnapsack(nKnapsack);
  12.  
  13. }
  14.  
  15. static void solveKnapsack(knapsackT knapsack){
  16. int i, j, k, **matrix, **keepTable, currentNumberofItems, itemsinkp, weigth,row, weightLeft;
  17.  
  18.  
  19.  
  20. row=0;
  21. matrix = KPmatrix(knapsack.capacity, knapsack.size);
  22. keepTable = KPmatrix(knapsack.capacity, knapsack.size);
  23.  
  24. if(knapsack.capacity == 0){
  25. Error("You cant pack anything in a small bag you dumbass\n");
  26. }
  27. //creating the value and 1/0 keeper tablet
  28. while(row <= knapsack.capacity){
  29. if(row==0){
  30. for(i=1;i<=knapsack.capacity;i++){
  31. matrix[i][row] = 0;
  32. keepTable[i][row] = 0;
  33. }
  34. }
  35. else{
  36. //får item platts i knapsack?
  37. for(i=1; i < knapsack.capacity; i++){
  38. if(knapsack.item[row].weight > i){
  39. //om itemet inte får platts kopieras värder åvanför
  40. matrix[i][row] = matrix[i][row-1];
  41. keepTable[i][row] = 0;
  42. }
  43. else{
  44. weightLeft = knapsack.item[row].weight -i;
  45.  
  46. if(database->matris[1][row]+values[weightLeft][row-1] > values[i][row-1]){
  47. values[i][row] = database->matris[1][row]+values[weightLeft][row-1];
  48. keeper[i][row] = 1;
  49. }
  50. else{
  51. values[i][row] = values[i][row-1];
  52. keeper[i][row] = 0;
  53. }
  54. }
  55. }
  56. }
  57. row = row+1;
  58. }
  59.  
  60. //we now got our keeper tablet,lets use it!
  61. printf("For a optimal solotion use:\n");
  62. weightLeft = database->knapsackCap;
  63. totalPoints = 0;
  64. for(i=database->nrOfitems; i < 0; i--){
  65. if(keeper[weightLeft][i] == 1){
  66. //then pick item.
  67. printf("Item nr: %d\n", database->matris[0][i-1]);
  68. printf("Item with value %d\n", database->matris[1][i-1]);
  69. totalPoints = totalPoints + database->matris[1][i-1];
  70. weightLeft = weightLeft - database->matris[2][i-1];
  71. printf("\n");
  72. }
  73. }
  74. printf("The optimal value is: %d\n", totalPoints);
  75. }
  76.  
  77.  
  78. }
  79.  
  80.  
  81. /*
  82. typedef struct{
  83. int nrOfitems;
  84. int **matris;
  85. int knapsackCap;
  86. }*dbT;
  87.  
  88. /*Functions*//*
  89. dbT readKpFile(void);
  90. int** NewKpValueMatris(int size);
  91. void printKpMatris(int **matris, int size);
  92. int getValueOf(int itemI, int **matris);
  93. int getWeightOf(int itemI, int **matris);
  94. int** NewKpVolumeAndKeepMatris(int cap, int nrOfitems);
  95. void KpSolv(dbT database);
  96. main(){
  97. dbT database;
  98. int i, **values, **keeper;
  99. database = readKpFile();
  100. KpSolv(database);
  101. }
  102.  
  103. int getValueOf(int itemI, int **matris){
  104. return matris[1][itemI-1];
  105. }
  106. int getWeightOf(int itemI, int **matris){
  107. return matris[2][itemI-1];
  108. }
  109. dbT readKpFile(void){
  110.  
  111. FILE *fp;
  112. int size, **matris, kapsackCap, nr, value, weight, i;
  113. dbT db;
  114. char *filename;
  115.  
  116. db = New(dbT);
  117. filename = GetLine();
  118. fp = fopen(filename, "r");
  119. if(fp == NULL){Error("Error reading file\n");}
  120. fscanf(fp, "%d", &size);
  121. db->nrOfitems = size;
  122. matris = NewKpValueMatris(size);
  123.  
  124.  
  125. for(i=0;i<size;i++){
  126. if(fp == NULL){Error("Error reading file\n");}
  127. fscanf(fp, "%5d %5d %5d",&matris[0][i], &matris[1][i],&matris[2][i]);
  128.  
  129. //printf("%5d %5d %5d\n",matris[0][i], matris[1][i],matris[2][i]);
  130. }
  131. db->matris = matris;
  132. fscanf(fp, "%d", &kapsackCap);
  133. db->knapsackCap = kapsackCap;
  134. fclose(fp);
  135. return db;
  136. }
  137. int** NewKpValueMatris(int size){
  138. int i, **matris;
  139. matris = (int**)calloc(3, sizeof(int)); //Allokerar matrisen, 3 i vågrät, nr-value-weight
  140. for(i = 0 ; i < size ; i++){
  141. matris[i] = (int*)calloc(size, sizeof(int));
  142. }
  143. return matris;
  144. }
  145. void printKpMatris(int **matris, int size){
  146. int i;
  147.  
  148. for(i = 0 ; i < size; i++){
  149. printf("%5d %5d %5d\n",matris[0][i], matris[1][i],matris[2][i]);
  150. }
  151. printf("\n");
  152. }
  153. int** NewKpVolumeAndKeepMatris(int cap, int nrOfitems){
  154. int i, **matris;
  155. matris = (int**)calloc(cap, sizeof(int)); //Allokerar matrisen, cap i vågrätt och nrofitems i lodräd + 1(pga första raden är 0
  156. for(i = 0 ; i < (nrOfitems+1) ; i++){
  157. matris[i] = (int*)calloc((nrOfitems+1), sizeof(int));
  158. }
  159. return matris;
  160. }
  161.  
  162. void KpSolv(dbT database){
  163. int i, weightLeft, **values, **keeper, row, totalPoints;
  164.  
  165. row=0;
  166. values = NewKpVolumeAndKeepMatris(database->knapsackCap, database->nrOfitems);
  167. keeper = NewKpVolumeAndKeepMatris(database->knapsackCap, database->nrOfitems);
  168.  
  169. if(database->knapsackCap == 0){
  170. Error("You cant pack anything in a empty bag you dumbass\n");
  171. }
  172. //creating the value and 1/0 keeper tablet
  173. while(row <= database->knapsackCap){
  174. if(row==0){
  175. for(i=1;i<=database->knapsackCap;i++){
  176. values[i][row] = 0;
  177. keeper[i][row] = 0;
  178. }
  179. }
  180. else{
  181. //får item platts i knapsack?
  182. for(i=1; i < database->knapsackCap; i++){
  183. if(database->matris[2][row] > i){
  184. values[i][row] = values[i][row-1];
  185. keeper[i][row] = 0;
  186. }
  187. else{
  188. weightLeft = database->matris[2][row]-i;
  189.  
  190. if(database->matris[1][row]+values[weightLeft][row-1] > values[i][row-1]){
  191. values[i][row] = database->matris[1][row]+values[weightLeft][row-1];
  192. keeper[i][row] = 1;
  193. }
  194. else{
  195. values[i][row] = values[i][row-1];
  196. keeper[i][row] = 0;
  197. }
  198. }
  199. }
  200. }
  201. row = row+1;
  202. }
  203.  
  204. //we now got our keeper tablet,lets use it!
  205. printf("For a optimal solotion use:\n");
  206. weightLeft = database->knapsackCap;
  207. totalPoints = 0;
  208. for(i=database->nrOfitems; i < 0; i--){
  209. if(keeper[weightLeft][i] == 1){
  210. //then pick item.
  211. printf("Item nr: %d\n", database->matris[0][i-1]);
  212. printf("Item with value %d\n", database->matris[1][i-1]);
  213. totalPoints = totalPoints + database->matris[1][i-1];
  214. weightLeft = weightLeft - database->matris[2][i-1];
  215. printf("\n");
  216. }
  217. }
  218. printf("The optimal value is: %d\n", totalPoints);
  219. }
  220. */
Add Comment
Please, Sign In to add comment