refactor JIT backward changeover scheduling

parent b1b2a85e
......@@ -18,6 +18,8 @@ public class ScheduleResultDetail {
private double Quantity; // 时间段
private double efficiency=1;//效率
private List<TimeSegment> usedSegment;
// true 表示换型段,false 表示加工段。
private boolean setup;
// Key 的 getter/setter
......
......@@ -1297,40 +1297,48 @@ public class GeneticDecoder {
lastGeneOnMachine=machineTasks.get(machineTasks.size()-1);
}
BackwardChangeoverHelper backwardChangeoverHelper =
new BackwardChangeoverHelper(_globalParam, baseTime, machineCalculator);
// 下面开始生成正式的 geneDetails。
// 与 buildMachinePreview 的区别是:这里得到的结果会继续向下写入 GAScheduleResult,成为真正排程结果。
//if (_globalParam.is_smoothChangeOver()) {
if (false) {
//是否考虑换型时间
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(3);//上个任务的结束时间
earliestStartTime=(int)reslte.get(4);//最早开工时间
processingTimeTotal=(int)reslte.get(5);//processingTimeTotal
if(setupTime==0)
{
geneDetails = machineCalculator.getNextAvailableTime(machine, operation, earliestStartTime, -1,
processingTimeTotal, machineTasks, operation.getIsInterrupt()!=1, true,processingTime, operation.getQuantity(), true,isJit);
}else {
CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = (CopyOnWriteArrayList<TimeSegment>) reslte.get(6);
Map<Integer,Object> result = machineCalculator.CreateScheduleResult(machine, operation, processingTimeTotal, earliestStartTime,
AvailableTimeSegment, processingTime, operation.getQuantity(), operation.getIsInterrupt() != 1, setupTime, _globalParam.is_smoothChangeOverInWeek(), setupStartTime,isJit);
setupTime=(int)result.get(1);
operation.setChangeLineTime(setupTime);
geneDetails=(CopyOnWriteArrayList<ScheduleResultDetail>) result.get(2);
if (true) {
if (isJit) {
BackwardChangeoverHelper.JitBackwardScheduleResult backwardResult =
backwardChangeoverHelper.scheduleJitBackwardWithChangeover(machine, operation, earliestStartTime,
processingTimeTotal, processingTime, machineTasks, chromosome.getAllOperations());
geneDetails = backwardResult.getGeneDetails();
setupTime = backwardResult.getSetupTime();
} else {
// 非 JIT 正排 + 考虑换型:沿用原来的正排换型逻辑。
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,
processingTimeTotal, machineTasks, operation.getIsInterrupt() != 1, true,
processingTime, operation.getQuantity(), true, isJit);
} else {
CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment =
(CopyOnWriteArrayList<TimeSegment>) reslte.get(6);
Map<Integer,Object> result = machineCalculator.CreateScheduleResult(machine, operation,
processingTimeTotal, earliestStartTime, AvailableTimeSegment, processingTime,
operation.getQuantity(), operation.getIsInterrupt() != 1, setupTime,
_globalParam.is_smoothChangeOverInWeek(), setupStartTime, isJit);
setupTime = (int) result.get(1);
operation.setChangeLineTime(setupTime);
geneDetails = (CopyOnWriteArrayList<ScheduleResultDetail>) result.get(2);
}
}
}else {
} else {
// 不考虑换型:是否倒排由 isJit 参数交给 MachineCalculator 控制。
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 +
// ", 前处理: " + preTime + ", 换型: " + setupTime+ ", 数量: " + operation.getQuantity()+ ", 设备: "+machine.getId()+ ", 是否可中断: "+operation.getIsInterrupt());
......@@ -2593,6 +2601,8 @@ if(geneDetails!=null&&geneDetails.size()>0)
private String ConvertTime(int minute) {
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) {
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