Ver código fonte

新模型调度退火合并优化

fangpengyuan 2 meses atrás
pai
commit
0c3f3868a4

+ 31 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/tado/TaskStartTimeListenerTa.java

@@ -84,12 +84,38 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
             for (int i = index; i < tasks.size(); i++) {
                 ProductionProcessesTa t = tasks.get(i);
                 LocalDateTime previousLastEndTime = getEarlyStartTime(t, equipmentTa,allProcessesList);
+
+                boolean isMergePrePro = false;
                 if(i>0){
                     ProductionProcessesTa pret = tasks.get(i-1);
                     if(previousLastEndTime.compareTo(pret.getStartTime())<=0){
                         // 设置当前工序和上道工序开始时间一样(即合并为同一炉)
                         if(thMerge(tasks,i,equipmentTa)){
                             previousEndTime = pret.getStartTime();
+                            isMergePrePro = true;
+                        }
+                    }
+                }
+
+                // 最晚结束时间
+                LocalDateTime mergeMaxEndTime = previousEndTime.plusMinutes(t.getProduceTime());
+                if(isMergePrePro){
+                    // 递归前道工序获取当前工序的前一炉退火工序
+                    List<ProductionProcessesTa> mergePros = new ArrayList<>();
+                    for (int j = i-1; j >= 0 ; j--) {
+                        if(mergePros.size() == 0){
+                            mergePros.add(tasks.get(j));
+                        }else{
+                            if(tasks.get(j).getStartTime().compareTo(mergePros.get(0).getStartTime()) == 0){
+                                mergePros.add(tasks.get(j));
+                            }
+                        }
+                    }
+                    if(mergePros != null && mergePros.size() > 0){
+                        for (ProductionProcessesTa mergePro : mergePros) {
+                            if(mergePro.getEndTime().compareTo(mergeMaxEndTime)>0){
+                                mergeMaxEndTime = mergePro.getEndTime();
+                            }
                         }
                     }
                 }
@@ -109,7 +135,11 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
                 if(previousEndTime.compareTo(specificDateTime)>0){
                     int aa = 0;
                 }
-                previousEndTime = t.getEndTime();
+                if(isMergePrePro && mergeMaxEndTime.compareTo(t.getEndTime())>0){
+                    previousEndTime = mergeMaxEndTime;
+                }else{
+                    previousEndTime = t.getEndTime();
+                }
             }
         }
         // 非退火