行程并发修改

parent a3e69687
......@@ -5,6 +5,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 生产环境可用的深拷贝工具类
......@@ -109,4 +110,21 @@ public class ProductionDeepCopyUtil {
throw new RuntimeException("列表深拷贝失败", e);
}
}
public static <T> CopyOnWriteArrayList<T> deepCopyList(CopyOnWriteArrayList<T> source, Class<T> elementType) {
if (source == null) {
return new CopyOnWriteArrayList<>();
}
try {
String json = objectMapper.writeValueAsString(source);
return objectMapper.readValue(json,
objectMapper.getTypeFactory().constructCollectionType(CopyOnWriteArrayList.class, elementType));
} catch (Exception e) {
throw new RuntimeException("列表深拷贝失败", e);
}
}
}
\ No newline at end of file
......@@ -16,7 +16,7 @@ public class Machine {
private double totalTaskTime=0;
private List<Shift> shifts;
private List<MaintenanceWindow> maintenanceWindows;
private List<TimeSegment> availability=new CopyOnWriteArrayList();
private CopyOnWriteArrayList<TimeSegment> availability;
private String code;
private List<Holiday> holidays;
......
......@@ -8,7 +8,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
public class MachineTimeline {
private Long machineId;
private List<TimeSegment> segments;
private CopyOnWriteArrayList<TimeSegment> segments;
private LocalDateTime validFrom;
private LocalDateTime validTo;
private LocalDateTime lastUpdated;
......@@ -27,11 +27,11 @@ public class MachineTimeline {
this.machineId = machineId;
}
public List<TimeSegment> getSegments() {
public CopyOnWriteArrayList<TimeSegment> getSegments() {
return segments;
}
public void setSegments(List<TimeSegment> segments) {
public void setSegments(CopyOnWriteArrayList<TimeSegment> segments) {
this.segments = segments;
}
......
......@@ -352,9 +352,15 @@ public class GeneticAlgorithm {
}
private void decode(GeneticDecoder decoder,Chromosome chromosome,ScheduleParams param, List<Entry> allOperations,List<GlobalOperationInfo> globalOpList) {
if (chromosome==null){
System.out.println("chromosome==null");
}
chromosome.setResult(new CopyOnWriteArrayList<>());
// 假设Machine类有拷贝方法,或使用MapStruct等工具进行映射
chromosome.setMachines(ProductionDeepCopyUtil.deepCopyList(machines,Machine.class)); // 简单拷贝,实际可能需要深拷贝
chromosome.setAllOperations(allOperations); // 简单拷贝,实际可能需要深拷贝
......
......@@ -5,7 +5,7 @@ import com.aps.common.util.ProductionDeepCopyUtil;
import com.aps.entity.Algorithm.GAScheduleResult;
import com.aps.entity.Algorithm.ScheduleResultDetail;
import com.aps.entity.basic.*;
import com.aps.service.plan.AlgorithmScheduler8;
import com.aps.service.plan.MachineSchedulerService;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
......@@ -308,10 +308,10 @@ public class MachineCalculator {
LocalDateTime current = start;
// 预先排序设备可用片段,避免后续遍历混乱
List<TimeSegment> allUseTimeSegment = machine.getAvailability().stream()
.filter(slot -> !slot.isUsed() && slot.getType() != SegmentType.MAINTENANCE)
.sorted(Comparator.comparing(TimeSegment::getStart, (a, b) -> a.compareTo(b)))
.collect(Collectors.toList());
// List<TimeSegment> allUseTimeSegment = machine.getAvailability().stream()
// .filter(slot -> !slot.isUsed() && slot.getType() != SegmentType.MAINTENANCE)
// .sorted(Comparator.comparing(TimeSegment::getStart, (a, b) -> a.compareTo(b)))
// .collect(Collectors.toList());
// 替换while(true),增加明确退出条件(原逻辑保留,可根据业务补充退出判断)
while (true) {
......@@ -548,8 +548,8 @@ public class MachineCalculator {
return new ArrayList<>();
}
List<TimeSegment> continuousCompliantSegments = new ArrayList<>();
List<TimeSegment> tempContinuousGroup = new ArrayList<>();
CopyOnWriteArrayList<TimeSegment> continuousCompliantSegments = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList<TimeSegment> tempContinuousGroup = new CopyOnWriteArrayList<>();
double tempContinuous = 0.0;
LocalDateTime lastSegmentEnd = currentTime;
......@@ -700,7 +700,7 @@ public class MachineCalculator {
}
machine.getAvailability().addAll(newSegments);
List<TimeSegment> mergedSegments = MergeSegments(machine.getAvailability());
CopyOnWriteArrayList<TimeSegment> mergedSegments = MergeSegments(machine.getAvailability());
// synchronized (machine.getAvailability()) {
// 合并片段(去重+排序),
......@@ -1018,7 +1018,7 @@ public class MachineCalculator {
private void RemoveMachineAvailable1(Machine machine, ScheduleResultDetail geneDetails,TimeSegment targetSegment1) {
List<TimeSegment> timeSegments = new ArrayList<>();
List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability());
CopyOnWriteArrayList<TimeSegment> availabilitySnapshot = new CopyOnWriteArrayList<>(machine.getAvailability());
int index = availabilitySnapshot.stream()
.filter(t -> t.getKey().equals(geneDetails.getKey()))
.findFirst()
......@@ -1072,9 +1072,12 @@ if(keys1!=null&&keys1.size()>0) {
keys.addAll(keys1);
}
machine.getAvailability().stream()
.filter(t ->keys.contains(t.getKey()))
.forEach(t->t.setUsed(false));
List<TimeSegment> toUpdate = machine.getAvailability().stream()
.filter(t -> keys.contains(t.getKey()))
.collect(Collectors.toList());
// 然后批量修改
toUpdate.forEach(t -> t.setUsed(false));
......@@ -1082,7 +1085,7 @@ if(keys1!=null&&keys1.size()>0) {
public void AddMachineAvailable1(Machine machine, List<ScheduleResultDetail> geneDetails) {
if (geneDetails == null || geneDetails.isEmpty()) return;
List<TimeSegment> availabilitySnapshot = new ArrayList<>(machine.getAvailability());
CopyOnWriteArrayList<TimeSegment> availabilitySnapshot = new CopyOnWriteArrayList<>(machine.getAvailability());
for (ScheduleResultDetail detail : geneDetails) {
if(detail.getUsedSegment()!=null&&detail.getUsedSegment().size()>0)
......@@ -1143,18 +1146,18 @@ if(keys1!=null&&keys1.size()>0) {
machine.getAvailability().sort((a, b) -> a.getStart().compareTo(b.getStart()));
}
private List<TimeSegment> MergeSegments(List<TimeSegment> segments) {
List<TimeSegment> maintenanceSegments = segments.stream()
private CopyOnWriteArrayList<TimeSegment> MergeSegments(CopyOnWriteArrayList<TimeSegment> segments) {
CopyOnWriteArrayList<TimeSegment> maintenanceSegments = segments.stream()
.filter(t -> t.getType() == SegmentType.MAINTENANCE)
.collect(Collectors.toList());
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
List<TimeSegment> unusedRegularSegments = segments.stream()
CopyOnWriteArrayList<TimeSegment> unusedRegularSegments = segments.stream()
.filter(t -> t.getType() != SegmentType.MAINTENANCE && !t.isUsed())
.collect(Collectors.toList());
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
List<TimeSegment> usedRegularSegments = segments.stream()
CopyOnWriteArrayList<TimeSegment> usedRegularSegments = segments.stream()
.filter(t -> t.getType() != SegmentType.MAINTENANCE && t.isUsed())
.collect(Collectors.toList());
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
unusedRegularSegments.sort(Comparator.comparing(TimeSegment::getStart));
......@@ -1169,7 +1172,7 @@ if(keys1!=null&&keys1.size()>0) {
}
}
List<TimeSegment> result = new ArrayList<>(mergedUnused);
CopyOnWriteArrayList<TimeSegment> result = new CopyOnWriteArrayList<>(mergedUnused);
result.addAll(usedRegularSegments);
result.addAll(maintenanceSegments);
result.sort(Comparator.comparing(TimeSegment::getStart));
......
......@@ -67,14 +67,14 @@ public class MachineSchedulerService {
LocalDate currentDate = currentTime.toLocalDate();
LocalDate endDate = currentTime.plusDays(200).toLocalDate();
List<TimeSegment> allSegments = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList<TimeSegment> allSegments = new CopyOnWriteArrayList<>();
while (!currentDate.isAfter(endDate)) {
// 检查是否在假期内
boolean isHolidayPeriod = isHoliday(machine,currentDate);
// 生成当日时间段
List<TimeSegment> daySegments = calculateDaySegments(machine, currentDate, isHolidayPeriod);
CopyOnWriteArrayList<TimeSegment> daySegments = calculateDaySegments(machine, currentDate, isHolidayPeriod);
allSegments.addAll(daySegments);
// 跳到下一天
......@@ -116,7 +116,7 @@ public class MachineSchedulerService {
return timeline;
}
public List<TimeSegment> generateTimeSegment(Machine machine, LocalDateTime currentTime,int days) {
public CopyOnWriteArrayList<TimeSegment> generateTimeSegment(Machine machine, LocalDateTime currentTime,int days) {
if(days==0)
{
days=200;
......@@ -147,9 +147,9 @@ try {
}
if (timeline.getValidTo().compareTo(currentTime) > 0) {
LocalDateTime currentTime1=currentTime;
List<TimeSegment> timeSegments= timeline.getSegments().stream()
CopyOnWriteArrayList<TimeSegment> timeSegments= timeline.getSegments().stream()
.filter(t->t.getStart().isAfter(currentTime1)||t.getStart().isBefore(currentTime1))
.collect(Collectors.toList());
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
return ProductionDeepCopyUtil.deepCopyList(timeSegments,TimeSegment.class);
} else {
......@@ -164,7 +164,7 @@ try {
LocalDate currentDate = currentTime.toLocalDate();
LocalDate endDate = currentTime.plusDays(days).toLocalDate();
List<TimeSegment> segments = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList<TimeSegment> segments = new CopyOnWriteArrayList<>();
while (!currentDate.isAfter(endDate)) {
// 检查是否在假期内
......@@ -236,7 +236,7 @@ try {
machine.getAvailability().addAll(newSegments);
// 合并片段(去重+排序),并重新赋值给设备的可用片段列表,对应C#的 machine.Availability = MergeSegments(...)
List<TimeSegment> mergedSegments = mergeSegments(machine.getAvailability());
CopyOnWriteArrayList<TimeSegment> mergedSegments = mergeSegments(machine.getAvailability());
machine.setAvailability(mergedSegments);
}
......@@ -260,8 +260,8 @@ try {
return false;
}
private List<TimeSegment> calculateDaySegments(Machine machine, LocalDate date, boolean isHoliday) {
List<TimeSegment> segments = new CopyOnWriteArrayList<>();
private CopyOnWriteArrayList<TimeSegment> calculateDaySegments(Machine machine, LocalDate date, boolean isHoliday) {
CopyOnWriteArrayList<TimeSegment> segments = new CopyOnWriteArrayList<>();
if (isHoliday) {
// 假期:只处理特定日期的班次
......@@ -359,29 +359,29 @@ if(shifts==null||shifts.size()==0) {
return shiftDays.contains(targetDayValue);
}
private List<TimeSegment> mergeSegments(List<TimeSegment> segments1) {
private CopyOnWriteArrayList<TimeSegment> mergeSegments(CopyOnWriteArrayList<TimeSegment> segments1) {
List<TimeSegment> segments= ProductionDeepCopyUtil.deepCopyList(segments1,TimeSegment.class);
CopyOnWriteArrayList<TimeSegment> segments= ProductionDeepCopyUtil.deepCopyList(segments1,TimeSegment.class);
if(segments==null||segments.size()==0)
{
return null;
}
List<TimeSegment> maintenanceSegments1 = segments.stream()
CopyOnWriteArrayList<TimeSegment> maintenanceSegments1 = segments.stream()
.filter(t ->t.getType()==null)
.collect(Collectors.toList());
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
if(maintenanceSegments1.size()>0)
{
int i=0;
}
List<TimeSegment> maintenanceSegments = segments.stream()
CopyOnWriteArrayList<TimeSegment> maintenanceSegments = segments.stream()
.filter(t ->t.getType()!=null&& t.getType() == SegmentType.MAINTENANCE)
.collect(Collectors.toList());
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
List<TimeSegment> otherSegments = segments.stream()
CopyOnWriteArrayList<TimeSegment> otherSegments = segments.stream()
.filter(t ->t.getType()!=null&& t.getType() != SegmentType.MAINTENANCE)
.collect(Collectors.toList());
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
// 按开始时间排序
otherSegments.sort(Comparator.comparing(TimeSegment::getStart));
......@@ -400,7 +400,7 @@ if(shifts==null||shifts.size()==0) {
}
}
List<TimeSegment> result = new CopyOnWriteArrayList<>(merged);
CopyOnWriteArrayList<TimeSegment> result = new CopyOnWriteArrayList<>(merged);
result.addAll(maintenanceSegments);
// 按开始时间排序
......
......@@ -120,69 +120,7 @@ public class PlanResultService {
private LocalDateTime baseTime = LocalDateTime.of(2025, 11, 1, 0, 0, 0);
public List<ScheduleChromosome> execute() {
try {
// 1. 读取数据
List<Machine> machines = loadData("machines.json", Machine.class);
List<Product> products = loadData("products.json", Product.class);
List<Order> orders = loadData("orders.json", Order.class);
// 设置机器信息到班次中
for (Machine machine : machines) {
if (machine.getShifts() != null) {
for (Shift shift : machine.getShifts()) {
shift.setMachineId(machine.getId());
shift.setMachineName(machine.getName());
}
}
// 调试:打印机器和班次信息
System.out.println("Machine: " + machine.getId() + ", Name: " + machine.getName());
if (machine.getShifts() != null) {
for (Shift shift : machine.getShifts()) {
System.out.println(" Shift: " + shift.getStartTime() + " - " + shift.getEndTime() +
", Status: " + shift.getStatus() +
", MachineId: " + shift.getMachineId() +
", MachineName: " + shift.getMachineName());
}
}
}
// 创建节假日
List<Holiday> holidays = Arrays.asList(
new Holiday(LocalDateTime.of(2025, 10, 1, 0, 0),
LocalDateTime.of(2025, 10, 7, 23, 59))
);
// 将节假日添加到所有设备中
addHolidaysToAllMachines(machines, holidays);
// 3. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService(
holidays, LocalDateTime.of(2025, 10, 1, 0, 0, 0));
// 4. 初始化机器时间线
for (Machine machine : machines) {
MachineTimeline timeline = machineScheduler.getOrCreateTimeline(machine);
machine.setAvailability(timeline.getSegments());
}
// 5. 执行调度算法
AlgorithmScheduler7 scheduler = new AlgorithmScheduler7(products, machines, orders, machineScheduler);
List<ScheduleChromosome> scheduleChromosomes = scheduler.RunAll();
// 对调度结果按照 fitness 由高到低排序
scheduleChromosomes.sort((c1, c2) -> Double.compare(c2.getFitness(), c1.getFitness()));
// 为每个 ScheduleChromosome 分配场景ID(基于排序后的位置)
for (int i = 0; i < scheduleChromosomes.size(); i++) {
scheduleChromosomes.get(i).setSceneId(i + 1); // 场景ID从1开始
}
return scheduleChromosomes;
} catch (Exception e) {
throw new RuntimeException("调度执行失败", e);
}
return null;
}
......
......@@ -19,80 +19,82 @@ public class PlanSchedulerService {
private final LocalDateTime baseTime = LocalDateTime.of(2025, 10, 1, 0, 0, 0);
public List<PlanResourceTaskGanttVO> execute() {
try {
// 1. 读取数据
List<Machine> machines = JsonFileReader.readListFromResources("machines.json", Machine.class);
List<Product> products = JsonFileReader.readListFromResources("products.json", Product.class);
List<Order> orders = JsonFileReader.readListFromResources("orders.json", Order.class);
// 2. 创建节假日
List<Holiday> holidays = Arrays.asList(
new Holiday(LocalDateTime.of(2025, 10, 1, 0, 0),
LocalDateTime.of(2025, 10, 7, 23, 59))
);
// 3. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService(
holidays, LocalDateTime.of(2025, 10, 1, 0, 0, 0));
// 4. 初始化机器时间线
for (Machine machine : machines) {
MachineTimeline timeline = machineScheduler.getOrCreateTimeline(machine);
machine.setAvailability(timeline.getSegments());
}
// 5. 执行调度算法
AlgorithmScheduler6 scheduler = new AlgorithmScheduler6(products, machines, orders, machineScheduler);
List<ScheduleChromosome> scheduleChromosomes = scheduler.RunAll();
List<PlanResourceTaskGanttVO> ganttlist = new ArrayList<>();
long sceneId = 1L;
for (ScheduleChromosome chromosome : scheduleChromosomes
) {
// 转换基因列表和设备列表
List<GenVO> genVOS = convertGeneListToGenVO(chromosome.getGenes(), baseTime);
List<MachineVO> machineVOS = machines.stream()
.map(this::convertToVO)
.collect(Collectors.toList());
// 按设备ID分组任务
Map<Long, List<GenVO>> taskMap = genVOS.stream()
.collect(Collectors.groupingBy(GenVO::getEquipId));
// 为每个设备设置任务
for (MachineVO machine : machineVOS) {
Integer equipId = Integer.valueOf(machine.getEquipId());
List<GenVO> tasks = taskMap.get(equipId);
if (tasks != null) {
// 按开始时间排序
tasks.sort(Comparator.comparing(GenVO::getStartTime));
machine.setTasks(tasks);
} else {
machine.setTasks(new ArrayList<>()); // 如果没有任务,设置为空列表
}
}
// 现在machineVOS中的每个MachineVO都包含了对应的任务列表
PlanResourceTaskGanttVO ganttVO = new PlanResourceTaskGanttVO()
.setResources(machineVOS)
.setEarliestTaskStartTime(LocalDateTime.of(2025, 9, 1, 0, 0, 0))
.setLastTaskAssignmentTime(LocalDateTime.of(2025, 12, 1, 0, 0, 0))
.setSceneId(sceneId);
sceneId++;
ganttlist.add(ganttVO);
}
return ganttlist;
} catch (Exception e) {
throw new RuntimeException("调度执行失败", e);
}
// try {
// // 1. 读取数据
// List<Machine> machines = JsonFileReader.readListFromResources("machines.json", Machine.class);
// List<Product> products = JsonFileReader.readListFromResources("products.json", Product.class);
// List<Order> orders = JsonFileReader.readListFromResources("orders.json", Order.class);
//
// // 2. 创建节假日
// List<Holiday> holidays = Arrays.asList(
// new Holiday(LocalDateTime.of(2025, 10, 1, 0, 0),
// LocalDateTime.of(2025, 10, 7, 23, 59))
// );
//
// // 3. 创建调度服务
// MachineSchedulerService machineScheduler = new MachineSchedulerService(
// holidays, LocalDateTime.of(2025, 10, 1, 0, 0, 0));
//
// // 4. 初始化机器时间线
// for (Machine machine : machines) {
// MachineTimeline timeline = machineScheduler.getOrCreateTimeline(machine);
// machine.setAvailability(timeline.getSegments());
// }
//
// // 5. 执行调度算法
// AlgorithmScheduler6 scheduler = new AlgorithmScheduler6(products, machines, orders, machineScheduler);
// List<ScheduleChromosome> scheduleChromosomes = scheduler.RunAll();
// List<PlanResourceTaskGanttVO> ganttlist = new ArrayList<>();
// long sceneId = 1L;
//
//
// for (ScheduleChromosome chromosome : scheduleChromosomes
// ) {
//
// // 转换基因列表和设备列表
// List<GenVO> genVOS = convertGeneListToGenVO(chromosome.getGenes(), baseTime);
// List<MachineVO> machineVOS = machines.stream()
// .map(this::convertToVO)
// .collect(Collectors.toList());
//
//// 按设备ID分组任务
// Map<Long, List<GenVO>> taskMap = genVOS.stream()
// .collect(Collectors.groupingBy(GenVO::getEquipId));
//
//// 为每个设备设置任务
// for (MachineVO machine : machineVOS) {
// Integer equipId = Integer.valueOf(machine.getEquipId());
// List<GenVO> tasks = taskMap.get(equipId);
//
// if (tasks != null) {
// // 按开始时间排序
// tasks.sort(Comparator.comparing(GenVO::getStartTime));
// machine.setTasks(tasks);
// } else {
// machine.setTasks(new ArrayList<>()); // 如果没有任务,设置为空列表
// }
// }
//
//// 现在machineVOS中的每个MachineVO都包含了对应的任务列表
// PlanResourceTaskGanttVO ganttVO = new PlanResourceTaskGanttVO()
// .setResources(machineVOS)
// .setEarliestTaskStartTime(LocalDateTime.of(2025, 9, 1, 0, 0, 0))
// .setLastTaskAssignmentTime(LocalDateTime.of(2025, 12, 1, 0, 0, 0))
// .setSceneId(sceneId);
// sceneId++;
// ganttlist.add(ganttVO);
// }
//
//
//
//
// return ganttlist;
//
// } catch (Exception e) {
// throw new RuntimeException("调度执行失败", e);
// }
return null;
}
public GenVO convertGeneToGenVO(Gene gene, LocalDateTime baseTime) {
......
......@@ -10,8 +10,8 @@ spring:
pathmatch:
matching-strategy: ant_path_matcher # Spring Boot 2.6+ 需要这个配置
redis:
host: 39.100.88.40
port: 6379
host: 192.168.0.181
port: 6380
timeout: 120000
database: 10
password: redis@228!
......@@ -37,7 +37,7 @@ spring:
# Oracle数据源
oracle:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//39.100.78.207:7002/ORCLPDB1 # ORCL为你的Oracle实例名
url: jdbc:oracle:thin:@//192.168.0.181:1522/ORCLPDB1 # ORCL为你的Oracle实例名
username: mes # 替换为你的Oracle用户名
password: root_mes123456 # 替换为你的Oracle密码
# sqlserver:
......
package com.aps.demo;
import com.aps.common.util.JsonFileReader;
import com.aps.entity.basic.ScheduleChromosome;
import com.aps.entity.basic.*;
import com.aps.service.plan.AlgorithmScheduler7;
import com.aps.service.plan.MachineSchedulerService;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
public class MachineSchedulerTest {
public static void main(String[] args) {
try {
// // 1. 读取JSON文件
// String jsonContent = new String(Files.readAllBytes(Paths.get("src/main/resources/machines.json")));
// // 2. 配置ObjectMapper支持Java 8时间API
// ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.registerModule(new JavaTimeModule());
// objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
List<Machine> machines = JsonFileReader.readListFromResources("machines.json", Machine.class);
// 读取产品数据
List<Product> products = JsonFileReader.readListFromResources("products.json", Product.class);
// 读取订单数据
List<Order> orders = JsonFileReader.readListFromResources("orders.json", Order.class);
// 3. 反序列化JSON到Machine列表
// List<Machine> machines = objectMapper.readValue(jsonContent,
// objectMapper.getTypeFactory().constructCollectionType(List.class, Machine.class));
// 4. 创建节假日数据
List<Holiday> holidays = Arrays.asList(
new Holiday(LocalDateTime.of(2025, 10, 1, 0, 0),
LocalDateTime.of(2025, 10, 7, 23, 59))
);
// 5. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService(
holidays, LocalDateTime.of(2025, 10, 1, 0, 0, 0));
// 6. 为每个设备生成时间线
for (Machine machine : machines) {
System.out.println("处理设备: " + machine.getName());
MachineTimeline machineTimeline = machineScheduler.getOrCreateTimeline(machine);
machine.setAvailability(machineTimeline.getSegments());
// 打印结果
System.out.println("设备 " + machine.getName() + " 的时间段数量: " +
(machine.getAvailability() != null ? machine.getAvailability().size() : 0));
if (machine.getAvailability() != null && !machine.getAvailability().isEmpty()) {
System.out.println("时间段:");
machine.getAvailability().stream().forEach(segment -> {
System.out.printf(" %s - %s (%s)%n",
segment.getStart(), segment.getEnd(), segment.getType());
});
}
System.out.println("---");
}
// 7. 测试缓存功能
System.out.println("缓存中的设备数量: " + MachineSchedulerService.getCacheSize());
// 8. 测试特定设备的时间段生成
if (!machines.isEmpty()) {
Machine firstMachine = machines.get(0);
List<TimeSegment> segments = machineScheduler.generateTimeSegment(
firstMachine, LocalDateTime.of(2025, 10, 1, 0, 0, 0),0);
System.out.println("直接生成的时间段数量: " + segments.size());
}
AlgorithmScheduler7 scheduler = new AlgorithmScheduler7(products,machines,orders, machineScheduler);
List<ScheduleChromosome> scheduleChromosomes = scheduler.RunAll();
for (ScheduleChromosome run:scheduleChromosomes
) {
System.out.println("------------------"+run.getFitness()+"------------------");
scheduler.PrintScheduleSummary(run);
}
ScheduleChromosome run = scheduler.Run();
scheduler.PrintScheduleSummary(run);
System.out.println(run.getFitness());
System.out.println("------------------"+scheduleChromosomes.size()+"------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
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