ソースを参照

排程算法优化

fangpy 1 年間 前
コミット
c6762a0234

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

@@ -338,11 +338,11 @@ public class ProductionProcesses implements Serializable {
         }*/
         Integer maxDelay = 1;
         if(this.processType.equals("成退") || this.processType.equals("中退")){
-            maxDelay = 5000;
+            maxDelay = 2000;
         }else if(this.processType.equals("冷轧") || this.processType.equals("铸轧")){
-            maxDelay = 1000;
+            maxDelay = 500;
         }else{
-            maxDelay = 1000;
+            maxDelay = 500;
         }
         return ValueRangeFactory.createIntValueRange(0, maxDelay);
     }

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

@@ -1083,6 +1083,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     }
                     int i = (int) (DateUtil.between(deliveryMinDate, Date.from(productionProcesses.getEndTime().atZone(zoneId).toInstant()), DateUnit.MINUTE) + 1) * 10;
                     return i;
+//                    return 10000;
                 })
                 .asConstraint("deliveryDate");
     }
@@ -1192,7 +1193,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 })
                 .penalize(HardMediumSoftScore.ONE_MEDIUM,(equipmentId,processes)->{
                     int countNum = seriesProduceCount(processes);
-                    return countNum*100;
+                    return countNum*10;
                 })
                 .asConstraint("seriesProduce");
 
@@ -1204,6 +1205,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
         if(processes != null && processes.size()>0){
             equipment = processes.get(0).getEquipment();
         }
+        /*if(equipment.getId().equals("0001be252874536843730b100151")){
+            int abc = 1;
+        }*/
         List<ProductionProcesses> hasStartTimeProcess = processes.stream().filter(v -> v.getStartTime() != null).collect(Collectors.toList());
         // 设备占用时间参与连续生产排程
         if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
@@ -1378,7 +1382,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 })
                 .penalize(HardMediumSoftScore.ONE_MEDIUM,(equipmentEquassociated, processess) -> {
                     int washingFurnaceCount = seriesProduceWashingFurnaceCount(processess);
-                    return washingFurnaceCount*100;
+                    return washingFurnaceCount*10;
                 })
                 .asConstraint("seriesProduceWashingFurnace");
     }
@@ -1625,7 +1629,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         System.out.println("*********************************");
                     }*/
                     Map<String, List<ProductionProcesses>> listMap = processes.stream().collect(Collectors.groupingBy(ProductionProcesses::getEquipmentId));
-                    return listMap.size()*100;
+                    return listMap.size()*10;
                 })
                 .asConstraint("sameEquipment");
     }

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

@@ -28,6 +28,7 @@ import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -49,15 +50,19 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         }
         // 排程运行时长
         Integer maxPlanSeconds = productionScheduleVo.getPlanSeconds();
+        Integer prospeed = 20;
+        if(productionScheduleVo.getPcspeed() != null && productionScheduleVo.getPcspeed()>0){
+            prospeed = productionScheduleVo.getPcspeed();
+        }
         int processNum = productionScheduleVo.getProcesses().size();
-        int runPlanSeconds = (processNum/10 + 1)*60;
+        int runPlanSeconds = (processNum/prospeed + 1)*60;
         if(maxPlanSeconds == null || maxPlanSeconds <= 0){
             maxPlanSeconds = 1800;
         }
         if(runPlanSeconds > maxPlanSeconds){
             throw new ApsException("所选排程作业太多,预计排程时间太长,请分开排程");
         }
-
+//        int runPlanSeconds = maxPlanSeconds;
         EnvironmentMode mode = EnvironmentMode.REPRODUCIBLE;
         if(productionScheduleVo.getEnvironmentMode() != null && productionScheduleVo.getEnvironmentMode() == 1){
             mode = EnvironmentMode.FULL_ASSERT;
@@ -346,7 +351,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 process.setIfLock(true);
             }
             // 特殊冲突约束Map初始化
-            process.setConflictRoptions(new HashMap<>());
+            process.setConflictRoptions(new ConcurrentHashMap<>());
             // 唯一作业ID设值
             process.setUniqueBsProcessesId(process.getBsProcessesId().get(0));
         }
@@ -456,8 +461,9 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
     private void nextProSort(Map<String,Integer> sortMap,Map<String,List<ProductionProcesses>> bsMap,String uniqueBsProcessesId){
         List<ProductionProcesses> processesList1 = bsMap.get(uniqueBsProcessesId);
         if(processesList1 != null && processesList1.size()>0){
-            if(processesList1.get(0).getProcessType().equals("成退") || processesList1.get(0).getProcessType().equals("中退")){
-                List<ProductionProcesses> pres = bsMap.get(processesList1.get(0).getPreviousProcesses().get(0).getUniqueBsProcessesId());
+            if(processesList1.get(0).getProcessType().equals("成退") || processesList1.get(0).getProcessType().equals("中退")
+                    || processesList1.get(0).getProcessType().equals("冷轧") || processesList1.get(0).getProcessType().equals("铸轧")){
+//                List<ProductionProcesses> pres = bsMap.get(processesList1.get(0).getPreviousProcesses().get(0).getUniqueBsProcessesId());
                 if(processesList1.get(0).getPreviousProcesses() != null && processesList1.get(0).getPreviousProcesses().size()>0){
                     for (ProductionProcesses productionProcesses : processesList1) {
                         productionProcesses.setOrderMark(productionProcesses.getPreviousProcesses().get(0).getOrderMark());

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

@@ -63,5 +63,9 @@ public class ProductionScheduleVo {
      * 松散度
      */
     private BigDecimal looseness;
+    /**
+     * 排程速度
+     */
+    private Integer pcspeed;
 
 }

+ 1 - 0
rw-aps-server/src/main/resources/logback-spring.xml

@@ -29,6 +29,7 @@
     </logger>
 
 <!--    <logger name="org.optaplanner" level="trace"/>-->
+<!--    <logger name="org.optaplanner" level="debug"/>-->
     <logger name="org.optaplanner" level="info"/>
 
     <root level="info">