From 85392bb7db247c4596d3fbf49c9e00cfd0e76a13 Mon Sep 17 00:00:00 2001 From: zhang <zc857179121@qq.com> Date: 星期四, 11 九月 2025 09:15:11 +0800 Subject: [PATCH] 1 --- algo-zkd/src/main/java/com/algo/service/TaskAllocationService.java | 34 ++---- algo-zkd/src/main/java/com/algo/expose/impl/BaseDataServiceImpl.java | 39 +++++++ algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java | 18 +++ algo-zkd/src/main/java/com/algo/expose/impl/AlgoSupportImpl.java | 16 ++ algo-zkd/src/main/java/com/algo/config/EnvDataConfig.java | 32 ++++++ algo-zkd/src/main/java/com/algo/expose/AlgoSupport.java | 2 algo-zkd/src/main/java/com/algo/service/PathPlanningService.java | 62 +++--------- algo-zkd/pom.xml | 7 + algo-zkd/src/main/java/com/algo/AlgorithmMain.java | 23 ++-- algo-zkd/target/classes/META-INF/spring.factories | 3 algo-zkd/src/main/java/com/algo/expose/BaseDataService.java | 40 ++++++++ 11 files changed, 192 insertions(+), 84 deletions(-) diff --git a/algo-zkd/pom.xml b/algo-zkd/pom.xml index d4b218e..1e21f94 100644 --- a/algo-zkd/pom.xml +++ b/algo-zkd/pom.xml @@ -40,6 +40,13 @@ <artifactId>junit</artifactId> </dependency> + + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>1.18.20</version> + <scope>provided</scope> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/algo-zkd/src/main/java/com/algo/AlgorithmMain.java b/algo-zkd/src/main/java/com/algo/AlgorithmMain.java index e596e88..a8774ff 100644 --- a/algo-zkd/src/main/java/com/algo/AlgorithmMain.java +++ b/algo-zkd/src/main/java/com/algo/AlgorithmMain.java @@ -6,18 +6,24 @@ import com.algo.service.PathPlanningService; import com.algo.service.TaskAllocationService; import com.algo.util.AgvTaskUtils; -import com.algo.util.JsonUtils; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; -import java.util.Map; @SpringBootTest @RunWith(SpringRunner.class) public class AlgorithmMain { + + + @Autowired + private TaskAllocationService taskAllocationService; + + @Autowired + private PathPlanningService pathPlanningService; /** @@ -25,12 +31,7 @@ */ @Test public void taskAllocationService() { - Map<String, Map<String, Integer>> pathMapping = JsonUtils.loadPathMapping("path_mapping.json"); - System.out.println(pathMapping); - Map<String, Object> environment = JsonUtils.loadEnvironment("environment.json"); - System.out.println(environment); - TaskAllocationService taskAllocationService = new TaskAllocationService(pathMapping, environment); List<AGVStatus> agvStatusList = AgvTaskUtils.loadAgvStatus("ctu_agv_status.json"); System.out.println(agvStatusList); @@ -50,17 +51,13 @@ */ @Test public void pathPlanningService() { - Map<String, Map<String, Integer>> pathMapping = JsonUtils.loadPathMapping("path_mapping.json"); - System.out.println(pathMapping); - Map<String, Object> environment = JsonUtils.loadEnvironment("environment.json"); - System.out.println(environment); + List<TaskData> taskList = AgvTaskUtils.loadTaskList("ctu_task_data.json"); System.out.println(taskList); - PathPlanningService pathPlanningService = new PathPlanningService(pathMapping, environment, taskList); List<AGVStatus> agvStatusList = AgvTaskUtils.loadAgvStatus("ctu_agv_status.json"); System.out.println(agvStatusList); - PathPlanningService.PathPlanningResult planningResult = pathPlanningService.planAllAgvPaths(agvStatusList, true, null); + PathPlanningService.PathPlanningResult planningResult = pathPlanningService.planAllAgvPaths(taskList, agvStatusList, true, null); System.out.println(planningResult); } diff --git a/algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java b/algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java new file mode 100644 index 0000000..24e04a6 --- /dev/null +++ b/algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java @@ -0,0 +1,18 @@ +//package com.algo.config; +// +//import com.algo.expose.BaseDataService; +//import com.algo.expose.impl.BaseDataServiceImpl; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +//@Configuration +//public class BaseDataConfig { +// +// +// @Bean +// public BaseDataService baseDataService() { +// return new BaseDataServiceImpl(); +// } +// +// +//} diff --git a/algo-zkd/src/main/java/com/algo/config/EnvDataConfig.java b/algo-zkd/src/main/java/com/algo/config/EnvDataConfig.java new file mode 100644 index 0000000..ca6238f --- /dev/null +++ b/algo-zkd/src/main/java/com/algo/config/EnvDataConfig.java @@ -0,0 +1,32 @@ +package com.algo.config; + +import com.algo.expose.BaseDataService; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; + +@Component +@Data +public class EnvDataConfig { + + @Autowired + private BaseDataService baseDataService; + + + private Map<String, Map<String, Integer>> pathMapping; + + + private Map<String, Object> environmentConfig; + + /** + * 鍒濆鍖� + */ + @PostConstruct + public void init() { + setEnvironmentConfig(baseDataService.loadEnvironment()); + setPathMapping(baseDataService.loadPathMapping()); + } +} diff --git a/algo-zkd/src/main/java/com/algo/expose/AlgoSupport.java b/algo-zkd/src/main/java/com/algo/expose/AlgoSupport.java index 010bd27..25c6d62 100644 --- a/algo-zkd/src/main/java/com/algo/expose/AlgoSupport.java +++ b/algo-zkd/src/main/java/com/algo/expose/AlgoSupport.java @@ -20,6 +20,6 @@ * * @return */ - PathPlanningService.PathPlanningResult planAllAgvPaths(List<AGVStatus> agvStatusList, boolean flag, List<double[]> constraints); + PathPlanningService.PathPlanningResult planAllAgvPaths(List<TaskData> taskList, List<AGVStatus> agvStatusList, boolean flag, List<double[]> constraints); } diff --git a/algo-zkd/src/main/java/com/algo/expose/BaseDataService.java b/algo-zkd/src/main/java/com/algo/expose/BaseDataService.java new file mode 100644 index 0000000..7fb962a --- /dev/null +++ b/algo-zkd/src/main/java/com/algo/expose/BaseDataService.java @@ -0,0 +1,40 @@ +package com.algo.expose; + +import com.algo.model.AGVStatus; +import com.algo.model.TaskData; + +import java.util.List; +import java.util.Map; + +/** + * 鍩虹 + */ +public interface BaseDataService { + /** + * 鍔犺浇璺緞鏄犲皠 + * + * @return + */ + Map<String, Map<String, Integer>> loadPathMapping(); + + /** + * 鍔犺浇鐜鍙傛暟 + * + * @return + */ + Map<String, Object> loadEnvironment(); + + /** + * 鍔犺浇agv鐘舵�� + * + * @return + */ + List<AGVStatus> loadAgvStatus(); + + /** + * 鍔犺浇浠诲姟鍒楄〃 + * + * @return + */ + List<TaskData> loadTaskList(); +} diff --git a/algo-zkd/src/main/java/com/algo/expose/impl/AlgoSupportImpl.java b/algo-zkd/src/main/java/com/algo/expose/impl/AlgoSupportImpl.java index ebbbeb4..fb150b1 100644 --- a/algo-zkd/src/main/java/com/algo/expose/impl/AlgoSupportImpl.java +++ b/algo-zkd/src/main/java/com/algo/expose/impl/AlgoSupportImpl.java @@ -5,22 +5,30 @@ import com.algo.model.TaskAssignment; import com.algo.model.TaskData; import com.algo.service.PathPlanningService; +import com.algo.service.TaskAllocationService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Collections; import java.util.List; @Service public class AlgoSupportImpl implements AlgoSupport { + @Autowired + private TaskAllocationService taskAllocationService; + + @Autowired + private PathPlanningService pathPlanningService; + + @Override public List<TaskAssignment> allocateTasks(List<AGVStatus> agvStatusList, List<TaskData> taskList) { - return Collections.emptyList(); + return taskAllocationService.allocateTasks(agvStatusList, taskList); } @Override - public PathPlanningService.PathPlanningResult planAllAgvPaths(List<AGVStatus> agvStatusList, boolean flag, List<double[]> constraints) { - return null; + public PathPlanningService.PathPlanningResult planAllAgvPaths(List<TaskData> taskList, List<AGVStatus> agvStatusList, boolean flag, List<double[]> constraints) { + return pathPlanningService.planAllAgvPaths(taskList, agvStatusList, true, null); } } diff --git a/algo-zkd/src/main/java/com/algo/expose/impl/BaseDataServiceImpl.java b/algo-zkd/src/main/java/com/algo/expose/impl/BaseDataServiceImpl.java new file mode 100644 index 0000000..6968d08 --- /dev/null +++ b/algo-zkd/src/main/java/com/algo/expose/impl/BaseDataServiceImpl.java @@ -0,0 +1,39 @@ +package com.algo.expose.impl; + +import com.algo.expose.BaseDataService; +import com.algo.model.AGVStatus; +import com.algo.model.TaskData; +import com.algo.util.AgvTaskUtils; +import com.algo.util.JsonUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 鍩虹 + */ +@Service +public class BaseDataServiceImpl implements BaseDataService { + + + @Override + public Map<String, Map<String, Integer>> loadPathMapping() { + return JsonUtils.loadPathMapping("path_mapping.json"); + } + + @Override + public Map<String, Object> loadEnvironment() { + return JsonUtils.loadEnvironment("environment.json"); + } + + @Override + public List<AGVStatus> loadAgvStatus() { + return AgvTaskUtils.loadAgvStatus("ctu_agv_status.json"); + } + + @Override + public List<TaskData> loadTaskList() { + return AgvTaskUtils.loadTaskList("ctu_task_data.json"); + } +} diff --git a/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java b/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java index 9fef948..833510e 100644 --- a/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java +++ b/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java @@ -1,26 +1,23 @@ package com.algo.service; +import com.algo.config.EnvDataConfig; import com.algo.model.*; import com.algo.util.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.PostConstruct; import java.util.*; import java.util.concurrent.*; /** * 璺緞瑙勫垝鏈嶅姟 */ +@Service public class PathPlanningService { - /** - * 璺緞鏄犲皠琛� - */ - private Map<String, Map<String, Integer>> pathMapping; - - /** - * 鐜閰嶇疆 - */ - private Map<String, Object> environmentConfig; + @Autowired + private EnvDataConfig envDataConfig; /** * 鎵ц涓换鍔℃彁鍙� @@ -47,63 +44,35 @@ */ private RemainingPathProcessor remainingPathProcessor; - /** - * 绾跨▼姹犲ぇ灏� - */ - private final int threadPoolSize; /** * 绾跨▼姹� */ - private final ExecutorService executorService; + private final ExecutorService executorService = Executors.newFixedThreadPool(Math.max(4, Runtime.getRuntime().availableProcessors())); /** * CTU鎵瑰鐞嗗ぇ灏� */ private final int batchSize = 10; - /** - * 鏋勯�犲嚱鏁� - * - * @param pathMapping 璺緞鏄犲皠琛� - * @param environmentConfig 鐜閰嶇疆 - * @param taskDataList 浠诲姟鏁版嵁鍒楄〃 - */ - public PathPlanningService(Map<String, Map<String, Integer>> pathMapping, - Map<String, Object> environmentConfig, - List<TaskData> taskDataList) { - this.pathMapping = pathMapping; - this.environmentConfig = environmentConfig; - - this.threadPoolSize = Math.max(4, Runtime.getRuntime().availableProcessors()); - this.executorService = Executors.newFixedThreadPool(threadPoolSize); - - // 鍒濆鍖� - initializeComponents(taskDataList); - - System.out.println("璺緞瑙勫垝鏈嶅姟鍒濆鍖栧畬鎴愶紙绾跨▼姹犲ぇ灏�: " + threadPoolSize + "锛�"); - } /** * 鍒濆鍖栧悇涓粍浠� - * - * @param taskDataList 浠诲姟鏁版嵁鍒楄〃 */ - private void initializeComponents(List<TaskData> taskDataList) { - // 鍒濆鍖栦换鍔℃彁鍙栧櫒 - this.taskExtractor = new ExecutingTaskExtractor(pathMapping, taskDataList); + @PostConstruct + public void initializeComponents() { // 鍒濆鍖栬矾寰勮鍒掑櫒 - this.pathPlanner = new AStarPathPlanner(pathMapping); + this.pathPlanner = new AStarPathPlanner(envDataConfig.getPathMapping()); // 鍒濆鍖栫鎾炴娴嬪櫒 - this.collisionDetector = new CollisionDetector(pathMapping); + this.collisionDetector = new CollisionDetector(envDataConfig.getPathMapping()); // 鍒濆鍖栫鎾炶В鍐冲櫒 this.collisionResolver = new CollisionResolver(collisionDetector); // 鍒濆鍖栧墿浣欒矾寰勫鐞嗗櫒 - this.remainingPathProcessor = new RemainingPathProcessor(pathMapping); + this.remainingPathProcessor = new RemainingPathProcessor(envDataConfig.getPathMapping()); } /** @@ -114,9 +83,12 @@ * @param constraints 璺緞绾︽潫鏉′欢 * @return 璺緞瑙勫垝缁撴灉 */ - public PathPlanningResult planAllAgvPaths(List<AGVStatus> agvStatusList, + public PathPlanningResult planAllAgvPaths(List<TaskData> taskList, List<AGVStatus> agvStatusList, boolean includeIdleAgv, List<double[]> constraints) { + // 鍒濆鍖栦换鍔℃彁鍙栧櫒 + this.taskExtractor = new ExecutingTaskExtractor(envDataConfig.getPathMapping(), taskList); + long startTime = System.currentTimeMillis(); System.out.println("寮�濮嬩负 " + agvStatusList.size() + " 涓狢TU瑙勫垝"); @@ -416,7 +388,7 @@ long currentTime = System.currentTimeMillis() / 1000; // 杞崲涓虹 for (PathCode pathCode : codeList) { - int[] coord = JsonUtils.getCoordinate(pathCode.getCode(), pathMapping); + int[] coord = JsonUtils.getCoordinate(pathCode.getCode(), envDataConfig.getPathMapping()); if (coord != null) { String spaceTimeKey = coord[0] + "," + coord[1] + "," + currentTime; occupancyMap.put(spaceTimeKey, agvStatus.getAgvId()); diff --git a/algo-zkd/src/main/java/com/algo/service/TaskAllocationService.java b/algo-zkd/src/main/java/com/algo/service/TaskAllocationService.java index dbe8985..fd1946f 100644 --- a/algo-zkd/src/main/java/com/algo/service/TaskAllocationService.java +++ b/algo-zkd/src/main/java/com/algo/service/TaskAllocationService.java @@ -1,10 +1,12 @@ package com.algo.service; +import com.algo.config.EnvDataConfig; import com.algo.model.AGVStatus; import com.algo.model.BackpackData; import com.algo.model.TaskAssignment; import com.algo.model.TaskData; import com.algo.util.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -13,22 +15,14 @@ /** * 浠诲姟鍒嗛厤鏈嶅姟绫� */ +@Service public class TaskAllocationService { - private Map<String, Map<String, Integer>> pathMapping; - private Map<String, Object> environmentConfig; + @Autowired + private EnvDataConfig envDataConfig; - /** - * 鏋勯�犲嚱鏁� - * - * @param pathMapping 璺緞鏄犲皠淇℃伅 - * @param environmentConfig 鐜閰嶇疆淇℃伅 - */ - public TaskAllocationService(Map<String, Map<String, Integer>> pathMapping, - Map<String, Object> environmentConfig) { - this.pathMapping = pathMapping; - this.environmentConfig = environmentConfig; - } + + /** * 鎵ц浠诲姟鍒嗛厤 @@ -42,9 +36,9 @@ System.out.println("寮�濮嬩换鍔″垎閰嶏紝AGV鏁伴噺: " + agvStatusList.size() + ", 浠诲姟鏁伴噺: " + taskList.size()); // 杈撳嚭鐜淇℃伅 - System.out.println("鐜淇℃伅锛氬搴�=" + environmentConfig.get("width") + - ", 楂樺害=" + environmentConfig.get("height") + - ", 宸ヤ綔绔欐暟閲�=" + environmentConfig.get("stationCount")); + System.out.println("鐜淇℃伅锛氬搴�=" + envDataConfig.getEnvironmentConfig().get("width") + + ", 楂樺害=" + envDataConfig.getEnvironmentConfig().get("height") + + ", 宸ヤ綔绔欐暟閲�=" + envDataConfig.getEnvironmentConfig().get("stationCount")); List<TaskAssignment> assignments = new ArrayList<>(); @@ -109,8 +103,8 @@ System.out.println("澶勭悊璧风偣 " + startLocation + " 鐨勪换鍔★紝鏁伴噺: " + locationTasks.size()); // 妫�鏌ユ槸鍚︿负宸ヤ綔绔� - if (JsonUtils.isStation(startLocation, environmentConfig)) { - Map<String, Object> stationInfo = JsonUtils.getStationInfo(startLocation, environmentConfig); + if (JsonUtils.isStation(startLocation, envDataConfig.getEnvironmentConfig())) { + Map<String, Object> stationInfo = JsonUtils.getStationInfo(startLocation, envDataConfig.getEnvironmentConfig()); if (stationInfo != null) { Integer capacity = (Integer) stationInfo.get("capacity"); System.out.println("宸ヤ綔绔� " + startLocation + " 瀹归噺: " + capacity); @@ -203,7 +197,7 @@ AGVStatus bestAgv = null; double minDistance = Double.MAX_VALUE; - int[] targetCoord = JsonUtils.getCoordinate(targetLocation, pathMapping); + int[] targetCoord = JsonUtils.getCoordinate(targetLocation, envDataConfig.getPathMapping()); if (targetCoord == null) { System.out.println("鏃犳硶鑾峰彇鐩爣浣嶇疆 " + targetLocation + " 鐨勫潗鏍�"); return availableAgvs.isEmpty() ? null : availableAgvs.get(0); @@ -216,7 +210,7 @@ continue; } - int[] agvCoord = JsonUtils.getCoordinate(agv.getPosition(), pathMapping); + int[] agvCoord = JsonUtils.getCoordinate(agv.getPosition(), envDataConfig.getPathMapping()); if (agvCoord != null) { double distance = JsonUtils.calculateManhattanDistance(agvCoord, targetCoord); diff --git a/algo-zkd/target/classes/META-INF/spring.factories b/algo-zkd/target/classes/META-INF/spring.factories index ab43764..82fa48f 100644 --- a/algo-zkd/target/classes/META-INF/spring.factories +++ b/algo-zkd/target/classes/META-INF/spring.factories @@ -1 +1,2 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration= +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.algo.service.PathPlanningService + -- Gitblit v1.9.1