Commit 31d2cb46 authored by Tong Li's avatar Tong Li

bom

parent b1b2a85e
...@@ -42,7 +42,7 @@ public class GlobalParam { ...@@ -42,7 +42,7 @@ public class GlobalParam {
/// <summary> /// <summary>
/// 是否全局倒排 /// 是否全局倒排
/// </summary> /// </summary>
private boolean isJit = true; private boolean isJit = false;
private boolean _smoothSetup = false; // 设置时间平滑 工序的前处理是否提前 private boolean _smoothSetup = false; // 设置时间平滑 工序的前处理是否提前
......
...@@ -76,7 +76,7 @@ public class MachineCalculator { ...@@ -76,7 +76,7 @@ public class MachineCalculator {
public Map<Integer,Object> CreateScheduleResult( public Map<Integer,Object> CreateScheduleResult(
Machine machine,Entry operation, int processingTime, int proposedStartTime,CopyOnWriteArrayList<TimeSegment> timeSegments, Machine machine,Entry operation, int processingTime, int proposedStartTime,CopyOnWriteArrayList<TimeSegment> timeSegments,
double oneTime,double quantity double oneTime,double quantity
,boolean isInterrupt,int changeOvertTime,boolean changeOverInWeek,int setupStartTime,boolean isJit) { ,boolean isInterrupt,int changeOvertTime,boolean changeOverInWeek,int setupStartTime,boolean islockMachineTime,boolean isJit) {
LocalDateTime startTime = baseTime.plus(proposedStartTime, ChronoUnit.SECONDS); LocalDateTime startTime = baseTime.plus(proposedStartTime, ChronoUnit.SECONDS);
...@@ -167,7 +167,7 @@ public class MachineCalculator { ...@@ -167,7 +167,7 @@ public class MachineCalculator {
times= CaldScheduleResult( times= CaldScheduleResult(
machine, operation, processingTime, startTime, machine, operation, processingTime, startTime,
timeSegments, oneTime, quantity,isJit timeSegments, oneTime, quantity,islockMachineTime,isJit
); );
}else { }else {
...@@ -238,7 +238,7 @@ public class MachineCalculator { ...@@ -238,7 +238,7 @@ public class MachineCalculator {
.collect(Collectors.toCollection(CopyOnWriteArrayList::new)); .collect(Collectors.toCollection(CopyOnWriteArrayList::new));
times= CaldScheduleResult( times= CaldScheduleResult(
machine, operation, processingTime, startTime, machine, operation, processingTime, startTime,
timeSegments1, oneTime, quantity,isJit); timeSegments1, oneTime, quantity,islockMachineTime,isJit);
} else { } else {
double e= (double)processingTime/slot.getEfficiency(); double e= (double)processingTime/slot.getEfficiency();
...@@ -285,6 +285,18 @@ public class MachineCalculator { ...@@ -285,6 +285,18 @@ public class MachineCalculator {
CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>(); CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>();
if(operation.getQuantity()==0)
{
ScheduleResultDetail time = new ScheduleResultDetail();
time.setKey("");
time.setStartTime((int) ChronoUnit.SECONDS.between(baseTime, currentTime));
time.setEndTime((int) ChronoUnit.SECONDS.between(baseTime, currentTime));
time.setOneTime(oneTime);
time.setQuantity(quantity);
times.add(time);
return times;
}
TimeSegment slot = GetCurrentOrNextShift(machine, currentTime, prevtime, checkprevtime,isJit); TimeSegment slot = GetCurrentOrNextShift(machine, currentTime, prevtime, checkprevtime,isJit);
if (slot == null) return times; if (slot == null) return times;
LocalDateTime startCandidate=null; LocalDateTime startCandidate=null;
...@@ -333,11 +345,13 @@ public class MachineCalculator { ...@@ -333,11 +345,13 @@ public class MachineCalculator {
times.add(time); times.add(time);
if(islockMachineTime) {
CopyOnWriteArrayList<TimeSegment> usedSegments = RemoveMachineAvailable(machine, time, slot); CopyOnWriteArrayList<TimeSegment> usedSegments = RemoveMachineAvailable(machine, time, slot);
if (usedSegments != null && usedSegments.size() > 0) { if (usedSegments != null && usedSegments.size() > 0) {
machine.getAvailability().addAll(usedSegments); machine.getAvailability().addAll(usedSegments);
machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart)); machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart));
} }
}
return times; return times;
} }
} }
...@@ -426,10 +440,12 @@ public class MachineCalculator { ...@@ -426,10 +440,12 @@ public class MachineCalculator {
CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>(); CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList<TimeSegment> timeSegments= findAvailableSegments(machine, currentTime, machineTasks, remainingTime, isInterrupt,isJit); CopyOnWriteArrayList<TimeSegment> timeSegments= findAvailableSegments(machine, currentTime, machineTasks, remainingTime, isInterrupt,isJit);
if (timeSegments == null || timeSegments.isEmpty()) {
return null;
}
times= CaldScheduleResult( times= CaldScheduleResult(
machine, operation, processingTime, currentTime, machine, operation, processingTime, currentTime,
timeSegments, oneTime, quantity,isJit timeSegments, oneTime, quantity,islockMachineTime,isJit
); );
// int estimateIndex= (int) Math.ceil(remainingTime / (double) ONE_DAY_MINUTES); // int estimateIndex= (int) Math.ceil(remainingTime / (double) ONE_DAY_MINUTES);
...@@ -472,7 +488,7 @@ public class MachineCalculator { ...@@ -472,7 +488,7 @@ public class MachineCalculator {
private CopyOnWriteArrayList<ScheduleResultDetail> CaldScheduleResult( private CopyOnWriteArrayList<ScheduleResultDetail> CaldScheduleResult(
Machine machine,Entry operation, int processingTime, LocalDateTime currentTime, Machine machine,Entry operation, int processingTime, LocalDateTime currentTime,
CopyOnWriteArrayList<TimeSegment> timeSegments,double oneTime,double quantity CopyOnWriteArrayList<TimeSegment> timeSegments,double oneTime,double quantity
,boolean isJit) { , boolean islockMachineTime,boolean isJit) {
int remainingTime = processingTime; int remainingTime = processingTime;
CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>(); CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>();
...@@ -480,16 +496,12 @@ public class MachineCalculator { ...@@ -480,16 +496,12 @@ public class MachineCalculator {
int estimateIndex= (int) Math.ceil(remainingTime / (double) ONE_DAY_MINUTES); int estimateIndex= (int) Math.ceil(remainingTime / (double) ONE_DAY_MINUTES);
CopyOnWriteArrayList<TimeSegment> timeSegments1=null; CopyOnWriteArrayList<TimeSegment> timeSegments1=null;
if(estimateIndex>10)
{
timeSegments1= getEnoughSegmentsByEstimateIndex(timeSegments,currentTime,remainingTime,isJit);
if(timeSegments1.size()==2)
if(estimateIndex>10)
{ {
timeSegments1= getEnoughSegmentsByEstimateIndex(timeSegments,currentTime,remainingTime,isJit); timeSegments1= getEnoughSegmentsByEstimateIndex(timeSegments,currentTime,remainingTime,isJit);
int i=0;
}
} }
if(timeSegments1==null) { if(timeSegments1==null) {
...@@ -503,11 +515,12 @@ public class MachineCalculator { ...@@ -503,11 +515,12 @@ public class MachineCalculator {
ScheduleResultDetail time = (ScheduleResultDetail) outMap.get(2); ScheduleResultDetail time = (ScheduleResultDetail) outMap.get(2);
times.add(time); times.add(time);
// 还原未使用的时间段 // 还原未使用的时间段
CopyOnWriteArrayList<TimeSegment> usedSegments1= RemoveMachineAvailable(machine, time,shift); if(islockMachineTime) {
if(usedSegments1!=null&&usedSegments1.size()>0) CopyOnWriteArrayList<TimeSegment> usedSegments1 = RemoveMachineAvailable(machine, time, shift);
{ if (usedSegments1 != null && usedSegments1.size() > 0) {
usedSegments.addAll(usedSegments1); usedSegments.addAll(usedSegments1);
} }
}
i++; i++;
} }
...@@ -516,13 +529,13 @@ public class MachineCalculator { ...@@ -516,13 +529,13 @@ public class MachineCalculator {
machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart)); machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart));
} }
}else { }else {
times= CaldScheduleResultDetail(timeSegments1,machine, operation,currentTime,remainingTime,oneTime,isJit); times= CaldScheduleResultDetail(timeSegments1,machine, operation,currentTime,remainingTime,oneTime,islockMachineTime,isJit);
} }
return times; return times;
} }
private CopyOnWriteArrayList<ScheduleResultDetail> CaldScheduleResultDetail(CopyOnWriteArrayList<TimeSegment> timeSegments,Machine machine,Entry operation,LocalDateTime st,int remainingTime,double oneTime,boolean isJit) private CopyOnWriteArrayList<ScheduleResultDetail> CaldScheduleResultDetail(CopyOnWriteArrayList<TimeSegment> timeSegments,Machine machine,Entry operation,LocalDateTime st,int remainingTime,double oneTime,boolean islockMachineTime,boolean isJit)
{ {
int processable1 =(int)calculateTotalAvailableSecond(timeSegments, st,isJit); int processable1 =(int)calculateTotalAvailableSecond(timeSegments, st,isJit);
...@@ -538,19 +551,16 @@ public class MachineCalculator { ...@@ -538,19 +551,16 @@ public class MachineCalculator {
remainingTime=(int)outMap.get(1); remainingTime=(int)outMap.get(1);
ScheduleResultDetail time1=(ScheduleResultDetail)outMap.get(2); ScheduleResultDetail time1=(ScheduleResultDetail)outMap.get(2);
times.add(time1); times.add(time1);
CopyOnWriteArrayList<TimeSegment> usedSegments1 = RemoveMachineAvailable(machine, time1,shiftfrist); if(islockMachineTime) {
CopyOnWriteArrayList<TimeSegment> usedSegments1 = RemoveMachineAvailable(machine, time1, shiftfrist);
if (usedSegments1 != null && usedSegments1.size() > 0) { if (usedSegments1 != null && usedSegments1.size() > 0) {
usedSegments.addAll(usedSegments1); usedSegments.addAll(usedSegments1);
} }
}
// 计算有效时间 // 计算有效时间
//中间的数据 //中间的数据
CopyOnWriteArrayList<TimeSegment> timeSegments2= new CopyOnWriteArrayList<>(timeSegments.subList(1,timeSegments.size()-1)); CopyOnWriteArrayList<TimeSegment> timeSegments2= new CopyOnWriteArrayList<>(timeSegments.subList(1,timeSegments.size()-1));
if(timeSegments2==null||timeSegments2.size()==0)
{
int i=0;
}
LocalDateTime effectiveStart=timeSegments2.get(0).getStart(); LocalDateTime effectiveStart=timeSegments2.get(0).getStart();
LocalDateTime effectiveend=timeSegments2.get(timeSegments2.size()-1).getEnd(); LocalDateTime effectiveend=timeSegments2.get(timeSegments2.size()-1).getEnd();
...@@ -570,8 +580,10 @@ if(timeSegments2==null||timeSegments2.size()==0) ...@@ -570,8 +580,10 @@ if(timeSegments2==null||timeSegments2.size()==0)
time.setOneTime(oneTime); time.setOneTime(oneTime);
time.setUsedSegment(timeSegments2); time.setUsedSegment(timeSegments2);
timeSegments2.forEach(t->t.setUsed(true)); if(islockMachineTime) {
remainingTime-=processable; timeSegments2.forEach(t -> t.setUsed(true));
remainingTime -= processable;
}
times.add(time); times.add(time);
...@@ -584,7 +596,8 @@ if(timeSegments2==null||timeSegments2.size()==0) ...@@ -584,7 +596,8 @@ if(timeSegments2==null||timeSegments2.size()==0)
ScheduleResultDetail timelast=(ScheduleResultDetail)outMaplast.get(2); ScheduleResultDetail timelast=(ScheduleResultDetail)outMaplast.get(2);
times.add(timelast); times.add(timelast);
CopyOnWriteArrayList<TimeSegment> usedSegments2 = RemoveMachineAvailable(machine, timelast,shiftlast); if(islockMachineTime) {
CopyOnWriteArrayList<TimeSegment> usedSegments2 = RemoveMachineAvailable(machine, timelast, shiftlast);
if (usedSegments2 != null && usedSegments2.size() > 0) { if (usedSegments2 != null && usedSegments2.size() > 0) {
usedSegments.addAll(usedSegments2); usedSegments.addAll(usedSegments2);
} }
...@@ -593,6 +606,7 @@ if(timeSegments2==null||timeSegments2.size()==0) ...@@ -593,6 +606,7 @@ if(timeSegments2==null||timeSegments2.size()==0)
machine.getAvailability().addAll(usedSegments); machine.getAvailability().addAll(usedSegments);
machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart)); machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart));
} }
}
return times; return times;
} }
...@@ -1060,7 +1074,7 @@ if(timeSegments2==null||timeSegments2.size()==0) ...@@ -1060,7 +1074,7 @@ if(timeSegments2==null||timeSegments2.size()==0)
if (!requireContinuous || requiredMinutes <= 0) { if (!requireContinuous || requiredMinutes <= 0) {
return baseValidSegments; return baseValidSegments;
} }
//不可中断,中间不能休息
if(isJit) if(isJit)
{ {
......
...@@ -45,7 +45,7 @@ import static org.springframework.beans.BeanUtils.copyProperties; ...@@ -45,7 +45,7 @@ import static org.springframework.beans.BeanUtils.copyProperties;
@RequiredArgsConstructor @RequiredArgsConstructor
public class LanuchServiceImpl implements LanuchService { public class LanuchServiceImpl implements LanuchService {
private static final BigDecimal MAX_PROCESS_DURATION_DAYS = BigDecimal.valueOf(30); private static final BigDecimal MAX_PROCESS_DURATION_DAYS = BigDecimal.valueOf(90);
private static final BigDecimal SECONDS_PER_DAY = BigDecimal.valueOf(24L * 3600L); private static final BigDecimal SECONDS_PER_DAY = BigDecimal.valueOf(24L * 3600L);
private static final BigDecimal MAX_PROCESS_DURATION_SECONDS = private static final BigDecimal MAX_PROCESS_DURATION_SECONDS =
SECONDS_PER_DAY.multiply(MAX_PROCESS_DURATION_DAYS); SECONDS_PER_DAY.multiply(MAX_PROCESS_DURATION_DAYS);
......
...@@ -1911,7 +1911,7 @@ public class PlanResultService { ...@@ -1911,7 +1911,7 @@ public class PlanResultService {
.collect(Collectors.joining(",")); .collect(Collectors.joining(","));
} }
sb.append(String.format( sb.append(String.format(
"[%d-%d]:[%s-%s] Order %d,OrderID %s, Machine %d, Operation %d, Batch %.1f, processingTime %.1f, 前处理 %d, 后处理 %d, 离散参数 %d, bomtime %s,TargetOperationId %s", "[%d-%d]:[%s-%s] Order %d,OrderID %s, Machine %d, Operation %d, Quantity %.1f, processingTime %.1f, 前处理 %d, 后处理 %d, 离散参数 %d, bomtime %s,TargetOperationId %s",
job.getStartTime(), job.getStartTime(),
job.getEndTime(), job.getEndTime(),
ConvertTime(job.getStartTime()), ConvertTime(job.getStartTime()),
......
...@@ -40,9 +40,9 @@ public class PlanResultServiceTest { ...@@ -40,9 +40,9 @@ public class PlanResultServiceTest {
// sortService.test1(); // sortService.test1();
// nsgaiiUtils.Test(); // nsgaiiUtils.Test();
// planResultService.execute2("AD62106303684459949A7323D114BF60");//2000 planResultService.execute2("6D7C59CF2576457EBCB5F6CCDF5AF342");//2000
planResultService.execute2("15210B13B88A453F8B84AAC7F16C7541");//2000 // planResultService.execute2("15210B13B88A453F8B84AAC7F16C7541");//2000
// planResultService.execute2("E29F2B3ADA8149F6B916B5119296A92B");//2000 // planResultService.execute2("E29F2B3ADA8149F6B916B5119296A92B");//2000
// planResultService.execute2("E2CD1FC6FF9B4B19A59FEC7F846D4952");//600 // planResultService.execute2("E2CD1FC6FF9B4B19A59FEC7F846D4952");//600
......
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