Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.79 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3.  
  4. import org.jacop.*;
  5. import org.jacop.constraints.Cumulative;
  6. import org.jacop.constraints.Diff2;
  7. import org.jacop.constraints.Max;
  8. import org.jacop.constraints.XgteqY;
  9. import org.jacop.constraints.XltY;
  10. import org.jacop.constraints.XplusYeqZ;
  11. import org.jacop.constraints.XplusYlteqZ;
  12. import org.jacop.constraints.diffn.Diffn;
  13. import org.jacop.core.IntVar;
  14. import org.jacop.core.Store;
  15. import org.jacop.search.DepthFirstSearch;
  16. import org.jacop.search.IndomainMin;
  17. import org.jacop.search.MostConstrainedStatic;
  18. import org.jacop.search.Search;
  19. import org.jacop.search.SelectChoicePoint;
  20. import org.jacop.search.SimpleSelect;
  21.  
  22. public class RegressionFilter {
  23.  
  24. public static void main(String[] args) {
  25.  
  26. // Vi behöver en cumulative för add och en för mul
  27.  
  28. // a list of tasks’ starts O,
  29. // a list of tasks’ durations D,
  30. // a list of amount
  31. // of resources AR required by each task, and
  32. // the upper limit of the amount of
  33. // used resources Limit.
  34.  
  35. DataSet6 data = new DataSet6();
  36. Store store = new Store();
  37.  
  38. System.out.println("Number of adds: " + data.add.length);
  39. System.out.println("Number of muls: " + data.mul.length);
  40.  
  41. IntVar[] addStart = new IntVar[data.add.length];
  42. IntVar[] mulStart = new IntVar[data.mul.length];
  43. IntVar[] allStart = new IntVar[data.add.length + data.mul.length];
  44. IntVar[] allEnd = new IntVar[data.add.length + data.mul.length];
  45.  
  46. IntVar[] addDelay = new IntVar[data.add.length];
  47. IntVar[] mulDelay = new IntVar[data.mul.length];
  48. IntVar[] allDelay = new IntVar[data.add.length + data.mul.length];
  49.  
  50. IntVar[] addProcNeed = new IntVar[data.add.length];
  51. IntVar[] mulProcNeed = new IntVar[data.mul.length];
  52.  
  53. IntVar[] addProcUsed = new IntVar[data.add.length];
  54. IntVar[] mulProcUsed = new IntVar[data.mul.length];
  55. IntVar[] allProcUsed = new IntVar[data.add.length + data.mul.length];
  56.  
  57. IntVar[][] addRects = new IntVar[data.add.length][4]; //first index for rectangle, second index: 0- start x, 1- start y, 2- length x, 3- length y
  58. IntVar[][] mulRects = new IntVar[data.mul.length][4];
  59.  
  60.  
  61. IntVar addLimit = new IntVar(store, "Limit", data.number_add, data.number_add);
  62. IntVar mulLimit = new IntVar(store, "Limit", data.number_mul, data.number_mul);
  63.  
  64. IntVar cost = new IntVar(store, "Cost", 0, 100);
  65.  
  66. for(int i = 0; i < data.n; i++) {
  67. allStart[i] = new IntVar(store, "Task " + (i+1) + " start", 0, 50);
  68. allEnd[i] = new IntVar(store, "Task " + (i+1) + " end", 0, 50);
  69. }
  70.  
  71. //Initializing add vars
  72. for(int i = 0; i < data.add.length; i++) {
  73. addStart[i] = allStart[data.add[i] - 1];
  74. addDelay[i] = new IntVar(store, data.del_add, data.del_add);
  75. addProcNeed[i] = new IntVar(store, 1, 1);
  76.  
  77. addProcUsed[i] = new IntVar(store, "Adding task " + (data.add[i]) + " used processor ", 1, data.number_add);
  78.  
  79. allDelay[data.add[i] - 1] = addDelay[i];
  80. allProcUsed[data.add[i] - 1] = addProcUsed[i];
  81.  
  82. }
  83.  
  84. //Initializing mul vars
  85. for(int i = 0; i < data.mul.length; i++) {
  86. mulStart[i] = allStart[data.mul[i] - 1];
  87. mulDelay[i] = new IntVar(store, data.del_mul, data.del_mul);
  88. mulProcNeed[i] = new IntVar(store, 1, 1);
  89.  
  90. mulProcUsed[i] = new IntVar(store, "Mulling task " + (data.mul[i]) + " used processor ", 1, data.number_mul);
  91.  
  92. allDelay[data.mul[i] - 1] = mulDelay[i];
  93. allProcUsed[data.mul[i] - 1] = mulProcUsed[i];
  94. }
  95.  
  96. for(int i = 0; i < allEnd.length; i++) {
  97. store.impose(new XplusYeqZ(allStart[i], allDelay[i], allEnd[i]));
  98. }
  99.  
  100. //Initializing precedence constraints
  101. for(int i = 0; i < data.dependencies.length; i++) {
  102. for(int j = 0; j < data.dependencies[i].length; j++) {
  103. //Check if the active operation is an add or mul
  104. IntVar delay = allDelay[data.dependencies[i][j] - 1];
  105.  
  106.  
  107. //task oAll[i] must be executed after its preceders (oAll[i] >= precederVar + operationTime)
  108. //IntVar z = new IntVar(store, 0, 50);
  109. //store.impose(new XplusYeqZ(delay, allStart[i], z));
  110. //store.impose(new XltY(z, allStart[data.dependencies[i][j] - 1]));
  111.  
  112. store.impose(new XplusYlteqZ(delay, allStart[i], allStart[data.dependencies[i][j] - 1]));
  113. System.out.println(data.dependencies[i][j] + " has to be executed after task " + allStart[i]);
  114. }
  115. }
  116.  
  117. boolean isLast = false;
  118. for(int i = 0; i < allStart.length; i++) {
  119. for(int j = 0; j < data.last.length; j++) {
  120. if(allStart[i] == allStart[data.last[j] - 1]) {
  121. isLast = true;
  122. }
  123. }
  124.  
  125. for(int j = 0; j < data.last.length; j++) {
  126. if(!isLast) {
  127. //store.impose(new XgteqY(allStart[data.last[j] - 1], allStart[i]));
  128. store.impose(new XplusYlteqZ(allDelay[i], allStart[i], allStart[data.last[j] - 1]));
  129. System.out.println("Execution start time for " + allStart[data.last[j] - 1] + " is after " + allStart[i]);
  130. } else {
  131. System.out.println(allStart[i] + " is one of the last operations.");
  132. }
  133. }
  134. isLast = false;
  135. }
  136.  
  137. //Impose cumulative constr for add
  138. store.impose(new Cumulative(addStart, addDelay, addProcNeed, addLimit));
  139.  
  140. //Impose cumulative constr for mul
  141. store.impose(new Cumulative(mulStart, mulDelay, mulProcNeed, mulLimit));
  142.  
  143. //Implementera diff ctr
  144.  
  145. //Create diff rectangles for adding
  146. for(int i = 0; i < data.add.length; i++) {
  147. addRects[i][0] = addStart[i];
  148. addRects[i][1] = addProcUsed[i];
  149. addRects[i][2] = addDelay[i];
  150. addRects[i][3] = new IntVar(store, 1, 1); //Each operation only needs one processor. Height of rect is always 1.
  151. }
  152.  
  153. //Create diff rectangles for mulling
  154. for(int i = 0; i < data.mul.length; i++) {
  155. mulRects[i][0] = mulStart[i];
  156. mulRects[i][1] = mulProcUsed[i];
  157. mulRects[i][2] = mulDelay[i];
  158. mulRects[i][3] = new IntVar(store, 1, 1); //Each operation only needs one processor. Height of rect is always 1.
  159. }
  160.  
  161. store.impose(new Diffn(addRects));
  162. store.impose(new Diffn(mulRects));
  163.  
  164. store.impose(new Max(allEnd, cost));
  165.  
  166. //Solve and search
  167. Search<IntVar> slave = new DepthFirstSearch<IntVar>();
  168. SelectChoicePoint slaveSelect = new SimpleSelect<IntVar>(allProcUsed, new MostConstrainedStatic<IntVar>(), new IndomainMin<IntVar>());
  169. slave.setSelectChoicePoint(slaveSelect);
  170.  
  171. Search<IntVar> search = new DepthFirstSearch<IntVar>();
  172. search.addChildSearch(slave);
  173. search.setPrintInfo(true);
  174. SelectChoicePoint<IntVar> select = new SimpleSelect<IntVar>(allStart, new MostConstrainedStatic<IntVar>(), new IndomainMin<IntVar>());
  175.  
  176. boolean result = search.labeling(store, select, cost);
  177.  
  178. //Print result
  179. if(result) {
  180. for(int i = 0; i < allStart.length; i++) {
  181. System.out.println(allStart[i] + "-----" + allProcUsed[i]);
  182. }
  183.  
  184. } else {
  185. System.out.println("No solution.");
  186. }
  187.  
  188. }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement