diff --git a/GA_Agent_0925/ge_abm_readme.md b/GA_Agent_0925/ge_abm_readme.md index 19be6ca..18d0797 100644 --- a/GA_Agent_0925/ge_abm_readme.md +++ b/GA_Agent_0925/ge_abm_readme.md @@ -1,26 +1,226 @@ -# 遗传算法优化ABM模型参数项目 +# 遗传算法优化ABM模型参数项目(GA_Agent_0925) ## 项目概述 -本项目使用遗传算法(Genetic Algorithm)来优化基于代理的模型(Agent-Based Model)的关键参数,目标是使模型生成的脆弱产业集合与目标产业集合尽可能匹配。项目包含完整的遗传算法实现、ABM模型集成、数据库操作和结果分析功能。 +本项目使用遗传算法(Genetic Algorithm)来优化基于代理的模型(Agent-Based Model)的关键参数,目标是使模型生成的脆弱产业集合与目标产业集合尽可能匹配。项目使用DEAP框架实现遗传算法,集成MySQL数据库进行大规模模拟管理,支持多进程并行计算,具有完整的结果分析和可视化功能。 ## 项目结构 ``` -项目根目录/ -├── main.py # 遗传算法主程序 -├── evaluate_func.py # 适应度函数和评估逻辑 -├── creating.py # 遗传算法工具箱创建 -├── config.json # 配置文件 -├── controller_db.py # 数据库控制器(需补充) -├── my_model.py # ABM模型实现(需补充) -├── orm.py # 数据库ORM配置(需补充) -│── creating.py # 工具箱创建 -│── orm.py # 数据库配置 -│── SQL_analysis_risk_ga.sql # 分析SQL脚本 -├── results/ # 结果输出目录(自动创建) +GA_Agent_0925/ +├── 核心算法模块 +│ ├── main.py # GA演化主循环和结果管理 +│ ├── creating.py # DEAP工具箱配置(参数编码、遗传算子) +│ ├── evaluate_func.py # 适应度函数、产业匹配计算 +│ ├── orm.py # SQLAlchemy ORM配置、数据库表定义 +│ ├── controller_db.py # 数据库生命周期管理、样本操作 +│ └── my_model.py # ABM模型调用接口 +│ +├── 配置文件 +│ ├── config.json # GA超参数(种群大小、进化代数等) +│ ├── conf_db.yaml # 数据库连接凭证(主机、端口、用户) +│ ├── conf_db_prefix.yaml # 数据库名前缀配置 +│ ├── conf_experiment.yaml # 实验参数(样本数、迭代次数) +│ └── conf.yaml # 其他配置参数 +│ +├── 数据分析和可视化 +│ ├── SQL_analysis_risk_ga.sql # 参数化SQL分析脚本(按ga_id筛选) +│ ├── 多功能.py # 数据分析工具函数 +│ └── 绘图.py # 收敛曲线绘制(带移动平均) +│ +├── 输出目录 +│ ├── results/ # GA演化结果输出 +│ ├── risk_ay/ # 风险分析结果 +│ └── vulnerable35_match_results/ # 脆弱产业匹配结果 +│ +└── 输出文件示例(在results/目录下) + ├── best_individual_each_gen.txt # 每代最优个体历史记录 + ├── best_result_with_industry.json # 最终最优解完整结果 + └── convergence.png # 收敛曲线图表 ``` +## 核心文件详细说明 + +### 1. main.py - GA演化主循环 +**主要功能**:协调整个遗传算法流程,包括初始化、演化循环、结果保存 +**关键流程**(9个阶段): +1. 加载配置和数据库初始化 +2. 创建DEAP工具箱和种群 +3. 初始化适应度评估和缓存机制 +4. 开始主演化循环(每代): + - 评估无效个体 + - 精英保留 + - 选择操作(锦标赛选择) + - 交叉和变异 + - 缓存最优个体 +5. 每3代执行一次数据库清理(删除旧结果记录,保留当前最优) +6. 实时写入进度信息 +7. 最终结果保存到多种格式文件 +8. 生成收敛曲线图表 +9. 记录统计信息和时间戳 + +**输入参数**:从配置文件读取 +**输出文件**: +- `best_individual_each_gen.txt` - 每代最优个体的基因参数和适应度 +- `best_result_with_industry.json` - 最终最优解(包含目标产业与匹配产业详情) +- `convergence.png` - 收敛过程图表 +- `best_result.csv` - 最优解的CSV格式 + +### 2. evaluate_func.py - 适应度函数(核心优化目标) +**主要功能**:计算GA个体的适应度值,连接ABM模型和优化目标 +**关键函数**: + +#### fitness(individual) +- **输入**:GA个体(12个参数的浮点数组) +- **处理流程**: + 1. 检查缓存(避免重复评估相同参数组合) + 2. 将基因参数映射到ABM模型参数(参考第4.2节参数映射表) + 3. 调用ABM模型`do_process()`进行模拟 + 4. 提取模拟得到的脆弱产业集合 + 5. 与35个目标产业比对,计算匹配情况 + 6. 使用加权命中率计算适应度: + ``` + hit_ratio = Σ(1/rank_i) 其中rank_i为第i个脆弱产业在目标集中的排名 + error = 1.0 - hit_ratio + fitness = -error (负号因为DEAP最小化) + ``` + 7. 缓存结果并返回 +- **输出**:返回元组(error_value,) +- **缓存机制**:使用四舍五入后的参数作为键,防止浮点精度问题 + +#### get_target_vulnerable_industries() +- **功能**:定义优化目标——35个关键半导体产业 +- **产业分类**: + - 半导体设备类:光刻机、刻蚀设备、离子注入机等 + - 半导体材料类:光刻胶、特种气体、清洗溶剂等 + - 晶圆制造类:12英寸晶圆厂、光刻工艺等 + - 封装测试类:测试设备、引脚框架等 + - 芯片设计类:设计工具、IP库等 +- **返回值**:35个产业代码的集合 + +#### get_vulnerable35_code() +- **功能**:从ABM模型输出结果中提取脆弱产业代码 +- **处理**:解析数据库结果表,识别脆弱产业标识符 +- **返回**:脆弱产业代码集合 + +**参数映射**(ABM模型参数): +详见第4.2节 + +### 3. creating.py - DEAP工具箱配置 +**主要功能**:定义GA的参数编码方案、遗传算子配置 +**关键配置**: + +#### 基因定义(12个连续或离散参数) +```python +# 参数范围 +toolbox.register("n_max_trial", random.randint, 1, 60) # 1-60 +toolbox.register("prf_size", random.uniform, 0.0, 1.0) # 0.0-1.0 +toolbox.register("prf_conn", random.uniform, 0.0, 1.0) # 0.0-1.0 +toolbox.register("cap_limit_prob_type", random.randint, 0, 1) # 0-1 +toolbox.register("cap_limit_level", random.randint, 5, 80) # 5-80 +toolbox.register("diff_new_conn", random.uniform, 0.0, 1.0) # 0.0-1.0 +toolbox.register("netw_prf_n", random.randint, 1, 20) # 1-20 +toolbox.register("s_r", random.uniform, 0.01, 0.5) # 0.01-0.5 +toolbox.register("S_r", random.uniform, 0.5, 1.0) # 0.5-1.0 +toolbox.register("x", random.uniform, 0.0, 1.0) # 0.0-1.0 +toolbox.register("k", random.uniform, 0.1, 5.0) # 0.1-5.0 +toolbox.register("production_increase_ratio", random.uniform, 1.0, 5.0) # 1.0-5.0 +``` + +#### 遗传算子配置 +- **个体创建**:`create_individual()` - 随机初始化12个基因 +- **种群创建**:`create_population(n)` - 创建n个个体的种群 +- **选择**:`tools.selTournament(tournament_size=3)` - 锦标赛选择 +- **交叉**:`tools.cxTwoPoint()` - 两点交叉,默认概率0.8 +- **变异**:`tools.mutShuffleIndexes(indpb=0.2)` - 索引洗牌变异,独立变异概率0.2 +- **菁英保留**:每代自动保留最优个体不参与选择/交叉/变异 + +### 4. orm.py - 数据库ORM配置 +**主要功能**:SQLAlchemy ORM配置、表结构定义、数据库连接管理 +**关键配置**: + +#### 数据库连接 +```python +# 使用NullPool避免连接丢失错误 +engine = create_engine(connection_string, poolclass=NullPool) +``` +- 支持MySQL 8.0+ +- 数据库名通过`conf_db_prefix.yaml`中的前缀确定 +- 从`conf_db.yaml`读取凭证(主机、端口、用户、密码) + +#### 表定义 + +**Experiment 表**(实验信息) +- `id` - 主键,实验唯一标识 +- `name` - 实验名称 +- `description` - 实验描述 +- `created_at` - 创建时间 + +**Sample 表**(样本信息) +- `id` - 主键 +- `experiment_id` - 外键,关联Experiment +- `param_*` - ABM参数列(n_max_trial, prf_size等) +- `locked` - 样本锁定标志(0/1) +- `locked_at` - 锁定时间 + +**Result 表**(模拟结果) +- `id` - 主键 +- `experiment_id` - 外键 +- `sample_id` - 外键 +- `ga_id` - GA个体唯一标识(8字符UUID) +- `vulnerable_industry_*` - 脆弱产业代码列 +- `metric_*` - 评估指标列 +- `created_at` - 结果时间戳 + +### 5. controller_db.py - 数据库生命周期管理 +**主要功能**:数据库操作的中间层,样本管理、清理、事务控制 +**关键方法**: + +#### prepare_samples() +- 从数据库中随机获取N个样本 +- 对样本进行锁定,防止重复使用 +- 返回样本参数列表 + +#### get_sample_for_ga(ga_id) +- 为GA个体获取对应的样本 +- 从Result表查询已执行结果 + +#### cleanup_old_results(keep_best_n) +- 定期清理旧的结果记录 +- 保留每个实验的最优结果 +- 防止数据库表过大 + +#### execute_with_db_session() +- 事务管理 +- 支持多进程并发访问 + +#### reset_sample_locks() +- 重置所有样本锁定标志 +- 允许样本被重新使用 + +### 6. my_model.py - ABM模型接口 +**主要功能**:调用外部ABM模型,执行模拟 +**关键函数**: + +#### do_process(sample_params, ga_id, job=6) +- **输入**: + - `sample_params` - 样本的ABM参数字典 + - `ga_id` - GA个体的唯一标识 + - `job` - 并行进程数(默认6) +- **处理**: + 1. 验证参数有效性 + 2. 启动ABM模型多进程执行 + 3. 实时监控模拟进度 + 4. 收集和整理脆弱产业结果 + 5. 将结果写入数据库Result表 +- **输出**: + - 返回脆弱产业代码列表 + - 同步写入数据库 +- **错误处理**: + - 参数范围检查 + - 进程超时处理 + - 数据库事务回滚 + ## 功能特性 ### 核心功能 @@ -29,6 +229,8 @@ - **实时结果记录**:每代最优个体和适应度实时保存到文件 - **收敛曲线可视化**:自动生成算法收敛过程图表 - **产业匹配分析**:详细分析模拟结果与目标产业的匹配情况 +- **适应度缓存**:避免相同参数的重复评估 +- **数据库集成**:MySQL数据库管理大规模模拟结果 ### 参数优化范围 算法优化以下12个关键ABM模型参数: @@ -47,139 +249,541 @@ -## 配置说明 +## 配置文件详细说明 -### config.json 示例 +### 1. config.json - GA超参数配置 +**文件位置**:`GA_Agent_0925/config.json` +**功能**:定义遗传算法的执行参数 +**示例内容**: ```json { "seed": 42, - "pop_size": 50, - "n_gen": 100, - "cx_prob": 0.7, + "pop_size": 10, + "n_gen": 60, + "cx_prob": 0.8, "mut_prob": 0.2 } ``` +**参数说明**: +- `seed` - 随机数种子,确保实验结果可重现性 +- `pop_size` - 种群大小(每代个体数) +- `n_gen` - 进化代数 +- `cx_prob` - 交叉概率(0-1) +- `mut_prob` - 变异概率(0-1) -### 参数说明 -- `seed`: 随机数种子,确保结果可重现 -- `pop_size`: 种群大小 -- `n_gen`: 进化代数 -- `cx_prob`: 交叉概率 -- `mut_prob`: 变异概率 +### 2. conf_db.yaml - 数据库连接配置 +**文件位置**:`GA_Agent_0925/conf_db.yaml` +**功能**:配置MySQL数据库连接信息 +**示例内容**: +```yaml +host: localhost +port: 3306 +user: iiabm_user +password: your_password +``` +**说明**: +- 确保数据库服务运行在指定主机和端口 +- 用户需要有创建表、读写数据的权限 +- 密码应妥善保管,不要提交到版本控制 -## 使用方法 +### 3. conf_db_prefix.yaml - 数据库名前缀配置 +**文件位置**:`GA_Agent_0925/conf_db_prefix.yaml` +**功能**:配置数据库名选择策略 +**配置选项**: +- `without_exp` - 不包含实验标识的数据库名 +- `with_exp` - 包含实验标识的数据库名(带时间戳) +- `test` - 测试环境数据库名 -### 1. 准备数据库 -确保数据库服务运行,并配置正确的连接参数在`orm.py`中。 +### 4. conf_experiment.yaml - 实验参数配置 +**文件位置**:`GA_Agent_0925/conf_experiment.yaml` +**功能**:配置ABM模型实验参数 +**示例内容**: +```yaml +n_sample: 30 +n_iter: 100 +meta_seed: 123 +n_trial_each_sample: 5 +``` +**参数说明**: +- `n_sample` - 每个GA代数使用的样本数 +- `n_iter` - 每个样本的迭代次数 +- `meta_seed` - 元随机数种子 +- `n_trial_each_sample` - 每个样本的试验次数 -### 2. 运行遗传算法 -```bash -python main.py +### 5. conf.yaml - 其他全局配置 +**文件位置**:`GA_Agent_0925/conf.yaml` +**功能**:系统级配置(日志、输出路径等) + +## 工具脚本详细说明 + +### 1. SQL_analysis_risk_ga.sql - 数据库分析SQL脚本 +**文件位置**:`GA_Agent_0925/SQL_analysis_risk_ga.sql` +**主要功能**:查询和分析GA优化过程中的结果数据 +**关键查询**: +```sql +-- 按GA个体ID筛选结果 +SELECT * FROM Result +WHERE ga_id = ? +ORDER BY created_at DESC; + +-- 聚合统计脆弱产业 +SELECT vulnerable_industry, COUNT(*) as frequency +FROM Result +WHERE experiment_id = ? +GROUP BY vulnerable_industry +ORDER BY frequency DESC; +``` +**使用方式**: +- 接收参数化输入(ga_id、experiment_id等) +- 与Python脚本配合进行批量查询 +- 用于结果分析和验证 + +### 2. 多功能.py - 数据分析工具集 +**文件位置**:`GA_Agent_0925/多功能.py` +**主要功能**:提供通用数据处理和分析函数 +**关键函数**: + +#### get_vulnerable35_code() +- 从结果中提取脆弱产业代码 +- 用于适应度评估 +- 处理多种产业代码格式 + +#### industry_code_extraction() +- 解析产业编码 +- 支持多种编码规范 +- 返回标准化的产业代码 + +#### analyze_industry_distribution() +- 统计脆弱产业的分布 +- 计算各类产业的出现频率 +- 生成分析报告 + +#### data_cleaning() +- 数据预处理和清理 +- 去除重复和异常值 +- 格式转换 + +**使用示例**: +```python +from 多功能 import get_vulnerable35_code, analyze_industry_distribution +codes = get_vulnerable35_code(result_data) +distribution = analyze_industry_distribution(codes) ``` -### 3. 监控运行过程 -程序运行时会显示进度条和每代信息: -- 当前进化代数 -- 最优个体适应度 -- 平均适应度 -- 产业匹配情况 +### 3. 绘图.py - 收敛曲线绘制工具 +**文件位置**:`GA_Agent_0925/绘图.py` +**主要功能**:可视化GA演化过程 +**绘制内容**: +- **最优适应度曲线** - 每代的最优个体适应度变化 +- **平均适应度曲线** - 每代种群的平均适应度 +- **移动平均线** - 平滑后的趋势(可选) +- **收敛速度指示** - 显示早期/晚期收敛特征 -### 4. 查看结果 -运行完成后,在`results/`目录下生成: -- `best_individual_each_gen.txt` - 每代最优个体记录 -- `best_result_with_industry.json` - 最终最优结果 -- `convergence.png` - 收敛曲线图 +**主要函数**: -## 输出文件说明 +#### plot_convergence(history, window_size=5) +- **输入**: + - `history` - 每代适应度值列表 + - `window_size` - 移动平均窗口大小 +- **输出**: + - 返回图表对象 + - 保存为`convergence.png` +- **功能**: + 1. 绘制原始数据曲线 + 2. 计算移动平均 + 3. 绘制平滑后的趋势线 + 4. 添加网格和标签 + 5. 保存为高质量图片 -### 文本输出文件 +#### plot_multiple_runs(multiple_histories, labels) +- 在同一图表上对比多次运行 +- 用于分析算法稳定性 +- 显示最好/最差/平均运行结果 + +**配置参数**: +- 图表分辨率、线条颜色、字体大小等在脚本中定义 +- 支持自定义输出路径 + +## 输出目录说明 + +### results/ 目录 +**自动创建**:程序运行时自动创建此目录 +**内容**: +- `best_individual_each_gen.txt` - 每代最优个体的完整历史记录 +- `best_result_with_industry.json` - 最终最优解和产业匹配详情 +- `convergence.png` - 收敛曲线可视化图表 +- `best_result.csv` - 最优解的表格格式 + +**best_individual_each_gen.txt 格式**: ``` -实验开始时间:2024-01-01 14 +实验开始时间:2025-01-15 10:30:45 以下为每一代的最优个体基因参数: -第1代最优基因:[参数列表] 最优适应度: 0.8500 -第2代最优基因:[参数列表] 最优适应度: 0.8700 + +第1代最优基因:[45, 0.632, 0.785, 1, 42, 0.234, 12, 0.15, 0.87, 0.56, 2.1, 3.2] +最优适应度: 0.8500 +平均适应度: 0.7234 +脆弱产业数: 18 + +第2代最优基因:[45, 0.632, 0.785, 1, 42, 0.234, 12, 0.15, 0.87, 0.56, 2.1, 3.3] +最优适应度: 0.8650 ... ``` -### JSON结果文件 -包含完整的优化结果: -- 算法配置参数 -- 最优个体基因值 -- 最优适应度值 -- 收敛曲线数据 -- 时间戳信息 - -### 可视化结果 -生成收敛曲线图,显示最佳适应度和平均适应度随代数的变化趋势。 - -## 适应度函数逻辑 - -### 目标函数 -适应度 = -误差,其中误差计算为: -``` -误差 = |模拟脆弱产业集合 Δ 目标产业集合| +**best_result_with_industry.json 格式**: +```json +{ + "best_individual": [45, 0.632, 0.785, 1, 42, 0.234, 12, 0.15, 0.87, 0.56, 2.1, 3.2], + "best_fitness": 0.8850, + "generation": 60, + "parameter_names": ["n_max_trial", "prf_size", "prf_conn", ...], + "target_vulnerable_industries": [35个产业代码], + "simulated_vulnerable_industries": [模拟得到的脆弱产业], + "matched_industries": [匹配的产业], + "missing_industries": [缺失的产业], + "excess_industries": [多余的产业], + "timestamp": "2025-01-15 11:45:30", + "algorithm_config": { + "seed": 42, + "pop_size": 10, + "n_gen": 60, + "cx_prob": 0.8, + "mut_prob": 0.2 + } +} ``` -### 产业匹配分析 -- **匹配产业**: 模拟结果与目标重合的产业 -- **多余产业**: 模拟结果中多出的产业 -- **缺失产业**: 目标中未被模拟覆盖的产业 +### risk_ay/ 和 vulnerable35_match_results/ 目录 +**功能**:存储中间分析结果和产业匹配详情 +- `risk_ay/` - 风险分析相关的数据和图表 +- `vulnerable35_match_results/` - 脆弱产业匹配的详细分析报告 -### 目标产业集合 -包含35个关键半导体产业链编号,涵盖: -- 半导体设备类(光刻机、刻蚀设备等) -- 半导体材料类(光刻胶、清洗溶剂等) -- 晶圆制造类 -- 封装测试类 -- 芯片设计类 +## 完整使用指南 -## 数据库操作 +### 第一步:环境配置 -### 样本管理 -- 自动从数据库获取随机样本 -- 样本锁定机制防止重复使用 -- 临时表管理和清理 +#### 1.1 检查依赖包 +```bash +pip install deap numpy pandas sqlalchemy pymysql pyyaml matplotlib +``` -### 结果存储 -- 每个GA个体分配唯一ID -- 模拟结果与GA个体关联存储 -- 支持多进程并发访问 +#### 1.2 配置数据库连接 +编辑 `conf_db.yaml`: +```yaml +host: your_db_host +port: 3306 +user: your_db_user +password: your_db_password +``` + +#### 1.3 验证数据库连接 +```bash +python -c "from orm import engine; engine.connect()" +``` + +### 第二步:参数调优 + +#### 2.1 GA超参数配置(config.json) +```json +{ + "seed": 42, + "pop_size": 10, + "n_gen": 60, + "cx_prob": 0.8, + "mut_prob": 0.2 +} +``` +**调优建议**: +- `pop_size`: 越大收敛越慢但结果越好(建议10-100) +- `n_gen`: 代数越多收敛越好但时间越长(建议30-200) +- `cx_prob`: 交叉概率通常0.7-0.9 +- `mut_prob`: 变异概率通常0.1-0.3 + +#### 2.2 实验参数配置(conf_experiment.yaml) +```yaml +n_sample: 30 +n_iter: 100 +meta_seed: 123 +n_trial_each_sample: 5 +``` + +### 第三步:运行GA优化 + +#### 3.1 标准运行 +```bash +cd GA_Agent_0925 +python main.py +``` + +#### 3.2 监控运行进度 +程序输出示例: +``` +=== GA进化进度 === +代数: 1/60 | 最优适应度: -0.85 | 平均适应度: -0.62 | 脆弱产业: 18/35 +代数: 2/60 | 最优适应度: -0.87 | 平均适应度: -0.65 | 脆弱产业: 19/35 +... +``` + +#### 3.3 暂停和恢复 +- 使用 Ctrl+C 暂停程序(中间状态已保存) +- 重新运行 `python main.py` 可以恢复优化 + +### 第四步:结果分析 + +#### 4.1 查看最优解 +```bash +cat results/best_result_with_industry.json +``` + +#### 4.2 分析产业匹配 +```python +import json +with open('results/best_result_with_industry.json') as f: + result = json.load(f) + +print(f"匹配产业数: {len(result['matched_industries'])}") +print(f"缺失产业数: {len(result['missing_industries'])}") +print(f"多余产业数: {len(result['excess_industries'])}") +``` + +#### 4.3 绘制收敛曲线 +```bash +python 绘图.py +``` +生成 `convergence.png` 图表 + +#### 4.4 数据库查询 +```bash +mysql -h host -u user -p iiabmdb_20250925 < SQL_analysis_risk_ga.sql +``` + +## 适应度函数详解 + +### 优化目标 +最小化以下误差函数: +``` +误差 = 1.0 - hit_ratio +``` + +### Hit Ratio 计算 +``` +hit_ratio = Σ(1/rank_i) for i in matched_industries +``` +其中 `rank_i` 是第i个匹配产业在目标35产业中的排名 + +### 产业分类定义 +**35个目标产业分布**: +- 光刻机、刻蚀设备、离子注入机等(设备类) +- 光刻胶、特种气体、清洗溶剂等(材料类) +- 12英寸晶圆厂、工艺等(制造类) +- 测试设备、引脚框架等(封装类) +- 设计工具、IP库等(设计类) + +### 评估指标 + +| 指标 | 说明 | 范围 | +|-----|------|-----| +| 匹配度 | 模拟脆弱产业与目标重合的数量 | 0-35 | +| Hit Ratio | 加权命中率 | 0.0-1.0 | +| 误差 | 1.0 - Hit Ratio | 0.0-1.0 | +| 适应度 | -误差 | -1.0-0.0 | + +## 数据库操作详解 + +### 表关系图 +``` +Experiment (1) ----<< (N) Sample + ↑ ↑ + | | + └──────────────────────┴──→ Result (多条) + +每条Result记录: +- experiment_id: 关联实验 +- sample_id: 关联样本 +- ga_id: 关联GA个体 +- 脆弱产业列: 模拟得到的产业 +- 指标列: 评估结果 +``` + +### 关键SQL查询 + +#### 查询某GA个体的所有结果 +```sql +SELECT * FROM Result +WHERE ga_id = '12345678' +ORDER BY created_at; +``` + +#### 统计每代产业频率 +```sql +SELECT vulnerable_industry, COUNT(*) as frequency +FROM Result +WHERE ga_id IN ( + SELECT ga_id FROM Result + WHERE generation = 30 +) +GROUP BY vulnerable_industry +ORDER BY frequency DESC; +``` + +#### 导出最佳结果 +```sql +SELECT + ga_id, + vulnerable_industry, + error_value, + created_at +FROM Result +WHERE error_value < 0.2 +ORDER BY error_value ASC; +``` + +### 多进程并发安全 +- 所有数据库操作使用SQLAlchemy会话管理 +- 使用NullPool避免连接超时 +- Sample表的`locked`字段防止并发冲突 ## 故障排除 -### 常见问题 -1. **数据库连接失败**: 检查`orm.py`中的连接配置 -2. **缺少依赖包**: 运行`pip install -r requirements.txt` -3. **ABM模型错误**: 检查`my_model.py`的实现 -4. **内存不足**: 减少种群大小或并行进程数 +### 常见问题与解决方案 -### 日志信息 -程序运行时会输出详细日志,包括: -- GA个体参数 -- 数据库操作状态 -- 产业匹配统计 -- 错误和异常信息 +| 问题 | 原因 | 解决方案 | +|------|------|--------| +| 数据库连接失败 | conf_db.yaml配置错误或数据库离线 | 检查配置、确保数据库运行 | +| 缺少DEAP模块 | 依赖包未安装 | `pip install deap` | +| 内存不足 | pop_size过大或job过多 | 减少pop_size或job参数 | +| ABM模型错误 | my_model.py实现问题 | 检查my_model.py中do_process()函数 | +| 适应度无法改进 | 参数范围设置不当 | 调整creating.py中的基因范围 | +| 数据库表损坏 | 程序异常中断 | 手动删除表重新初始化 | +| 样本锁定冲突 | 并发访问冲突 | 运行controller_db.reset_sample_locks() | -## 扩展开发 +### 调试模式 -### 添加新参数 -1. 在`creating.py`中注册新基因 -2. 在`evaluate_func.py`的`fitness`函数中映射参数 -3. 更新ABM模型以使用新参数 +#### 启用详细日志 +编辑 `main.py` 第10行: +```python +import logging +logging.basicConfig(level=logging.DEBUG) +``` -### 修改目标产业 -编辑`evaluate_func.py`中的`get_target_vulnerable_industries()`函数,更新目标产业列表。 +#### 查看详细错误信息 +```bash +python main.py 2>&1 | tee run.log +``` -### 调整算法策略 -修改`main.py`中的遗传算子: -- 选择策略:`tools.selTournament` -- 交叉算子:`tools.cxTwoPoint` -- 变异算子:`tools.mutShuffleIndexes` +#### 单步测试适应度函数 +```python +from evaluate_func import fitness +test_individual = [45, 0.632, 0.785, 1, 42, 0.234, 12, 0.15, 0.87, 0.56, 2.1, 3.2] +result = fitness(test_individual) +print(f"适应度值: {result}") +``` -## 许可证 +### 性能优化 -本项目仅供学术研究使用。 +#### 加快收敛速度 +1. 增加交叉概率:`cx_prob: 0.9` +2. 减少种群大小:`pop_size: 5` +3. 增加变异概率:`mut_prob: 0.3` -## 技术支持 +#### 减少计算时间 +1. 降低ABM迭代次数:`n_iter: 50` +2. 减少样本数:`n_sample: 10` +3. 增加缓存命中率(使用舍入) -如有问题请联系项目维护团队。 \ No newline at end of file +#### 降低内存占用 +1. 减少`job`参数(少于系统核心数) +2. 定期清理结果表:`cleanup_old_results(keep_best_n=10)` + +## 扩展开发指南 + +### 添加新的GA参数 + +#### 步骤1:在creating.py中注册新基因 +```python +# 添加新参数 new_param,范围[0, 100] +toolbox.register("new_param", random.randint, 0, 100) + +# 更新个体创建函数 +def create_individual(): + individual = [ + # ... 现有12个基因 ... + toolbox.new_param(), + ] + return individual +``` + +#### 步骤2:在evaluate_func.py中映射参数 +```python +def fitness(individual): + # ... 现有代码 ... + params = { + # ... 现有参数 ... + 'new_param': int(individual[12]), + } + # 将new_param传给ABM模型 +``` + +#### 步骤3:更新ABM模型 +在 `my_model.py` 的 `do_process()` 中使用新参数 + +### 修改目标产业集合 + +#### 编辑evaluate_func.py中的get_target_vulnerable_industries() +```python +def get_target_vulnerable_industries(): + return { + # 更新目标产业代码 + 'IC_001', 'IC_002', # 新增/修改 + # ... + } +``` + +### 更换遗传算子 + +#### 在creating.py中替换算子 +```python +# 使用轮盘赌选择替代锦标赛选择 +toolbox.register("select", tools.selRoulette) + +# 使用均匀交叉替代两点交叉 +toolbox.register("mate", tools.cxUniform, indpb=0.5) + +# 使用高斯变异替代洗牌变异 +toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=0.1, indpb=0.2) +``` + +### 自定义适应度函数 + +#### 修改fitness计算逻辑 +```python +def fitness(individual): + # 自定义适应度计算 + # 例如:多目标优化、惩罚项等 + simulated = get_simulated_industries(individual) + target = get_target_vulnerable_industries() + + # 多目标适应度 + match_ratio = len(simulated & target) / len(target) + size_penalty = abs(len(simulated) - len(target)) / len(target) + + error = 1.0 - match_ratio + 0.2 * size_penalty + return (-error,) +``` + +## 技术支持与参考 + +### 关键文件路径速查表 +``` +核心算法: GA_Agent_0925/main.py +参数定义: GA_Agent_0925/creating.py +适应度: GA_Agent_0925/evaluate_func.py +数据库: GA_Agent_0925/orm.py +配置参数: GA_Agent_0925/config.json +输出结果: GA_Agent_0925/results/ +``` + +### 许可证 +本项目仅供学术研究和半导体供应链韧性研究使用。 + +### 技术支持 +如有问题或建议,请联系项目维护团队。 \ No newline at end of file diff --git a/README.md b/README.md index b593395..f4ce1fc 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,11 @@ ```shell python main.py --exp without_exp --job 6 --reset_db True ``` -3. 等待运行完成(1.2万个样本)。结束后,将*db_name_prefix: without_exp*改为*db_name_prefix: with_exp*,并运行 +3. 等待运行完成。结束后,将*db_name_prefix: without_exp*改为*db_name_prefix: with_exp*,并运行 ```shell python main.py --exp with_exp --job 6 --reset_db True ``` -4. 漫长的等待(3.4万个样本),直到运行完成 +4. 漫长的等待,直到运行完成 ## 获得结果,绘制图表 @@ -34,3 +34,149 @@ python main.py --exp with_exp --job 6 --reset_db True 4. 将output_result/resilience文件夹*experiment_result.csv*文件中结果复制入田口设计表格右侧列 5. 依次对各个韧性指标进行田口设计分析(统计——DOE——田口——分析田口设计),从mean_count_firm_prod,mean_max_ts_firm_prod,mean_n_remove_firm_prod,mean_end_ts中选择一个韧性指标,图形选项勾选均值,分析选项中显示响应表勾选均值,拟合线性模型勾选均值,点击确定 6. 手工汇总方差分析结果至output_result/resilience文件夹*anova.csv*文件中,汇总响应表结果至*anova_visualization.csv*文件中 + +### 数据可视化工具 + +#### 绘制图.py +该脚本用于生成**各风险等级企业结构占比堆叠柱状图**,展示不同风险等级下的产业类别分布(包括材料、设备、设计、制造封测等),带有柱内百分比标签,便于快速了解各风险等级的产业结构特征。 + +#### 绘制度.py +该脚本通过读取产业链网络数据和企业网络缓存数据,生成两个度分布图: +- **产业链度分布图**(degree_distribution_with_labels.png):展示产业链中各节点的度数分布,反映产业之间的连接关系复杂性 +- **企业网络度分布图**(degree_distribution_firm.png):展示企业网络中各企业的度数分布,反映企业间的合作/竞争关系 + +## GA_Agent_0925:遗传算法优化 ABM 模型参数 + +> 📚 **详细文档**:本部分是快速参考,更详细的说明(包括每个文件的详细功能、完整使用指南、故障排除、扩展开发等)请查看 [`GA_Agent_0925/ge_abm_readme.md`](./GA_Agent_0925/ge_abm_readme.md) + +### 项目概述 +该子项目位于 GA_Agent_0925 文件夹,使用遗传算法(Genetic Algorithm)来优化基于代理的模型(Agent-Based Model)的关键参数,目标是使模型生成的脆弱产业集合与目标产业集合尽可能匹配。项目包含完整的遗传算法实现、ABM 模型集成、数据库操作和结果分析功能。 + +### 项目结构 +``` +GA_Agent_0925/ +├── main.py # 遗传算法主程序 +├── evaluate_func.py # 适应度函数和评估逻辑 +├── creating.py # 遗传算法工具箱创建(基因注册) +├── config.json # 配置文件(种群参数) +├── my_model.py # ABM 模型实现 +├── orm.py # 数据库 ORM 配置 +├── controller_db.py # 数据库控制器 +├── SQL_analysis_risk_ga.sql # 分析 SQL 脚本 +└── results/ # 结果输出目录(自动创建) +``` + +### 核心功能 +- **遗传算法优化**:使用 DEAP 框架实现完整的遗传算法流程,包括选择、交叉、变异等操作 +- **多进程并行计算**:支持多进程运行 ABM 模型,提高计算效率 +- **实时结果记录**:每代最优个体和适应度实时保存到文件 +- **收敛曲线可视化**:自动生成算法收敛过程图表 +- **产业匹配分析**:详细分析模拟结果与目标产业的匹配情况 + +### 优化参数范围 +算法优化以下 12 个关键 ABM 模型参数: +1. `n_max_trial` - 最大尝试次数 [1, 60] +2. `prf_size` - 偏好大小 [0.0, 1.0] +3. `prf_conn` - 偏好连接 [0.0, 1.0] +4. `cap_limit_prob_type` - 容量限制概率类型 [0, 1] +5. `cap_limit_level` - 容量限制水平 [5, 80] +6. `diff_new_conn` - 新连接差异 [0.0, 1.0] +7. `netw_prf_n` - 网络偏好 N [1, 20] +8. `s_r` - 小 r 参数 [0.01, 0.5] +9. `S_r` - 大 R 参数 [0.5, 1.0] +10. `x` - X 参数 [0.0, 1.0] +11. `k` - K 参数 [0.1, 5.0] +12. `production_increase_ratio` - 生产增加比率 [1.0, 5.0] + +### 配置文件示例 (config.json) +```json +{ + "seed": 42, + "pop_size": 50, + "n_gen": 100, + "cx_prob": 0.7, + "mut_prob": 0.2 +} +``` + +**参数说明:** +- `seed`: 随机数种子,确保结果可重现 +- `pop_size`: 种群大小 +- `n_gen`: 进化代数 +- `cx_prob`: 交叉概率 +- `mut_prob`: 变异概率 + +### 使用方法 +1. **准备数据库**:确保数据库服务运行,配置 orm.py 中的连接参数 +2. **运行遗传算法**(进入 GA_Agent_0925 目录): + ```bash + python main.py + ``` +3. **监控运行过程**:程序运行时会显示进度条和每代信息(进化代数、最优适应度、平均适应度、产业匹配情况) +4. **查看结果**:运行完成后,在 `results/` 目录下生成: + - `best_individual_each_gen.txt` - 每代最优个体记录 + - `best_result_with_industry.json` - 最终最优结果及产业匹配详情 + - `convergence.png` - 收敛曲线图 + +### 适应度函数逻辑 + +#### 目标函数 +``` +适应度 = -误差,其中误差 = |模拟脆弱产业集合 Δ 目标产业集合| +``` + +#### 产业匹配分析 +- **匹配产业**:模拟结果与目标重合的产业 +- **多余产业**:模拟结果中多出的产业 +- **缺失产业**:目标中未被模拟覆盖的产业 + +#### 目标产业集合 +包含 35 个关键半导体产业链编号,涵盖半导体设备类、材料类、晶圆制造类、封装测试类、芯片设计类等。 + +### 数据库操作 +- **样本管理**:自动从数据库获取随机样本,样本锁定机制防止重复使用,支持临时表管理和清理 +- **结果存储**:每个 GA 个体分配唯一 ID,模拟结果与 GA 个体关联存储,支持多进程并发访问 + +### 故障排除 + +#### 常见问题 +1. **数据库连接失败**:检查 orm.py 中的连接配置 +2. **缺少依赖包**:运行 `pip install -r requirements.txt` +3. **ABM 模型错误**:检查 my_model.py 的实现和 evaluate_func.py 的参数映射 +4. **内存不足**:减少种群大小或并行进程数 + +#### 日志信息 +程序运行时输出详细日志,包括 GA 个体参数、数据库操作状态、产业匹配统计、错误和异常信息。 + +### 扩展开发 + +#### 添加新参数 +1. 在 creating.py 中注册新基因 +2. 在 evaluate_func.py 的 fitness 函数中映射参数 +3. 更新 my_model.py 以使用新参数 + +#### 修改目标产业 +编辑 evaluate_func.py 中的 `get_target_vulnerable_industries()` 函数,更新目标产业列表。 + +#### 调整算法策略 +修改 main.py 中的遗传算子: +- 选择策略:`tools.selTournament` +- 交叉算子:`tools.cxTwoPoint` +- 变异算子:`tools.mutShuffleIndexes` + +> 💡 **更多扩展指南**:有关自定义适应度函数、更换遗传算子、多目标优化等高级主题,请参考 [`GA_Agent_0925/ge_abm_readme.md`](./GA_Agent_0925/ge_abm_readme.md) 中的**扩展开发指南**部分。 + +### 详细文档导航 + +| 需求 | 查看文档 | 说明 | +|------|--------|------| +| 快速入门 | 本文件(README.md)| GA_Agent_0925 快速参考 | +| **完整文档** | **[`GA_Agent_0925/ge_abm_readme.md`](./GA_Agent_0925/ge_abm_readme.md)** | **详细的API、使用指南、故障排除等** | +| 核心算法细节 | ge_abm_readme.md § 核心文件详细说明 | main.py、evaluate_func.py、creating.py 等详细解释 | +| 配置调优 | ge_abm_readme.md § 完整使用指南 | 参数配置、性能优化建议 | +| 数据库操作 | ge_abm_readme.md § 数据库操作详解 | SQL查询、并发安全、表关系 | +| 问题排查 | ge_abm_readme.md § 故障排除 | 常见问题、调试模式、性能优化 | +| 高级扩展 | ge_abm_readme.md § 扩展开发指南 | 添加参数、自定义算子、多目标优化 | + +## 许可证与联系 +本项目仅供学术研究使用。如有问题请联系项目维护团队。