package com.rongwei.rwapsserver.aps; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.rongwei.rwapsserver.aps.domain.*; import com.rongwei.rwapsserver.aps.score.ApsConstraintProvider; import lombok.extern.slf4j.Slf4j; import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; import org.optaplanner.core.api.solver.SolutionManager; import org.optaplanner.core.api.solver.Solver; import org.optaplanner.core.api.solver.SolverFactory; import org.optaplanner.core.config.solver.SolverConfig; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.temporal.TemporalAdjusters; import java.util.*; @Slf4j public class ApsBalancingApplication { public static void main(String[] args) { // testAps(); /*String a = "1"; String b = "1"; System.out.println(a == b);*/ /*ProductionProcesses p1 = new ProductionProcesses(); ProductionProcesses p2 = new ProductionProcesses(); p1.setId(1111); p2.setId(2222); p1.setNextProcesses(p2); p2.setPreviousProcesses(p1); System.out.println(p2.getPreviousProcesses().getId());*/ /*Date date1 = DateUtil.parseDateTime("2024-02-22 20:01:23"); LocalDateTime time2 = LocalDateTime.now(); long a = DateUtil.between(Date.from(time2.atZone(ZoneId.systemDefault()).toInstant()),date1, DateUnit.DAY); System.out.println("a:"+a);*/ // System.out.println(JSONUtil.toJsonStr(getTestApsSolution())); /*Boolean a = null; if(a){ System.out.println("1111"); } System.out.println("2222");*/ /*Map map = new HashMap(); Integer a = 3; map.put("1",a); ApsBalancingApplication application = new ApsBalancingApplication(); application.testOne(map); System.out.println(map.get("1"));*/ /*List> list = new ArrayList<>(); Map map = new HashMap(); map.put("1",1);map.put("2",2);map.put("3",3);*/ // System.out.println((int)Math.ceil((double) 3/2)); /*Boolean a = true; while (a){ for (int i=0;i<10;i++){ if(i > 6){ a = false; break; } } } System.out.println("1111111");*/ /*LocalDateTime now = LocalDateTime.now(); List allRunTimes = new ArrayList<>(); EquipmentRunTime eq1 = new EquipmentRunTime(); eq1.setStartRunTime(now.plusMinutes(3)); EquipmentRunTime eq2 = new EquipmentRunTime(); eq2.setStartRunTime(now); EquipmentRunTime eq3 = new EquipmentRunTime(); eq3.setStartRunTime(now.plusMinutes(1)); allRunTimes.add(eq1);allRunTimes.add(eq2);allRunTimes.add(eq3); System.out.println(allRunTimes); allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime)); System.out.println(allRunTimes);*/ // System.out.println(1280/100); /*ProductionProcesses a = new ProductionProcesses(); a.setProduceTime(20); a.setStartTime(LocalDateTime.now()); LocalDateTime endTime = a.getStartTime(); System.out.println(a.getStartTime()); endTime = endTime.plusMinutes(10); System.out.println(a.getStartTime());*/ /*Date deliverydate = DateUtil.parseDateTime("2024-06-24 08:00:00"); Integer deliverytime = 33; DateTime dateTime = DateUtil.offsetHour(deliverydate, -deliverytime); System.out.println(dateTime);*/ /*Map> equipmentPlanActualTime = new HashMap<>(); List planActualTimeList = new ArrayList<>(); planActualTimeList.add(1);planActualTimeList.add(2); equipmentPlanActualTime.put("a",planActualTimeList); System.out.println(equipmentPlanActualTime); List planActualTimeList1 = equipmentPlanActualTime.get("a"); System.out.println(planActualTimeList1); planActualTimeList1.set(0,2); System.out.println(planActualTimeList1); System.out.println(equipmentPlanActualTime);*/ /*ProductionProcesses a = new ProductionProcesses(); a.setId("11111"); System.out.println(ObjectUtil.cloneByStream(a).getId());*/ /*String[] split = "1050^_^10500态热轧卷冷轧 厚6*宽1600mm 1吨^_^1600.00^_^6.0000^_^6.0000".split("\\^_\\^"); BigDecimal i1 = new BigDecimal("1600"); int cores = Runtime.getRuntime().availableProcessors(); System.out.println(cores);*/ /*BigDecimal thickness = new BigDecimal("1.2"); System.out.println(thickness.setScale(0, RoundingMode.CEILING).intValue()); Integer a = 1;Integer b = 1; System.out.println(a+b);*/ /*LocalDateTime now = LocalDateTime.now(); LocalDateTime nearestTenMinutes = now.minusSeconds(now.getSecond()) // 减去当前秒数 .minusNanos(now.getNano()) // 减去当前纳秒数 .plusMinutes(-now.getMinute() % 10) // 减去当前分钟数的余数,向下调整到最近的10的倍数 .plusMinutes(10); // 加上调整后的分钟数的余数 System.out.println(nearestTenMinutes);*/ /*List a = new ArrayList<>(); a.add("1"); List b = a; b.add("2"); System.out.println(a);*/ /*BigDecimal a = new BigDecimal("516.78"); System.out.println(a.intValue());*/ System.out.println( 5 % 3); System.out.println( 5 / 3); System.out.println( 5 * 3); } public static void constraintTest(){ // 构建约束校验器,入参:约束供应者实例,规划方案类,规划实体类 /*ConstraintVerifier constraintVerifier = ConstraintVerifier.build( new ApsConstraintProvider(), TimeTable.class, Lesson.class);*/ } public static void consTest(){ /*ConstraintVerifier constraintVerifier = ConstraintVerifier.build( new ApsConstraintProvider(), ApsSolution.class, ProductionProcesses.class);*/ } public static void testAps(){ log.info("app start..."); Date startDate = DateUtil.parseDateTime("2024-03-06 17:00:12"); LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); // ApsConstraintProvider.startTimeLong = startDate.getTime(); // ApsSolution.startTime = startTime; SolverFactory solverFactory = SolverFactory.create(new SolverConfig() .withSolutionClass(ApsSolution.class) .withEntityClasses(ProductionProcesses.class) .withConstraintProviderClass(ApsConstraintProvider.class) .withTerminationSpentLimit(Duration.ofSeconds(20))); Solver solver = solverFactory.buildSolver(); // System.out.println("\nProcesses:\n" + unsolvedCloudBalance.toStringProcessList()); // Display the computer list // System.out.println("\nComputers:\n" + unsolvedCloudBalance.toStringComputerList()); ApsSolution apsSolution = getTestApsSolution(); log.info("start to solve..."); ApsSolution solvedBalance = solver.solve(getTestApsSolution()); System.out.println("*****************************"); System.out.println(solvedBalance); SolutionManager scoreManager = SolutionManager.create(solverFactory); System.out.println(scoreManager.explain(solvedBalance)); System.out.println("*****************************"); System.out.println(solvedBalance); // Display the result // System.out.println("\nSolved cloudBalance with 3 computers and 12 processes:\n" + toDisplayString(solvedCloudBalance)); } public static ApsSolution getTestApsSolution(){ ApsSolution unsolvedCloudBalance = new ApsSolution(); // 设备列表初始化 List equipmentList = new ArrayList<>(); Equipment eq1 = new Equipment("1","均热炉"); Equipment eq2 = new Equipment("2","均热炉"); Equipment eq3 = new Equipment("3","卧式分切机"); Equipment eq4 = new Equipment("4","卧式分切机"); Equipment eq5 = new Equipment("5","卧式分切机"); Equipment eq6 = new Equipment("6","厚纵剪"); Equipment eq7 = new Equipment("7","厚纵剪"); Equipment eq8 = new Equipment("8","氮气保护退火炉"); equipmentList.add(eq1); equipmentList.add(eq2); equipmentList.add(eq3); equipmentList.add(eq4); equipmentList.add(eq5); equipmentList.add(eq6); equipmentList.add(eq7); equipmentList.add(eq8); unsolvedCloudBalance.setEquipmentList(equipmentList); // 工步初始化 List processes = new ArrayList<>(); // 订单初始化 ProduceOrder produceOrder1 = new ProduceOrder("order1","订单1", DateUtil.parseDateTime("2024-03-06 19:20:12")); ProduceOrder produceOrder2 = new ProduceOrder("order2","订单2", DateUtil.parseDateTime("2024-03-06 19:20:12")); ProductionProcesses p1 = new ProductionProcesses("1","均热炉",Arrays.asList(new ProduceOrder[]{produceOrder1}),10); p1.setOptionalEquipments(Arrays.asList(new String[]{"1","2"})); ProductionProcesses p2 = new ProductionProcesses("2","卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder1}),12); p2.setOptionalEquipments(Arrays.asList(new String[]{"3","4","5"})); ProductionProcesses p6 = new ProductionProcesses("6","氮气保护退火炉",Arrays.asList(new ProduceOrder[]{produceOrder1,produceOrder2}),72); p6.setOptionalEquipments(Arrays.asList(new String[]{"8"})); p6.setMergeProcessMark("tuihuolu"); // p1.setNextProcessesIds(Arrays.asList(new String[]{p2.getId()}));p2.setPreviousProcessesIds(Arrays.asList(new String[]{p1.getId()})); // p2.setNextProcessesIds(Arrays.asList(new String[]{p6.getId()})); p1.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p2}));p2.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p1})); p2.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6})); processes.add(p1);processes.add(p2); ProductionProcesses p3 = new ProductionProcesses("3","均热炉",Arrays.asList(new ProduceOrder[]{produceOrder2}),10); p3.setOptionalEquipments(Arrays.asList(new String[]{"1","2"})); ProductionProcesses p4 = new ProductionProcesses("4","卧式分切机",Arrays.asList(new ProduceOrder[]{produceOrder2}),12); p4.setOptionalEquipments(Arrays.asList(new String[]{"3","4","5"})); ProductionProcesses p5 = new ProductionProcesses("5","厚纵剪",Arrays.asList(new ProduceOrder[]{produceOrder2}),23); p5.setOptionalEquipments(Arrays.asList(new String[]{"6","7"})); // p3.setNextProcessesIds(Arrays.asList(new String[]{p4.getId()}));p4.setPreviousProcessesIds(Arrays.asList(new String[]{p3.getId()})); // p4.setNextProcessesIds(Arrays.asList(new String[]{p5.getId()}));p5.setPreviousProcessesIds(Arrays.asList(new String[]{p4.getId()})); // p5.setNextProcessesIds(Arrays.asList(new String[]{p6.getId()}));p6.setPreviousProcessesIds(Arrays.asList(new String[]{p2.getId(),p5.getId()})); p3.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p4}));p4.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p3})); p4.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p5}));p5.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p4})); p5.setNextProcesses(Arrays.asList(new ProductionProcesses[]{p6}));p6.setPreviousProcesses(Arrays.asList(new ProductionProcesses[]{p2,p5})); processes.add(p3);processes.add(p4);processes.add(p5);processes.add(p6); unsolvedCloudBalance.setProcessesList(processes); return unsolvedCloudBalance; } private void testOne(Map map){ map.put("1",map.get("1")+2); } }