物料配套

parent 40085732
......@@ -193,7 +193,7 @@ public class Chromosome {
/// 交付期延迟时间
/// </summary>
private double DelayTime;
private double SemiJitSlack;
private String ScenarioID;
......
......@@ -7,10 +7,10 @@ package com.aps.entity.Algorithm;
*/
public class ObjectiveWeights {
/**
* 目标权重(默认值:[0.3, 0.2, 0.15, 0.2, 0.15])
* 对应:完工时间、总流程时间、总换型时间、机器负载标准差、延迟时间
* 目标权重(默认值:[0.3, 0.2, 0.15, 0.2, 0.15, 0.01])
* 对应:完工时间、总流程时间、总换型时间、机器负载标准差、延迟时间、半成品JIT
*/
private double[] weights = new double[] { 0.3, 0.2, 0.15, 0.2, 0.15 };
private double[] weights = new double[] { 0.3, 0.2, 0.15, 0.2, 0.15, 0.01 };
/**
* NSGA-II模式:true=纯帕累托(无视权重),false=加权帕累托
......
......@@ -160,4 +160,8 @@ private Long isInterrupt = 1l;
@Schema(description = "指定开始时间")
@JsonInclude(JsonInclude.Include.ALWAYS)
private LocalDateTime designatedStartTime;
private LocalDateTime jitPreferredStartTime;
private boolean jitTemporary = false;
}
......@@ -14,7 +14,6 @@ public class GlobalParam {
/// 是否可以打破优先级
/// </summary>
private boolean IsBreakPriority = false;
/// <summary>
/// 是否多台设备
/// </summary>
......@@ -51,6 +50,16 @@ public class GlobalParam {
*/
private boolean pureNSGAIIMode = true;
/**
* 半成品JIT缓冲时间(分钟)
*/
private int semiJitBufferMinutes = 0;
/**
* 物料/设备固定点求解最大迭代次数
*/
private int materialSolveMaxIterations = 8;
/// <summary>
......@@ -66,6 +75,7 @@ public class GlobalParam {
public static final String OBJECTIVE_SETUP_TIME = "setupTime"; // 总换型时间
public static final String OBJECTIVE_MACHINE_LOAD = "machineLoad"; // 机器负载均衡
public static final String OBJECTIVE_TARDINESS = "tardiness"; // 延迟时间
public static final String OBJECTIVE_SEMI_JIT = "semiJitSlack"; // 半成品提前完工惩罚
/// <summary>
/// 构造函数,初始化默认值
......@@ -73,15 +83,22 @@ public class GlobalParam {
public GlobalParam() {
// 初始化默认目标值配置
//完工时间、总流程时间、总换型时间、机器负载标准差、延迟时间
objectiveConfigs.add(new ObjectiveConfig(OBJECTIVE_MAKESPAN, true, 1, 0.3));
objectiveConfigs.add(new ObjectiveConfig(OBJECTIVE_FLOW_TIME, true, 2, 0.1));
objectiveConfigs.add(new ObjectiveConfig(OBJECTIVE_SETUP_TIME, true, 2, 0.1));
objectiveConfigs.add(new ObjectiveConfig(OBJECTIVE_MACHINE_LOAD, true, 1, 0.1));
objectiveConfigs.add(new ObjectiveConfig(OBJECTIVE_TARDINESS, true, 1, 0.6));
objectiveConfigs.add(createMinimizeObjectiveConfig(OBJECTIVE_MAKESPAN, 1, 0.3));
objectiveConfigs.add(createMinimizeObjectiveConfig(OBJECTIVE_FLOW_TIME, 2, 0.2));
objectiveConfigs.add(createMinimizeObjectiveConfig(OBJECTIVE_SETUP_TIME, 2, 0.15));
objectiveConfigs.add(createMinimizeObjectiveConfig(OBJECTIVE_MACHINE_LOAD, 1, 0.2));
objectiveConfigs.add(createMinimizeObjectiveConfig(OBJECTIVE_TARDINESS, 1, 0.15));
objectiveConfigs.add(createMinimizeObjectiveConfig(OBJECTIVE_SEMI_JIT, 2, 0.01));
objectiveConfigs.sort(Comparator.comparing((ObjectiveConfig op) -> op.getLevel()));
}
private ObjectiveConfig createMinimizeObjectiveConfig(String name, int level, double weight) {
ObjectiveConfig config = new ObjectiveConfig(name, true, level, weight);
config.setMinimize(true);
return config;
}
/// <summary>
/// 获取目标值启用状态
/// </summary>
......
......@@ -133,6 +133,9 @@ int opcount=allOperations.size();
FileHelper.writeLogFile("按Objectives去重-----------开始-------" + population.size());
population = chromosomeDistinctByObjectives(population);
FileHelper.writeLogFile("按Objectives去重-----------结束-------" + population.size());
if (population == null || population.isEmpty()) {
throw new RuntimeException("初始种群为空,请检查 populationSize、种群初始化和解码结果");
}
// if(1==1)
// return getBestChromosome(population.get(0), param.getBaseTime(), starttime);
// 步骤2:对初始种群进行爬山法局部优化
......
......@@ -19,7 +19,7 @@ public class NSGAIIUtils {
private int taskCount; // 并行任务数(默认=CPU核心数)
private GlobalParam globalParam; // 全局参数配置
// true 越小越好
private boolean[] isMinimize = {true, true, true, true, true};
private boolean[] isMinimize = {true, true, true, true, true, true};
......@@ -627,7 +627,8 @@ public class NSGAIIUtils {
for (int i = 0; i < kpisize; i++) {
final int idx = i;
if(isMinimize[i])
boolean minimize = i >= isMinimize.length || isMinimize[i];
if(minimize)
{
idealPoint[i] = front.stream().mapToDouble(c -> c.getObjectives()[idx]).min().orElse(0);
......
......@@ -1851,42 +1851,23 @@ if(targetOp.getSequence()>1) {
*/
public void redecode(Chromosome chromosome,LocalDateTime baseTime, GlobalParam globalParam)
{
List<Material> UseMaterials= materialRequirementService.GetMaterials(chromosome.getScenarioID());
chromosome.setMaterials(new ArrayList<>());
if(UseMaterials==null) {
if (chromosome.getMaterialIds() != null && chromosome.getMaterialIds().size() > 0) {
List<Material> Materials = planResultService.InitMaterial();
UseMaterials = Materials.stream()
.filter(t -> chromosome.getMaterialIds()
.contains(t.getId())).collect(Collectors.toList());
chromosome.setMaterials(UseMaterials);
materialRequirementService.SetMaterials(chromosome.getScenarioID(),UseMaterials);
}
}else {
chromosome.setMaterials(UseMaterials);
}
DelOrder(chromosome);
MachineSchedulerService machineScheduler = new MachineSchedulerService(baseTime);
chromosome.setMachines(ProductionDeepCopyUtil.deepCopyList(chromosome.getInitMachines(),Machine.class) );
GeneticDecoder decoder = new GeneticDecoder(globalParam,baseTime, chromosome.getMachines(),
chromosome.getOrders(), null, machineScheduler,materialRequirementService,chromosome.getScenarioID());
List<Material> baseMaterialsSnapshot = resolveDecodeMaterials(chromosome);
chromosome.setResultOld(ProductionDeepCopyUtil.deepCopyList(chromosome.getResult(),GAScheduleResult.class));
chromosome.getResult().clear();
CopyOnWriteArrayList<GAScheduleResult> Resultlock= chromosome.getResult().stream()
.filter(o -> o.isIsLocked() == true)
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
chromosome.setResult(ProductionDeepCopyUtil.deepCopyList(Resultlock,GAScheduleResult.class));
GeneticDecoder decoder = prepareDecodePass(chromosome, baseTime, globalParam, baseMaterialsSnapshot, true);
decoder.decode(chromosome,false);
PostEditJitService postEditJitService = new PostEditJitService();
try {
if (postEditJitService.applyPostEditJitBias(chromosome, globalParam)) {
chromosome.setResultOld(ProductionDeepCopyUtil.deepCopyList(chromosome.getResult(),GAScheduleResult.class));
decoder = prepareDecodePass(chromosome, baseTime, globalParam, baseMaterialsSnapshot, false);
decoder.decode(chromosome,false, false);
}
} finally {
postEditJitService.clearTemporaryJitBias(chromosome);
}
KpiCalculator kpiCalculator=new KpiCalculator(chromosome);
kpiCalculator.calculatekpi();
......@@ -1907,6 +1888,47 @@ if(targetOp.getSequence()>1) {
}
private GeneticDecoder prepareDecodePass(Chromosome chromosome, LocalDateTime baseTime, GlobalParam globalParam,
List<Material> baseMaterialsSnapshot, boolean removeGeneratedOrders) {
if (removeGeneratedOrders) {
DelOrder(chromosome);
}
if (chromosome.getOrders() != null) {
chromosome.getOrders().forEach(order -> order.setCreateBom(false));
}
resetDecodeMaterials(chromosome, baseMaterialsSnapshot);
MachineSchedulerService machineScheduler = new MachineSchedulerService(baseTime);
chromosome.setMachines(ProductionDeepCopyUtil.deepCopyList(chromosome.getInitMachines(),Machine.class) );
chromosome.getResult().clear();
chromosome.setResult(new CopyOnWriteArrayList<>());
return new GeneticDecoder(globalParam,baseTime, chromosome.getMachines(),
chromosome.getOrders(), null, machineScheduler,materialRequirementService,chromosome.getScenarioID());
}
private List<Material> resolveDecodeMaterials(Chromosome chromosome) {
List<Material> useMaterials = materialRequirementService.GetMaterials(chromosome.getScenarioID());
if (useMaterials == null && chromosome.getMaterialIds() != null && chromosome.getMaterialIds().size() > 0) {
List<Material> materials = planResultService.InitMaterial();
useMaterials = materials.stream()
.filter(t -> chromosome.getMaterialIds().contains(t.getId()))
.collect(Collectors.toList());
}
if (useMaterials == null) {
useMaterials = new ArrayList<>();
}
return ProductionDeepCopyUtil.deepCopyList(useMaterials, Material.class);
}
private void resetDecodeMaterials(Chromosome chromosome, List<Material> baseMaterialsSnapshot) {
List<Material> materialsForDecode = ProductionDeepCopyUtil.deepCopyList(baseMaterialsSnapshot, Material.class);
chromosome.setMaterials(materialsForDecode);
materialRequirementService.SetMaterials(chromosome.getScenarioID(), materialsForDecode);
}
public void DelOrder(Chromosome chromosome) {
List<Entry> allOperations = chromosome.getAllOperations();
List<GlobalOperationInfo> globalOpList= chromosome.getGlobalOpList();
......@@ -1914,7 +1936,7 @@ if(targetOp.getSequence()>1) {
List<Integer> OperationSequencing= chromosome.getOperationSequencing();
List<GAScheduleResult> ScheduleResults = chromosome.getResult();
List<Integer> newoorderids= orders.stream()
.filter(t->t.isNewCreate())
.filter(t -> t.isNewCreate() || t.isNewSfCreate())
.map(Order::getId)
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
......
......@@ -1867,6 +1867,7 @@ public class PlanResultService {
FileHelper.writeLogFile(String.format("Setup Time: %f minutes", schedule.getTotalChangeoverTime()));
FileHelper.writeLogFile(String.format("Flow Time: %f minutes", schedule.getTotalFlowTime()));
FileHelper.writeLogFile(String.format("Machine Load Balance: %.2f%%", schedule.getMachineLoadStd() * 100));
FileHelper.writeLogFile(String.format("Semi JIT Slack: %f minutes", schedule.getSemiJitSlack()));
FileHelper.writeLogFile("-------------------------");
// 按订单分组写入
......
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