Commit b9dc6d43 authored by Tong Li's avatar Tong Li

跳过策略

parent a1d62496
...@@ -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()); 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) { // List<StrategyScheduling> StrategySchedulings = _strategyRuleService.getForwardSchedulingByRuleId(strategyRules.getId());
// Set<String> files = new HashSet<>();
int Amplitude= strategy.getAmplitude(); // if (StrategySchedulings != null) {
if (strategy.getName().equals("customer_due_date")) { // List<StrategyScheduling> selecteds = StrategySchedulings.stream().filter(t -> t.isValue() == true).sorted(Comparator.comparingInt(StrategyScheduling::getSort) ).collect(Collectors.toList());
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // if (selecteds != null && selecteds.size() > 0) {
condition.setSequence(i); // int i = 1;
if(Amplitude>0) { // for (StrategyScheduling strategy : selecteds) {
condition.setFieldName("groupDueDate"); //
DateGroupUtil.calculateGroupDueDate(orders, "dueDate", "groupDueDate", strategy.getAmplitude()); // int Amplitude= strategy.getAmplitude();
// if (strategy.getName().equals("customer_due_date")) {
}else { // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setFieldName("dueDate"); // condition.setSequence(i);
} // if(Amplitude>0) {
condition.setReverse(false); // 递增 // condition.setFieldName("groupDueDate");
conditions.add(condition); // DateGroupUtil.calculateGroupDueDate(orders, "dueDate", "groupDueDate", strategy.getAmplitude());
files.add("groupDueDate"); //
i++; // }else {
// condition.setFieldName("dueDate");
// }
} else if (strategy.getName().equals("startd_date") ) { // condition.setReverse(false); // 递增
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // conditions.add(condition);
condition.setSequence(i); // files.add("groupDueDate");
if(Amplitude>0) { // i++;
condition.setFieldName("groupStartDate"); //
DateGroupUtil.calculateGroupDueDate(orders, "startDate", "groupStartDate", strategy.getAmplitude()); //
// } else if (strategy.getName().equals("startd_date") ) {
}else { // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setFieldName("startDate"); // condition.setSequence(i);
} // if(Amplitude>0) {
condition.setReverse(false); // 递增 // condition.setFieldName("groupStartDate");
conditions.add(condition); // DateGroupUtil.calculateGroupDueDate(orders, "startDate", "groupStartDate", strategy.getAmplitude());
files.add("groupStartDate"); //
i++; // }else {
// condition.setFieldName("startDate");
} else if (strategy.getName().equals("gathering_series")) { // }
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // condition.setReverse(false); // 递增
condition.setSequence(i); // conditions.add(condition);
condition.setFieldName("serie"); // files.add("groupStartDate");
condition.setReverse(false); // 递增 // i++;
conditions.add(condition); //
files.add("serie"); // } else if (strategy.getName().equals("gathering_series")) {
i++; // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
} else if (strategy.getName() .equals( "Minimum_wo_priority") && !files.contains("priority")) { // condition.setSequence(i);
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // condition.setFieldName("serie");
condition.setSequence(i); // condition.setReverse(false); // 递增
condition.setFieldName("priority"); // conditions.add(condition);
condition.setReverse(false); // 递增 // files.add("serie");
conditions.add(condition); // i++;
files.add("priority"); // } else if (strategy.getName() .equals( "Minimum_wo_priority") && !files.contains("priority")) {
i++; // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
} else if (strategy.getName() .equals( "maximum_wo_priority") && !files.contains("priority")) { // condition.setSequence(i);
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // condition.setFieldName("priority");
condition.setSequence(i); // condition.setReverse(false); // 递增
condition.setFieldName("priority"); // conditions.add(condition);
condition.setReverse(true); // 高优先级在前 // files.add("priority");
conditions.add(condition); // i++;
files.add("priority"); // } else if (strategy.getName() .equals( "maximum_wo_priority") && !files.contains("priority")) {
i++; // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
} else if (strategy.getName() .equals( "material_rise")) { // condition.setSequence(i);
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // condition.setFieldName("priority");
condition.setSequence(i); // condition.setReverse(true); // 高优先级在前
condition.setFieldName("materialCode"); // conditions.add(condition);
condition.setReverse(true); // 递增 // files.add("priority");
conditions.add(condition); // i++;
files.add("materialCode"); // } else if (strategy.getName() .equals( "material_rise")) {
i++; // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
} else if (strategy.getName() .equals( "plan_rise") && !files.contains("orderCode")) { // condition.setSequence(i);
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // condition.setFieldName("materialCode");
condition.setSequence(i); // condition.setReverse(true); // 递增
condition.setFieldName("orderCode"); // conditions.add(condition);
condition.setReverse(true); // 递增 // files.add("materialCode");
conditions.add(condition); // i++;
files.add("orderCode"); // } else if (strategy.getName() .equals( "plan_rise") && !files.contains("orderCode")) {
i++; // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
} else if (strategy.getName() .equals( "plan_drop") && !files.contains("orderCode")) { // condition.setSequence(i);
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // condition.setFieldName("orderCode");
condition.setSequence(i); // condition.setReverse(true); // 递增
condition.setFieldName("orderCode"); // conditions.add(condition);
condition.setReverse(false); // 递减 // files.add("orderCode");
conditions.add(condition); // i++;
files.add("orderCode"); // } else if (strategy.getName() .equals( "plan_drop") && !files.contains("orderCode")) {
i++; // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
}else if (strategy.getName().equals("minimize_tool_changeovers")) { // condition.setSequence(i);
// 最小化换线策略需要特殊处理,这里只做标记 // condition.setFieldName("orderCode");
// 实际排序逻辑将在orderSortService中处理 // condition.setReverse(false); // 递减
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition(); // conditions.add(condition);
condition.setSequence(i); // files.add("orderCode");
condition.setFieldName("minimize_changeover"); // i++;
condition.setReverse(false); // }else if (strategy.getName().equals("minimize_tool_changeovers")) {
conditions.add(condition); // // 最小化换线策略需要特殊处理,这里只做标记
files.add("minimize_changeover"); // // 实际排序逻辑将在orderSortService中处理
i++; // OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
} // condition.setSequence(i);
// condition.setFieldName("minimize_changeover");
} // condition.setReverse(false);
// conditions.add(condition);
} else { // files.add("minimize_changeover");
OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition(); // i++;
condition3.setSequence(1); // }
condition3.setFieldName("priority"); //
condition3.setReverse(false); // 优先级越小越越先 // }
conditions.add(condition3); //
} // } else {
// OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition();
} else { // condition3.setSequence(1);
OrderSortRule.SortCondition condition3 = new OrderSortRule.SortCondition(); // condition3.setFieldName("priority");
condition3.setSequence(1); // condition3.setReverse(false); // 优先级越小越越先
condition3.setFieldName("priority"); // conditions.add(condition3);
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