Commit 105c01f8 authored by Tong Li's avatar Tong Li

优化速度

parent 34d7e700
...@@ -361,7 +361,7 @@ public class GeneticAlgorithm { ...@@ -361,7 +361,7 @@ public class GeneticAlgorithm {
private void decode(GeneticDecoder decoder,Chromosome chromosome,ScheduleParams param, List<Entry> allOperations,List<GlobalOperationInfo> globalOpList) { private void decode(GeneticDecoder decoder,Chromosome chromosome,ScheduleParams param, List<Entry> allOperations,List<GlobalOperationInfo> globalOpList) {
chromosome.setResult(new ArrayList<>()); chromosome.setResult(new ArrayList<>());
_sceneService.saveChromosomeToFile(chromosome, "12345679");
// 假设Machine类有拷贝方法,或使用MapStruct等工具进行映射 // 假设Machine类有拷贝方法,或使用MapStruct等工具进行映射
// chromosome.setInitMachines(ProductionDeepCopyUtil.deepCopyList(machines)); // 简单拷贝,实际可能需要深拷贝 // chromosome.setInitMachines(ProductionDeepCopyUtil.deepCopyList(machines)); // 简单拷贝,实际可能需要深拷贝
chromosome.setMachines(ProductionDeepCopyUtil.deepCopyList(machines,Machine.class)); // 简单拷贝,实际可能需要深拷贝 chromosome.setMachines(ProductionDeepCopyUtil.deepCopyList(machines,Machine.class)); // 简单拷贝,实际可能需要深拷贝
......
...@@ -204,7 +204,7 @@ public class MachineCalculator { ...@@ -204,7 +204,7 @@ public class MachineCalculator {
i++; i++;
} }
}else { }else {
times= CaldScheduleResultDetail(timeSegments1,machine,st,remainingTime,oneTime); times= CaldScheduleResultDetail(timeSegments1,machine,st,remainingTime,oneTime);
} }
return times; return times;
...@@ -979,23 +979,22 @@ public class MachineCalculator { ...@@ -979,23 +979,22 @@ public class MachineCalculator {
private void RemoveMachineAvailable(Machine machine, ScheduleResultDetail geneDetails,TimeSegment targetSegment) { private void RemoveMachineAvailable(Machine machine, ScheduleResultDetail geneDetails,TimeSegment targetSegment) {
// 关键修复2:加锁(若多线程访问),避免并发修改 // 关键修复2:加锁(若多线程访问),避免并发修改
synchronized (machine.getAvailability()) {
List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability());
LocalDateTime geneEndTime = baseTime.plusSeconds(geneDetails.getEndTime());
LocalDateTime geneEndTime = baseTime.plusSeconds(geneDetails.getEndTime());
TimeSegment usedSegment = null;
if (targetSegment.getEnd().isAfter(geneEndTime)) { if (targetSegment.getEnd().isAfter(geneEndTime)) {
TimeSegment usedSegment = new TimeSegment();
usedSegment.setStart(baseTime.plusSeconds(geneDetails.getStartTime())); usedSegment.setStart(baseTime.plusSeconds(geneDetails.getStartTime()));
usedSegment.setEnd(geneEndTime); usedSegment.setEnd(geneEndTime);
usedSegment.setHoliday(false); usedSegment.setHoliday(false);
usedSegment.setKey(UUID.randomUUID().toString()); usedSegment.setKey(UUID.randomUUID().toString());
usedSegment.setType(SegmentType.REGULAR); usedSegment.setType(SegmentType.REGULAR);
usedSegment.setUsed(true); usedSegment.setUsed(true);
availabilitySnapshot.add(usedSegment);
geneDetails.setKey(usedSegment.getKey()); geneDetails.setKey(usedSegment.getKey());
targetSegment.setStart(geneEndTime); targetSegment.setStart(geneEndTime);
...@@ -1004,12 +1003,15 @@ public class MachineCalculator { ...@@ -1004,12 +1003,15 @@ public class MachineCalculator {
} }
if(usedSegment!=null)
{
synchronized (machine.getAvailability()) {
availabilitySnapshot.sort(Comparator.comparing(TimeSegment::getStart)); machine.getAvailability().add(usedSegment);
machine.getAvailability().sort(Comparator.comparing(TimeSegment::getStart));
machine.setAvailability(availabilitySnapshot); }
} }
} }
private void RemoveMachineAvailable1(Machine machine, ScheduleResultDetail geneDetails) { private void RemoveMachineAvailable1(Machine machine, ScheduleResultDetail geneDetails) {
...@@ -1055,7 +1057,7 @@ public class MachineCalculator { ...@@ -1055,7 +1057,7 @@ public class MachineCalculator {
public void AddMachineAvailable(Machine machine, List<ScheduleResultDetail> geneDetails) { public void AddMachineAvailable(Machine machine, List<ScheduleResultDetail> geneDetails) {
if (geneDetails == null || geneDetails.isEmpty()) return; if (geneDetails == null || geneDetails.isEmpty()) return;
synchronized (machine.getAvailability()) {
List<String> keys= geneDetails.stream(). List<String> keys= geneDetails.stream().
filter(t->t.getUsedSegment()==null||t.getUsedSegment().size()==0) filter(t->t.getUsedSegment()==null||t.getUsedSegment().size()==0)
.map(ScheduleResultDetail::getKey) .map(ScheduleResultDetail::getKey)
...@@ -1074,7 +1076,7 @@ if(keys1!=null&&keys1.size()>0) { ...@@ -1074,7 +1076,7 @@ if(keys1!=null&&keys1.size()>0) {
.forEach(t->t.setUsed(false)); .forEach(t->t.setUsed(false));
}
} }
public void AddMachineAvailable1(Machine machine, List<ScheduleResultDetail> geneDetails) { public void AddMachineAvailable1(Machine machine, List<ScheduleResultDetail> geneDetails) {
......
...@@ -38,13 +38,13 @@ public class PlanResultServiceTest { ...@@ -38,13 +38,13 @@ public class PlanResultServiceTest {
// nsgaiiUtils.Test(); // nsgaiiUtils.Test();
//planResultService.execute2("C5FB5EF2A7334A0A92F826F4937E1008"); //planResultService.execute2("C5FB5EF2A7334A0A92F826F4937E1008");
planResultService.execute2("726D4C1A712B4B1393175BD44B775B66"); // planResultService.execute2("726D4C1A712B4B1393175BD44B775B66");
// planResultService.execute2("BCA6FA43FFA444D3952CF8F6E1EA291B"); planResultService.execute2("BCA6FA43FFA444D3952CF8F6E1EA291B");
// LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11); // LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11);
// List<Integer> opids=new ArrayList<>(); // List<Integer> opids=new ArrayList<>();
// opids.add(1); // opids.add(1);
// planResultService.Move("B571EF6682DB463AB2977B1055A74112",opids,t,3403L); // planResultService.Move("B571EF6682DB463AB2977B1055A74112",opids,t,3403L);
planResultService.Redecode("12345679"); // planResultService.Redecode("12345679");
// 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