Commit 539b80b3 authored by Tong Li's avatar Tong Li

Merge remote-tracking branch 'origin/tl'

parents 73a7b529 b9dc6d43
...@@ -58,7 +58,7 @@ public class GeneticDecoder { ...@@ -58,7 +58,7 @@ public class GeneticDecoder {
private DiscreteParameterMatrixService discreteParameterMatrixService; private DiscreteParameterMatrixService discreteParameterMatrixService;
private String sceneId; private String sceneId;
private boolean rebuildStructureForCurrentDecode = true; private boolean rebuildStructureForCurrentDecode = false;
...@@ -1107,6 +1107,7 @@ public class GeneticDecoder { ...@@ -1107,6 +1107,7 @@ public class GeneticDecoder {
int setupTime=0; int setupTime=0;
long machineId = machine.getId(); long machineId = machine.getId();
boolean needMaterialCheck = (operation.getMaterialRequirements()!=null&&operation.getMaterialRequirements().size()>0&&operation.getTargetFinishedOperationId()==null)||calbom; boolean needMaterialCheck = (operation.getMaterialRequirements()!=null&&operation.getMaterialRequirements().size()>0&&operation.getTargetFinishedOperationId()==null)||calbom;
needMaterialCheck=false;
boolean commitMaterialCheck = needMaterialCheck; boolean commitMaterialCheck = needMaterialCheck;
int baseEarliestStartTime = earliestStartTime; int baseEarliestStartTime = earliestStartTime;
int candidateStartTime = earliestStartTime; int candidateStartTime = earliestStartTime;
......
...@@ -86,7 +86,7 @@ public class HillClimbing { ...@@ -86,7 +86,7 @@ public class HillClimbing {
// 构建位置到Entry的映射:position -> Entry // 构建位置到Entry的映射:position -> Entry
Map<Integer, Entry> entryIndex = buildEntryIndex(current, entrys); Map<Integer, Entry> entryIndex = buildEntryIndex(current, entrys);
boolean improved = true; boolean improved = false;
for (Double priority : sortedPriorities) { for (Double priority : sortedPriorities) {
List<Entry> priorityOps = priorityGroups.get(priority); List<Entry> priorityOps = priorityGroups.get(priority);
if (priorityOps.isEmpty()) { if (priorityOps.isEmpty()) {
...@@ -107,6 +107,7 @@ public class HillClimbing { ...@@ -107,6 +107,7 @@ public class HillClimbing {
Chromosome machineChange = generateMachineChange(current, op.getMachineOptions(), maPos); Chromosome machineChange = generateMachineChange(current, op.getMachineOptions(), maPos);
if (machineChange != null) { if (machineChange != null) {
decode(decoder, machineChange,machines); decode(decoder, machineChange,machines);
writeKpi(machineChange);
if (isBetter(machineChange, current)) { if (isBetter(machineChange, current)) {
current = machineChange; current = machineChange;
if (isBetter(current, best)) { if (isBetter(current, best)) {
...@@ -125,7 +126,7 @@ public class HillClimbing { ...@@ -125,7 +126,7 @@ public class HillClimbing {
if (improved) break; if (improved) break;
} }
if (improved) continue;
// 2. 检查是否是单一订单(如果只有一个订单,不需要交换位置 // 2. 检查是否是单一订单(如果只有一个订单,不需要交换位置
Set<Integer> groupIds = priorityOps.stream() Set<Integer> groupIds = priorityOps.stream()
...@@ -312,6 +313,8 @@ public class HillClimbing { ...@@ -312,6 +313,8 @@ public class HillClimbing {
// 根据当前优先级的工序数确定迭代次数和step // 根据当前优先级的工序数确定迭代次数和step
int priorityIterations = Math.max(5, priorityOps.size() / 2); int priorityIterations = Math.max(5, priorityOps.size() / 2);
priorityIterations = Math.min(priorityIterations, priorityOps.size());
// 200/10 =20 // 200/10 =20
// 1 // 1
int step = Math.max(1, (int) Math.ceil(priorityOps.size() / 10.0)); int step = Math.max(1, (int) Math.ceil(priorityOps.size() / 10.0));
...@@ -422,6 +425,7 @@ public class HillClimbing { ...@@ -422,6 +425,7 @@ public class HillClimbing {
} }
for (int i = 0; i < candidates.size(); i++) { for (int i = 0; i < candidates.size(); i++) {
Chromosome candidate = candidates.get(i); Chromosome candidate = candidates.get(i);
writeKpi(candidate);
if (isBetter(candidate, best)) { if (isBetter(candidate, best)) {
bestidx = i; bestidx = i;
} }
...@@ -439,7 +443,7 @@ public class HillClimbing { ...@@ -439,7 +443,7 @@ public class HillClimbing {
fitness += fitness1[i] + ","; fitness += fitness1[i] + ",";
} }
FileHelper.writeLogFile(String.format("爬山法 - kpi:%s", fitness)); FileHelper.writeLogFile(String.format("爬山法%s - kpi:%s",chromosome.getGeneStr(), fitness));
} }
/** /**
......
...@@ -119,7 +119,7 @@ int opcount=allOperations.size(); ...@@ -119,7 +119,7 @@ int opcount=allOperations.size();
FileHelper.writeLogFile("构造启发式初始化-----------结束-------"); FileHelper.writeLogFile("构造启发式初始化-----------结束-------");
population= chromosomeDistinct(population); population= chromosomeDistinct(population).subList(0,1);
...@@ -457,7 +457,7 @@ int opcount=allOperations.size(); ...@@ -457,7 +457,7 @@ int opcount=allOperations.size();
FileHelper.writeLogFile("解码---------------"+population.size() ); FileHelper.writeLogFile("解码---------------"+population.size() );
GeneticDecoder decoder = new GeneticDecoder(_GlobalParam, param.getBaseTime(), machines, orders, materials, machineScheduler,materialRequirementService, sceneId); GeneticDecoder decoder = new GeneticDecoder(_GlobalParam, param.getBaseTime(), machines, orders, materials, machineScheduler,materialRequirementService, sceneId);
boolean ismore=false; boolean ismore=true;
if(ismore) { if(ismore) {
CompletableFuture.allOf(population.stream() CompletableFuture.allOf(population.stream()
.map(chromosome -> CompletableFuture.runAsync(() -> decode(decoder, chromosome, param, allOperations, globalOpList), decodeExecutor)) .map(chromosome -> CompletableFuture.runAsync(() -> decode(decoder, chromosome, param, allOperations, globalOpList), decodeExecutor))
......
...@@ -2146,124 +2146,130 @@ public class PlanResultService { ...@@ -2146,124 +2146,130 @@ public class PlanResultService {
.eq(StrategyRule::getIsGlobal, 1) .eq(StrategyRule::getIsGlobal, 1)
.one(); .one();
List<StrategyScheduling> StrategySchedulings = _strategyRuleService.getForwardSchedulingByRuleId(strategyRules.getId());
Set<String> files = new HashSet<>();
if (StrategySchedulings != null) {
List<StrategyScheduling> selecteds = StrategySchedulings.stream().filter(t -> t.isValue() == true).sorted(Comparator.comparingInt(StrategyScheduling::getSort) ).collect(Collectors.toList());
if (selecteds != null && selecteds.size() > 0) {
int i = 1;
for (StrategyScheduling strategy : selecteds) {
int Amplitude= strategy.getAmplitude();
if (strategy.getName().equals("customer_due_date")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
if(Amplitude>0) {
condition.setFieldName("groupDueDate");
DateGroupUtil.calculateGroupDueDate(orders, "dueDate", "groupDueDate", strategy.getAmplitude());
}else {
condition.setFieldName("dueDate");
}
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("groupDueDate");
i++;
} else if (strategy.getName().equals("startd_date") ) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
if(Amplitude>0) {
condition.setFieldName("groupStartDate");
DateGroupUtil.calculateGroupDueDate(orders, "startDate", "groupStartDate", strategy.getAmplitude());
}else {
condition.setFieldName("startDate");
}
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("groupStartDate");
i++;
} else if (strategy.getName().equals("gathering_series")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("serie");
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("serie");
i++;
} else if (strategy.getName() .equals( "Minimum_wo_priority") && !files.contains("priority")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("priority");
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("priority");
i++;
} else if (strategy.getName() .equals( "maximum_wo_priority") && !files.contains("priority")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("priority");
condition.setReverse(true); // 高优先级在前
conditions.add(condition);
files.add("priority");
i++;
} else if (strategy.getName() .equals( "material_rise")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("materialCode");
condition.setReverse(true); // 递增
conditions.add(condition);
files.add("materialCode");
i++;
} else if (strategy.getName() .equals( "plan_rise") && !files.contains("orderCode")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("orderCode");
condition.setReverse(true); // 递增
conditions.add(condition);
files.add("orderCode");
i++;
} else if (strategy.getName() .equals( "plan_drop") && !files.contains("orderCode")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("orderCode");
condition.setReverse(false); // 递减
conditions.add(condition);
files.add("orderCode");
i++;
}else if (strategy.getName().equals("minimize_tool_changeovers")) {
// 最小化换线策略需要特殊处理,这里只做标记
// 实际排序逻辑将在orderSortService中处理
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("minimize_changeover");
condition.setReverse(false);
conditions.add(condition);
files.add("minimize_changeover");
i++;
}
}
} else {
OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition(); OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition();
condition3.setSequence(1); condition3.setSequence(1);
condition3.setFieldName("priority"); condition3.setFieldName("priority");
condition3.setReverse(false); // 优先级越小越越先 condition3.setReverse(false); // 优先级越小越越先
conditions.add(condition3); conditions.add(condition3);
}
} else { // List<StrategyScheduling> StrategySchedulings = _strategyRuleService.getForwardSchedulingByRuleId(strategyRules.getId());
OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition(); // Set<String> files = new HashSet<>();
condition3.setSequence(1); // if (StrategySchedulings != null) {
condition3.setFieldName("priority"); // List<StrategyScheduling> selecteds = StrategySchedulings.stream().filter(t -> t.isValue() == true).sorted(Comparator.comparingInt(StrategyScheduling::getSort) ).collect(Collectors.toList());
condition3.setReverse(false); // 优先级越小越越先 // if (selecteds != null && selecteds.size() > 0) {
conditions.add(condition3); // int i = 1;
// for (StrategyScheduling strategy : selecteds) {
} //
// int Amplitude= strategy.getAmplitude();
// if (strategy.getName().equals("customer_due_date")) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// if(Amplitude>0) {
// condition.setFieldName("groupDueDate");
// DateGroupUtil.calculateGroupDueDate(orders, "dueDate", "groupDueDate", strategy.getAmplitude());
//
// }else {
// condition.setFieldName("dueDate");
// }
// condition.setReverse(false); // 递增
// conditions.add(condition);
// files.add("groupDueDate");
// i++;
//
//
// } else if (strategy.getName().equals("startd_date") ) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// if(Amplitude>0) {
// condition.setFieldName("groupStartDate");
// DateGroupUtil.calculateGroupDueDate(orders, "startDate", "groupStartDate", strategy.getAmplitude());
//
// }else {
// condition.setFieldName("startDate");
// }
// condition.setReverse(false); // 递增
// conditions.add(condition);
// files.add("groupStartDate");
// i++;
//
// } else if (strategy.getName().equals("gathering_series")) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// condition.setFieldName("serie");
// condition.setReverse(false); // 递增
// conditions.add(condition);
// files.add("serie");
// i++;
// } else if (strategy.getName() .equals( "Minimum_wo_priority") && !files.contains("priority")) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// condition.setFieldName("priority");
// condition.setReverse(false); // 递增
// conditions.add(condition);
// files.add("priority");
// i++;
// } else if (strategy.getName() .equals( "maximum_wo_priority") && !files.contains("priority")) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// condition.setFieldName("priority");
// condition.setReverse(true); // 高优先级在前
// conditions.add(condition);
// files.add("priority");
// i++;
// } else if (strategy.getName() .equals( "material_rise")) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// condition.setFieldName("materialCode");
// condition.setReverse(true); // 递增
// conditions.add(condition);
// files.add("materialCode");
// i++;
// } else if (strategy.getName() .equals( "plan_rise") && !files.contains("orderCode")) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// condition.setFieldName("orderCode");
// condition.setReverse(true); // 递增
// conditions.add(condition);
// files.add("orderCode");
// i++;
// } else if (strategy.getName() .equals( "plan_drop") && !files.contains("orderCode")) {
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// condition.setFieldName("orderCode");
// condition.setReverse(false); // 递减
// conditions.add(condition);
// files.add("orderCode");
// i++;
// }else if (strategy.getName().equals("minimize_tool_changeovers")) {
// // 最小化换线策略需要特殊处理,这里只做标记
// // 实际排序逻辑将在orderSortService中处理
// OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
// condition.setSequence(i);
// condition.setFieldName("minimize_changeover");
// condition.setReverse(false);
// conditions.add(condition);
// files.add("minimize_changeover");
// i++;
// }
//
// }
//
// } else {
// OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition();
// condition3.setSequence(1);
// condition3.setFieldName("priority");
// condition3.setReverse(false); // 优先级越小越越先
// conditions.add(condition3);
// }
//
// } else {
// OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition();
// condition3.setSequence(1);
// condition3.setFieldName("priority");
// condition3.setReverse(false); // 优先级越小越越先
// conditions.add(condition3);
//
// }
rule.setConditions(conditions); rule.setConditions(conditions);
return rule; return rule;
......
...@@ -42,9 +42,9 @@ public class PlanResultServiceTest { ...@@ -42,9 +42,9 @@ public class PlanResultServiceTest {
// planResultService.execute2("E29F2B3ADA8149F6B916B5119296A92B");//2000 // planResultService.execute2("E29F2B3ADA8149F6B916B5119296A92B");//2000
// planResultService.execute2("E2CD1FC6FF9B4B19A59FEC7F846D4952");//600 // planResultService.execute2("E2CD1FC6FF9B4B19A59FEC7F846D4952");//600
planResultService.execute2("EAF3C94B8F3345278F226C94FB0FED86");//bom // planResultService.execute2("EAF3C94B8F3345278F226C94FB0FED86");//bom
// planResultService.execute2("08B1D87FE1B84ECDBAC2E546DDB6FB81");//2000 planResultService.execute2("6D63146BE5C84A78B5AB044327BA55BD");//2000
// planResultService.execute2("0428340BB4F540938F1FB5599F03E8A4");//5000 // planResultService.execute2("6D63146BE5C84A78B5AB044327BA55BD");//5000
// planResultService.execute2("C8B533BD8944405B9A2F8823C575C204");//500 // planResultService.execute2("C8B533BD8944405B9A2F8823C575C204");//500
// planResultService.execute2("EFDD34E4B5BC434BAEAE6A84DFCD4E7B");//20 // planResultService.execute2("EFDD34E4B5BC434BAEAE6A84DFCD4E7B");//20
// planResultService.execute2("00E0C5D3E4AD4F36B56C39395906618D"); // planResultService.execute2("00E0C5D3E4AD4F36B56C39395906618D");
......
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