Procházet zdrojové kódy

APS平台新模型调优

fangpy před 1 rokem
rodič
revize
e3ea2e40df

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

@@ -80,7 +80,7 @@ public class ApsBalancingApplication {
         System.out.println(allRunTimes);
         allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
         System.out.println(allRunTimes);*/
-        System.out.println(DateUtil.now());
+        System.out.println((int)Math.ceil((double)1280/100));
     }
 
     public static void testAps(){

+ 0 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ApsSolution.java

@@ -45,7 +45,6 @@ public class ApsSolution extends ApsAbstractPersistable{
         return processesList;
     }
 
-    @ValueRangeProvider(id="equipmentRange")
     @ProblemFactCollectionProperty
     public List<Equipment> getEquipmentList() {
         return equipmentList;

+ 41 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProductionProcesses.java

@@ -1,7 +1,12 @@
 package com.rongwei.rwapsserver.aps.domain;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.rongwei.rwapsserver.aps.listener.TaskStartTimeListener;
+import com.rongwei.rwapsserver.aps.util.DelayStrengthComparator;
 import org.optaplanner.core.api.domain.entity.PlanningEntity;
+import org.optaplanner.core.api.domain.valuerange.CountableValueRange;
+import org.optaplanner.core.api.domain.valuerange.ValueRangeFactory;
+import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider;
 import org.optaplanner.core.api.domain.variable.AnchorShadowVariable;
 import org.optaplanner.core.api.domain.variable.PlanningVariable;
 import org.optaplanner.core.api.domain.variable.PlanningVariableGraphType;
@@ -46,6 +51,11 @@ public class ProductionProcesses extends Step{
      */
     private List<String> optionalEquipments;
 
+    /**
+     * 可选设备ID
+     */
+    private List<Equipment> optionalProviderEquipments;
+
     /**
      * 工步生产时的设备
      */
@@ -56,6 +66,11 @@ public class ProductionProcesses extends Step{
      */
     private Equipment equipment;
 
+    /**
+     * 延迟分钟数据(步长5分钟)
+     */
+    private Integer delay;
+
     private Step previousStep;
 
     /**
@@ -215,8 +230,34 @@ public class ProductionProcesses extends Step{
         return equipment;
     }
 
+    @PlanningVariable(strengthComparatorClass = DelayStrengthComparator.class)
+    public Integer getDelay() {
+        return delay;
+    }
+
+    public void setDelay(Integer delay) {
+        this.delay = delay;
+    }
+
+    @ValueRangeProvider(id="equipmentRange")
+    @JsonIgnore
+    public List<Equipment> getOptionalProviderEquipments() {
+        return optionalProviderEquipments;
+    }
+
+    @ValueRangeProvider
+    @JsonIgnore
+    public CountableValueRange<Integer> getDelayRange() {
+        return ValueRangeFactory.createIntValueRange(0, 200);
+    }
+
+    public void setOptionalProviderEquipments(List<Equipment> optionalProviderEquipments) {
+        this.optionalProviderEquipments = optionalProviderEquipments;
+    }
+
     //    @PlanningVariable(valueRangeProviderRefs={"timeRange"})
     @ShadowVariable(variableListenerClass = TaskStartTimeListener.class, sourceVariableName = "equipment")
+    @ShadowVariable(variableListenerClass = TaskStartTimeListener.class, sourceVariableName = "delay")
 //    @AnchorShadowVariable(sourceVariableName = "equipment")
     public LocalDateTime getStartTime() {
         return startTime;

+ 30 - 19
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/listener/TaskStartTimeListener.java

@@ -79,18 +79,30 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
      * @param process
      */
     private void setNextAllStartTime(ScoreDirector<ApsSolution> scoreDirector,ProductionProcesses process){
-        /*if("d49913c98e6945ca851f8231b62d9ea9".equals(process.getId()) && "0001be252874536843730b100021".equals(process.getEquipment().getId())){
-            System.out.println(process.getId());
-        }*/
-        LocalDateTime startDateTime = startTimeSet(process);
-        scoreDirector.beforeVariableChanged(process, "startTime");
-        process.setStartTime(startDateTime);
-        scoreDirector.afterVariableChanged(process, "startTime");
-        if(process.getNextProcesses() != null && process.getNextProcesses().size()>0){
-            for (ProductionProcesses nextProcess : process.getNextProcesses()) {
-                setNextAllStartTime(scoreDirector,nextProcess);
+        if(process.getEquipment() != null){
+            /*if("5ba50382a57648aebbcfce233160e4c5".equals(process.getId()) && "0001be252874536843730b100016".equals(process.getEquipment().getId())){
+                process.getId();
+            }*/
+            LocalDateTime startDateTime = startTimeSet(process);
+            if(process.getDelay() != null && process.getDelay()>0){
+                if(process.getProduceTime()>1000){
+                    int bc = (int) Math.ceil((double) process.getProduceTime() / 20);
+                    startDateTime = startDateTime.plusMinutes(process.getDelay() * bc);
+                }else{
+                    startDateTime = startDateTime.plusMinutes(process.getDelay() * 20);
+                }
+
+            }
+            scoreDirector.beforeVariableChanged(process, "startTime");
+            process.setStartTime(startDateTime);
+            scoreDirector.afterVariableChanged(process, "startTime");
+            if(process.getNextProcesses() != null && process.getNextProcesses().size()>0){
+                for (ProductionProcesses nextProcess : process.getNextProcesses()) {
+                    setNextAllStartTime(scoreDirector,nextProcess);
+                }
             }
         }
+
         // 前置任务最大等待时间修正
 //        preProcessCheck(scoreDirector,process);
     }
@@ -367,8 +379,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                 allRunTimes.add(copy);
                             }
                         }
-                        if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
-//                            System.out.println("process.getEquipment().getProcessesList():"+process.getEquipment().getProcessesList().size());
+                        /*if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
                             for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
                                 if(productionProcesses.getStartTime() != null && productionProcesses.getEndTime() != null && !productionProcesses.getId().equals(process.getId())){
                                     EquipmentRunTime copy = new EquipmentRunTime();
@@ -377,11 +388,11 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                     allRunTimes.add(copy);
                                 }
                             }
-                        }
+                        }*/
                         // 按照开始时间排序
                         allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
 
-                        /*if(allRunTimes.size()>0){
+                        if(allRunTimes.size()>0){
                             for (EquipmentRunTime equipmentRunTime : allRunTimes) {
                                 if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
                                     continue;
@@ -390,7 +401,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                     proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                                 }
                             }
-                        }*/
+                        }
 
                         toUpdateStartTime = proStartTime;
                     }
@@ -408,7 +419,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                         allRunTimes.add(copy);
                     }
                 }
-                if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
+                /*if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
                     for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
                         if(productionProcesses.getStartTime() != null && productionProcesses.getEndTime() != null && !productionProcesses.getId().equals(process.getId())){
                             EquipmentRunTime copy = new EquipmentRunTime();
@@ -417,10 +428,10 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                             allRunTimes.add(copy);
                         }
                     }
-                }
+                }*/
                 allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
 
-                /*if(allRunTimes.size()>0){
+                if(allRunTimes.size()>0){
                     for (EquipmentRunTime equipmentRunTime : allRunTimes) {
                         if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
                             continue;
@@ -429,7 +440,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                             proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                         }
                     }
-                }*/
+                }
                 toUpdateStartTime = proStartTime;
             }
 

+ 14 - 16
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -12,6 +12,7 @@ import org.optaplanner.core.api.score.stream.*;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static org.optaplanner.core.api.score.stream.ConstraintCollectors.count;
 
@@ -621,26 +622,23 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         equipment.setProcessesList(plist);
                     }
 
-                    for (ProductionProcesses process : processes) {
-                        if(process.getStartTime() == null){
-                            return false;
-                        }
-                    }
-                    if(processes != null && processes.size()>1){
+                    List<ProductionProcesses> hasStartTimeProcess = processes.stream().filter(v -> v.getStartTime() != null).collect(Collectors.toList());
+
+                    if(hasStartTimeProcess != null && hasStartTimeProcess.size()>1){
                         // 安装开始时间排序
-                        Collections.sort(processes, Comparator.comparing(ProductionProcesses::getStartTime));
+                        Collections.sort(hasStartTimeProcess, Comparator.comparing(ProductionProcesses::getStartTime));
                         // 临时标记
                         Boolean a = false;
-                        for(int i=0;i<processes.size()-1;i++){
-                            if(processes.get(i).getSeriesProduceMark() != null && processes.get(i+1).getSeriesProduceMark() != null){
-                                if("铸轧".equals(processes.get(i).getProcessType())){
-                                    if(!processes.get(i).getSeriesProduceMark().equals(processes.get(i+1).getSeriesProduceMark())){
+                        for(int i=0;i<hasStartTimeProcess.size()-1;i++){
+                            if(hasStartTimeProcess.get(i).getSeriesProduceMark() != null && hasStartTimeProcess.get(i+1).getSeriesProduceMark() != null){
+                                if("铸轧".equals(hasStartTimeProcess.get(i).getProcessType()) && "铸轧".equals(hasStartTimeProcess.get(i+1).getProcessType())){
+                                    if(!hasStartTimeProcess.get(i).getSeriesProduceMark().equals(hasStartTimeProcess.get(i+1).getSeriesProduceMark())){
                                         a = true;
                                         break;
                                     }
-                                } else if ("冷轧".equals(processes.get(i).getProcessType())) {
-                                    String[] serspre = processes.get(i).getSeriesProduceMark().split("^_^");
-                                    String[] sersafter = processes.get(i+1).getSeriesProduceMark().split("^_^");
+                                } else if ("冷轧".equals(hasStartTimeProcess.get(i).getProcessType()) && "冷轧".equals(hasStartTimeProcess.get(i+1).getProcessType())) {
+                                    String[] serspre = hasStartTimeProcess.get(i).getSeriesProduceMark().split("^_^");
+                                    String[] sersafter = hasStartTimeProcess.get(i+1).getSeriesProduceMark().split("^_^");
                                     if(serspre.length == 3 && sersafter.length == 3){
                                         if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
                                             a = true;
@@ -670,7 +668,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 })
                 .penalize(HardSoftScore.ONE_SOFT,(equipmentId,processes)->{
                     int b = 0;
-                    for(int i=0;i<processes.size()-1;i++){
+                    /*for(int i=0;i<processes.size()-1;i++){
                         if(processes.get(i).getSeriesProduceMark() != null && processes.get(i+1).getSeriesProduceMark() != null){
                             if("铸轧".equals(processes.get(i).getProcessType())){
                                 if(!processes.get(i).getSeriesProduceMark().equals(processes.get(i+1).getSeriesProduceMark())){
@@ -702,7 +700,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     if(b>0){
 //                        System.out.println("扣分:"+b);
                         return b;
-                    }
+                    }*/
                     return 1;
                 })
                 .asConstraint("seriesProduce");

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

@@ -50,9 +50,13 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             planSeconds = 60;
         }
 
+        EnvironmentMode mode = EnvironmentMode.REPRODUCIBLE;
+        if(productionScheduleVo.getEnvironmentMode() != null && productionScheduleVo.getEnvironmentMode() == 1){
+            mode = EnvironmentMode.FULL_ASSERT;
+        }
         // optaplanner 求解器配置实例化
         SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
-                .withEnvironmentMode(EnvironmentMode.FULL_ASSERT)
+                .withEnvironmentMode(mode)
                 .withSolutionClass(ApsSolution.class)
                 .withEntityClasses(ProductionProcesses.class)
                 .withConstraintProviderClass(ApsConstraintProvider.class)
@@ -88,6 +92,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             productionProcesses.setNextProcesses(null);
             productionProcesses.getEquipment().setProcessesList(null);
             productionProcesses.setPreviousStep(null);
+            productionProcesses.setOptionalProviderEquipments(null);
         }
         // 得分分析
         softExplain(explain,solvedBalance.getProcessesList());
@@ -197,6 +202,16 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             if(process.getUnitProduceTime() == null){
                 process.setUnitProduceTime((int)(Math.ceil((double)process.getProduceTime()/process.getProducePcNum())));
             }
+            // 可选设备初始化
+            if(process.getOptionalEquipments() != null){
+                List<Equipment> providedEq = new ArrayList<>();
+                for (Equipment equipment : productionScheduleVo.getEquipmentList()) {
+                    if(process.getOptionalEquipments().contains(equipment.getId())){
+                        providedEq.add(equipment);
+                    }
+                }
+                process.setOptionalProviderEquipments(providedEq);
+            }
         }
         // 设备列表初始化
         unsolvedCloudBalance.setEquipmentList(productionScheduleVo.getEquipmentList());

+ 12 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/util/DelayStrengthComparator.java

@@ -0,0 +1,12 @@
+package com.rongwei.rwapsserver.aps.util;
+
+import java.util.Comparator;
+
+public class DelayStrengthComparator implements Comparator<Integer> {
+
+    @Override
+    public int compare(Integer a, Integer b) {
+        return a.compareTo(b);
+    }
+
+}

+ 2 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/vo/ProductionScheduleVo.java

@@ -41,4 +41,6 @@ public class ProductionScheduleVo {
      */
     private Map<String,Integer> roamTime;
 
+    private Integer environmentMode;
+
 }