|
@@ -6,6 +6,7 @@ import org.optaplanner.core.api.score.buildin.hardmediumsoft.HardMediumSoftScore
|
|
|
import org.optaplanner.core.api.score.stream.*;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
+import java.time.Duration;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
@@ -47,10 +48,12 @@ public class ApsConstraintListProvider implements ConstraintProvider {
|
|
|
//
|
|
|
// preNextProcessSameWorkShop(constraintFactory),
|
|
|
// SOFT
|
|
|
-// processNear(constraintFactory),
|
|
|
+ processNear(constraintFactory),
|
|
|
// lzbzSp(constraintFactory),
|
|
|
// eqTimeCrossMinTuihuoSoft(constraintFactory),
|
|
|
// preNextProcessSameEq(constraintFactory),
|
|
|
+
|
|
|
+ freeTimeEquipmentSoft(constraintFactory),
|
|
|
};
|
|
|
}
|
|
|
|
|
@@ -362,6 +365,15 @@ public class ApsConstraintListProvider implements ConstraintProvider {
|
|
|
pta.setEndTime(eqlastTime);
|
|
|
}
|
|
|
tasks.add(pta);
|
|
|
+ }else{
|
|
|
+ if(equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
|
|
|
+ for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
|
|
|
+ ProductionProcessesTa pta = new ProductionProcessesTa();
|
|
|
+ pta.setStartTime(equipmentRunTime.getStartRunTime());
|
|
|
+ pta.setEndTime(equipmentRunTime.getEndRunTime());
|
|
|
+ tasks.add(pta);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
tasks.addAll(equipment.getTasks());
|
|
|
|
|
@@ -373,6 +385,11 @@ public class ApsConstraintListProvider implements ConstraintProvider {
|
|
|
ProductionProcessesTa nextTask = tasks.get(i + 1);
|
|
|
if(preTask.getEndTime().plusMinutes(60).compareTo(nextTask.getStartTime())<0){
|
|
|
b = b + 100;
|
|
|
+ // 上道工序结束时间和下道开始时间的分钟差,再减去1小时
|
|
|
+// long durationInMinutes = Duration.between(preTask.getEndTime(), nextTask.getStartTime()).toMinutes()-60;
|
|
|
+// if(durationInMinutes>0){
|
|
|
+// b = (int) (b + durationInMinutes);
|
|
|
+// }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -383,6 +400,59 @@ public class ApsConstraintListProvider implements ConstraintProvider {
|
|
|
.asConstraint("freeTimeEquipment");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 设备生产的任务都在可选设备范围内
|
|
|
+ * @param constraintFactory
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Constraint freeTimeEquipmentSoft(ConstraintFactory constraintFactory) {
|
|
|
+ return constraintFactory.forEach(EquipmentTa.class)
|
|
|
+ .filter((equipment) -> {
|
|
|
+ return true;
|
|
|
+ })
|
|
|
+ .penalize(HardMediumSoftScore.ONE_SOFT,(equipment) -> {
|
|
|
+ int b = 0;
|
|
|
+ List<ProductionProcessesTa> tasks = new ArrayList<>();
|
|
|
+
|
|
|
+ if(equipment.getTasks() != null && equipment.getTasks().size()>0){
|
|
|
+ if(equipment.getLastProcessEndTime() != null){
|
|
|
+ ProductionProcessesTa pta = new ProductionProcessesTa();
|
|
|
+ LocalDateTime eqlastTime = equipment.getLastProcessEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
|
|
+ LocalDateTime startTime = equipment.getTasks().get(0).getApsOverallConfig().getStartTime();
|
|
|
+ if(startTime.compareTo(eqlastTime)>0){
|
|
|
+ pta.setStartTime(startTime.plusMinutes(-10));
|
|
|
+ pta.setEndTime(startTime);
|
|
|
+ }else{
|
|
|
+ pta.setStartTime(eqlastTime.plusMinutes(-10));
|
|
|
+ pta.setEndTime(eqlastTime);
|
|
|
+ }
|
|
|
+ tasks.add(pta);
|
|
|
+ }
|
|
|
+ tasks.addAll(equipment.getTasks());
|
|
|
+
|
|
|
+ // 根据开始时间排序
|
|
|
+ if(tasks.size()>1){
|
|
|
+ Collections.sort(tasks, Comparator.comparing(ProductionProcessesTa::getStartTime));
|
|
|
+ for (int i = 0; i < tasks.size()-1; i++) {
|
|
|
+ ProductionProcessesTa preTask = tasks.get(i);
|
|
|
+ ProductionProcessesTa nextTask = tasks.get(i + 1);
|
|
|
+ if(preTask.getEndTime().plusMinutes(60).compareTo(nextTask.getStartTime())<0){
|
|
|
+// b = b + 100;
|
|
|
+ // 上道工序结束时间和下道开始时间的分钟差,再减去1小时
|
|
|
+ long durationInMinutes = Duration.between(preTask.getEndTime(), nextTask.getStartTime()).toMinutes()-60;
|
|
|
+ if(durationInMinutes>0){
|
|
|
+ b = (int) (b + durationInMinutes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return b;
|
|
|
+ })
|
|
|
+ .asConstraint("freeTimeEquipmentSoft");
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 连续生产约束条件,同一设备的连续生产标识一样的工序、尽量排在一起
|
|
|
* 铸轧考虑换辊和立板
|
|
@@ -728,7 +798,10 @@ public class ApsConstraintListProvider implements ConstraintProvider {
|
|
|
return constraintFactory.forEach(ProductionProcessesTa.class)
|
|
|
.filter((process)->{
|
|
|
if(process.getPreviousProcesses() == null || process.getPreviousProcesses().size() == 0){
|
|
|
- if(process.getStartTime().compareTo(process.getApsOverallConfig().getStartTime())>0){
|
|
|
+ if(process.getStartTime() == null || process.getApsOverallConfig().getStartTime() == null){
|
|
|
+ int ma = 0;
|
|
|
+ }
|
|
|
+ if(process.getStartTime() != null && process.getStartTime().compareTo(process.getApsOverallConfig().getStartTime())>0){
|
|
|
return true;
|
|
|
}else{
|
|
|
return false;
|