Explorar el Código

退火炉合并排程算法优化

fangpy hace 1 año
padre
commit
42d3004c3b

+ 7 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/listener/TaskStartTimeListener.java

@@ -490,6 +490,13 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             if(process.getPreviousProcesses() != null && process.getPreviousProcesses().size()>0){
                 // 单卷情况下前道工序只有一个
                 preProcess = process.getPreviousProcesses().get(0);
+                if(process.getPreviousProcesses().size()>1){
+                    for (ProductionProcesses previousProcess : process.getPreviousProcesses()) {
+                        if(previousProcess.getEndTime().compareTo(preProcess.getEndTime())>0){
+                            preProcess = previousProcess;
+                        }
+                    }
+                }
                 // 前道工序结束时间
                 endTime = preProcess.getEndTime();
             }

+ 27 - 23
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -119,35 +119,39 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         int a = 1;
                     }*/
                     boolean bln = false;
-                    if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
+                    /*if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
                         // 此种情况简化为前道工序只有一个
-                        ProductionProcesses preProcess = productionProcesses.getPreviousProcesses().get(0);
-                        // 流转时间(最小等待时间)
-                        Integer lzTimes = 0;
-                        if(preProcess.getEquipment() != null){
-                            if(preProcess.getEquipment().getWorkshopid() != null && preProcess.getEquipment().getWorkshopid().equals(productionProcesses.getEquipment().getWorkshopid())){
-                                lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
-                            }else{
-                                lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
-                            }
-                            // 最小等待时间对比流转时间
-                            if(preProcess.getMinWaitTime() != null && lzTimes<preProcess.getMinWaitTime()){
-                                lzTimes = preProcess.getMinWaitTime();
-                            }
-                            // 最大等待时间
-                            Integer maxWaitTime = preProcess.getMaxWaitTime();
-                            if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(lzTimes))<0){
-                                bln = true;
-                            }
-                            if(maxWaitTime != null && maxWaitTime>0){
-                                if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(maxWaitTime))>0){
+                        for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
+                            ProductionProcesses preProcess = previousProcess;
+                            // 流转时间(最小等待时间)
+                            Integer lzTimes = 0;
+                            if(preProcess.getEquipment() != null){
+                                if(preProcess.getEquipment().getWorkshopid() != null && preProcess.getEquipment().getWorkshopid().equals(productionProcesses.getEquipment().getWorkshopid())){
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
+                                }else{
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
+                                }
+                                // 最小等待时间对比流转时间
+                                if(preProcess.getMinWaitTime() != null && lzTimes<preProcess.getMinWaitTime()){
+                                    lzTimes = preProcess.getMinWaitTime();
+                                }
+                                // 最大等待时间
+                                Integer maxWaitTime = preProcess.getMaxWaitTime();
+                                if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(lzTimes))<0){
                                     bln = true;
                                 }
+                                if(maxWaitTime != null && maxWaitTime>0){
+                                    if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(maxWaitTime))>0){
+                                        bln = true;
+                                    }
+                                }
                             }
                         }
-                    }
+                    }*/
                     if(productionProcesses.getMaxWaitTime() != null && productionProcesses.getMaxWaitTime()>0
-                            && (productionProcesses.getNextProcesses() != null && productionProcesses.getNextProcesses().get(0).getIfLock() && productionProcesses.getNextProcesses().size()>0 && "成退,中退,小卷成退".contains(productionProcesses.getNextProcesses().get(0).getProcessType()))){
+                            && (productionProcesses.getNextProcesses() != null
+//                            && productionProcesses.getNextProcesses().get(0).getIfLock()
+                            && productionProcesses.getNextProcesses().size()>0 && "成退,中退,小卷成退".contains(productionProcesses.getNextProcesses().get(0).getProcessType()))){
                         if(productionProcesses.getNextProcesses() != null && productionProcesses.getNextProcesses().size()>0){
                             for (ProductionProcesses nextProcess : productionProcesses.getNextProcesses()) {
                                 if(nextProcess.getEquipment() != null && nextProcess.getStartTime() != null){

+ 1 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/ApsService.java

@@ -14,6 +14,6 @@ public interface ApsService {
 
     SolverFactory<ApsSolution> solverInit(ProductionScheduleVo productionScheduleVo);
 
-    List<ProductionProcesses> thProcessMerge(ProductionScheduleVo productionScheduleVo);
+    List<ProductionProcesses> thProcessMerge(ProductionScheduleVo productionScheduleVo,List<ProductionProcesses> otherThproces);
 
 }

+ 16 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/impl/ApsServiceImpl.java

@@ -169,7 +169,7 @@ public class ApsServiceImpl implements ApsService {
      * @return
      */
     @Override
-    public List<ProductionProcesses> thProcessMerge(ProductionScheduleVo productionScheduleVo){
+    public List<ProductionProcesses> thProcessMerge(ProductionScheduleVo productionScheduleVo,List<ProductionProcesses> otherThproces){
         List<ProductionProcesses> processes = productionScheduleVo.getProcesses();
         // 设备集合
         List<Equipment> equipmentList = productionScheduleVo.getEquipmentList();
@@ -219,12 +219,27 @@ public class ApsServiceImpl implements ApsService {
                         for (List<ProductionProcesses> thps : chunks) {
                             for (int i = 0; i < thps.size(); i++) {
                                 if(i>0){
+                                    otherThproces.add(thps.get(i));
                                     // 退火前一道作业设置下一作业ID
                                     ProductionProcesses prepro = allProMap.get(thps.get(i).getPreviousProcessesIds().get(0));
                                     List<String> nextids = new ArrayList<>();
                                     nextids.add(thps.get(0).getId());
                                     prepro.setNextProcessesIds(nextids);
                                     thps.get(0).getPreviousProcessesIds().add(prepro.getId());
+                                    // 退火后一道作业设置上一道作业ID
+                                    if(thps.get(i).getNextProcessesIds() != null && thps.get(i).getNextProcessesIds().size()>0){
+                                        for (String nextProcessesId : thps.get(i).getNextProcessesIds()) {
+                                            ProductionProcesses nextpro = allProMap.get(nextProcessesId);
+                                            List<String> preids = new ArrayList<>();
+                                            preids.add(thps.get(0).getId());
+                                            nextpro.setPreviousProcessesIds(preids);
+                                        }
+                                        thps.get(0).getNextProcessesIds().addAll(thps.get(i).getNextProcessesIds());
+                                    }
+                                    // 小卷退火卷数合并
+                                    if(thps.get(i).getProcessType().equals("小卷退火")){
+                                        thps.get(0).setMinThPcNum(thps.get(0).getMinThPcNum()+thps.get(i).getMinThPcNum());
+                                    }
                                 }
                             }
                             // 取第一个作业作为合并作业

+ 43 - 8
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/impl/ProductionScheduleServiceImpl.java

@@ -115,7 +115,8 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             }
         });
         // optaplanner 求解器数据装配
-        ApsSolution apsSolution = getPreApsSolution(productionScheduleVo);
+        List<ProductionProcesses> otherThproces = new ArrayList<>();
+        ApsSolution apsSolution = getPreApsSolution(productionScheduleVo,otherThproces);
         // 去掉锁定工序
         List<ProductionProcesses> notLocks = new ArrayList<>();
         List<ProductionProcesses> hasLocks = new ArrayList<>();
@@ -182,7 +183,41 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
         // 循环引用ProductionProcesses置空
 //        solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
+        if(otherThproces != null && otherThproces.size()>0){
+            for (ProductionProcesses otherThproce : otherThproces) {
+                String preid = otherThproce.getPreviousProcessesIds().get(0);
+                ProductionProcesses pres = null;
+                for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
+                    if(productionProcesses.getId().equals(preid)){
+                        pres = productionProcesses;
+                        break;
+                    }
+                }
+                if(pres.getNextProcesses() != null && pres.getNextProcesses().size()>0){
+                    ProductionProcesses thpro = pres.getNextProcesses().get(0);
+                    otherThproce.setStartTime(thpro.getStartTime());
+                    otherThproce.setEndTime(thpro.getEndTime());
+                    otherThproce.setEquipmentId(thpro.getEquipmentId());
+                    otherThproce.setEquipment(thpro.getEquipment());
+                    otherThproce.setConflictRoptions(thpro.getConflictRoptions());
 
+                    thpro.setOpeProducePcNum(1);
+                    List<String> preids = new ArrayList<>();
+                    preids.add(thpro.getPreviousProcessesIds().get(0));
+                    thpro.setPreviousProcessesIds(preids);
+                    if(thpro.getNextProcessesIds() != null && thpro.getNextProcessesIds().size()>0){
+                        List<String> nextids = new ArrayList<>();
+                        nextids.add(thpro.getNextProcessesIds().get(0));
+                        thpro.setNextProcessesIds(nextids);
+                    }
+                    if(thpro.getProcessType().equals("小卷成退")){
+                        thpro.setMinThPcNum(thpro.getMinThPcNum()-otherThproce.getMinThPcNum());
+                    }
+                }
+            }
+        }
+
+        solvedBalance.getProcessesList().addAll(otherThproces);
         for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
             productionProcesses.setPreviousProcesses(null);
             productionProcesses.setNextProcesses(null);
@@ -222,13 +257,10 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         ProductionProcesses newPre = null;
         List<ProductionProcesses> previousProcesses = process.getPreviousProcesses();
         if(previousProcesses != null){
-            ProductionProcesses preProcess = previousProcesses.get(0);
+            ProductionProcesses preProcess = process;
             if(!preProcess.getProcessType().equals("成退") && !preProcess.getProcessType().equals("中退") && !preProcess.getProcessType().equals("小卷成退")){
-                if(process.getId().equals("2294c17bb20549d28cbe9af149669988") || process.getId().equals("e23ea38146fb4f7bbb4a042c9a84dcba")){
-                    int a = 0;
-                }
                 Equipment equipment = preProcess.getEquipment();
-                newPre = maxWaitSet(equipment, process, processes, preProcess);
+                newPre = maxWaitSet(equipment, process.getNextProcesses().get(0), processes, preProcess);
                 if(newPre == null){
                     for (Equipment equipment1 : equipments) {
                         if(preProcess.getOptionalEquipments().contains(equipment1.getId()) && !equipment1.getId().equals(equipment.getId())){
@@ -611,7 +643,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
      * @param productionScheduleVo
      * @return
      */
-    private ApsSolution getPreApsSolution(ProductionScheduleVo productionScheduleVo){
+    private ApsSolution getPreApsSolution(ProductionScheduleVo productionScheduleVo,List<ProductionProcesses> otherThproces){
         ApsSolution unsolvedCloudBalance = new ApsSolution();
         // 排程全局配置
         ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
@@ -636,6 +668,8 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         for (ProductionProcesses process : productionScheduleVo.getProcesses()) {
             idMaps.put(String.join(",",process.getId()),process);
         }
+        List<ProductionProcesses> thList = apsService.thProcessMerge(productionScheduleVo,otherThproces);
+        productionScheduleVo.setProcesses(thList);
         for (ProductionProcesses process : productionScheduleVo.getProcesses()) {
             // 全局配置设置
             if(process.getApsOverallConfig() == null){
@@ -1010,7 +1044,8 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         if(productionScheduleVo.getEnvironmentMode() != null && productionScheduleVo.getEnvironmentMode() == 1){
             mode = EnvironmentMode.FULL_ASSERT;
         }
-        ApsSolution apsSolution = getPreApsSolution(productionScheduleVo);
+        List<ProductionProcesses> otherThproces = new ArrayList<>();
+        ApsSolution apsSolution = getPreApsSolution(productionScheduleVo,otherThproces);
         // 退火提前排序
         ApsSolution apsSolutionTh = apsService.tuihuoAps(apsSolution);
         if(apsSolutionTh.getProcessesList() != null && apsSolutionTh.getProcessesList().size()>0){