Commit 1c20209d authored by Tong Li's avatar Tong Li

遗传算法

parent edfba6c2
package com.aps.entity.Algorithm;
/**
* 作者:佟礼
* 时间:2025-12-04
*/
public enum DependencyType {
FinishToStart(0), // 完成-开始(FS):串行 下料→加工→组装
StartToStart(1), // 开始-开始(SS): 加工 A 和加工 B 可同时进行 重叠 重叠生产:涂装开始后 30 分钟,烘烤可开始
FinishToFinish(2), // 完成-完成(FF):前置工序完成后,后继工序才能完成 所有并行加工工序需同时完成
StartToFinish(3); // 开始-完成(SF):前置工序开始后,后继工序才能完成
private final int value;
DependencyType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
package com.aps.entity.Algorithm;
import lombok.Data;
/**
* 作者:佟礼
* 时间:2025-12-04
*/
@Data
public class OperationDependency {
private int Id ;
private int prevOperationId ; // 前置工序ID
private int nextOperationId ; // 后继工序ID
private DependencyType dependencyType=DependencyType.FinishToStart ; // 依赖类型
}
...@@ -9,6 +9,40 @@ import lombok.Data; ...@@ -9,6 +9,40 @@ import lombok.Data;
@Data @Data
public class ScheduleResultDetail { public class ScheduleResultDetail {
private String Key; private String Key;
private int StartTime; // 相对开始时间(分钟) private int StartTime; // 相对开始时间(秒)
private int EndTime; // 相对结束时间(分钟) private int EndTime; // 相对结束时间(秒)
private double OneTime; // 单件工时
private double Quantity; // 时间段
// Key 的 getter/setter
public String getKey() {
return Key;
}
public void setKey(String key) {
this.Key = key;
}
// StartTime 的 getter/setter
public int getStartTime() {
return StartTime;
}
public void setStartTime(int startTime) {
this.StartTime = startTime;
}
// EndTime 的 getter/setter
public int getEndTime() {
return EndTime;
}
public void setEndTime(int endTime) {
this.EndTime = endTime;
}
// 对应C#的计算属性 processingTime(通过方法实现)
public int getProcessingTime() {
return EndTime - StartTime; // 绝对处理时间(分钟)
}
} }
package com.aps.entity.basic; package com.aps.entity.basic;
import com.aps.entity.Algorithm.OperationDependency;
import lombok.Data; import lombok.Data;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -12,7 +13,7 @@ import java.util.List; ...@@ -12,7 +13,7 @@ import java.util.List;
@Data @Data
public class Entry { public class Entry {
public Entry() { public Entry() {
PrevEntryIds=new ArrayList<Integer>(); PrevEntryIds=new ArrayList<OperationDependency>();
} }
/** /**
...@@ -74,12 +75,12 @@ public class Entry { ...@@ -74,12 +75,12 @@ public class Entry {
/** /**
* 前工单ID * 前工单ID
*/ */
public List<Integer> PrevEntryIds ;//前工序 public List<OperationDependency> PrevEntryIds ;//前工序
/** /**
* 工单ID * 工单ID
*/ */
public List<Integer> NextEntryIds ;//后工序 public List<OperationDependency> NextEntryIds ;//后工序
/** /**
* 数据状态 1 拆分 2 新建 * 数据状态 1 拆分 2 新建
......
package com.aps.service.Algorithm; package com.aps.service.Algorithm;
import com.aps.common.util.ProductionDeepCopyUtil; import com.aps.common.util.ProductionDeepCopyUtil;
import com.aps.entity.Algorithm.Chromosome; import com.aps.entity.Algorithm.*;
import com.aps.entity.Algorithm.GAScheduleResult;
import com.aps.entity.Algorithm.GlobalOperationInfo;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult; import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo; import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.Algorithm.ScheduleResultDetail;
import com.aps.entity.basic.Entry; import com.aps.entity.basic.Entry;
import com.aps.entity.basic.GlobalParam; import com.aps.entity.basic.GlobalParam;
import com.aps.entity.basic.MachineOption; import com.aps.entity.basic.MachineOption;
...@@ -173,9 +170,28 @@ public class ScheduleOperationService { ...@@ -173,9 +170,28 @@ public class ScheduleOperationService {
{ {
//存在则修改顺和前后序 //存在则修改顺和前后序
entry.setSequence(nodeInfo.getGroupSerial()); entry.setSequence(nodeInfo.getGroupSerial());
entry.setPrevEntryIds(nodeInfo.getNewParentIds()); // entry.setPrevEntryIds(nodeInfo.getNewParentIds());
entry.setNextEntryIds(nodeInfo.getNewChildIds()); // entry.setNextEntryIds(nodeInfo.getNewChildIds());
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
GlobalOperationInfo info= chromosome.getGlobalOpList().stream() GlobalOperationInfo info= chromosome.getGlobalOpList().stream()
.filter(t->t.getOp().getId()==entry.getId()) .filter(t->t.getOp().getId()==entry.getId())
.findFirst() .findFirst()
...@@ -196,8 +212,28 @@ public class ScheduleOperationService { ...@@ -196,8 +212,28 @@ public class ScheduleOperationService {
newOp.setId(nodeInfo.getGlobalSerial()); newOp.setId(nodeInfo.getGlobalSerial());
newOp.setSequence(nodeInfo.getGroupSerial()); newOp.setSequence(nodeInfo.getGroupSerial());
newOp.setExecId(nodeInfo.getOriginalId()); newOp.setExecId(nodeInfo.getOriginalId());
newOp.setPrevEntryIds(nodeInfo.getNewParentIds()); // newOp.setPrevEntryIds(nodeInfo.getNewParentIds());
newOp.setNextEntryIds(nodeInfo.getNewChildIds()); // newOp.setNextEntryIds(nodeInfo.getNewChildIds());
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
newOp.setQuantity(newids.get(nodeInfo.getOriginalId())); newOp.setQuantity(newids.get(nodeInfo.getOriginalId()));
newOp.setMainId(MainId); newOp.setMainId(MainId);
newOp.setState(2); newOp.setState(2);
...@@ -281,10 +317,10 @@ public class ScheduleOperationService { ...@@ -281,10 +317,10 @@ public class ScheduleOperationService {
for (Entry entry : newEntrys) { for (Entry entry : newEntrys) {
if(entry.getNextEntryIds().size()>0) if(entry.getNextEntryIds().size()>0)
{ {
for (Integer id : entry.getNextEntryIds()) { for (OperationDependency od : entry.getNextEntryIds()) {
Entry nextentry= newEntrys.stream() Entry nextentry= newEntrys.stream()
.filter(t->t.getGroupId()==entry.getGroupId()&&t.getId()==id) .filter(t->t.getGroupId()==entry.getGroupId()&&t.getId()==od.getNextOperationId())
.findFirst() .findFirst()
.orElse(null); .orElse(null);
if(nextentry!=null) { if(nextentry!=null) {
...@@ -325,8 +361,28 @@ public class ScheduleOperationService { ...@@ -325,8 +361,28 @@ public class ScheduleOperationService {
entry.setGroupId(i+1); entry.setGroupId(i+1);
entry.setSequence(nodeInfo.getGroupSerial()); entry.setSequence(nodeInfo.getGroupSerial());
entry.setExecId(nodeInfo.getOriginalId()); entry.setExecId(nodeInfo.getOriginalId());
entry.setPrevEntryIds(nodeInfo.getNewParentIds()); // entry.setPrevEntryIds(nodeInfo.getNewParentIds());
entry.setNextEntryIds(nodeInfo.getNewChildIds()); // entry.setNextEntryIds(nodeInfo.getNewChildIds());
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
entry.setMainId(""); entry.setMainId("");
entry.setState(2); entry.setState(2);
//工序基本信息 //工序基本信息
...@@ -487,8 +543,28 @@ public class ScheduleOperationService { ...@@ -487,8 +543,28 @@ public class ScheduleOperationService {
if(node!=null) if(node!=null)
{ {
entry.setSequence(node.getGroupSerial()); entry.setSequence(node.getGroupSerial());
entry.setPrevEntryIds(node.getNewParentIds()); // entry.setPrevEntryIds(node.getNewParentIds());
entry.setNextEntryIds(node.getNewChildIds()); // entry.setNextEntryIds(node.getNewChildIds());
if(node.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : node.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(node.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : node.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
GlobalOperationInfo info= chromosome.getGlobalOpList().stream() GlobalOperationInfo info= chromosome.getGlobalOpList().stream()
.filter(t->t.getOp().getId()==entry.getId()) .filter(t->t.getOp().getId()==entry.getId())
.findFirst() .findFirst()
......
...@@ -5,12 +5,9 @@ import com.aps.common.util.JsonFileReader; ...@@ -5,12 +5,9 @@ import com.aps.common.util.JsonFileReader;
import com.aps.common.util.ProductionDeepCopyUtil; import com.aps.common.util.ProductionDeepCopyUtil;
import com.aps.controller.gantt.FileUploadController; import com.aps.controller.gantt.FileUploadController;
import com.aps.entity.*; import com.aps.entity.*;
import com.aps.entity.Algorithm.Chromosome; import com.aps.entity.Algorithm.*;
import com.aps.entity.Algorithm.GAScheduleResult;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult; import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo; import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.Algorithm.ScheduleParams;
import com.aps.entity.Algorithm.ScheduleResultDetail;
import com.aps.entity.basic.ScheduleChromosome; import com.aps.entity.basic.ScheduleChromosome;
import com.aps.entity.Schedule.GenVO; import com.aps.entity.Schedule.GenVO;
import com.aps.entity.Schedule.MachineVO; import com.aps.entity.Schedule.MachineVO;
...@@ -135,10 +132,25 @@ public class PlanResultService { ...@@ -135,10 +132,25 @@ public class PlanResultService {
} }
} }
public Chromosome execute1() {
public Chromosome execute1() {
try { try {
//List<ScheduleResultDetail> details=new ArrayList<>();
// ScheduleResultDetail detail1=new ScheduleResultDetail();
//
// detail1.setOneTime(100);//单件工时
//
//
// ScheduleResultDetail detail2=new ScheduleResultDetail();
//
// detail2.setOneTime(200);//单件工时
// details.add(detail1);
// details.add(detail2);
// mergeSegmentsWithDifferentOneTime(details, 50);
// 1. 读取数据 // 1. 读取数据
List<Machine> machines = loadData("machines.json", Machine.class); List<Machine> machines = loadData("machines.json", Machine.class);
List<Product> products = loadData("products.json", Product.class); List<Product> products = loadData("products.json", Product.class);
...@@ -166,23 +178,20 @@ public class PlanResultService { ...@@ -166,23 +178,20 @@ public class PlanResultService {
} }
ScheduleParams param = new ScheduleParams(); ScheduleParams param = new ScheduleParams();
param.setBaseTime(LocalDateTime.of(2025, 11, 1, 0, 0, 0)); param.setBaseTime(LocalDateTime.of(2025, 11, 1, 0, 0, 0));
param.setPopulationSize(50); param.setPopulationSize(1);
param.setMaxIterations(100); param.setMaxIterations(2);
// List<MesHoliday> holidays= _MesHolidayService.list(); // List<MesHoliday> holidays= _MesHolidayService.list();
// 创建节假日 // 创建节假日
List<Holiday> holidays = Arrays.asList(
new Holiday(LocalDateTime.of(2025, 10, 1, 0, 0),
LocalDateTime.of(2025, 10, 7, 23, 59))
);
// 将节假日添加到所有设备中 // 将节假日添加到所有设备中
addHolidaysToAllMachines(machines, holidays); // addHolidaysToAllMachines(machines);
// 3. 创建调度服务 // 3. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService( MachineSchedulerService machineScheduler = new MachineSchedulerService(
holidays, param.getBaseTime()); param.getBaseTime());
// 4. 初始化机器时间线 // 4. 初始化机器时间线
for (Machine machine : machines) { for (Machine machine : machines) {
...@@ -214,7 +223,10 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -214,7 +223,10 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
// entry.setMaterialRequirements(o.getMaterialRequirements()); // 假设Operation类有获取物料需求的方法 // entry.setMaterialRequirements(o.getMaterialRequirements()); // 假设Operation类有获取物料需求的方法
if (sequence != 1) { if (sequence != 1) {
entry.getPrevEntryIds().add(id - 1); // 假设Entry类有getPrevEntryIds()返回List<Integer> OperationDependency od=new OperationDependency();
od.setPrevOperationId(id - 1);
entry.getPrevEntryIds().add(od); // 假设Entry类有getPrevEntryIds()返回List<Integer>
} }
allOperations.add(entry); allOperations.add(entry);
...@@ -794,8 +806,27 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -794,8 +806,27 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
entry.setGroupId(i + 1); entry.setGroupId(i + 1);
entry.setSequence(nodeInfo.getGroupSerial()); entry.setSequence(nodeInfo.getGroupSerial());
entry.setExecId(nodeInfo.getOriginalId()); entry.setExecId(nodeInfo.getOriginalId());
entry.setPrevEntryIds(nodeInfo.getNewParentIds());
entry.setNextEntryIds(nodeInfo.getNewChildIds()); if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
OperationDependency.add(od);
}
entry.setPrevEntryIds(OperationDependency);
}
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
ProdProcessExec op= ProdProcessExecs.stream() ProdProcessExec op= ProdProcessExecs.stream()
.filter(t->t.getExecId().equals(entry.getExecId())) .filter(t->t.getExecId().equals(entry.getExecId()))
.findFirst().orElse(null); .findFirst().orElse(null);
......
...@@ -5,36 +5,12 @@ ...@@ -5,36 +5,12 @@
"startTime": "08:00:00", "startTime": "08:00:00",
"endTime": "18:00:00", "endTime": "18:00:00",
"days": [1, 2, 3, 4, 5], "days": [1, 2, 3, 4, 5],
"startDate": "2025-10-10T00:00:00", "startDate": "2000-01-01T00:00:00",
"endDate": "2025-11-10T00:00:00", "endDate": "2000-01-01T00:00:00",
"shiftDate": "0001-01-01T00:00:00", "shiftDate": "0001-01-01T00:00:00",
"temporaryShift": false, "temporaryShift": false,
"priority": 0, "priority": 0,
"status":0 "status":0
},{
"startTime": "18:00:00",
"endTime": "20:00:00",
"days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00",
"temporaryShift": true,
"priority": 0,
"status":1
},{
"startTime": "08:00:00",
"endTime": "18:00:00",
"days": [0],
"shiftDate": "0001-01-01T00:00:00",
"temporaryShift": true,
"priority": 0,
"status":1
},{
"startTime": "08:00:00",
"endTime": "18:00:00",
"days": null,
"shiftDate": "2025-10-01T00:00:00",
"temporaryShift": true,
"priority": 0,
"status":1
}], }],
"maintenanceWindows": [{ "maintenanceWindows": [{
"startTime": "2025-10-08T10:00:00", "startTime": "2025-10-08T10:00:00",
...@@ -49,6 +25,8 @@ ...@@ -49,6 +25,8 @@
"endTime": "18:00:00", "endTime": "18:00:00",
"days": [1, 2, 3,4,5], "days": [1, 2, 3,4,5],
"shiftDate": "0001-01-01T00:00:00", "shiftDate": "0001-01-01T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false, "temporaryShift": false,
"priority": 0, "priority": 0,
"status":0 "status":0
...@@ -62,6 +40,8 @@ ...@@ -62,6 +40,8 @@
"endTime": "18:00:00", "endTime": "18:00:00",
"days": [1, 2, 3, 4, 5], "days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00", "shiftDate": "0001-01-01T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false, "temporaryShift": false,
"priority": 0, "priority": 0,
"status":0 "status":0
...@@ -75,6 +55,8 @@ ...@@ -75,6 +55,8 @@
"endTime": "18:00:00", "endTime": "18:00:00",
"days": [1, 2, 3, 4, 5], "days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00", "shiftDate": "0001-01-01T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false, "temporaryShift": false,
"priority": 0, "priority": 0,
"status":0 "status":0
...@@ -88,6 +70,8 @@ ...@@ -88,6 +70,8 @@
"endTime": "18:00:00", "endTime": "18:00:00",
"days": [1, 2, 3, 4, 5], "days": [1, 2, 3, 4, 5],
"shiftDate": "0001-01-01T00:00:00", "shiftDate": "0001-01-01T00:00:00",
"startDate": "2000-01-01T00:00:00",
"endDate": "2000-01-01T00:00:00",
"temporaryShift": false, "temporaryShift": false,
"priority": 0, "priority": 0,
"status":0 "status":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