refactor JIT backward changeover scheduling

parent b1b2a85e
...@@ -18,6 +18,8 @@ public class ScheduleResultDetail { ...@@ -18,6 +18,8 @@ public class ScheduleResultDetail {
private double Quantity; // 时间段 private double Quantity; // 时间段
private double efficiency=1;//效率 private double efficiency=1;//效率
private List<TimeSegment> usedSegment; private List<TimeSegment> usedSegment;
// true 表示换型段,false 表示加工段。
private boolean setup;
// Key 的 getter/setter // Key 的 getter/setter
......
...@@ -1297,40 +1297,48 @@ public class GeneticDecoder { ...@@ -1297,40 +1297,48 @@ public class GeneticDecoder {
lastGeneOnMachine=machineTasks.get(machineTasks.size()-1); lastGeneOnMachine=machineTasks.get(machineTasks.size()-1);
} }
BackwardChangeoverHelper backwardChangeoverHelper =
new BackwardChangeoverHelper(_globalParam, baseTime, machineCalculator);
// 下面开始生成正式的 geneDetails。 // 下面开始生成正式的 geneDetails。
// 与 buildMachinePreview 的区别是:这里得到的结果会继续向下写入 GAScheduleResult,成为真正排程结果。 // 与 buildMachinePreview 的区别是:这里得到的结果会继续向下写入 GAScheduleResult,成为真正排程结果。
//if (_globalParam.is_smoothChangeOver()) { if (true) {
if (false) { if (isJit) {
//是否考虑换型时间 BackwardChangeoverHelper.JitBackwardScheduleResult backwardResult =
Map<Integer,Object> reslte = calculateSetupTime(lastGeneOnMachine, operation, machine,earliestStartTime,processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(),chromosome.getAllOperations()); backwardChangeoverHelper.scheduleJitBackwardWithChangeover(machine, operation, earliestStartTime,
setupTime=(int)reslte.get(1);//换型时间 processingTimeTotal, processingTime, machineTasks, chromosome.getAllOperations());
int setupStartTime=(int)reslte.get(2);//换型开始时间 geneDetails = backwardResult.getGeneDetails();
//earliestStartTime=(int)reslte.get(3);//上个任务的结束时间 setupTime = backwardResult.getSetupTime();
earliestStartTime=(int)reslte.get(4);//最早开工时间 } else {
processingTimeTotal=(int)reslte.get(5);//processingTimeTotal // 非 JIT 正排 + 考虑换型:沿用原来的正排换型逻辑。
if(setupTime==0) Map<Integer,Object> reslte = calculateSetupTime(lastGeneOnMachine, operation, machine, earliestStartTime,
{ processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(), chromosome.getAllOperations());
setupTime = (int) reslte.get(1);//换型时间
int setupStartTime = (int) reslte.get(2);//换型开始时间
earliestStartTime = (int) reslte.get(4);//最早开工时间
processingTimeTotal = (int) reslte.get(5);//processingTimeTotal
if (setupTime == 0) {
geneDetails = machineCalculator.getNextAvailableTime(machine, operation, earliestStartTime, -1, geneDetails = machineCalculator.getNextAvailableTime(machine, operation, earliestStartTime, -1,
processingTimeTotal, machineTasks, operation.getIsInterrupt()!=1, true,processingTime, operation.getQuantity(), true,isJit); processingTimeTotal, machineTasks, operation.getIsInterrupt() != 1, true,
processingTime, operation.getQuantity(), true, isJit);
}else { } else {
CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = (CopyOnWriteArrayList<TimeSegment>) reslte.get(6); CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment =
(CopyOnWriteArrayList<TimeSegment>) reslte.get(6);
Map<Integer,Object> result = machineCalculator.CreateScheduleResult(machine, operation, processingTimeTotal, earliestStartTime, Map<Integer,Object> result = machineCalculator.CreateScheduleResult(machine, operation,
AvailableTimeSegment, processingTime, operation.getQuantity(), operation.getIsInterrupt() != 1, setupTime, _globalParam.is_smoothChangeOverInWeek(), setupStartTime,isJit); processingTimeTotal, earliestStartTime, AvailableTimeSegment, processingTime,
operation.getQuantity(), operation.getIsInterrupt() != 1, setupTime,
_globalParam.is_smoothChangeOverInWeek(), setupStartTime, isJit);
setupTime = (int) result.get(1);
setupTime=(int)result.get(1);
operation.setChangeLineTime(setupTime); operation.setChangeLineTime(setupTime);
geneDetails=(CopyOnWriteArrayList<ScheduleResultDetail>) result.get(2); geneDetails = (CopyOnWriteArrayList<ScheduleResultDetail>) result.get(2);
} }
}else { }
} else {
// 不考虑换型:是否倒排由 isJit 参数交给 MachineCalculator 控制。
geneDetails = machineCalculator.getNextAvailableTime(machine, operation, earliestStartTime, -1, geneDetails = machineCalculator.getNextAvailableTime(machine, operation, earliestStartTime, -1,
processingTimeTotal, machineTasks, operation.getIsInterrupt()!=1, true,processingTime, operation.getQuantity(), true,isJit); processingTimeTotal, machineTasks, operation.getIsInterrupt() != 1, true,
processingTime, operation.getQuantity(), true, isJit);
} }
// FileHelper.writeLogFile(" 开始 "+operation.getGroupId()+" : "+operation.getId()+",处理时间: " + processingTime + ", 后处理: " + teardownTime + // FileHelper.writeLogFile(" 开始 "+operation.getGroupId()+" : "+operation.getId()+",处理时间: " + processingTime + ", 后处理: " + teardownTime +
// ", 前处理: " + preTime + ", 换型: " + setupTime+ ", 数量: " + operation.getQuantity()+ ", 设备: "+machine.getId()+ ", 是否可中断: "+operation.getIsInterrupt()); // ", 前处理: " + preTime + ", 换型: " + setupTime+ ", 数量: " + operation.getQuantity()+ ", 设备: "+machine.getId()+ ", 是否可中断: "+operation.getIsInterrupt());
...@@ -2593,6 +2601,8 @@ if(geneDetails!=null&&geneDetails.size()>0) ...@@ -2593,6 +2601,8 @@ if(geneDetails!=null&&geneDetails.size()>0)
private String ConvertTime(int minute) { private String ConvertTime(int minute) {
return baseTime.plusSeconds(minute).format(java.time.format.DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm")); return baseTime.plusSeconds(minute).format(java.time.format.DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm"));
} }
private Map<Integer,Object> calculateSetupTime(GAScheduleResult lastGeneOnMachine, Entry operation, Machine machine, int earliestStartTime,int processingTimeTotal,boolean changeOverInWeek,List<Entry> allOperations) { private Map<Integer,Object> calculateSetupTime(GAScheduleResult lastGeneOnMachine, Entry operation, Machine machine, int earliestStartTime,int processingTimeTotal,boolean changeOverInWeek,List<Entry> allOperations) {
Map<Integer,Object> reslte=new HashMap<>(); Map<Integer,Object> reslte=new HashMap<>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment