ApsBalancingApplication.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package com.rongwei.rwapsserver.aps;
  2. import cn.hutool.core.date.DateTime;
  3. import cn.hutool.core.date.DateUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import cn.hutool.json.JSONUtil;
  6. import com.rongwei.rwapsserver.aps.domain.*;
  7. import com.rongwei.rwapsserver.aps.score.ApsConstraintProvider;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
  10. import org.optaplanner.core.api.solver.SolutionManager;
  11. import org.optaplanner.core.api.solver.Solver;
  12. import org.optaplanner.core.api.solver.SolverFactory;
  13. import org.optaplanner.core.config.solver.SolverConfig;
  14. import java.math.BigDecimal;
  15. import java.math.RoundingMode;
  16. import java.time.Duration;
  17. import java.time.LocalDateTime;
  18. import java.time.ZoneId;
  19. import java.time.temporal.TemporalAdjusters;
  20. import java.util.*;
  21. @Slf4j
  22. public class ApsBalancingApplication {
  23. public static void main(String[] args) {
  24. // testAps();
  25. /*String a = "1";
  26. String b = "1";
  27. System.out.println(a == b);*/
  28. /*ProductionProcesses p1 = new ProductionProcesses();
  29. ProductionProcesses p2 = new ProductionProcesses();
  30. p1.setId(1111);
  31. p2.setId(2222);
  32. p1.setNextProcesses(p2);
  33. p2.setPreviousProcesses(p1);
  34. System.out.println(p2.getPreviousProcesses().getId());*/
  35. /*Date date1 = DateUtil.parseDateTime("2024-02-22 20:01:23");
  36. LocalDateTime time2 = LocalDateTime.now();
  37. long a = DateUtil.between(Date.from(time2.atZone(ZoneId.systemDefault()).toInstant()),date1, DateUnit.DAY);
  38. System.out.println("a:"+a);*/
  39. // System.out.println(JSONUtil.toJsonStr(getTestApsSolution()));
  40. /*Boolean a = null;
  41. if(a){
  42. System.out.println("1111");
  43. }
  44. System.out.println("2222");*/
  45. /*Map<String,Integer> map = new HashMap();
  46. Integer a = 3;
  47. map.put("1",a);
  48. ApsBalancingApplication application = new ApsBalancingApplication();
  49. application.testOne(map);
  50. System.out.println(map.get("1"));*/
  51. /*List<Map<String,Integer>> list = new ArrayList<>();
  52. Map<String,Integer> map = new HashMap();
  53. map.put("1",1);map.put("2",2);map.put("3",3);*/
  54. // System.out.println((int)Math.ceil((double) 3/2));
  55. /*Boolean a = true;
  56. while (a){
  57. for (int i=0;i<10;i++){
  58. if(i > 6){
  59. a = false;
  60. break;
  61. }
  62. }
  63. }
  64. System.out.println("1111111");*/
  65. /*LocalDateTime now = LocalDateTime.now();
  66. List<EquipmentRunTime> allRunTimes = new ArrayList<>();
  67. EquipmentRunTime eq1 = new EquipmentRunTime();
  68. eq1.setStartRunTime(now.plusMinutes(3));
  69. EquipmentRunTime eq2 = new EquipmentRunTime();
  70. eq2.setStartRunTime(now);
  71. EquipmentRunTime eq3 = new EquipmentRunTime();
  72. eq3.setStartRunTime(now.plusMinutes(1));
  73. allRunTimes.add(eq1);allRunTimes.add(eq2);allRunTimes.add(eq3);
  74. System.out.println(allRunTimes);
  75. allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
  76. System.out.println(allRunTimes);*/
  77. // System.out.println(1280/100);
  78. /*ProductionProcesses a = new ProductionProcesses();
  79. a.setProduceTime(20);
  80. a.setStartTime(LocalDateTime.now());
  81. LocalDateTime endTime = a.getStartTime();
  82. System.out.println(a.getStartTime());
  83. endTime = endTime.plusMinutes(10);
  84. System.out.println(a.getStartTime());*/
  85. /*Date deliverydate = DateUtil.parseDateTime("2024-06-24 08:00:00");
  86. Integer deliverytime = 33;
  87. DateTime dateTime = DateUtil.offsetHour(deliverydate, -deliverytime);
  88. System.out.println(dateTime);*/
  89. /*Map<String,List<Integer>> equipmentPlanActualTime = new HashMap<>();
  90. List<Integer> planActualTimeList = new ArrayList<>();
  91. planActualTimeList.add(1);planActualTimeList.add(2);
  92. equipmentPlanActualTime.put("a",planActualTimeList);
  93. System.out.println(equipmentPlanActualTime);
  94. List<Integer> planActualTimeList1 = equipmentPlanActualTime.get("a");
  95. System.out.println(planActualTimeList1);
  96. planActualTimeList1.set(0,2);
  97. System.out.println(planActualTimeList1);
  98. System.out.println(equipmentPlanActualTime);*/
  99. /*ProductionProcesses a = new ProductionProcesses();
  100. a.setId("11111");
  101. System.out.println(ObjectUtil.cloneByStream(a).getId());*/
  102. /*String[] split = "1050^_^10500态热轧卷冷轧 厚6*宽1600mm 1吨^_^1600.00^_^6.0000^_^6.0000".split("\\^_\\^");
  103. BigDecimal i1 = new BigDecimal("1600");
  104. int cores = Runtime.getRuntime().availableProcessors();
  105. System.out.println(cores);*/
  106. /*BigDecimal thickness = new BigDecimal("1.2");
  107. System.out.println(thickness.setScale(0, RoundingMode.CEILING).intValue());
  108. Integer a = 1;Integer b = 1;
  109. System.out.println(a+b);*/
  110. /*LocalDateTime now = LocalDateTime.now();
  111. LocalDateTime nearestTenMinutes = now.minusSeconds(now.getSecond()) // 减去当前秒数
  112. .minusNanos(now.getNano()) // 减去当前纳秒数
  113. .plusMinutes(-now.getMinute() % 10) // 减去当前分钟数的余数,向下调整到最近的10的倍数
  114. .plusMinutes(10); // 加上调整后的分钟数的余数
  115. System.out.println(nearestTenMinutes);*/
  116. /*List<String> a = new ArrayList<>();
  117. a.add("1");
  118. List<String> b = a;
  119. b.add("2");
  120. System.out.println(a);*/
  121. /*BigDecimal a = new BigDecimal("516.78");
  122. System.out.println(a.intValue());*/
  123. System.out.println( 5 % 3);
  124. System.out.println( 5 / 3);
  125. System.out.println( 5 * 3);
  126. }
  127. public static void constraintTest(){
  128. // 构建约束校验器,入参:约束供应者实例,规划方案类,规划实体类
  129. /*ConstraintVerifier<ApsConstraintProvider, TimeTable> constraintVerifier = ConstraintVerifier.build(
  130. new ApsConstraintProvider(), TimeTable.class, Lesson.class);*/
  131. }
  132. public static void consTest(){
  133. /*ConstraintVerifier<ApsConstraintProvider, ApsSolution> constraintVerifier = ConstraintVerifier.build(
  134. new ApsConstraintProvider(), ApsSolution.class, ProductionProcesses.class);*/
  135. }
  136. public static void testAps(){
  137. log.info("app start...");
  138. Date startDate = DateUtil.parseDateTime("2024-03-06 17:00:12");
  139. LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
  140. // ApsConstraintProvider.startTimeLong = startDate.getTime();
  141. // ApsSolution.startTime = startTime;
  142. SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
  143. .withSolutionClass(ApsSolution.class)
  144. .withEntityClasses(ProductionProcesses.class)
  145. .withConstraintProviderClass(ApsConstraintProvider.class)
  146. .withTerminationSpentLimit(Duration.ofSeconds(20)));
  147. Solver<ApsSolution> solver = solverFactory.buildSolver();
  148. // System.out.println("\nProcesses:\n" + unsolvedCloudBalance.toStringProcessList());
  149. // Display the computer list
  150. // System.out.println("\nComputers:\n" + unsolvedCloudBalance.toStringComputerList());
  151. ApsSolution apsSolution = getTestApsSolution();
  152. log.info("start to solve...");
  153. ApsSolution solvedBalance = solver.solve(getTestApsSolution());
  154. System.out.println("*****************************");
  155. System.out.println(solvedBalance);
  156. SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
  157. System.out.println(scoreManager.explain(solvedBalance));
  158. System.out.println("*****************************");
  159. System.out.println(solvedBalance);
  160. // Display the result
  161. // System.out.println("\nSolved cloudBalance with 3 computers and 12 processes:\n" + toDisplayString(solvedCloudBalance));
  162. }
  163. public static ApsSolution getTestApsSolution(){
  164. ApsSolution unsolvedCloudBalance = new ApsSolution();
  165. // 设备列表初始化
  166. List<Equipment> equipmentList = new ArrayList<>();
  167. Equipment eq1 = new Equipment("1","均热炉");
  168. Equipment eq2 = new Equipment("2","均热炉");
  169. Equipment eq3 = new Equipment("3","卧式分切机");
  170. Equipment eq4 = new Equipment("4","卧式分切机");
  171. Equipment eq5 = new Equipment("5","卧式分切机");
  172. Equipment eq6 = new Equipment("6","厚纵剪");
  173. Equipment eq7 = new Equipment("7","厚纵剪");
  174. Equipment eq8 = new Equipment("8","氮气保护退火炉");
  175. equipmentList.add(eq1);
  176. equipmentList.add(eq2);
  177. equipmentList.add(eq3);
  178. equipmentList.add(eq4);
  179. equipmentList.add(eq5);
  180. equipmentList.add(eq6);
  181. equipmentList.add(eq7);
  182. equipmentList.add(eq8);
  183. unsolvedCloudBalance.setEquipmentList(equipmentList);
  184. // 工步初始化
  185. List<ProductionProcesses> processes = new ArrayList<>();
  186. // 订单初始化
  187. ProduceOrder produceOrder1 = new ProduceOrder("order1","订单1", DateUtil.parseDateTime("2024-03-06 19:20:12"));
  188. ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-03-06 19:20:12"));
  189. ProductionProcesses p1 = new ProductionProcesses("1","均热炉",Arrays.asList(new ProduceOrder[]{produceOrder1}),10);
  190. p1.setOptionalEquipments(Arrays.asList(new String[]{"1","2"}));
  191. ProductionProcesses p2 = new ProductionProcesses("2","卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder1}),12);
  192. p2.setOptionalEquipments(Arrays.asList(new String[]{"3","4","5"}));
  193. ProductionProcesses p6 = new ProductionProcesses("6","氮气保护退火炉",Arrays.asList(new ProduceOrder[]{produceOrder1,produceOrder2}),72);
  194. p6.setOptionalEquipments(Arrays.asList(new String[]{"8"}));
  195. p6.setMergeProcessMark("tuihuolu");
  196. // p1.setNextProcessesIds(Arrays.asList(new String[]{p2.getId()}));p2.setPreviousProcessesIds(Arrays.asList(new String[]{p1.getId()}));
  197. // p2.setNextProcessesIds(Arrays.asList(new String[]{p6.getId()}));
  198. p1.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p2}));p2.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p1}));
  199. p2.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));
  200. processes.add(p1);processes.add(p2);
  201. ProductionProcesses p3 = new ProductionProcesses("3","均热炉",Arrays.asList(new ProduceOrder[]{produceOrder2}),10);
  202. p3.setOptionalEquipments(Arrays.asList(new String[]{"1","2"}));
  203. ProductionProcesses p4 = new ProductionProcesses("4","卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder2}),12);
  204. p4.setOptionalEquipments(Arrays.asList(new String[]{"3","4","5"}));
  205. ProductionProcesses p5 = new ProductionProcesses("5","厚纵剪",Arrays.asList(new ProduceOrder[]{produceOrder2}),23);
  206. p5.setOptionalEquipments(Arrays.asList(new String[]{"6","7"}));
  207. // p3.setNextProcessesIds(Arrays.asList(new String[]{p4.getId()}));p4.setPreviousProcessesIds(Arrays.asList(new String[]{p3.getId()}));
  208. // p4.setNextProcessesIds(Arrays.asList(new String[]{p5.getId()}));p5.setPreviousProcessesIds(Arrays.asList(new String[]{p4.getId()}));
  209. // p5.setNextProcessesIds(Arrays.asList(new String[]{p6.getId()}));p6.setPreviousProcessesIds(Arrays.asList(new String[]{p2.getId(),p5.getId()}));
  210. p3.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p4}));p4.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p3}));
  211. p4.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p5}));p5.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p4}));
  212. p5.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));p6.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p2,p5}));
  213. processes.add(p3);processes.add(p4);processes.add(p5);processes.add(p6);
  214. unsolvedCloudBalance.setProcessesList(processes);
  215. return unsolvedCloudBalance;
  216. }
  217. private void testOne(Map<String,Integer> map){
  218. map.put("1",map.get("1")+2);
  219. }
  220. }