Commit baeaecee authored by Tong Li's avatar Tong Li

遗传算法

parent f0f39d4c
package com.aps.entity.Algorithm;
import com.aps.entity.basic.Order;
import java.util.List;
/**
* 作者:佟礼
* 时间:2025-12-08
*/
public class BOMBuildResult {
private List<OrderMaterialRequirement> materialRequirements;
private List<Order> childOrders;
public BOMBuildResult(List<OrderMaterialRequirement> materialRequirements, List<Order> childOrders) {
this.materialRequirements = materialRequirements;
this.childOrders = childOrders;
}
public List<OrderMaterialRequirement> getMaterialRequirements() {
return materialRequirements;
}
public List<Order> getChildOrders() {
return childOrders;
}
}
package com.aps.entity.Algorithm;
import com.aps.entity.basic.MaterialType;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 订单物料需求
*/
@Data
public class OrderMaterialRequirement {
private String orderId;
private int operationId;
private String childorderId;
private String materialId;
private MaterialType materialType;
/**
* 需求总数
*/
private double requiredQuantity;
/**
* 已配数量
*/
private double ypQty;
/**
* 缺件数量
*/
private double qjQty;
/**
* 占用库存
*/
private double useStock;
/**
* 占用在途数量
*/
private double useTransit;
/**
* 层级
*/
private int level;
/**
* 预计到货时间
*/
private LocalDateTime arrivalTime;
/**
* 预计可用时间
*/
private LocalDateTime useTime;
/**
* 采购开始时间
*/
private LocalDateTime purchaseStartTime;
/**
* 采购结束时间
*/
private LocalDateTime purchaseEndTime;
/**
* 创建或使用的半成品订单ID
*/
private List<Integer> productOrderID;
}
......@@ -30,7 +30,7 @@ public class Entry {
* 原订单ID
*/
public String OrderId ;
private Integer routingId;
private Long routingDetailId;
private Long taskSeq;
private String routingDetailName;
......
package com.aps.entity.basic;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
......@@ -12,7 +14,7 @@ public class Material {
/**
* 物料ID
*/
private int Id;
private String Id;
/**
* 物料名称
......@@ -35,6 +37,7 @@ public class Material {
private int PurchaseLeadTime;
/**
* 物料类型
*/
......
......@@ -17,7 +17,7 @@ public class MaterialRequirement {
/**
* 物料ID
*/
private int MaterialId;
private String MaterialId;
/**
* 物料类型
......@@ -27,7 +27,7 @@ public class MaterialRequirement {
/**
* 该工序需要的物料数量
*/
private BigDecimal RequiredQuantity;
private double RequiredQuantity;
@Override
public String toString() {
......
......@@ -4,6 +4,7 @@ import lombok.Data;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.List;
/**
* 订单定义
......@@ -14,6 +15,7 @@ public class Order {
private String OrderId;
private int productId;
private String materialId;
private Integer routingId;
private double quantity = 100; // 100个
private double sYQuantity;
......@@ -26,4 +28,6 @@ public class Order {
private boolean canInterrupt = false;
private double actualPriority;
private String mainId;
/*使用这个半成品的成品工单*/
public List<String> FinishOrderId ;
}
\ No newline at end of file
......@@ -271,6 +271,8 @@ public class GeneticDecoder {
int machineAvailableTime = lastGeneOnMachine.getEndTime();
if (setupTime > 0) {
if (_globalParam.is_smoothSetup()) {
......
package com.aps.service.Algorithm;
import com.aps.entity.*;
import com.aps.entity.Algorithm.DependencyType;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.Algorithm.OperationDependency;
import com.aps.entity.basic.Entry;
import com.aps.entity.basic.MachineOption;
import com.aps.service.*;
import com.aps.service.plan.SceneService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* 作者:佟礼
* 时间:2025-12-09
*/
@Service
public class RoutingDataService {
@Autowired
private ProdLaunchOrderService _prodLaunchOrderService;
@Autowired
private ProdProcessExecService _prodProcessExecService;
@Autowired
private ProdEquipmentService _prodEquipmentService;
@Autowired
private PlanResourceService _PlanResourceService;
@Autowired
private SceneService _sceneService;
@Autowired
private ProdOrderProcessService _prodOrderProcessService;
@Autowired
private RoutingDiscreteParamService _routingDiscreteParamService;
@Autowired
private DiscreteParameterMatrixService _discreteParameterMatrixService;
public Map<Integer, Object> InitEntrys(String SceneId, List<ProdEquipment> ProdEquipments, List<ProdLaunchOrder> ProdLaunchOrders)
{
Map<Integer, Object> list=new HashMap<>();
List<ProdProcessExec> ProdProcessExecs= _prodProcessExecService.lambdaQuery()
.eq(ProdProcessExec::getSceneId,SceneId)
.list();
// 获取op列表中所有的routingDetailId
List<Long> routingDetailIds = ProdProcessExecs.stream()
.map(ProdProcessExec::getRoutingDetailId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 查询RoutingDiscreteParam中routingDetailId在上述列表中的所有记录
List<RoutingDiscreteParam> routingDiscreteParams = _routingDiscreteParamService.lambdaQuery()
.in(RoutingDiscreteParam::getRoutingDetailId, routingDetailIds)
.eq(RoutingDiscreteParam::getIsDeleted, 0)
.list();
List<ProdOrderProcess> ProdOrderProcesss = _prodOrderProcessService.lambdaQuery()
.eq(ProdOrderProcess::getSceneId,SceneId)
.list();
return CreateEntry( SceneId, ProdEquipments, ProdLaunchOrders, routingDiscreteParams, ProdOrderProcesss, ProdProcessExecs,null );
}
public Map<Integer, Object> CreateEntry(String SceneId, List<ProdEquipment> ProdEquipments, List<ProdLaunchOrder> ProdLaunchOrders,List<RoutingDiscreteParam> routingDiscreteParams,List<ProdOrderProcess> ProdOrderProcesss,List<ProdProcessExec> ProdProcessExecs,List<GroupResult> existingResults)
{
Map<Integer, Object> list=new HashMap<>();
List<String> soutceExecId = ProdOrderProcesss.stream()
.map(ProdOrderProcess::getExecId)
.distinct() // 提取Exec_ID
.collect(Collectors.toList());
List<String> targetExecId = ProdOrderProcesss.stream()
.map(ProdOrderProcess::getTargetExecId)
.distinct() // 提取TARGET_Exec_ID
.collect(Collectors.toList());
List<String> ExecIdNoChild= ProdProcessExecs.stream()
.filter(e -> !soutceExecId.contains(e.getExecId())&&!targetExecId.contains(e.getExecId())) // 过滤条件
.map(ProdProcessExec::getExecId)
.distinct()
.collect(Collectors.toList());
if(ExecIdNoChild!=null&&ExecIdNoChild.size()>0)
{
for (String ExecId : ExecIdNoChild) {
soutceExecId.add(ExecId);
targetExecId.add("");
}
}
List<GroupResult> results;
int index=0;
if(existingResults==null||existingResults.size()==0) {
results = IdGroupingWithDualSerial.groupAndOrderIds(soutceExecId, targetExecId);
}else {
index=existingResults.size();
results = IdGroupingWithDualSerial.addNewDataWithIsolatedGroup(existingResults,soutceExecId, targetExecId);
}
List<Entry> entrys=new ArrayList<>();
for (int i = index; i < results.size(); i++) {
GroupResult groupResult = results.get(i);
List<NodeInfo> nodeInfoList = groupResult.getNodeInfoList();
// System.out.println("分组" + (i + 1) + "顺序:" + nodeInfoList);
for (NodeInfo nodeInfo : nodeInfoList) {
// System.out.printf("原始ID:%s → 全局序号:%d,分组内序号:%d,新父ID列表:%s,新子ID列表:%s%n",
// nodeInfo.getOriginalId(),
// nodeInfo.getGlobalSerial(),
// nodeInfo.getGroupSerial(),
// nodeInfo.getNewParentIds().isEmpty() ? "无" : nodeInfo.getNewParentIds(),
// nodeInfo.getNewChildIds());
Entry entry = new Entry();
entry.setId(nodeInfo.getGlobalSerial());
entry.setGroupId(i + 1);
entry.setSequence(nodeInfo.getGroupSerial());
entry.setExecId(nodeInfo.getOriginalId());
ProdProcessExec op= ProdProcessExecs.stream()
.filter(t->t.getExecId().equals(entry.getExecId()))
.findFirst().orElse(null);
if(nodeInfo.getNewParentIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewParentIds()) {
OperationDependency od=new OperationDependency();
od.setPrevOperationId(id);
if (op != null) {
od.setDependencyType(DependencyType.fromValueSafe(op.getConnectProperty()));
} else {
od.setDependencyType(DependencyType.FinishToStart);
}
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);
// 记录属性
if (op != null) {
od.setDependencyType(DependencyType.fromValueSafe(op.getConnectProperty()));
} else {
od.setDependencyType(DependencyType.FinishToStart);
}
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
if(op!=null)
{
entry.setDiscreteParameter(routingDiscreteParams.stream().filter(t -> t.getRoutingDetailId().equals(op.getRoutingDetailId())).collect(Collectors.toList()));
entry.setEquipTypeID(op.getMachineId());
entry.setOrderId(op.getOrderId());
entry.setQuantity(op.getPlanQty());
entry.setRoutingId(op.getRoutingId());
entry.setRoutingDetailId(op.getRoutingDetailId());
entry.setTaskSeq(op.getTaskSeq());
entry.setRoutingDetailName(op.getRoutingDetailName());
ProdLaunchOrder order = ProdLaunchOrders.stream()
.filter(t -> t.getOrderId().equals(op.getOrderId()))
.findFirst().orElse(null);
if (order != null) {
entry.setProductId(order.getMaterialId());
}
List<ProdEquipment> Equipments = ProdEquipments.stream()
.filter(t -> t.getExecId().equals(op.getExecId()))
.collect(Collectors.toList());
if (Equipments != null && Equipments.size() > 0) {
List<MachineOption> mos = new ArrayList<>();
for (ProdEquipment e : Equipments) {
MachineOption mo = new MachineOption();
mo.setMachineId(e.getEquipId());
mo.setProcessingTime(e.getSpeed());
mo.setContantTime(op.getConstTime());
mo.setSetupTime(op.getChangeLineTime());
mo.setTeardownTime(op.getPostprocessingTime());
mo.setPreTime(e.getSetupTime());
mos.add(mo);
}
entry.setMachineOptions(mos);
}
}
entry.setPriority(1);
entrys.add(entry);
}
// 输出每个节点的详细信息
System.out.println("------------------------");
}
list.put(1,entrys);
list.put(2,results);
return list;
}
}
......@@ -633,7 +633,7 @@ public class LanuchServiceImpl implements LanuchService {
◦ @return 工序列表
*/
private List<RoutingDetail> getRoutingDetails(Integer routingHeaderId) {
public List<RoutingDetail> getRoutingDetails(Integer routingHeaderId) {
LambdaQueryWrapper<RoutingDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(RoutingDetail::getRoutingHeaderId, routingHeaderId)
.eq(RoutingDetail::getIsDeleted, 0) // 添加 is_deleted=0 过滤条件
......@@ -661,7 +661,7 @@ public class LanuchServiceImpl implements LanuchService {
◦ @param sceneId 场景ID
*/
private void batchInsertProcessExec(ProdLaunchOrder prodOrderMain,
public void batchInsertProcessExec(ProdLaunchOrder prodOrderMain,
List<RoutingDetail> routingDetails,
String sceneId, List<RoutingDetailEquip> routingDetailEquip) {
......@@ -670,7 +670,7 @@ public class LanuchServiceImpl implements LanuchService {
.map(detail -> createProcessExec(prodOrderMain, detail, sceneId))
.collect(Collectors.toList());
batchInsertEquipMent(routingDetailEquip, sceneId,processExecList);
batchInsertEquipMent(routingDetailEquip, sceneId,processExecList,true);
// 批量插入
if (!CollectionUtils.isEmpty(processExecList)) {
......@@ -699,7 +699,7 @@ public class LanuchServiceImpl implements LanuchService {
◦ @return 工序执行记录
*/
private ProdProcessExec createProcessExec(ProdLaunchOrder prodOrderMain,
public ProdProcessExec createProcessExec(ProdLaunchOrder prodOrderMain,
RoutingDetail detail,
String sceneId) {
ProdProcessExec prodProcessExec = new ProdProcessExec();
......@@ -790,6 +790,10 @@ public class LanuchServiceImpl implements LanuchService {
log.info("完成{}个工单的工序关系生成", prodOrderMains.size());
}
/**
◦ 生成工序关联关系
......@@ -873,7 +877,7 @@ public class LanuchServiceImpl implements LanuchService {
◦ @return 工序关系
*/
private ProdOrderProcess createProcessRelation(ProdLaunchOrder prodOrderMain,
public ProdOrderProcess createProcessRelation(ProdLaunchOrder prodOrderMain,
RoutingDetailConnect connection,
String sceneId,
Map<Long, String> routingDetailIdToExecIdMap) {
......@@ -934,14 +938,14 @@ public class LanuchServiceImpl implements LanuchService {
◦ 设备对照表
*/
private void batchInsertEquipMent(
public List<ProdEquipment> batchInsertEquipMent(
List<RoutingDetailEquip> routingDetailEquips,
String sceneId,List<ProdProcessExec> processExecList) {
String sceneId,List<ProdProcessExec> processExecList,Boolean isSave) {
if (CollectionUtils.isEmpty(routingDetailEquips)) {
log.warn("工艺设备列表为空,跳过设备对照表生成");
return;
return null;
}
......@@ -997,12 +1001,11 @@ public class LanuchServiceImpl implements LanuchService {
}
// 批量保存
if (!prodEquipments.isEmpty()) {
if (!prodEquipments.isEmpty()&&isSave) {
prodEquipmentService.saveBatch(prodEquipments);
}
return prodEquipments;
}
/**
......@@ -1014,7 +1017,7 @@ public class LanuchServiceImpl implements LanuchService {
◦ @return 工序列表
*/
private List<RoutingDetailEquip> getRoutingDetailEquip(Integer routingHeaderId) {
public List<RoutingDetailEquip> getRoutingDetailEquip(Integer routingHeaderId) {
List<RoutingDetailEquip> detailEquips = routingDetailEquipService.lambdaQuery()
......
......@@ -15,6 +15,7 @@ import com.aps.entity.basic.*;
import com.aps.service.*;
import com.aps.service.Algorithm.GeneticAlgorithm;
import com.aps.service.Algorithm.IdGroupingWithDualSerial;
import com.aps.service.Algorithm.RoutingDataService;
import com.aps.service.Algorithm.ScheduleOperationService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -69,6 +70,9 @@ public class PlanResultService {
@Autowired
private DiscreteParameterMatrixService _discreteParameterMatrixService;
@Autowired
private RoutingDataService _routingDataService;
private LocalDateTime baseTime = LocalDateTime.of(2025, 11, 1, 0, 0, 0);
public List<ScheduleChromosome> execute() {
......@@ -289,7 +293,9 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
List<Order> orders=new ArrayList<>();
for (ProdLaunchOrder lo : ProdLaunchOrders) {
Order order=new Order();
order.setOrderId(lo.getOrderId());
order.setRoutingId(lo.getRoutingId());
order.setMaterialId(lo.getMaterialId());
order.setDueDate(lo.getEndDate());
order.setQuantity(lo.getQuantity());
......@@ -752,161 +758,9 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
private Map<Integer, Object> InitEntrys(String SceneId,List<ProdEquipment> ProdEquipments,List<ProdLaunchOrder> ProdLaunchOrders)
{
Map<Integer, Object> list=new HashMap<>();
List<ProdProcessExec> ProdProcessExecs= _prodProcessExecService.lambdaQuery()
.eq(ProdProcessExec::getSceneId,SceneId)
.list();
// 获取op列表中所有的routingDetailId
List<Long> routingDetailIds = ProdProcessExecs.stream()
.map(ProdProcessExec::getRoutingDetailId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 查询RoutingDiscreteParam中routingDetailId在上述列表中的所有记录
List<RoutingDiscreteParam> routingDiscreteParams = _routingDiscreteParamService.lambdaQuery()
.in(RoutingDiscreteParam::getRoutingDetailId, routingDetailIds)
.eq(RoutingDiscreteParam::getIsDeleted, 0)
.list();
List<ProdOrderProcess> ProdOrderProcesss = _prodOrderProcessService.lambdaQuery()
.eq(ProdOrderProcess::getSceneId,SceneId)
.list();
List<String> soutceExecId = ProdOrderProcesss.stream()
.map(ProdOrderProcess::getExecId)
.distinct() // 提取Exec_ID
.collect(Collectors.toList());
List<String> targetExecId = ProdOrderProcesss.stream()
.map(ProdOrderProcess::getTargetExecId)
.distinct() // 提取TARGET_Exec_ID
.collect(Collectors.toList());
List<String> ExecIdNoChild= ProdProcessExecs.stream()
.filter(e -> !soutceExecId.contains(e.getExecId())&&!targetExecId.contains(e.getExecId())) // 过滤条件
.map(ProdProcessExec::getExecId)
.distinct()
.collect(Collectors.toList());
if(ExecIdNoChild!=null&&ExecIdNoChild.size()>0)
{
for (String ExecId : ExecIdNoChild) {
soutceExecId.add(ExecId);
targetExecId.add("");
}
}
List<GroupResult> results= IdGroupingWithDualSerial.groupAndOrderIds(soutceExecId,targetExecId);
List<Entry> entrys=new ArrayList<>();
return _routingDataService.InitEntrys(SceneId,ProdEquipments,ProdLaunchOrders);
for (int i = 0; i < results.size(); i++) {
GroupResult groupResult = results.get(i);
List<NodeInfo> nodeInfoList = groupResult.getNodeInfoList();
// System.out.println("分组" + (i + 1) + "顺序:" + nodeInfoList);
for (NodeInfo nodeInfo : nodeInfoList) {
// System.out.printf("原始ID:%s → 全局序号:%d,分组内序号:%d,新父ID列表:%s,新子ID列表:%s%n",
// nodeInfo.getOriginalId(),
// nodeInfo.getGlobalSerial(),
// nodeInfo.getGroupSerial(),
// nodeInfo.getNewParentIds().isEmpty() ? "无" : nodeInfo.getNewParentIds(),
// nodeInfo.getNewChildIds());
Entry entry = new Entry();
entry.setId(nodeInfo.getGlobalSerial());
entry.setGroupId(i + 1);
entry.setSequence(nodeInfo.getGroupSerial());
entry.setExecId(nodeInfo.getOriginalId());
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);
}
ProdProcessExec op= ProdProcessExecs.stream()
.filter(t->t.getExecId().equals(entry.getExecId()))
.findFirst().orElse(null);
if(nodeInfo.getNewChildIds()!=null)
{
List<OperationDependency> OperationDependency=new ArrayList<>();
for (int id : nodeInfo.getNewChildIds()) {
OperationDependency od=new OperationDependency();
od.setNextOperationId(id);
// 记录属性
if (op != null) {
od.setDependencyType(DependencyType.fromValueSafe(op.getConnectProperty()));
} else {
od.setDependencyType(DependencyType.FinishToStart);
}
OperationDependency.add(od);
}
entry.setNextEntryIds(OperationDependency);
}
if(op!=null)
{
entry.setDiscreteParameter(routingDiscreteParams.stream().filter(t -> t.getRoutingDetailId().equals(op.getRoutingDetailId())).collect(Collectors.toList()));
entry.setEquipTypeID(op.getMachineId());
entry.setOrderId(op.getOrderId());
entry.setQuantity(op.getPlanQty());
entry.setRoutingDetailId(op.getRoutingDetailId());
entry.setTaskSeq(op.getTaskSeq());
entry.setRoutingDetailName(op.getRoutingDetailName());
ProdLaunchOrder order = ProdLaunchOrders.stream()
.filter(t -> t.getOrderId().equals(op.getOrderId()))
.findFirst().orElse(null);
if (order != null) {
entry.setProductId(order.getMaterialId());
}
List<ProdEquipment> Equipments = ProdEquipments.stream()
.filter(t -> t.getExecId().equals(op.getExecId()))
.collect(Collectors.toList());
if (Equipments != null && Equipments.size() > 0) {
List<MachineOption> mos = new ArrayList<>();
for (ProdEquipment e : Equipments) {
MachineOption mo = new MachineOption();
mo.setMachineId(e.getEquipId());
mo.setProcessingTime(e.getSpeed());
mo.setContantTime(op.getConstTime());
mo.setSetupTime(op.getChangeLineTime());
mo.setTeardownTime(op.getPostprocessingTime());
mo.setPreTime(e.getSetupTime());
mos.add(mo);
}
entry.setMachineOptions(mos);
}
}
entry.setPriority(1);
entrys.add(entry);
}
// 输出每个节点的详细信息
System.out.println("------------------------");
}
list.put(1,entrys);
list.put(2,results);
return list;
}
......
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