# alpha-program **Repository Path**: lingfengsu/alpha-program ## Basic Information - **Project Name**: alpha-program - **Description**: 宜昌两网 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-28 - **Last Updated**: 2025-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SchedulerAI Simplified - 简化项目调度优化系统 基于Google OR-Tools的轻量级项目调度系统,专注于核心调度优化功能,提供简洁高效的API接口。 ## 🌟 核心功能 - **智能调度算法**: 基于CP-SAT求解器的全局优化 - **标准约束支持**: FS、SS、FF、SF四种前后置关系 - **资源约束优化**: 多种资源类型的容量限制 - **简化分区逻辑**: 基于CSV"划分条件"列的分区判断 - **RESTful API**: FastAPI驱动的现代化API接口 - **统一错误处理**: 标准化的错误响应和日志记录 ### 🚀 简化设计理念 **系统优势:** - **代码精简**: 移除复杂逻辑,代码量减少30%+ - **易于维护**: 统一的工序处理,简化的架构设计 - **高效求解**: 专注核心优化算法,提升求解性能 - **标准接口**: RESTful API,易于集成和扩展 **快速使用:** ```python import requests # 通过API优化项目调度 with open("project.csv", "rb") as f: response = requests.post( "http://localhost:8000/api/v1/optimize", files={"csv_file": f} ) result = response.json() print(f"优化工期: {result['makespan']} 天") ``` ## 系统架构 ```mermaid graph TB subgraph "API层 (API Layer)" API[FastAPI接口
simplified_api.py] end subgraph "业务逻辑层 (Business Layer)" SVC[调度服务
simplified_scheduler_service.py] PARSER[数据解析器
simplified_data_parser.py] end subgraph "计算层 (Compute Layer)" SOLVER[CP-SAT求解器
simplified_cpsat_solver.py] end subgraph "外部接口" CSV[CSV文件输入] JSON[JSON结果输出] end API --> SVC SVC --> PARSER SVC --> SOLVER PARSER --> CSV API --> JSON ``` ### 简化架构特点 - **三层架构**: API层、业务逻辑层、计算层清晰分离 - **统一处理**: 所有工序使用相同的处理逻辑 - **简化分区**: 只依赖CSV"划分条件"列判断分区 - **标准接口**: RESTful API,支持文件上传和JSON响应 ## 快速开始 ### 环境要求 - **Python**: 3.8 或更高版本 - **操作系统**: Windows, macOS, Linux - **内存**: 建议 4GB 以上 - **磁盘空间**: 至少 200MB 可用空间 ### 安装步骤 #### 1. 克隆或下载项目 ```bash # 使用 Git 克隆(推荐) git clone https://github.com/schedulerai/scheduler-ai-simplified.git cd scheduler-ai-simplified # 或者下载 ZIP 文件并解压 ``` #### 2. 创建虚拟环境 ```bash # 创建虚拟环境 python -m venv venv # 激活虚拟环境 # Windows venv\Scripts\activate # Linux/macOS source venv/bin/activate ``` #### 3. 安装依赖 ```bash # 升级 pip(推荐) python -m pip install --upgrade pip # 安装项目依赖 pip install -r requirements.txt # 验证安装 python -c "import ortools; print('OR-Tools 安装成功')" ``` #### 4. 启动API服务 ```bash # 启动API服务 python run_api.py # 或者使用uvicorn直接启动 uvicorn scheduler_ai.simplified_api:app --host 0.0.0.0 --port 8000 --reload ``` #### 5. 验证安装 ```bash # 检查API健康状态 curl http://localhost:8000/health # 查看API文档 # 浏览器访问: http://localhost:8000/docs ``` ### 基本使用 #### API接口调用 ##### 1. 健康检查 ```bash # 检查API服务状态 curl http://localhost:8000/health # 获取系统信息 curl http://localhost:8000/api/v1/info ``` ##### 2. 项目调度优化 ```bash # 使用curl上传CSV文件进行优化 curl -X POST "http://localhost:8000/api/v1/optimize" \ -H "accept: application/json" \ -H "Content-Type: multipart/form-data" \ -F "csv_file=@project.csv" ``` ##### 3. Python客户端调用 ```python import requests # 优化项目调度 with open("project.csv", "rb") as f: response = requests.post( "http://localhost:8000/api/v1/optimize", files={"csv_file": f} ) if response.status_code == 200: result = response.json() if result["success"]: print(f"优化成功!工期: {result['makespan']} 天") print(f"求解时间: {result['solve_time']:.3f} 秒") # 查看调度详情 for activity_id, activity in result["schedule"].items(): print(f"工序{activity_id}: {activity['name']} " f"({activity['start_time']}-{activity['end_time']}天)") else: print(f"优化失败: {result['error_message']}") ``` ##### 4. CSV文件验证 ```python import requests # 验证CSV文件格式 with open("project.csv", "rb") as f: response = requests.post( "http://localhost:8000/api/v1/validate-csv", files={"csv_file": f} ) result = response.json() print(f"工序总数: {result['statistics']['total_activities']}") print(f"可分区工序: {result['statistics']['subdividable_activities']}") print("建议:", result['recommendations']) ``` ## CSV文件格式规范 ### 必需列 项目数据CSV文件**必须**包含以下列(支持中英文列名): | 列名 | 别名 | 数据类型 | 说明 | 示例 | |------|------|----------|------|------| | `ID` | - | 整数 | 工序唯一标识符 | 1, 2, 75 | | `Name` | `名称` | 字符串 | 工序名称描述 | "基础混凝土浇筑" | | `Duration` | `工期` | 正整数 | 工序持续时间(天) | 1, 3, 7 | | `Predecessors` | `前置任务` | 字符串 | 前置依赖关系 | "74FS+1", "81SS-2, 77" | | `划分条件` | - | 字符串 | 是否可分区 | "是", "否" | ### 资源列 资源列以 `Resource_` 开头,系统会自动识别: | 列名格式 | 说明 | 示例 | |----------|------|------| | `Resource_Worker` | 工人需求数量 | 5, 10 | | `Resource_Excavator` | 挖掘机需求数量 | 1, 2 | | `Resource_Crane` | 起重机需求数量 | 1 | | `Resource_[类型]` | 自定义资源类型 | 任意正整数 | ### 分区逻辑说明 **简化分区判断**: - 系统只检查"划分条件"列的值 - "是" → 工序可以分区优化 - "否"或空值 → 工序不可分区 - 完全移除了复杂的文本识别逻辑 ### 前置关系格式详解 #### 基本格式 ``` [工序ID][依赖类型][延时] ``` #### 依赖类型说明 | 类型 | 全称 | 含义 | 示例 | |------|------|------|------| | `FS` | Finish-to-Start | 前置工序完成后开始 | `75FS` - 工序75完成后开始 | | `SS` | Start-to-Start | 与前置工序同时开始 | `81SS` - 与工序81同时开始 | | `FF` | Finish-to-Finish | 与前置工序同时完成 | `88FF` - 与工序88同时完成 | | `SF` | Start-to-Finish | 前置工序开始后完成 | `90SF` - 工序90开始后完成 | #### 延时格式 | 格式 | 含义 | 示例 | |------|------|------| | `+数字` | 正延时(延后) | `FS+3` - 完成后3天开始 | | `-数字` | 负延时(提前) | `SS-2` - 提前2天同时开始 | | 无延时 | 默认为0 | `FS` - 完成后立即开始 | #### 多依赖关系 使用逗号分隔多个依赖关系: ``` "74FS+1, 73SS-2, 72FF" ``` #### 完整示例 ```csv ID,Name,Duration,Predecessors,划分条件,Resource_Worker,Resource_Excavator 1,场地清理,2,,否,4,1 2,基础开挖,3,1FS+1,是,6,2 3,基础钢筋绑扎,2,2FS,是,8,0 4,基础模板安装,1,3FS,否,4,0 5,基础混凝土浇筑,1,4FS,是,6,0 6,基础养护,3,5FS,否,2,0 7,地下室墙体钢筋,4,6FS,是,10,0 8,地下室墙体模板,2,7FS,否,6,0 9,地下室墙体浇筑,2,8FS,是,8,0 10,地下室顶板钢筋,3,"9SS+2",是,8,0 ``` **说明**: - 工序2、3、5、7、9、10标记为"是",可以进行分区优化 - 工序1、4、6、8标记为"否",作为整体处理 - 系统会根据"划分条件"列自动判断分区策略 ### 数据验证规则 1. **ID唯一性**: 每个工序ID必须唯一 2. **正整数约束**: Duration和资源需求必须为正整数 3. **依赖关系有效性**: Predecessors中引用的ID必须存在 4. **循环依赖检测**: 系统会自动检测并拒绝循环依赖 5. **编码格式**: 文件必须使用UTF-8编码 ## API响应格式 ### 优化结果响应 ```json { "success": true, "makespan": 15, "schedule": { "1": { "id": 1, "name": "基础开挖", "start_time": 0, "end_time": 5, "duration": 5, "resource_info": "worker:3, excavator:1" }, "2": { "id": 2, "name": "钢筋绑扎", "start_time": 5, "end_time": 8, "duration": 3, "resource_info": "worker:2" } }, "duration_comparison": { "original_makespan": 18, "optimized_makespan": 15, "improvement": 3, "improvement_percentage": 16.7 }, "solve_time": 0.025, "status": "OPTIMAL", "timestamp": "2025-08-25T10:30:00.000000" } ``` ### 错误响应格式 ```json { "success": false, "error_message": "CSV文件缺少必需列: Duration", "timestamp": "2025-08-25T10:30:00.000000" } ``` ### 验证响应格式 ```json { "success": true, "file_info": { "filename": "project.csv", "size": 1024 }, "statistics": { "total_activities": 10, "subdividable_activities": 6, "resource_types": ["worker", "excavator"], "activities_with_resources": 10 }, "validation_results": { "has_required_columns": true, "has_subdivision_column": true, "has_resource_columns": true, "has_precedences": true }, "recommendations": [ "CSV文件格式良好,可以进行调度优化" ] } ``` ## 开发指南 ### 运行测试 ```bash # 运行所有测试 pytest # 运行测试并生成覆盖率报告 pytest --cov=scheduler_ai --cov-report=html # 运行特定测试文件 pytest tests/test_data_models.py -v # 运行特定测试方法 pytest tests/test_data_parser.py::test_parse_predecessors -v ``` ### 代码质量检查 ```bash # 代码格式化 black scheduler_ai/ tests/ main.py # 代码风格检查 flake8 scheduler_ai/ tests/ main.py # 类型检查 mypy scheduler_ai/ # 运行所有质量检查 black . && flake8 . && mypy scheduler_ai/ ``` ### 性能测试 ```bash # 运行性能测试 python test_data/performance_test.py # 运行简单性能测试 python test_data/simple_performance_test.py ``` ## 项目结构 ``` scheduler-ai-simplified/ ├── scheduler_ai/ # 核心包 │ ├── __init__.py # 包初始化 │ ├── simplified_data_models.py # 简化数据模型 │ ├── exceptions.py # 异常类定义 │ ├── simplified_data_parser.py # 简化CSV解析器 │ ├── simplified_cpsat_solver.py # 简化CP-SAT求解器 │ ├── simplified_scheduler_service.py # 简化调度服务 │ ├── simplified_api.py # FastAPI接口 │ ├── error_handlers.py # 错误处理器 │ └── logging_config.py # 日志配置 ├── tests/ # 单元测试 │ ├── test_simplified_data_models.py │ ├── test_simplified_data_parser.py │ ├── test_simplified_cpsat_solver.py │ ├── test_simplified_scheduler_service.py │ └── test_simplified_api.py ├── docs/ # 文档 │ ├── API_USAGE.md # API使用指南 │ ├── CSV_FORMAT_GUIDE.md # CSV格式指南 │ └── DEPLOYMENT_GUIDE.md # 部署指南 ├── examples/ # 使用示例 │ └── api_usage_example.py # API使用示例 ├── test_data/ # 测试数据 │ └── example_project.csv # 示例项目数据 ├── run_api.py # API启动脚本 ├── Dockerfile # Docker配置 ├── docker-compose.yml # Docker Compose配置 ├── requirements.txt # 项目依赖 ├── setup.py # 安装配置 ├── pyproject.toml # 项目配置 └── README.md # 项目说明 ``` ## 常见问题解答 (FAQ) ### 安装问题 **Q: 安装OR-Tools时出现错误怎么办?** A: 尝试以下解决方案: ```bash # 升级pip python -m pip install --upgrade pip # 使用国内镜像源 pip install ortools -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 如果仍有问题,尝试安装特定版本 pip install ortools==9.8.3296 ``` **Q: API服务无法启动怎么办?** A: 检查以下问题: ```bash # 检查端口占用 netstat -tlnp | grep 8000 # 检查Python环境 python -c "import ortools, fastapi; print('依赖正常')" # 使用调试模式启动 python run_api.py --log-level debug ``` ### 数据格式问题 **Q: CSV文件编码错误怎么办?** A: 系统支持多种编码格式: - 支持UTF-8、GBK、GB2312编码 - Excel: 另存为 → CSV UTF-8 (逗号分隔) - 系统会自动检测并转换编码 **Q: "划分条件"列如何设置?** A: 简化的分区逻辑: - "是" → 工序可以分区优化 - "否"或空值 → 工序不可分区 - 系统完全依赖此列判断,无需复杂设置 **Q: 前置关系格式错误怎么办?** A: 检查Predecessors列格式: - 正确: `1FS+3`, `2SS-2, 3FS` - 错误: `1 FS +3`(多余空格) - 错误: `1XS+3`(无效依赖类型) ### API使用问题 **Q: 如何验证CSV文件格式?** A: 使用验证接口: ```bash curl -X POST "http://localhost:8000/api/v1/validate-csv" \ -F "csv_file=@project.csv" ``` **Q: 优化结果为什么不理想?** A: 检查以下方面: 1. **分区设置**: 确认"划分条件"列设置正确 2. **资源约束**: 检查资源需求是否合理 3. **依赖关系**: 验证前置关系是否正确 4. **数据质量**: 确保工期和资源数据准确 **Q: 如何处理大型项目?** A: 系统优化建议: - 工序数量 < 1000: 直接处理 - 工序数量 > 1000: 考虑分阶段处理 - 使用批量处理接口处理多个项目 ## 故障排除指南 ### API服务问题 #### 1. 服务启动失败 ```bash # 检查端口占用 netstat -tlnp | grep 8000 # 检查Python环境 python -c "import ortools, fastapi; print('依赖正常')" # 使用调试模式启动 python run_api.py --log-level debug ``` #### 2. 连接问题 ```bash # 检查服务状态 curl http://localhost:8000/health # 检查防火墙设置 sudo ufw status # Ubuntu sudo firewall-cmd --list-ports # CentOS ``` ### 数据格式问题 #### 1. CSV文件错误 **错误**: "只支持CSV文件格式" **解决方案**: 确保上传的是.csv文件 **错误**: "CSV文件缺少必需列: Duration" **解决方案**: 检查CSV文件包含所有必需列:ID, Name, Duration, Predecessors, 划分条件 **错误**: "工序ID重复" **解决方案**: 确保ID列中每个值唯一 #### 2. 编码问题 **错误**: "无法解析CSV文件编码" **解决方案**: - 系统支持UTF-8、GBK、GB2312编码 - 使用Excel另存为CSV UTF-8格式 - 或使用文本编辑器转换编码 #### 3. 依赖关系错误 **错误**: "检测到循环依赖关系" **解决方案**: - 检查前置关系是否形成循环 - 绘制依赖关系图识别问题 - 重新设计工序依赖关系 ### 优化问题 #### 1. 求解失败 **错误**: "求解器无法找到可行解" **解决方案**: - 检查资源约束是否过严 - 验证依赖关系是否合理 - 确认工期设置是否正确 #### 2. 性能问题 **问题**: 求解时间过长 **解决方案**: - 减少工序数量(建议<1000个) - 简化资源类型 - 分阶段处理大型项目 ### 调试技巧 #### 1. 使用验证接口 ```bash # 先验证CSV文件格式 curl -X POST "http://localhost:8000/api/v1/validate-csv" \ -F "csv_file=@project.csv" ``` #### 2. 检查API响应 ```python import requests response = requests.post( "http://localhost:8000/api/v1/optimize", files={"csv_file": open("project.csv", "rb")} ) print(f"状态码: {response.status_code}") print(f"响应: {response.json()}") ``` #### 3. 查看服务日志 ```bash # 如果使用systemd服务 sudo journalctl -u scheduler-ai -f # 如果使用Docker docker logs scheduler-ai -f ``` ## 文档和支持 ### 详细文档 - **[API使用指南](docs/API_USAGE.md)**: 详细的API接口说明 - **[CSV格式指南](docs/CSV_FORMAT_GUIDE.md)**: CSV文件格式要求 - **[部署指南](docs/DEPLOYMENT_GUIDE.md)**: 生产环境部署说明 - **[使用指南](docs/USAGE_GUIDE.md)**: 完整的使用教程 ### 获取帮助 1. **查看文档**: 首先查阅相关文档和API说明 2. **使用验证接口**: 通过`/api/v1/validate-csv`检查数据格式 3. **检查API响应**: 查看详细的错误信息和建议 4. **运行示例**: 使用`examples/api_usage_example.py`验证环境 ### 报告问题 提交Issue时请包含: - 操作系统和Python版本 - API响应的完整错误信息 - 输入CSV文件样本(脱敏后) - 重现步骤和预期结果 ### 联系方式 - **项目主页**: https://github.com/schedulerai/scheduler-ai-simplified - **问题报告**: https://github.com/schedulerai/scheduler-ai-simplified/issues - **API文档**: http://localhost:8000/docs (服务启动后) ## 许可证 MIT License - 详见 [LICENSE](LICENSE) 文件 ## 贡献指南 欢迎贡献代码!请遵循以下步骤: 1. Fork 项目仓库 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 创建 Pull Request ### 开发规范 - 遵循PEP 8代码风格 - 添加适当的类型注解 - 编写单元测试 - 更新相关文档 ## 版本历史 - **v1.0.0** (2024-01-01): 初始版本发布 - 基础CSV解析功能 - CP-SAT求解器集成 - 命令行界面 - 完整的测试套件