Commit d5dfcb6f authored by Tong Li's avatar Tong Li

排产逻辑

parent 35468cd2
package com.aps.entity.basic; package com.aps.entity.basic;
import com.aps.entity.Algorithm.GAScheduleResult;
import lombok.Data; import lombok.Data;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -27,6 +28,11 @@ public class Machine { ...@@ -27,6 +28,11 @@ public class Machine {
*/ */
private int earliestTime=0; private int earliestTime=0;
/**
* 最后的任务,默认值:0
*/
private GAScheduleResult lastGene=null;
/** /**
* 总任务时间 * 总任务时间
*/ */
......
...@@ -474,18 +474,27 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -474,18 +474,27 @@ if(finishedOrder==null||finishedOrder.size()==0)
} }
int setupTime=0; int setupTime=0;
CopyOnWriteArrayList<GAScheduleResult> machineTasks =chromosome.getResult().stream() CopyOnWriteArrayList<GAScheduleResult> machineTasks=null;
.filter(t -> t.getMachineId() == machine.getId()) // CopyOnWriteArrayList<GAScheduleResult> machineTasks =chromosome.getResult().stream()
.sorted(Comparator.comparingInt(GAScheduleResult::getStartTime)) // .filter(t -> t.getMachineId() == machine.getId())
.collect(Collectors.toCollection(CopyOnWriteArrayList::new)); // .sorted(Comparator.comparingInt(GAScheduleResult::getStartTime))
// _globalParam.set_smoothChangeOver(false); // .collect(Collectors.toCollection(CopyOnWriteArrayList::new));
GAScheduleResult lastGeneOnMachine = machine.getLastGene();
if(lastGeneOnMachine!=null)
{
earliestStartTime = Math.max(earliestStartTime,lastGeneOnMachine.getEndTime());
}
// _globalParam.set_smoothChangeOver(false);
CopyOnWriteArrayList<ScheduleResultDetail> geneDetails=new CopyOnWriteArrayList<>(); CopyOnWriteArrayList<ScheduleResultDetail> geneDetails=new CopyOnWriteArrayList<>();
int bomtime=0; int bomtime=0;
if((operation.getMaterialRequirements()!=null&&operation.getTargetFinishedOperationId()==null)||calbom) { if((operation.getMaterialRequirements()!=null&&operation.getTargetFinishedOperationId()==null)||calbom) {
int earliestStartTimeold=earliestStartTime; int earliestStartTimeold=earliestStartTime;
if (_globalParam.is_smoothChangeOver()) { if (_globalParam.is_smoothChangeOver()) {
Map<Integer, Object> reslte = calculateSetupTime(machineTasks, operation, machine, earliestStartTime, processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(), "", null); Map<Integer, Object> reslte = calculateSetupTime(machine.getLastGene(), operation, machine, earliestStartTime, processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(), chromosome.getAllOperations());
// setupTime = (int) reslte.get(1);//换型时间 // setupTime = (int) reslte.get(1);//换型时间
// int setupStartTime = (int) reslte.get(2);//换型开始时间 // int setupStartTime = (int) reslte.get(2);//换型开始时间
//earliestStartTime=(int)reslte.get(3);//上个任务的结束时间 //earliestStartTime=(int)reslte.get(3);//上个任务的结束时间
...@@ -505,7 +514,7 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -505,7 +514,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
if (_globalParam.is_smoothChangeOver()) { if (_globalParam.is_smoothChangeOver()) {
//是否考虑换型时间 //是否考虑换型时间
Map<Integer,Object> reslte = calculateSetupTime(machineTasks, operation, machine,earliestStartTime,processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(),"",null); Map<Integer,Object> reslte = calculateSetupTime(machine.getLastGene(), operation, machine,earliestStartTime,processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(),chromosome.getAllOperations());
setupTime=(int)reslte.get(1);//换型时间 setupTime=(int)reslte.get(1);//换型时间
int setupStartTime=(int)reslte.get(2);//换型开始时间 int setupStartTime=(int)reslte.get(2);//换型开始时间
//earliestStartTime=(int)reslte.get(3);//上个任务的结束时间 //earliestStartTime=(int)reslte.get(3);//上个任务的结束时间
...@@ -514,7 +523,7 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -514,7 +523,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
if(setupTime==0) if(setupTime==0)
{ {
geneDetails = machineCalculator.getNextAvailableTime(machine, earliestStartTime, -1, geneDetails = machineCalculator.getNextAvailableTime(machine, earliestStartTime, -1,
processingTimeTotal, chromosome.getResult(), operation.IsInterrupt!=1, true,processingTime, operation.getQuantity(), true); processingTimeTotal, machineTasks, operation.IsInterrupt!=1, true,processingTime, operation.getQuantity(), true);
}else { }else {
CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = (CopyOnWriteArrayList<TimeSegment>) reslte.get(6); CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = (CopyOnWriteArrayList<TimeSegment>) reslte.get(6);
...@@ -629,7 +638,7 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -629,7 +638,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
// System.out.println("huanxingshijian="+result.getChangeOverTime()+"-------------------"+result.getOrderId()+"--------"+result.getExecId()+"---------"+prev.getOrderId()+"--------"+prev.getExecId()); // System.out.println("huanxingshijian="+result.getChangeOverTime()+"-------------------"+result.getOrderId()+"--------"+result.getExecId()+"---------"+prev.getOrderId()+"--------"+prev.getExecId());
chromosome.getResult().add(result); chromosome.getResult().add(result);
machine.setLastGene(result);
// FileHelper.writeLogFile(" 结束 "+ConvertTime(startTime)+"--"+ConvertTime(endTime)+" "+operation.getGroupId()+" : "+operation.getId()+",处理时间: " + processingTime + ", 后处理: " + teardownTime + // FileHelper.writeLogFile(" 结束 "+ConvertTime(startTime)+"--"+ConvertTime(endTime)+" "+operation.getGroupId()+" : "+operation.getId()+",处理时间: " + processingTime + ", 后处理: " + teardownTime +
// ", 前处理: " + preTime + ", 换型: " + setupTime+ ", 数量: " + operation.getQuantity()+ ", 设备: "+machine.getId()+ ", 是否可中断: "+operation.getIsInterrupt()); // ", 前处理: " + preTime + ", 换型: " + setupTime+ ", 数量: " + operation.getQuantity()+ ", 设备: "+machine.getId()+ ", 是否可中断: "+operation.getIsInterrupt());
...@@ -1118,7 +1127,109 @@ return getOperationBOMTime(currentOp, chromosome); ...@@ -1118,7 +1127,109 @@ return getOperationBOMTime(currentOp, chromosome);
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(CopyOnWriteArrayList<GAScheduleResult> machineTasks, Entry operation, Machine machine, int earliestStartTime,int processingTimeTotal,boolean changeOverInWeek,String lastExecId,Map<Integer,Object> lastsetupTime) { 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<>();
reslte.put(1,0);//换型时间
reslte.put(2,0);//换型开始时间
reslte.put(3,0);//上个任务的结束时间
reslte.put(4,earliestStartTime);//最早开工时间
reslte.put(5,processingTimeTotal);//总加工时长
if(lastGeneOnMachine==null)
{
return reslte;
}
// LocalDateTime startTime = baseTime.plus(earliestStartTime, ChronoUnit.SECONDS);
reslte.put(3,lastGeneOnMachine.getEndTime());//换型开始时间
String ExecId=lastGeneOnMachine.getExecId();
Entry prev= allOperations.stream().
filter(t->t.getExecId().equals(ExecId))
.findFirst().orElse(null);
int setupTime=0;
if(prev!=null)
{
//离散参数
// prev.getDiscreteParameter()
// setupTime = (prev.getProductId() != operation.getProductId())
// ? (int) discreteParameterMatrixService.getDiscreteParameterMatrixValue(prev, operation)
// : 0;
DiscreteParameterMatrixService discreteParameterMatrixService = SpringContextUtil.getBean(DiscreteParameterMatrixService.class);
DiscreteParameterDurationService discreteParameterDurationService = SpringContextUtil.getBean(DiscreteParameterDurationService.class);
double discreteParameterDurationValue = discreteParameterDurationService.calculateChangeoverTime(prev, operation, machine, allOperations, earliestStartTime,null);
double discreteParameterMatrixValue = discreteParameterMatrixService.getDiscreteParameterMatrixValue(operation, prev);
setupTime = (int) Math.max(discreteParameterDurationValue, discreteParameterMatrixValue);
// setupTime = (int) discreteParameterMatrixValue;
// System.out.println("换型时间"+discreteParameterMatrixValue);
// System.out.println(setupTime+"换型时间"+"huanxingshijian ");
}
// setupTime=20*3600;
operation.setChangeLineTime(setupTime);
reslte.put(1,setupTime);//换型时间
if(changeOverInWeek)//可以放到休息时间
{
CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = machineCalculator.getMachineAvailableTime(machine, earliestStartTime+setupTime,
processingTimeTotal, null, operation.IsInterrupt!=1);
if(AvailableTimeSegment!=null) {
reslte.put(6, AvailableTimeSegment);
int start = (int) ChronoUnit.SECONDS.between(baseTime, AvailableTimeSegment.get(0).getStart());
earliestStartTime = earliestStartTime > start ? earliestStartTime : start;
reslte.put(4, earliestStartTime);//最早开工时间
reslte.put(2,earliestStartTime-setupTime);//换型开始时间
}
//01 16:00 +20 -01 16:00 02 12:00 08:00 -18:00 01 16:18 02 08:00-12:00
//01 16:00 +10 -01 16:00 换型10:00 08:00
//01 18:00 +10 -02 08:00<0 换型 休息时间满足
//01 18:00 +20 -02 08:00>0
//01 18:00 +10 -02 00:00>0
return reslte;
}else {
//开始时间加上设置时间重新算
//如果是前提供任务是相同的则跳出
CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = machineCalculator.getMachineAvailableTime(machine, earliestStartTime,
processingTimeTotal+setupTime, null, operation.IsInterrupt!=1);
if(AvailableTimeSegment!=null) {
reslte.put(6, AvailableTimeSegment);
int start = (int) ChronoUnit.SECONDS.between(baseTime, AvailableTimeSegment.get(0).getStart());
earliestStartTime = earliestStartTime > start ? earliestStartTime : start;
reslte.put(4, earliestStartTime);//最早开工时间
reslte.put(2,earliestStartTime);//换型开始时间
reslte.put(5,processingTimeTotal+setupTime);//换型开始时间
}
}
// System.out.println("换型时间111"+setupTime);
return reslte;
}
private Map<Integer,Object> calculateSetupTime1(CopyOnWriteArrayList<GAScheduleResult> machineTasks, Entry operation, Machine machine, int earliestStartTime,int processingTimeTotal,boolean changeOverInWeek,String lastExecId,Map<Integer,Object> lastsetupTime) {
Map<Integer,Object> reslte=new HashMap<>(); Map<Integer,Object> reslte=new HashMap<>();
reslte.put(1,0);//换型时间 reslte.put(1,0);//换型时间
...@@ -1133,6 +1244,10 @@ return getOperationBOMTime(currentOp, chromosome); ...@@ -1133,6 +1244,10 @@ return getOperationBOMTime(currentOp, chromosome);
// LocalDateTime startTime = baseTime.plus(earliestStartTime, ChronoUnit.SECONDS); // LocalDateTime startTime = baseTime.plus(earliestStartTime, ChronoUnit.SECONDS);
GAScheduleResult lastGeneOnMachine=machineTasks.get(machineTasks.size()-1); GAScheduleResult lastGeneOnMachine=machineTasks.get(machineTasks.size()-1);
if(lastGeneOnMachine.getEndTime()>earliestStartTime) if(lastGeneOnMachine.getEndTime()>earliestStartTime)
{ {
CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = machineCalculator.getMachineAvailableTime(machine, earliestStartTime, CopyOnWriteArrayList<TimeSegment> AvailableTimeSegment = machineCalculator.getMachineAvailableTime(machine, earliestStartTime,
...@@ -1229,7 +1344,7 @@ return getOperationBOMTime(currentOp, chromosome); ...@@ -1229,7 +1344,7 @@ return getOperationBOMTime(currentOp, chromosome);
{ {
cha=cha+1;//加1是工序开始加工时间 cha=cha+1;//加1是工序开始加工时间
reslte.put(2,lastGeneOnMachine.getEndTime());//换型开始时间 reslte.put(2,lastGeneOnMachine.getEndTime());//换型开始时间
reslte = calculateSetupTime(machineTasks, operation, machine,earliestStartTime+cha,processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(), ExecId,reslte); // reslte = calculateSetupTime(machineTasks, operation, machine,earliestStartTime+cha,processingTimeTotal, _globalParam.is_smoothChangeOverInWeek(), ExecId,reslte);
} }
else { else {
...@@ -1242,7 +1357,7 @@ return getOperationBOMTime(currentOp, chromosome); ...@@ -1242,7 +1357,7 @@ return getOperationBOMTime(currentOp, chromosome);
//开始时间加上设置时间重新算 //开始时间加上设置时间重新算
//如果是前提供任务是相同的则跳出 //如果是前提供任务是相同的则跳出
reslte = calculateSetupTime(machineTasks, operation, machine,earliestStartTime,processingTimeTotal+setupTime, _globalParam.is_smoothChangeOverInWeek(),ExecId,reslte); // reslte = calculateSetupTime(machineTasks, operation, machine,earliestStartTime,processingTimeTotal+setupTime, _globalParam.is_smoothChangeOverInWeek(),ExecId,reslte);
} }
......
...@@ -271,10 +271,13 @@ public class MachineCalculator { ...@@ -271,10 +271,13 @@ public class MachineCalculator {
Machine machine, int processingTime, LocalDateTime currentTime, Machine machine, int processingTime, LocalDateTime currentTime,
String prevtime, CopyOnWriteArrayList<GAScheduleResult> existingTasks,double oneTime,double quantity, boolean checkprevtime, boolean islockMachineTime String prevtime, CopyOnWriteArrayList<GAScheduleResult> existingTasks,double oneTime,double quantity, boolean checkprevtime, boolean islockMachineTime
,boolean isInterrupt) { ,boolean isInterrupt) {
CopyOnWriteArrayList<GAScheduleResult> machineTasks =existingTasks.stream() CopyOnWriteArrayList<GAScheduleResult> machineTasks=null;
.filter(t -> t.getMachineId() == machine.getId()) if(existingTasks!=null) {
.sorted(Comparator.comparingInt(GAScheduleResult::getStartTime)) machineTasks = existingTasks.stream()
.collect(Collectors.toCollection(CopyOnWriteArrayList::new)); .filter(t -> t.getMachineId() == machine.getId())
.sorted(Comparator.comparingInt(GAScheduleResult::getStartTime))
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
}
CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>(); CopyOnWriteArrayList<ScheduleResultDetail> times = new CopyOnWriteArrayList<>();
......
...@@ -201,7 +201,6 @@ int newStartTime=0; ...@@ -201,7 +201,6 @@ int newStartTime=0;
} }
/** /**
* 移动工序方法 * 移动工序方法
* @param chromosome 染色体对象 * @param chromosome 染色体对象
...@@ -212,6 +211,35 @@ int newStartTime=0; ...@@ -212,6 +211,35 @@ int newStartTime=0;
public void moveOperation(Chromosome chromosome, List<Integer> opIds, int newStartTime, public void moveOperation(Chromosome chromosome, List<Integer> opIds, int newStartTime,
Long newMachineId, GlobalParam globalParam,int lockStartTime) { Long newMachineId, GlobalParam globalParam,int lockStartTime) {
List<Entry> allOperations = chromosome.getAllOperations(); List<Entry> allOperations = chromosome.getAllOperations();
for (Integer opId:opIds) {
GAScheduleResult targetResults = chromosome.getResult().stream()
.filter(r -> r.getOperationId() == opId).findFirst()
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
targetResults.setLockStartTime(1);
targetResults.setDesignatedStartTime(newStartTime);
Entry targetOp = allOperations.stream()
.filter(o -> o.getId() == opId)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
targetOp.setDesignatedStartTime(chromosome.getBaseTime().plusSeconds(newStartTime));
}
redecode(chromosome, chromosome.getBaseTime(), globalParam);
}
/**
* 移动工序方法
* @param chromosome 染色体对象
* @param opIds 工序ID
* @param newStartTime 新开始时间
* @param newMachineId 新设备ID
*/
public void moveOperation1(Chromosome chromosome, List<Integer> opIds, int newStartTime,
Long newMachineId, GlobalParam globalParam,int lockStartTime) {
List<Entry> allOperations = chromosome.getAllOperations();
int newStartTime1=newStartTime; int newStartTime1=newStartTime;
......
...@@ -28,7 +28,7 @@ public class DiscreteParameterDurationServiceImpl extends ServiceImpl<DiscretePa ...@@ -28,7 +28,7 @@ public class DiscreteParameterDurationServiceImpl extends ServiceImpl<DiscretePa
Machine machine, Machine machine,
List<Entry> allOperations,int startTime,List<GAScheduleResult> machineTasks) { List<Entry> allOperations,int startTime,List<GAScheduleResult> machineTasks) {
if ( machineTasks.isEmpty()) { if (machineTasks==null|| machineTasks.isEmpty()) {
return 0.0; return 0.0;
} }
...@@ -38,15 +38,7 @@ public class DiscreteParameterDurationServiceImpl extends ServiceImpl<DiscretePa ...@@ -38,15 +38,7 @@ public class DiscreteParameterDurationServiceImpl extends ServiceImpl<DiscretePa
return 0.0; return 0.0;
} }
// 获取设备上最后一个任务
GAScheduleResult lastGene = machineTasks.stream()
.filter(g -> g.getMachineId() == machine.getId())
.max(Comparator.comparingInt(GAScheduleResult::getEndTime))
.orElse(null);
if (lastGene == null) {
return 0.0;
}
......
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