Commit 485980ba authored by Tong Li's avatar Tong Li

遗传算法-增加约束和基准日期

parent 89da235d
package com.aps.entity.Algorithm;
import com.aps.common.util.FileHelper;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
......
......@@ -24,9 +24,14 @@ public class GlobalParam {
private boolean IsUseCalendar = true;
/// <summary>
/// 是否启动设备日历
/// 是否启动原材料约束
/// </summary>
private boolean IsCheckMp = true;
/// <summary>
/// 是否启动半成品约束
/// </summary>
private boolean IsCheckBom = true;
private boolean IsCheckSf = true;
/// <summary>
/// 是否重叠
......
......@@ -62,8 +62,8 @@ public class GeneticAlgorithm {
}
public Chromosome Run(ScheduleParams param, List<Entry> allOperations) {
if(_GlobalParam.isIsCheckBom()&&materials!=null&&materials.size()>0) {
materialRequirementService.init(materials, orders, allOperations, _entryRel, machineScheduler, machines);
if(materials!=null&&materials.size()>0) {
materialRequirementService.init(materials, orders, allOperations, _entryRel, machineScheduler, machines,_GlobalParam);
orderMaterials = materialRequirementService.buildMultiLevelRequirementNetwork(param.getBaseTime());
}
......
......@@ -63,7 +63,7 @@ public class GeneticDecoder {
FileHelper.writeLogFile("解码-----------开始-------"+chromosome.getID()+":"+cacheKey );
_allOperations=chromosome.getAllOperations();
if(_globalParam.isIsCheckBom()&&orderMaterials!=null&&orderMaterials.size()>0) {
if(orderMaterials!=null&&orderMaterials.size()>0) {
CreateNewOpSequence(chromosome);
}
......@@ -128,7 +128,10 @@ public class GeneticDecoder {
.distinct()
.collect(Collectors.toList());
if(finishedOrder==null||finishedOrder.size()==0)
{
return;
}
List<Integer> oldSequence=chromosome.getOperationSequencing();
List<Integer> finalSequence = new ArrayList<>();
......@@ -577,7 +580,7 @@ public class GeneticDecoder {
private int getOperationBOMTime(Entry currentOp, Chromosome chromosome) {
if(!_globalParam.isIsCheckBom()||orderMaterials==null)
if(orderMaterials==null)
{
return 0;
}
......@@ -588,12 +591,14 @@ public class GeneticDecoder {
int rawTime = 0, sfTime = 0;
if (opboms != null && !opboms.isEmpty()) {
// 计算RawTime
Optional<LocalDateTime> rawDateOpt = opboms.stream()
.filter(t -> t.getMaterialTypeName().equals("MP") )
.map(OrderMaterialRequirement::getUseTime)
.max(LocalDateTime::compareTo);
if (rawDateOpt.isPresent()) {
rawTime = (int) Duration.between(baseTime, rawDateOpt.get()).getSeconds();
if(_globalParam.isIsCheckMp()) {
Optional<LocalDateTime> rawDateOpt = opboms.stream()
.filter(t -> t.getMaterialTypeName().equals("MP"))
.map(OrderMaterialRequirement::getUseTime)
.max(LocalDateTime::compareTo);
if (rawDateOpt.isPresent()) {
rawTime = (int) Duration.between(baseTime, rawDateOpt.get()).getSeconds();
}
}
// 计算SFTime
......@@ -602,7 +607,7 @@ public class GeneticDecoder {
&& t.getProductOrderID() != null && !t.getProductOrderID().isEmpty())
.collect(Collectors.toList());
if (!sfBoms.isEmpty()) {
if (!sfBoms.isEmpty()&&sfBoms.size()>0) {
for (OrderMaterialRequirement sf : sfBoms) {
for (int orderid : sf.getProductOrderID()) {
int sfTime1 = 0;
......
......@@ -78,7 +78,11 @@ public class MaterialRequirementService {
private MachineSchedulerService machineScheduler;
public void init(List<Material> materials,List<Order> _orders,List<Entry> allOperations,List<GroupResult> entryRel,MachineSchedulerService _machineScheduler,List<Machine> machines)
private GlobalParam globalParam;
public void init(List<Material> materials,List<Order> _orders,List<Entry> allOperations,List<GroupResult> entryRel,MachineSchedulerService _machineScheduler,List<Machine> machines,GlobalParam _GlobalParam)
{
orders = _orders;
......@@ -87,6 +91,7 @@ public class MaterialRequirementService {
_entryRel=entryRel;
machineScheduler=_machineScheduler;
_Machines=machines;
globalParam=_GlobalParam;
}
/**
......@@ -356,7 +361,7 @@ if(routingIds.size()==0)
Map<Integer, Object> list=_routingDataService.CreateEntry( sceneId, ProdEquipmentList, ProdLaunchOrders, routingDiscreteParams, ProdOrderProcesslist, processExecList,_entryRel );
List<Machine> machines= _routingDataService.InitCalendarToAllMachines(sceneId,ProdEquipmentList,machineScheduler);
List<Machine> machines= _routingDataService.InitCalendarToAllMachines(sceneId,ProdEquipmentList,machineScheduler, globalParam.isIsUseCalendar());
if(list.get(1)!=null)
......@@ -536,6 +541,7 @@ if(routingIds.size()==0)
if (order.getFinishOrderId().size() == 1) {
// 递归构建BOM
int l = level + 1;
BOMBuildResult childResult = buildOrderBOM(0, material.getId(),
orderId, order.getOrderId(),
order.getQuantity(), l,order);
......@@ -556,7 +562,7 @@ if(routingIds.size()==0)
orderMaterial.setYpQty(allneeded - needed);
orderMaterial.setQjQty(needed);
if (needed > 0) {
if (needed > 0&&globalParam.isIsCheckSf()) {
// 创建新的子订单
Order childorder = new Order();
String OrderId = UUID.randomUUID().toString().replace("-", "");
......
......@@ -79,6 +79,9 @@ public class PlanResultService {
@Autowired
private ConfigMapper configMapper;
@Autowired
private ApsTimeConfigMapper apsTimeConfigMapper;
@Autowired
private RedisUtils redisUtils;
......@@ -301,9 +304,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
try {
ScheduleParams param = new ScheduleParams();
param.setBaseTime(LocalDateTime.of(2025, 11, 1, 0, 0, 0));
ScheduleParams param = InitScheduleParams();
// 1. 读取数据
......@@ -318,10 +319,11 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
List<ProdLaunchOrder> ProdLaunchOrders= _prodLaunchOrderService.lambdaQuery()
.eq(ProdLaunchOrder::getSceneId,SceneId)
.list();
GlobalParam globalParam=InitGlobalParam();
// 3. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService(
param.getBaseTime());
List<Machine> machines= InitCalendarToAllMachines(SceneId, ProdEquipments,machineScheduler);
List<Machine> machines= InitCalendarToAllMachines(SceneId, ProdEquipments,machineScheduler,globalParam.isIsUseCalendar());
// 3. 构建订单-工序数据
List<Order> orders=InitOrder(ProdLaunchOrders);
......@@ -331,15 +333,9 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
List<Entry> entrys=(List<Entry>)list.get(1);
List<GroupResult> entryRel=(List<GroupResult>)list.get(2);
GlobalParam globalParam=InitGlobalParam();
// 5. 执行调度算法
GeneticAlgorithm scheduler =new GeneticAlgorithm(globalParam,machines,orders,Materials,machineScheduler,entryRel,materialRequirementService); //new GeneticAlgorithm(products, machines, orders, machineScheduler);
param.initAdaptiveParams(entrys.size());
......@@ -537,12 +533,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
public Chromosome schedule(String SceneId) {
try {
ScheduleParams param = new ScheduleParams();
// param.setBaseTime(baseTime);
param.setBaseTime(LocalDateTime.of(2025, 11, 1, 0, 0, 0));
ScheduleParams param = InitScheduleParams();
......@@ -558,25 +549,25 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
List<ProdEquipment> ProdEquipments= _prodEquipmentService.lambdaQuery()
.eq(ProdEquipment::getSceneId,SceneId)
.list();
GlobalParam globalParam=InitGlobalParam();
List<ProdLaunchOrder> ProdLaunchOrders= _prodLaunchOrderService.lambdaQuery()
.eq(ProdLaunchOrder::getSceneId,SceneId)
.list();
// 3. 创建调度服务
MachineSchedulerService machineScheduler = new MachineSchedulerService(
param.getBaseTime());
List<Machine> machines= InitCalendarToAllMachines(SceneId, ProdEquipments,machineScheduler);
List<Machine> machines= InitCalendarToAllMachines(SceneId, ProdEquipments,machineScheduler,globalParam.isIsUseCalendar());
// 3. 构建订单-工序数据
List<Order> orders=InitOrder(ProdLaunchOrders);
List<Material> Materials=null; //InitMaterial();
List<Material> Materials=InitMaterial();
Map<Integer,Object> list= InitEntrys(SceneId,ProdEquipments,orders);
List<Entry> entrys=(List<Entry>)list.get(1);
List<GroupResult> entryRel=(List<GroupResult>)list.get(2);
GlobalParam globalParam=InitGlobalParam();
// 5. 执行调度算法
GeneticAlgorithm scheduler =new GeneticAlgorithm(globalParam,machines,orders,Materials,machineScheduler,entryRel,materialRequirementService); //new GeneticAlgorithm(products, machines, orders, machineScheduler);
param.initAdaptiveParams(entrys.size());
......@@ -704,16 +695,40 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
}
}
private List<Machine> InitCalendarToAllMachines(String SceneId,List<ProdEquipment> ProdEquipments,MachineSchedulerService machineScheduler) {
private List<Machine> InitCalendarToAllMachines(String SceneId,List<ProdEquipment> ProdEquipments,MachineSchedulerService machineScheduler,boolean IsUseCalendar) {
// 按设备分组
return _routingDataService.InitCalendarToAllMachines(SceneId,ProdEquipments,machineScheduler);
FileHelper.writeLogFile("初始化设备日历-----------开始-------");
List<Machine> machines= _routingDataService.InitCalendarToAllMachines(SceneId,ProdEquipments,machineScheduler,IsUseCalendar);
FileHelper.writeLogFile("初始化设备日历-----------结束-------");
return machines;
}
private ScheduleParams InitScheduleParams()
{
FileHelper.writeLogFile("初始化排产参数-----------开始-------");
LambdaQueryWrapper<ApsTimeConfig> queryWrapper = new LambdaQueryWrapper<ApsTimeConfig>();
Page<ApsTimeConfig> page = new Page<>(1, 1);
ApsTimeConfig apsTimeConfig= apsTimeConfigMapper.selectOne( queryWrapper);
ScheduleParams param = new ScheduleParams();
param.setBaseTime(LocalDateTime.of(2025, 11, 1, 0, 0, 0));
if(apsTimeConfig!=null) {
if(apsTimeConfig.getBaseTime()!=null)
{
param.setBaseTime(apsTimeConfig.getBaseTime());
}
}
FileHelper.writeLogFile("初始化排产参数-----------结束-------");
return param;
}
private GlobalParam InitGlobalParam()
{
FileHelper.writeLogFile("初始化约束-----------开始-------");
GlobalParam globalParam=new GlobalParam();
......@@ -734,23 +749,31 @@ private GlobalParam InitGlobalParam()
List<ConfigSetting> configs= _configService.getComponentSettingsByPageAndNote(config.getId(),"setting");
for (ConfigSetting c : configs) {
if(c.getTitle().equals("日历"))
if(c.getTitle().contains("日历"))
{
globalParam.setIsUseCalendar(c.isValue());
}
else if(c.getTitle().equals("设置时间"))
else if(c.getTitle().contains("设置时间"))
{
globalParam.setIsUseCalendar(c.isValue());
}else if(c.getTitle().equals("原材料"))
}
else if(c.getTitle().contains("原材料"))
{
globalParam.setIsCheckBom(c.isValue());
globalParam.setIsCheckMp(c.isValue());
}
else if(c.getTitle().equals("设置时间平滑"))
else if(c.getTitle().contains("后台任务设置"))
{
globalParam.set_smoothSetup(c.isValue());
}
else if(c.getTitle().contains("设置时间平滑"))
{
globalParam.set_smoothSetup(c.isValue());
}
}
}
FileHelper.writeLogFile("初始化约束-----------结束-------");
return globalParam;
}
private List<Order> InitOrder(List<ProdLaunchOrder> ProdLaunchOrders)
......@@ -915,6 +938,7 @@ private GlobalParam InitGlobalParam()
private List<Material> InitMaterial() {
List<Material> materials=new ArrayList<>();
FileHelper.writeLogFile("初始化物料-----------开始-------");
// List<MaterialInfo> materiallist= materialInfoService.lambdaQuery()
// .eq(MaterialInfo::getIsdeleted,0)
......@@ -938,6 +962,7 @@ private GlobalParam InitGlobalParam()
GlobalCacheUtil.put("material",materials, 10, TimeUnit.MINUTES);
FileHelper.writeLogFile("初始化物料-----------结束-------");
return materials;
}
......@@ -1049,7 +1074,10 @@ private GlobalParam InitGlobalParam()
private Map<Integer, Object> InitEntrys(String SceneId,List<ProdEquipment> ProdEquipments,List<Order> ProdLaunchOrders)
{
return _routingDataService.InitEntrys(SceneId,ProdEquipments,ProdLaunchOrders);
FileHelper.writeLogFile("初始化工单-----------开始-------");
Map<Integer, Object> entrys= _routingDataService.InitEntrys(SceneId,ProdEquipments,ProdLaunchOrders);
FileHelper.writeLogFile("初始化工单-----------结束-------");
return entrys;
}
......
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