Commit d209cd62 authored by DESKTOP-VKRD9QF\Administration's avatar DESKTOP-VKRD9QF\Administration
parents 20d04adf 15136f5f
package com.aps.entity.Algorithm;
import lombok.Data;
/**
* 作者:佟礼
* 时间:2026-01-15
*/
@Data
public class OperationSort {
int id;
int time;
int group;
/**
* 工序顺序
*/
public int sequence;
public OperationSort(int id, int time, int group, int sequence) {
this.id = id;
this.time = time;
this.group = group;
this.sequence = sequence;
}
}
...@@ -125,6 +125,14 @@ public class GeneticAlgorithm { ...@@ -125,6 +125,14 @@ public class GeneticAlgorithm {
if(population.size()<param.getTournamentSize()) if(population.size()<param.getTournamentSize())
{ {
best.setBaseTime(param.getBaseTime());
best.setOrderMaterials(orderMaterials);
best.setOperatRel(_entryRel);
if(best.getInitMachines()==null)
{
best.setInitMachines(ProductionDeepCopyUtil.deepCopyList(machines,Machine.class));
}
LocalDateTime endtime1=LocalDateTime.now(); LocalDateTime endtime1=LocalDateTime.now();
FileHelper.writeLogFile(String.format("排产-------总方案数%d----结束---%s----耗时%d----",population.size(),allOperations.get(0).getSceneId(),DateTimeUtil.diffDuration(starttime,endtime1).getSeconds()) ); FileHelper.writeLogFile(String.format("排产-------总方案数%d----结束---%s----耗时%d----",population.size(),allOperations.get(0).getSceneId(),DateTimeUtil.diffDuration(starttime,endtime1).getSeconds()) );
return best; return best;
......
...@@ -382,6 +382,8 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -382,6 +382,8 @@ if(finishedOrder==null||finishedOrder.size()==0)
int teardownTime = machineOption.getTeardownTime(); int teardownTime = machineOption.getTeardownTime();
int preTime = machineOption.getPreTime(); int preTime = machineOption.getPreTime();
int setupTime = calculateSetupTime(chromosome.getResult(), operation, machine, machineOption); int setupTime = calculateSetupTime(chromosome.getResult(), operation, machine, machineOption);
...@@ -393,29 +395,6 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -393,29 +395,6 @@ if(finishedOrder==null||finishedOrder.size()==0)
// 确定任务的最早开始时间(基于前一道工序的完整结束时间,包含后处理) // 确定任务的最早开始时间(基于前一道工序的完整结束时间,包含后处理)
int earliestStartTime = prevOperationEndTime; int earliestStartTime = prevOperationEndTime;
// 检查设备上是否有前一个任务
GAScheduleResult lastGeneOnMachine = chromosome.getResult().stream()
.filter(g -> g.getMachineId() == machine.getId())
.max(Comparator.comparingInt(GAScheduleResult::getEndTime))
.orElse(null);
if (lastGeneOnMachine != null) {
int machineAvailableTime = lastGeneOnMachine.getEndTime();
if (setupTime > 0) {
if (_globalParam.is_smoothSetup()) {
machineAvailableTime += setupTime;
// 平滑模式:换型在非工作时间进行,不额外占用设备时间
// System.out.println(" 平滑模式换型:在非工作时间进行,设备可用时间不变");
} else {
// 标准模式:换型需要额外占用设备时间
machineAvailableTime += setupTime;
// System.out.println(" 标准模式换型:需要额外占用设备 " + setupTime + " 分钟");
}
}
earliestStartTime = Math.max(earliestStartTime, machineAvailableTime);
}
// System.out.println(" 最终最早开始时间: " + earliestStartTime + // System.out.println(" 最终最早开始时间: " + earliestStartTime +
// " (前序工序结束含后处理: " + prevOperationEndTime + ", 设备可用: " + // " (前序工序结束含后处理: " + prevOperationEndTime + ", 设备可用: " +
...@@ -442,7 +421,6 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -442,7 +421,6 @@ if(finishedOrder==null||finishedOrder.size()==0)
CopyOnWriteArrayList<ScheduleResultDetail> geneDetails = machineCalculator.getNextAvailableTime(machine, earliestStartTime, -1, CopyOnWriteArrayList<ScheduleResultDetail> geneDetails = machineCalculator.getNextAvailableTime(machine, earliestStartTime, -1,
processingTimeTotal, chromosome.getResult(), operation.IsInterrupt!=1, true,processingTime, operation.getQuantity(), true); processingTimeTotal, chromosome.getResult(), operation.IsInterrupt!=1, true,processingTime, operation.getQuantity(), true);
...@@ -457,11 +435,22 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -457,11 +435,22 @@ if(finishedOrder==null||finishedOrder.size()==0)
.mapToInt(ScheduleResultDetail::getEndTime) .mapToInt(ScheduleResultDetail::getEndTime)
.max() .max()
.orElse(0); .orElse(0);
//换型时间是否占用设备加工时间
//10:00 开始上班 前面的任务:24:00 结束 开始换型 休息时间 10小时
// 换型时间 12小时
// 换型时间 - 中间休息时间 =2小时
//开工时间需往后延 2小时
// 冲突检测和解决 //设置时间平滑
final int finalStartTime = startTime; //前处理,准备工时 是否可以在前序未完工就开始时间, 就是
final int finalEndTime = endTime;
// 冲突检测和解决
final int finalStartTime = startTime;//10:00 12
final int finalEndTime = endTime;//15:00
// 7:00-9:00 1
//7:00-11:00 2
// 10<9&&15>7 1
// 10<11&&15>7 2 有任务
GAScheduleResult conflictingGene = chromosome.getResult().stream() GAScheduleResult conflictingGene = chromosome.getResult().stream()
.filter(g -> g.getMachineId() == machine.getId()) .filter(g -> g.getMachineId() == machine.getId())
.filter(g -> (finalStartTime < g.getEndTime() && finalEndTime > g.getStartTime())) .filter(g -> (finalStartTime < g.getEndTime() && finalEndTime > g.getStartTime()))
...@@ -470,7 +459,7 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -470,7 +459,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
if (conflictingGene != null) { if (conflictingGene != null) {
// System.out.println(" ⚠️ 检测到时间冲突,重新调度"); // System.out.println(" ⚠️ 检测到时间冲突,重新调度");
int conflictSetupStartTime = conflictingGene.getEndTime(); int conflictSetupStartTime = conflictingGene.getEndTime(); //11:00
int conflictSetupTime = calculateSetupTimeForConflict(chromosome.getResult(),operation , machine, machineOption, conflictingGene); int conflictSetupTime = calculateSetupTimeForConflict(chromosome.getResult(),operation , machine, machineOption, conflictingGene);
int conflictEarliestStartTime = conflictSetupStartTime + conflictSetupTime; int conflictEarliestStartTime = conflictSetupStartTime + conflictSetupTime;
...@@ -843,6 +832,7 @@ if(finishedOrder==null||finishedOrder.size()==0) ...@@ -843,6 +832,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
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 int calculateSetupTime(List<GAScheduleResult> existingGenes, Entry operation, Machine machine, MachineOption machineOption) { private int calculateSetupTime(List<GAScheduleResult> existingGenes, Entry operation, Machine machine, MachineOption machineOption) {
GAScheduleResult lastGeneOnMachine = existingGenes.stream() GAScheduleResult lastGeneOnMachine = existingGenes.stream()
.filter(g -> g.getMachineId() == machine.getId()) .filter(g -> g.getMachineId() == machine.getId())
.max(Comparator.comparingInt(GAScheduleResult::getEndTime)) .max(Comparator.comparingInt(GAScheduleResult::getEndTime))
......
...@@ -36,11 +36,18 @@ public class ScheduleOperationService { ...@@ -36,11 +36,18 @@ public class ScheduleOperationService {
Long newMachineId, GlobalParam globalParam,int lockStartTime) { Long newMachineId, GlobalParam globalParam,int lockStartTime) {
List<Entry> allOperations = chromosome.getAllOperations(); List<Entry> allOperations = chromosome.getAllOperations();
int newStartTime1=newStartTime; int newStartTime1=newStartTime;
Map<Integer, Integer> opTimeMap = chromosome.getResult().stream() Map<Integer, Integer> opTimeMap = chromosome.getResult().stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
GAScheduleResult::getOperationId, GAScheduleResult::getOperationId,
r -> r.getStartTime() r -> r.getStartTime()
)); ));
List<OperationSort> opGroupMap = allOperations.stream()
.map(data -> new OperationSort(data.getId(), 0,data.getGroupId(),data.getSequence())) // 再提取字段
.collect(Collectors.toList());
Integer newMachineId1=newMachineId.intValue(); Integer newMachineId1=newMachineId.intValue();
for (Integer opId:opIds) { for (Integer opId:opIds) {
...@@ -55,6 +62,21 @@ Integer newMachineId1=newMachineId.intValue(); ...@@ -55,6 +62,21 @@ Integer newMachineId1=newMachineId.intValue();
.filter(o -> o.getId() == opId) .filter(o -> o.getId() == opId)
.findFirst() .findFirst()
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId)); .orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
if(targetOp.getSequence()>1) {
Entry targetOp1 = allOperations.stream()
.filter(o -> o.getGroupId() == targetOp.getGroupId()
&& o.getSequence() == targetOp.getSequence() - 1)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
GAScheduleResult targetResult1 = chromosome.getResult().stream()
.filter(r -> r.getOperationId() == targetOp1.getId())
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
if (targetResult1.getEndTime() < newStartTime)
{
throw new RuntimeException("不能早于前一工序的结束时间");
}
}
if(newMachineId1!=0) { if(newMachineId1!=0) {
int machineOptionIndex = targetOp.getMachineOptions().stream() int machineOptionIndex = targetOp.getMachineOptions().stream()
...@@ -85,25 +107,25 @@ Integer newMachineId1=newMachineId.intValue(); ...@@ -85,25 +107,25 @@ Integer newMachineId1=newMachineId.intValue();
targetResult.setLockStartTime(lockStartTime); targetResult.setLockStartTime(lockStartTime);
if(targetOp.getSequence()==1) { // if(targetOp.getSequence()==1) {
opTimeMap.put(opId, newStartTime); // opTimeMap.put(opId, newStartTime);
}else { // }else {
Entry targetOp1 = allOperations.stream() // Entry targetOp1 = allOperations.stream()
.filter(o -> o.getGroupId() == targetOp.getGroupId() // .filter(o -> o.getGroupId() == targetOp.getGroupId()
&&o.getSequence()==targetOp.getSequence()-1) // &&o.getSequence()==targetOp.getSequence()-1)
.findFirst() // .findFirst()
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId)); // .orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
GAScheduleResult targetResult1 = chromosome.getResult().stream() // GAScheduleResult targetResult1 = chromosome.getResult().stream()
.filter(r -> r.getOperationId() == targetOp1.getId()) // .filter(r -> r.getOperationId() == targetOp1.getId())
.findFirst() // .findFirst()
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId)); // .orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
if(targetResult1.getStartTime()<newStartTime) // if(targetResult1.getStartTime()<newStartTime)
{ // {
opTimeMap.put(opId, newStartTime); // opTimeMap.put(opId, newStartTime);
}else { // }else {
opTimeMap.put(opId, targetResult1.getStartTime()+1); // opTimeMap.put(opId, targetResult1.getStartTime()+1);
} // }
} // }
newStartTime=newStartTime+1; newStartTime=newStartTime+1;
} }
...@@ -126,19 +148,58 @@ Integer newMachineId1=newMachineId.intValue(); ...@@ -126,19 +148,58 @@ Integer newMachineId1=newMachineId.intValue();
List<Integer> operationSequencing = allOperations.stream()
opGroupMap.forEach(t->t.setTime(opTimeMap.get(t.getId())));
opGroupMap = opGroupMap.stream()
.sorted(Comparator.comparingLong(OperationSort::getTime))
.collect(Collectors.toList());
opGroupMap = opGroupMap.stream()
.sorted((op1, op2) -> { .sorted((op1, op2) -> {
int time1 = opTimeMap.getOrDefault(op1.getId(), Integer.MAX_VALUE); return Integer.compare(op2.getTime(), op1.getTime());
int time2 = opTimeMap.getOrDefault(op2.getId(), Integer.MAX_VALUE);
if (time1 != time2) {
return Integer.compare(time1, time2);
} else {
return Integer.compare(op1.getSequence(), op2.getSequence());
}
}) })
.map(Entry::getGroupId)
.collect(Collectors.toList()); .collect(Collectors.toList());
Map<Integer, Integer> groupMap=new HashMap<>();
Map<Integer, Integer> opidMap=new HashMap<>();
Map<Integer, OperationSort> outtimeMap=new HashMap<>();
List<OperationSort> newops=new ArrayList<>();
for (OperationSort op:opGroupMap) {
if(groupMap.containsKey(op.getGroup()))
{
if(groupMap.get(op.getGroup())<=op.getSequence())
{
outtimeMap.put(op.getId(),op);
}else {
opidMap.put(op.getGroup(),op.getSequence());
newops.add(op);
}
}else {
groupMap.put(op.getGroup(),op.getSequence());
opidMap.put(op.getGroup(),op.getId());
newops.add(op);
}
}
for (OperationSort op:outtimeMap.values()) {
int opid=(int) opidMap.get(op.getGroup());
OptionalInt index = IntStream.range(0, newops.size())
.filter(j -> opid==newops.get(j).getId())
.findFirst();
int opSeq =index.orElse(0) ;
newops.add(opSeq,op);
opidMap.put(op.getGroup(),op.getId());
}
List<Integer> operationSequencing = newops.stream()
.map(OperationSort::getGroup)
.collect(Collectors.toList());
Collections.reverse(operationSequencing);
chromosome.setOperationSequencing(operationSequencing); chromosome.setOperationSequencing(operationSequencing);
// 重新解码 // 重新解码
redecode(chromosome, chromosome.getBaseTime(), globalParam); redecode(chromosome, chromosome.getBaseTime(), globalParam);
...@@ -731,10 +792,10 @@ Integer newMachineId1=newMachineId.intValue(); ...@@ -731,10 +792,10 @@ Integer newMachineId1=newMachineId.intValue();
targetResults.forEach(t->t.setIsLocked(isLocked)); targetResults.forEach(t->t.setIsLocked(isLocked));
// 若解锁,重新解码受影响工序 // 若解锁,重新解码受影响工序
if (!isLocked) // if (!isLocked)
{ // {
redecode(chromosome, chromosome.getBaseTime(), globalParam); // redecode(chromosome, chromosome.getBaseTime(), globalParam);
} // }
} }
public void DelOperation(Chromosome chromosome, int opId, GlobalParam globalParam) { public void DelOperation(Chromosome chromosome, int opId, GlobalParam globalParam) {
......
...@@ -539,7 +539,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -539,7 +539,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
// WriteScheduleSummary(chromosome); // WriteScheduleSummary(chromosome);
ScheduleOperationService ScheduleOperation=new ScheduleOperationService(); ScheduleOperationService ScheduleOperation=new ScheduleOperationService();
WriteScheduleSummary(chromosome); // WriteScheduleSummary(chromosome);
ScheduleOperation.moveOperation(chromosome,opId, (int)ChronoUnit.SECONDS.between(chromosome.getBaseTime(), newStartTime),newMachineId, globalParam, lockStartTime); ScheduleOperation.moveOperation(chromosome,opId, (int)ChronoUnit.SECONDS.between(chromosome.getBaseTime(), newStartTime),newMachineId, globalParam, lockStartTime);
// WriteScheduleSummary(chromosome); // WriteScheduleSummary(chromosome);
...@@ -550,6 +550,8 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -550,6 +550,8 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
{ {
Chromosome chromosome= _sceneService.loadChromosomeFromFile(SceneId); Chromosome chromosome= _sceneService.loadChromosomeFromFile(SceneId);
ScheduleOperationService ScheduleOperation=new ScheduleOperationService(); ScheduleOperationService ScheduleOperation=new ScheduleOperationService();
WriteScheduleSummary(chromosome);
GlobalParam globalParam=new GlobalParam(); GlobalParam globalParam=new GlobalParam();
ScheduleOperation.redecode(chromosome, chromosome.getBaseTime(), globalParam); ScheduleOperation.redecode(chromosome, chromosome.getBaseTime(), globalParam);
WriteScheduleSummary(chromosome); WriteScheduleSummary(chromosome);
......
...@@ -37,14 +37,14 @@ public class PlanResultServiceTest { ...@@ -37,14 +37,14 @@ public class PlanResultServiceTest {
// NSGAIIUtils nsgaiiUtils=new NSGAIIUtils(); // NSGAIIUtils nsgaiiUtils=new NSGAIIUtils();
// nsgaiiUtils.Test(); // nsgaiiUtils.Test();
//planResultService.execute2("C5FB5EF2A7334A0A92F826F4937E1008"); planResultService.execute2("C5FB5EF2A7334A0A92F826F4937E1008");
// planResultService.execute2("726D4C1A712B4B1393175BD44B775B66"); // planResultService.execute2("726D4C1A712B4B1393175BD44B775B66");
planResultService.execute2("265F24B6DF3C40E4B17D193B0CC8AAF2"); // planResultService.execute2("265F24B6DF3C40E4B17D193B0CC8AAF2");
// LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11); // LocalDateTime t= LocalDateTime.of(2026, 02, 14, 1, 25, 52);
// List<Integer> opids=new ArrayList<>();BCA6FA43FFA444D3952CF8F6E1EA291B // List<Integer> opids=new ArrayList<>();//BCA6FA43FFA444D3952CF8F6E1EA291B
// opids.add(1); // opids.add(9);
// planResultService.Move("B571EF6682DB463AB2977B1055A74112",opids,t,3403L); // planResultService.Move("27065EA0ECD14A81B7FAAFEF52273F93",opids,t,1265l,0);
// planResultService.Redecode("12345679"); // planResultService.Redecode("27065EA0ECD14A81B7FAAFEF52273F93");
// MaintenanceWindow maintenanceWindow=new MaintenanceWindow(); // MaintenanceWindow maintenanceWindow=new MaintenanceWindow();
// maintenanceWindow.setStartTime(LocalDateTime.of(2025, 10, 21, 0, 0, 0)); // maintenanceWindow.setStartTime(LocalDateTime.of(2025, 10, 21, 0, 0, 0));
// maintenanceWindow.setEndTime(LocalDateTime.of(2025, 10, 31, 0, 0, 0)); // maintenanceWindow.setEndTime(LocalDateTime.of(2025, 10, 31, 0, 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