Browse Source

退火调度新模型排程优化

fangpengyuan 3 tháng trước cách đây
mục cha
commit
5bb3a57c0b

+ 31 - 3
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -3084,9 +3084,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         qz = 1100;
                     }
                     int zzdf = ppMap.size()*qz;
-                    if(hasMergeOldKeys != null && hasMergeOldKeys.size()>0){
+                    /*if(hasMergeOldKeys != null && hasMergeOldKeys.size()>0){
                         zzdf = zzdf + hasMergeOldKeys.size();
-                    }
+                    }*/
                     return zzdf;
                 })
                 .asConstraint("mergeTuihuo");
@@ -3161,7 +3161,35 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         for(int i=0;i<hasStartTimeProcess.size()-1;i++){
                             ProductionProcesses bfpps = hasStartTimeProcess.get(i);
                             ProductionProcesses afpps = hasStartTimeProcess.get(i+1);
-                            if(bfpps.getId() != null || afpps.getId() != null){
+
+                            List<EquipmentRunTime> bfppsRunTimes = equipment.getEquipmentRunTimes().stream().filter(v -> v.getStartRunTime().compareTo(bfpps.getStartTime()) == 0).collect(Collectors.toList());
+                            List<EquipmentRunTime> afppsRunTimes = equipment.getEquipmentRunTimes().stream().filter(v -> v.getStartRunTime().compareTo(afpps.getStartTime()) == 0).collect(Collectors.toList());
+
+                            boolean hasNowApsPros = true;
+                            // 前后道工序都是本批次排程的任务
+                            if(bfpps.getId() != null && afpps.getId() != null){
+                                if(bfppsRunTimes != null && bfppsRunTimes.size()>0 && afppsRunTimes != null && afppsRunTimes.size()>0){
+                                    hasNowApsPros = false;
+                                }
+                            }
+                            // 前道工序是本批次排程的任务
+                            else if (bfpps.getId() != null && afpps.getId() == null) {
+                                if(bfppsRunTimes != null && bfppsRunTimes.size()>0){
+                                    hasNowApsPros = false;
+                                }
+                            }
+                            // 后道工序是本批次排程的任务
+                            else if (bfpps.getId() == null && afpps.getId() != null) {
+                                if(afppsRunTimes != null && afppsRunTimes.size()>0){
+                                    hasNowApsPros = false;
+                                }
+                            }
+                            // 前后道工序都不是本批次排程的任务
+                            else{
+                                hasNowApsPros = false;
+                            }
+                            // 再判断前后道工序之间是否有碎片时间
+                            if(hasNowApsPros){
                                 if(bfpps.getEndTime().plusMinutes(300).compareTo(afpps.getStartTime())<0 && bfpps.getEndTime().plusMinutes(1200).compareTo(afpps.getStartTime())>0){
                                     b++;
                                 }