|
| 1 | +# Huawei CodeCraft 2017 CDN Optimization with OpenEvolve |
| 2 | + |
| 3 | +## 问题概述 |
| 4 | + |
| 5 | +这是华为 CodeCraft 2017 编程大赛的题目 - 一个视频内容分发网络(CDN)服务器部署优化问题。 |
| 6 | + |
| 7 | +**目标**: 最小化总成本 = 服务器部署成本 + 带宽租用成本 |
| 8 | + |
| 9 | +**约束条件**: |
| 10 | +- 满足所有消费节点的视频带宽需求 |
| 11 | +- 不超过网络链路的带宽容量 |
| 12 | +- 不超过服务器的输出能力上限 |
| 13 | + |
| 14 | +**问题本质**: 这是一个设施选址(Facility Location)和多商品流(Multi-Commodity Flow)的组合优化问题,属于NP-hard问题。 |
| 15 | + |
| 16 | +## OpenEvolve 原理 |
| 17 | + |
| 18 | +OpenEvolve 使用**进化算法** + **大语言模型**来优化代码: |
| 19 | + |
| 20 | +1. **MAP-Elites算法**: 维护程序多样性,在特征空间中保留精英解 |
| 21 | +2. **Island-Based Evolution**: 多个独立种群并行演化,定期迁移交流 |
| 22 | +3. **LLM驱动变异**: 使用Qwen等大模型生成智能代码变异 |
| 23 | +4. **级联评估**: 多阶段评估策略,快速过滤低质量解 |
| 24 | +5. **进程池并行**: 并行评估多个程序,加速演化 |
| 25 | + |
| 26 | +## 文件说明 |
| 27 | + |
| 28 | +- `initial_program.py` - 初始基线解决方案(简单贪心策略) |
| 29 | +- `evaluator.py` - 评估器,测试程序在多个案例上的表现 |
| 30 | +- `config.qwen.yaml` - Qwen模型配置文件 |
| 31 | +- `case_example/` - 测试用例目录 |
| 32 | + - `batch1/0Primary/` - 初级测试用例 |
| 33 | + - `batch1/1Intermediate/` - 中级测试用例 |
| 34 | + - `batch1/2Advanced/` - 高级测试用例 |
| 35 | + - `batch2/`, `batch3/` - 更多测试批次 |
| 36 | + |
| 37 | +## 快速开始 |
| 38 | + |
| 39 | +### 1. 安装依赖 |
| 40 | + |
| 41 | +```bash |
| 42 | +cd /path/to/openevolve |
| 43 | +pip install -e ".[dev]" |
| 44 | +``` |
| 45 | + |
| 46 | +### 2. 验证初始程序 |
| 47 | + |
| 48 | +```bash |
| 49 | +cd examples/huawei_2017 |
| 50 | + |
| 51 | +# 测试单个案例 |
| 52 | +python initial_program.py case_example/batch1/0Primary/case0.txt |
| 53 | + |
| 54 | +# 完整评估 |
| 55 | +python -c "from evaluator import evaluate; result = evaluate('initial_program.py'); print(result.metrics)" |
| 56 | +``` |
| 57 | + |
| 58 | +预期输出: |
| 59 | +``` |
| 60 | +{'valid_solutions': 1.0, 'avg_cost': 149920.0, 'combined_score': 0.6267, ...} |
| 61 | +``` |
| 62 | + |
| 63 | +### 3. 运行进化优化 |
| 64 | + |
| 65 | +**Linux/Mac**: |
| 66 | +```bash |
| 67 | +chmod +x run_evolution.sh |
| 68 | +./run_evolution.sh --iterations 300 |
| 69 | +``` |
| 70 | + |
| 71 | +**Windows**: |
| 72 | +```batch |
| 73 | +run_evolution.bat --iterations 300 |
| 74 | +``` |
| 75 | + |
| 76 | +**Python直接调用**: |
| 77 | +```bash |
| 78 | +python ../../openevolve-run.py initial_program.py evaluator.py \ |
| 79 | + --config config.qwen.yaml \ |
| 80 | + --iterations 300 |
| 81 | +``` |
| 82 | + |
| 83 | +### 4. 查看结果 |
| 84 | + |
| 85 | +进化过程中会自动保存: |
| 86 | + |
| 87 | +- `openevolve_output/best/best_program.py` - 最优解 |
| 88 | +- `openevolve_output/best/best_program_info.json` - 最优解的性能指标 |
| 89 | +- `openevolve_output/checkpoints/checkpoint_N/` - 定期保存的检查点 |
| 90 | +- `openevolve_output/logs/` - 详细日志 |
| 91 | + |
| 92 | +### 5. 从检查点恢复 |
| 93 | + |
| 94 | +如果进化中断,可以从检查点恢复: |
| 95 | + |
| 96 | +```bash |
| 97 | +python ../../openevolve-run.py initial_program.py evaluator.py \ |
| 98 | + --config config.qwen.yaml \ |
| 99 | + --checkpoint openevolve_output/checkpoints/checkpoint_150 \ |
| 100 | + --iterations 50 |
| 101 | +``` |
| 102 | + |
| 103 | +## 性能指标说明 |
| 104 | + |
| 105 | +评估器返回以下指标: |
| 106 | + |
| 107 | +- `valid_solutions` (0.0-1.0): 有效解的比例 |
| 108 | +- `avg_cost`: 平均总成本(越低越好) |
| 109 | +- `cost_score` (0.0-1.0): 成本得分(归一化) |
| 110 | +- `time_score` (0.0-1.0): 执行时间得分 |
| 111 | +- `combined_score` (0.0-1.0): 综合得分 |
| 112 | + - 公式: `0.5 * valid_rate + 0.4 * cost_score + 0.1 * time_score` |
| 113 | + |
| 114 | +**基线性能** (初始程序): |
| 115 | +- Valid Solutions: 100% |
| 116 | +- Average Cost: ~150,000 |
| 117 | +- Combined Score: ~0.63 |
| 118 | + |
| 119 | +**优化目标**: |
| 120 | +- 降低平均成本到 100,000 以下 |
| 121 | +- 提高 Combined Score 到 0.75+ |
| 122 | + |
| 123 | +## 配置参数说明 |
| 124 | + |
| 125 | +`config.qwen.yaml` 中的关键参数: |
| 126 | + |
| 127 | +```yaml |
| 128 | +max_iterations: 300 # 进化迭代次数 |
| 129 | +checkpoint_interval: 30 # 每30次迭代保存检查点 |
| 130 | + |
| 131 | +llm: |
| 132 | + primary_model: "Qwen/Qwen2.5-Coder-32B-Instruct" # 使用的模型 |
| 133 | + temperature: 0.8 # 生成的随机性(0-1,越高越随机) |
| 134 | + max_tokens: 8192 # 单次生成的最大token数 |
| 135 | + |
| 136 | +database: |
| 137 | + num_islands: 4 # 岛屿数量(并行演化的种群数) |
| 138 | + population_size: 80 # 种群大小 |
| 139 | + elite_selection_ratio: 0.25 # 精英选择比例 |
| 140 | + |
| 141 | +evaluator: |
| 142 | + timeout: 90 # 单个程序评估超时(秒) |
| 143 | + parallel_evaluations: 3 # 并行评估的程序数量 |
| 144 | +``` |
| 145 | +
|
| 146 | +**调优建议**: |
| 147 | +- 如果想快速实验: `max_iterations: 100`, `population_size: 40` |
| 148 | +- 如果想更好结果: `max_iterations: 500`, `population_size: 120`, `num_islands: 6` |
| 149 | +- 如果API调用受限: 降低 `parallel_evaluations` 和 `num_islands` |
| 150 | + |
| 151 | +## 算法优化方向 |
| 152 | + |
| 153 | +OpenEvolve 的 LLM 会尝试探索以下优化策略: |
| 154 | + |
| 155 | +1. **贪心启发式** |
| 156 | + - 服务器放置策略(靠近高需求区域) |
| 157 | + - 服务器类型选择(容量vs成本权衡) |
| 158 | + |
| 159 | +2. **局部搜索** |
| 160 | + - 服务器重定位 |
| 161 | + - 服务器增删 |
| 162 | + - 需求重分配 |
| 163 | + |
| 164 | +3. **流量优化** |
| 165 | + - 更好的路由算法 |
| 166 | + - 带宽成本最小化 |
| 167 | + - 负载均衡 |
| 168 | + |
| 169 | +4. **高级技术** |
| 170 | + - 聚类消费节点 |
| 171 | + - 分层部署策略 |
| 172 | + - 动态规划组件 |
| 173 | + - 启发式剪枝 |
| 174 | + |
| 175 | +## 常见问题 |
| 176 | + |
| 177 | +### Q: 进化过程很慢怎么办? |
| 178 | + |
| 179 | +A: 可以调整以下参数加速: |
| 180 | +- 减少 `max_iterations` |
| 181 | +- 减少测试用例数量(在evaluator.py中调整`load_test_cases()[:5]`) |
| 182 | +- 增加 `parallel_evaluations`(如果有更多CPU核心) |
| 183 | +- 使用更快的LLM模型 |
| 184 | + |
| 185 | +### Q: 所有解都无效怎么办? |
| 186 | + |
| 187 | +A: 检查: |
| 188 | +1. 初始程序能否正常运行 |
| 189 | +2. 评估器是否配置正确 |
| 190 | +3. 约束条件是否理解正确 |
| 191 | +4. LLM生成的代码是否有语法错误(查看日志) |
| 192 | + |
| 193 | +### Q: 成本没有下降怎么办? |
| 194 | + |
| 195 | +A: 尝试: |
| 196 | +1. 增加 `temperature` 提高探索性 |
| 197 | +2. 增加 `population_size` 和 `num_islands` |
| 198 | +3. 调整 `elite_selection_ratio` 和 `exploitation_ratio` |
| 199 | +4. 修改 prompt 提供更多优化提示 |
| 200 | + |
| 201 | +### Q: 如何使用其他模型? |
| 202 | + |
| 203 | +A: 修改 `config.qwen.yaml` 中的 `llm.primary_model`: |
| 204 | + |
| 205 | +```yaml |
| 206 | +# 使用 OpenAI GPT-4 |
| 207 | +llm: |
| 208 | + primary_model: "gpt-4" |
| 209 | + api_key: "your-openai-api-key" |
| 210 | + api_base: "https://api.openai.com/v1" |
| 211 | +
|
| 212 | +# 使用本地模型(需要兼容OpenAI API) |
| 213 | +llm: |
| 214 | + primary_model: "local-model-name" |
| 215 | + api_base: "http://localhost:8000/v1" |
| 216 | +``` |
| 217 | + |
| 218 | +## 进阶使用 |
| 219 | + |
| 220 | +### 可视化演化树 |
| 221 | + |
| 222 | +```bash |
| 223 | +python ../../scripts/visualizer.py \ |
| 224 | + --path openevolve_output/checkpoints/checkpoint_300/ |
| 225 | +``` |
| 226 | + |
| 227 | +### 分析最佳程序 |
| 228 | + |
| 229 | +```python |
| 230 | +import json |
| 231 | +
|
| 232 | +# 读取最佳程序信息 |
| 233 | +with open('openevolve_output/best/best_program_info.json') as f: |
| 234 | + info = json.load(f) |
| 235 | + print(f"Generation: {info['generation']}") |
| 236 | + print(f"Found at iteration: {info['iteration']}") |
| 237 | + print(f"Metrics: {info['metrics']}") |
| 238 | +
|
| 239 | +# 读取并测试最佳程序 |
| 240 | +with open('openevolve_output/best/best_program.py') as f: |
| 241 | + best_code = f.read() |
| 242 | + print(best_code) |
| 243 | +``` |
| 244 | + |
| 245 | +### 批量测试 |
| 246 | + |
| 247 | +```python |
| 248 | +from evaluator import evaluate |
| 249 | +import glob |
| 250 | +
|
| 251 | +for checkpoint_dir in sorted(glob.glob('openevolve_output/checkpoints/checkpoint_*')): |
| 252 | + program_path = f'{checkpoint_dir}/best_program.py' |
| 253 | + if os.path.exists(program_path): |
| 254 | + result = evaluate(program_path) |
| 255 | + print(f"{checkpoint_dir}: {result.metrics['combined_score']:.4f}") |
| 256 | +``` |
| 257 | + |
| 258 | +## 参考资料 |
| 259 | + |
| 260 | +- [OpenEvolve 文档](../../CLAUDE.md) |
| 261 | +- [华为 CodeCraft 2017 题目](README.md) |
| 262 | +- [MAP-Elites 算法论文](https://arxiv.org/abs/1504.04909) |
| 263 | +- [AlphaEvolve 论文](https://deepmind.google/discover/blog/alphaevolve/) |
| 264 | + |
| 265 | +## 许可证 |
| 266 | + |
| 267 | +本示例遵循 OpenEvolve 项目的许可证。 |
0 commit comments