|
@@ -21,6 +21,7 @@ import org.optaplanner.core.api.solver.event.BestSolutionChangedEvent;
|
|
|
import org.optaplanner.core.api.solver.event.SolverEventListener;
|
|
|
import org.optaplanner.core.config.solver.EnvironmentMode;
|
|
|
import org.optaplanner.core.config.solver.SolverConfig;
|
|
|
+import org.optaplanner.core.config.solver.termination.TerminationConfig;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import java.math.BigDecimal;
|
|
@@ -76,12 +77,12 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
// CPU核数
|
|
|
String cores = Runtime.getRuntime().availableProcessors() + "";
|
|
|
// optaplanner 求解器配置实例化
|
|
|
- SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
+ /*SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
.withEnvironmentMode(mode)
|
|
|
.withSolutionClass(ApsSolution.class)
|
|
|
.withEntityClasses(ProductionProcesses.class)
|
|
|
.withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
-// .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(10L))
|
|
|
+// .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(180L))
|
|
|
.withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
.withMoveThreadCount(cores)
|
|
|
);
|
|
@@ -120,7 +121,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
// solver.terminateEarly();
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ });*/
|
|
|
// optaplanner 求解器数据装配
|
|
|
List<ProductionProcesses> otherThproces = new ArrayList<>();
|
|
|
List<ProductionProcesses> otherNotThproces = new ArrayList<>();
|
|
@@ -212,7 +213,6 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
// }
|
|
|
apsSolution.setProcessesList(notLocks);
|
|
|
|
|
|
- SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
// 按照退火组炉分批排程
|
|
|
List<CommonJavaBean> orderMerges = produceOrderMerge(ordergrous,apsSolution);
|
|
|
Collections.sort(orderMerges, (pro1, pro2) -> {return pro2.getMaxVolumeWidth().compareTo(pro1.getMaxVolumeWidth());});
|
|
@@ -227,6 +227,55 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
List<ProductionProcesses> processesList1 = apsSolution.getProcessesList().stream().filter(m -> v.contains(m.getProduceOrder().get(0).getId())).collect(Collectors.toList());
|
|
|
apsSolution1.setProcessesList(processesList1);
|
|
|
apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
|
|
|
+
|
|
|
+ runPlanSeconds = (apsSolution1.getProcessesList().size()/prospeed + 1)*60;
|
|
|
+ SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
+ .withEnvironmentMode(mode)
|
|
|
+ .withSolutionClass(ApsSolution.class)
|
|
|
+ .withEntityClasses(ProductionProcesses.class)
|
|
|
+ .withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
+ .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(120L))
|
|
|
+// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
+ .withMoveThreadCount(cores)
|
|
|
+ );
|
|
|
+ Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
|
+ solver.addEventListener(new SolverEventListener<ApsSolution>() {
|
|
|
+ public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
|
|
|
+ if(solver.isEveryProblemChangeProcessed()) {
|
|
|
+ event.getNewBestSolution().setConstructionHeuristicEnd(true);
|
|
|
+ if(event.getNewBestSolution().getStepBestProcessesList() == null){
|
|
|
+ List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
+// List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
|
|
|
+ for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
|
|
|
+ ProductionProcesses newPro = new ProductionProcesses();
|
|
|
+ newPro.setId(productionProcesses.getId());
|
|
|
+ newPro.setEquipmentId(productionProcesses.getEquipmentId());
|
|
|
+ Equipment eq = new Equipment();
|
|
|
+ if(productionProcesses.getEquipment() != null){
|
|
|
+ eq.setId(productionProcesses.getEquipment().getId());
|
|
|
+ }
|
|
|
+ newPro.setEquipment(eq);
|
|
|
+ newPro.setProduceTime(productionProcesses.getProduceTime());
|
|
|
+ newPro.setStartTime(productionProcesses.getStartTime());
|
|
|
+ newPro.setEndTime(productionProcesses.getEndTime());
|
|
|
+ newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
+ processesList.add(newPro);
|
|
|
+
|
|
|
+ productionProcesses.setApsStatus("LS");
|
|
|
+ }
|
|
|
+ event.getNewBestSolution().setStepBestProcessesList(processesList);
|
|
|
+ }
|
|
|
+ System.out.println("************"+event.getNewBestScore()+"************");
|
|
|
+ log.info("************"+event.getNewBestScore()+"************");
|
|
|
+
|
|
|
+ // 终止排程
|
|
|
+// solver.terminateEarly();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
+
|
|
|
ApsSolution solvedBalance1 = solver.solve(apsSolution1);
|
|
|
log.info("**************排程评分分析***************");
|
|
|
ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance1);
|
|
@@ -257,11 +306,63 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
}
|
|
|
}
|
|
|
if(equass != null && equass.size()>0){
|
|
|
- equass.forEach((k,processesList1)->{
|
|
|
+ for(Map.Entry<String, List<ProductionProcesses>> entry : equass.entrySet()){
|
|
|
+ String k = entry.getKey();
|
|
|
+ List<ProductionProcesses> processesList1 = entry.getValue();
|
|
|
+
|
|
|
ApsSolution apsSolution1 = new ApsSolution();
|
|
|
apsSolution1.setStartTime(apsSolution.getStartTime());
|
|
|
apsSolution1.setProcessesList(processesList1);
|
|
|
apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
|
|
|
+
|
|
|
+ runPlanSeconds = (apsSolution1.getProcessesList().size()/prospeed + 1)*60;
|
|
|
+ SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
+ .withEnvironmentMode(mode)
|
|
|
+ .withSolutionClass(ApsSolution.class)
|
|
|
+ .withEntityClasses(ProductionProcesses.class)
|
|
|
+ .withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
+ .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(120L))
|
|
|
+// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
+ .withMoveThreadCount(cores)
|
|
|
+ );
|
|
|
+ Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
|
+ solver.addEventListener(new SolverEventListener<ApsSolution>() {
|
|
|
+ public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
|
|
|
+ if(solver.isEveryProblemChangeProcessed()) {
|
|
|
+ event.getNewBestSolution().setConstructionHeuristicEnd(true);
|
|
|
+ if(event.getNewBestSolution().getStepBestProcessesList() == null){
|
|
|
+ List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
+// List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
|
|
|
+ for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
|
|
|
+ ProductionProcesses newPro = new ProductionProcesses();
|
|
|
+ newPro.setId(productionProcesses.getId());
|
|
|
+ newPro.setEquipmentId(productionProcesses.getEquipmentId());
|
|
|
+ Equipment eq = new Equipment();
|
|
|
+ if(productionProcesses.getEquipment() != null){
|
|
|
+ eq.setId(productionProcesses.getEquipment().getId());
|
|
|
+ }
|
|
|
+ newPro.setEquipment(eq);
|
|
|
+ newPro.setProduceTime(productionProcesses.getProduceTime());
|
|
|
+ newPro.setStartTime(productionProcesses.getStartTime());
|
|
|
+ newPro.setEndTime(productionProcesses.getEndTime());
|
|
|
+ newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
+ processesList.add(newPro);
|
|
|
+
|
|
|
+ productionProcesses.setApsStatus("LS");
|
|
|
+ }
|
|
|
+ event.getNewBestSolution().setStepBestProcessesList(processesList);
|
|
|
+ }
|
|
|
+ System.out.println("************"+event.getNewBestScore()+"************");
|
|
|
+ log.info("************"+event.getNewBestScore()+"************");
|
|
|
+
|
|
|
+ // 终止排程
|
|
|
+// solver.terminateEarly();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
+
|
|
|
ApsSolution solvedBalance1 = solver.solve(apsSolution1);
|
|
|
log.info("**************排程评分分析***************");
|
|
|
ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance1);
|
|
@@ -275,7 +376,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
|
|
|
// 排程结束的数据手动添加到设备占用列表中
|
|
|
setEqRunTimes(solvedBalance1.getProcessesList());
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|