From 2fa19599467263dcf582bb12906e03328e03b4a4 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期三, 02 七月 2025 13:12:26 +0800
Subject: [PATCH] 初版提交

---
 run_algorithm.py |  216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 216 insertions(+), 0 deletions(-)

diff --git a/run_algorithm.py b/run_algorithm.py
new file mode 100644
index 0000000..6ae84d8
--- /dev/null
+++ b/run_algorithm.py
@@ -0,0 +1,216 @@
+#!/usr/bin/env python3
+import sys
+import os
+import signal
+import logging
+from typing import Optional
+
+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+
+from common.utils import setup_logging
+from config.settings import (
+    ALGORITHM_SERVER_HOST, ALGORITHM_SERVER_PORT, LOG_LEVEL, LOG_FILE,
+    RCS_SERVER_HOST, RCS_SERVER_PORT, MONITOR_POLLING_INTERVAL
+)
+from algorithm_system.algorithm_server import AlgorithmServer
+
+
+class AlgorithmApplication:
+    
+    def __init__(self, host: str = None, port: int = None, log_level: str = None, 
+                 enable_path_monitor: bool = True, monitor_interval: float = None,
+                 rcs_host: str = None, rcs_port: int = None):
+        # Initialize algorithm system application
+        self.host = host or ALGORITHM_SERVER_HOST
+        self.port = port or ALGORITHM_SERVER_PORT
+        self.log_level = log_level or LOG_LEVEL
+        self.enable_path_monitor = enable_path_monitor
+        self.monitor_interval = monitor_interval or MONITOR_POLLING_INTERVAL
+        self.rcs_host = rcs_host or RCS_SERVER_HOST
+        self.rcs_port = rcs_port or RCS_SERVER_PORT
+        
+        setup_logging(self.log_level, LOG_FILE)
+        self.logger = logging.getLogger(__name__)
+        
+        self.server: Optional[AlgorithmServer] = None
+        
+        signal.signal(signal.SIGINT, self.signal_handler)
+        signal.signal(signal.SIGTERM, self.signal_handler)
+    
+    def signal_handler(self, signum, frame):
+        # Handle system signals, shutdown program
+        self.logger.info(f"Received signal {signum}, shutting down algorithm system...")
+        self.shutdown()
+        sys.exit(0)
+    
+    def start_server(self):
+        # Start algorithm server
+        try:
+            self.logger.info("Initializing algorithm system server...")
+            
+            # Set RCS connection configuration
+            os.environ['RCS_SERVER_HOST'] = self.rcs_host
+            os.environ['RCS_SERVER_PORT'] = str(self.rcs_port)
+            
+            self.server = AlgorithmServer(self.host, self.port, self.enable_path_monitor, self.monitor_interval)
+            
+            status = self.server.get_server_status()
+            self.logger.info("Algorithm system server status:")
+            self.logger.info(f"  - Host: {status['host']}")
+            self.logger.info(f"  - Port: {status['port']}")
+            self.logger.info(f"  - Path mapping loaded: {status['path_mapping_loaded']}")
+            self.logger.info(f"  - AGV count: {status['agv_count']}")
+            self.logger.info(f"  - Task allocation algorithm: {status['algorithms']['task_allocation']}")
+            self.logger.info(f"  - Path planning algorithm: {status['algorithms']['path_planning']}")
+            
+            self.logger.info("Algorithm system server initialization completed")
+            
+            self.server.start_server()
+            
+        except KeyboardInterrupt:
+            self.logger.info("Received interrupt signal, shutting down algorithm server...")
+        except Exception as e:
+            self.logger.error(f"Algorithm server startup failed: {e}")
+            raise
+        finally:
+            self.shutdown()
+    
+    def shutdown(self):
+        # Shutdown algorithm system components
+        self.logger.info("Shutting down algorithm system...")
+        
+        if self.server:
+            try:
+                self.server.stop_server()
+            except Exception as e:
+                self.logger.error(f"Failed to shutdown server: {e}")
+        
+        self.logger.info("Algorithm system shutdown completed")
+
+
+def main():
+    # Main function entry point
+    import argparse
+    
+    parser = argparse.ArgumentParser(description="Algorithm System - Provides task allocation and path planning services")
+    parser.add_argument(
+        "--host",
+        default=ALGORITHM_SERVER_HOST,
+        help=f"Algorithm server host address (default: {ALGORITHM_SERVER_HOST})"
+    )
+    parser.add_argument(
+        "--port",
+        type=int,
+        default=ALGORITHM_SERVER_PORT,
+        help=f"Algorithm server port (default: {ALGORITHM_SERVER_PORT})"
+    )
+    parser.add_argument(
+        "--log-level",
+        choices=["DEBUG", "INFO", "WARNING", "ERROR"],
+        default="DEBUG",
+        help=f"Log level (default: DEBUG)"
+    )
+    parser.add_argument(
+        "--task-algorithm",
+        choices=["NEAREST_FIRST", "LOAD_BALANCED", "PRIORITY_FIRST", "MULTI_OBJECTIVE"],
+        default="LOAD_BALANCED",
+        help="Task allocation algorithm (default: LOAD_BALANCED)"
+    )
+    parser.add_argument(
+        "--path-algorithm",
+        choices=["A_STAR", "DIJKSTRA", "GREEDY"],
+        default="DIJKSTRA",
+        help="Path planning algorithm (default: DIJKSTRA)"
+    )
+    parser.add_argument(
+        "--enable-path-monitor",
+        action="store_true",
+        default=True,
+        help="Enable path monitoring service (default: True)"
+    )
+    parser.add_argument(
+        "--disable-path-monitor",
+        action="store_true",
+        help="Disable path monitoring service"
+    )
+    parser.add_argument(
+        "--monitor-interval",
+        type=float,
+        default=MONITOR_POLLING_INTERVAL,
+        help=f"Path monitoring polling interval in seconds (default: {MONITOR_POLLING_INTERVAL})"
+    )
+    parser.add_argument(
+        "--rcs-host",
+        default=RCS_SERVER_HOST,
+        help=f"RCS server host address (default: {RCS_SERVER_HOST})"
+    )
+    parser.add_argument(
+        "--rcs-port",
+        type=int,
+        default=RCS_SERVER_PORT,
+        help=f"RCS server port (default: {RCS_SERVER_PORT})"
+    )
+    
+    args = parser.parse_args()
+    
+    # Handle path monitoring switch
+    enable_path_monitor = args.enable_path_monitor and not args.disable_path_monitor
+    
+    app = AlgorithmApplication(
+        host=args.host,
+        port=args.port,
+        log_level=args.log_level,
+        enable_path_monitor=enable_path_monitor,
+        monitor_interval=args.monitor_interval,
+        rcs_host=args.rcs_host,
+        rcs_port=args.rcs_port
+    )
+    
+    try:
+        print("=" * 60)
+        print("CTU Warehouse Management System - Algorithm System")
+        print("=" * 60)
+        print(f"Server Address: http://{args.host}:{args.port}")
+        print(f"Task Allocation Algorithm: {args.task_algorithm}")
+        print(f"Path Planning Algorithm: {args.path_algorithm}")
+        print(f"Log Level: {args.log_level}")
+        print(f"Path Monitoring Service: {'Enabled' if enable_path_monitor else 'Disabled'}")
+        if enable_path_monitor:
+            print(f"Monitor Polling Interval: {args.monitor_interval}s")
+            print(f"RCS Server Address: {args.rcs_host}:{args.rcs_port}")
+        print("=" * 60)
+        print("Available APIs:")
+        print(f"  POST http://{args.host}:{args.port}/open/task/send/v1")
+        print(f"       - Task allocation API")
+        print(f"       - Supports new format: {{\"tasks\": [...], \"agvStatus\": [...]}}")
+        print(f"       - Compatible with old format: [task1, task2, ...]")
+        print(f"  POST http://{args.host}:{args.port}/open/path/plan/v1")
+        print(f"       - Path planning API")
+        print(f"  POST http://{args.host}:{args.port}/open/path/batch/plan/v1")
+        print(f"       - Batch path planning API")
+        print(f"  POST http://{args.host}:{args.port}/open/algorithm/config/v1")
+        print(f"       - Algorithm configuration API")
+        if enable_path_monitor:
+            print(f"  POST http://{args.host}:{args.port}/monitor/path/start/v1")
+            print(f"       - Start path monitoring service")
+            print(f"  POST http://{args.host}:{args.port}/monitor/path/stop/v1")
+            print(f"       - Stop path monitoring service")
+            print(f"  GET  http://{args.host}:{args.port}/monitor/path/status/v1")
+            print(f"       - Path monitoring service status query")
+        print(f"  GET  http://{args.host}:{args.port}/health")
+        print(f"       - Health check API")
+        print("=" * 60)
+        print("Press Ctrl+C to stop server")
+        print()
+        
+        app.start_server()
+        
+    except KeyboardInterrupt:
+        print("\nReceived interrupt signal, shutting down...")
+    except Exception as e:
+        print(f"Startup failed: {e}")
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    main() 
\ No newline at end of file

--
Gitblit v1.9.1