|
@@ -6,17 +6,35 @@ import cn.hutool.core.date.DateTime;
|
|
|
import cn.hutool.core.date.DateUnit;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
+import com.rongwei.rwapsserver.aps.domain.ApsSolution;
|
|
|
+import com.rongwei.rwapsserver.aps.domain.Equipment;
|
|
|
import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
|
|
|
+import com.rongwei.rwapsserver.aps.score.ApsConstraintProvider;
|
|
|
+import com.rongwei.rwapsserver.test.Employee;
|
|
|
+import com.rongwei.rwapsserver.test.Task;
|
|
|
+import com.rongwei.rwapsserver.test.TaskAssigningConstraintProvider;
|
|
|
+import com.rongwei.rwapsserver.test.TaskAssigningSolution;
|
|
|
import org.drools.util.DateUtils;
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
+import org.optaplanner.core.api.score.ScoreExplanation;
|
|
|
+import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
|
|
|
+import org.optaplanner.core.api.solver.SolutionManager;
|
|
|
+import org.optaplanner.core.api.solver.Solver;
|
|
|
+import org.optaplanner.core.api.solver.SolverFactory;
|
|
|
+import org.optaplanner.core.api.solver.event.BestSolutionChangedEvent;
|
|
|
+import org.optaplanner.core.api.solver.event.SolverEventListener;
|
|
|
+import org.optaplanner.core.config.solver.EnvironmentMode;
|
|
|
+import org.optaplanner.core.config.solver.SolverConfig;
|
|
|
+import org.optaplanner.core.config.solver.termination.TerminationConfig;
|
|
|
import org.springframework.boot.test.context.SpringBootTest;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
-@SpringBootTest
|
|
|
+//@SpringBootTest
|
|
|
class RwApsServerApplicationTests {
|
|
|
|
|
|
@Test
|
|
@@ -34,7 +52,85 @@ class RwApsServerApplicationTests {
|
|
|
sources.sort(Comparator.comparing(ProductionProcesses::getOrderMark));
|
|
|
System.out.println(sources);*/
|
|
|
|
|
|
- test1(3);
|
|
|
+// test1(3);
|
|
|
+// System.out.println(1111);
|
|
|
+ test2();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void test2(){
|
|
|
+ String cores = Runtime.getRuntime().availableProcessors() + "";
|
|
|
+ SolverFactory<TaskAssigningSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
+ .withEnvironmentMode(EnvironmentMode.REPRODUCIBLE)
|
|
|
+ .withSolutionClass(TaskAssigningSolution.class)
|
|
|
+ .withEntityClasses(Task.class, Employee.class)
|
|
|
+ .withConstraintProviderClass(TaskAssigningConstraintProvider.class)
|
|
|
+ .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(30L))
|
|
|
+// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
+ .withMoveThreadCount(cores)
|
|
|
+ );
|
|
|
+ Solver<TaskAssigningSolution> solver = solverFactory.buildSolver();
|
|
|
+ solver.addEventListener(new SolverEventListener<TaskAssigningSolution>() {
|
|
|
+ public void bestSolutionChanged(BestSolutionChangedEvent<TaskAssigningSolution> event) {
|
|
|
+ if(solver.isEveryProblemChangeProcessed()) {
|
|
|
+ System.out.println("************"+event.getNewBestScore()+"************");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ TaskAssigningSolution apsSolution = getTestData();
|
|
|
+ TaskAssigningSolution solvedBalance = solver.solve(apsSolution);
|
|
|
+ System.out.println("**************排程评分分析***************");
|
|
|
+ SolutionManager<TaskAssigningSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
+ ScoreExplanation<TaskAssigningSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance);
|
|
|
+ System.out.println(explain.toString());
|
|
|
+ System.out.println("**************排程评分分析***************");
|
|
|
+ for (Employee employee : solvedBalance.getEmployeeList()) {
|
|
|
+ String str = employee.getFullName()+":";
|
|
|
+ List<Task> tasks = employee.getTasks();
|
|
|
+ if(tasks != null && tasks.size()>0){
|
|
|
+ for (Task task : tasks) {
|
|
|
+ str = str + " task" + task.getId() + "("+task.getStartTime()+"-"+task.getEndTime()+")";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ System.out.println(str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private TaskAssigningSolution getTestData(){
|
|
|
+ TaskAssigningSolution apsSolution = new TaskAssigningSolution();
|
|
|
+ List<Employee> es = new ArrayList<>();
|
|
|
+ List<Task> tasks = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 10; i++) {
|
|
|
+ Task task = new Task();
|
|
|
+ task.setId(i);
|
|
|
+ if(i<3){
|
|
|
+ task.setIndexInTaskType(10);
|
|
|
+ task.setProduceTime(7);
|
|
|
+ } else if (i>=3 && i<5) {
|
|
|
+ task.setIndexInTaskType(20);
|
|
|
+ task.setProduceTime(15);
|
|
|
+ }else{
|
|
|
+ task.setIndexInTaskType(30);
|
|
|
+ task.setProduceTime(9);
|
|
|
+ }
|
|
|
+ task.setPreTasks(new ArrayList<>());
|
|
|
+ tasks.add(task);
|
|
|
+ }
|
|
|
+ Task t0 = tasks.get(0);Task t1 = tasks.get(1);Task t2 = tasks.get(2);
|
|
|
+ Task t3 = tasks.get(3);Task t4 = tasks.get(4);
|
|
|
+ Task t5 = tasks.get(5);Task t6 = tasks.get(6);Task t7 = tasks.get(7);Task t8 = tasks.get(8);Task t9 = tasks.get(9);
|
|
|
+ t5.getPreTasks().add(t3);t6.getPreTasks().add(t4);
|
|
|
+ t3.getPreTasks().add(t0);t4.getPreTasks().add(t1);
|
|
|
+ t7.getPreTasks().add(t2);
|
|
|
+
|
|
|
+ Employee e1 = new Employee(1,"设备1",10);
|
|
|
+ Employee e2 = new Employee(2,"设备2",20);
|
|
|
+ Employee e3 = new Employee(3,"设备3",30);
|
|
|
+ Employee e4 = new Employee(4,"设备4",30);
|
|
|
+ es.add(e1);es.add(e2);es.add(e3);es.add(e4);
|
|
|
+
|
|
|
+ apsSolution.setEmployeeList(es);
|
|
|
+ apsSolution.setTaskList(tasks);
|
|
|
+ return apsSolution;
|
|
|
}
|
|
|
|
|
|
private void test1(Integer inta){
|