readme文件修改

This commit is contained in:
Cricial
2026-06-17 13:27:56 +08:00
parent b74490c4fa
commit 2235cc86cc
2 changed files with 863 additions and 113 deletions

View File

@@ -1,26 +1,226 @@
# 遗传算法优化ABM模型参数项目 # 遗传算法优化ABM模型参数项目GA_Agent_0925
## 项目概述 ## 项目概述
本项目使用遗传算法Genetic Algorithm来优化基于代理的模型Agent-Based Model的关键参数目标是使模型生成的脆弱产业集合与目标产业集合尽可能匹配。项目包含完整的遗传算法实现、ABM模型集成、数据库操作和结果分析功能。 本项目使用遗传算法Genetic Algorithm来优化基于代理的模型Agent-Based Model的关键参数目标是使模型生成的脆弱产业集合与目标产业集合尽可能匹配。项目使用DEAP框架实现遗传算法集成MySQL数据库进行大规模模拟管理支持多进程并行计算具有完整的结果分析和可视化功能。
## 项目结构 ## 项目结构
``` ```
项目根目录/ GA_Agent_0925/
├── main.py # 遗传算法主程序 ├── 核心算法模块
├── evaluate_func.py # 适应度函数和评估逻辑 │ ├── main.py # GA演化主循环和结果管理
├── creating.py # 遗传算法工具箱创建 ├── creating.py # DEAP工具箱配置参数编码、遗传算子
├── config.json # 配置文件 │ ├── evaluate_func.py # 适应度函数、产业匹配计算
├── controller_db.py # 数据库控制器(需补充) │ ├── orm.py # SQLAlchemy ORM配置、数据库表定义
├── my_model.py # ABM模型实现需补充 │ ├── controller_db.py # 数据库生命周期管理、样本操作
├── orm.py # 数据库ORM配置需补充 │ └── my_model.py # ABM模型调用接口
── creating.py # 工具箱创建
── orm.py # 数据库配置 ── 配置文件
── SQL_analysis_risk_ga.sql # 分析SQL脚本 ├── config.json # GA超参数种群大小、进化代数等
├── results/ # 结果输出目录(自动创建 │ ├── 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模型参数 算法优化以下12个关键ABM模型参数
@@ -47,139 +249,541 @@
## 配置说明 ## 配置文件详细说明
### config.json 示例 ### 1. config.json - GA超参数配置
**文件位置**`GA_Agent_0925/config.json`
**功能**:定义遗传算法的执行参数
**示例内容**
```json ```json
{ {
"seed": 42, "seed": 42,
"pop_size": 50, "pop_size": 10,
"n_gen": 100, "n_gen": 60,
"cx_prob": 0.7, "cx_prob": 0.8,
"mut_prob": 0.2 "mut_prob": 0.2
} }
``` ```
**参数说明**
- `seed` - 随机数种子,确保实验结果可重现性
- `pop_size` - 种群大小(每代个体数)
- `n_gen` - 进化代数
- `cx_prob` - 交叉概率0-1
- `mut_prob` - 变异概率0-1
### 参数说明 ### 2. conf_db.yaml - 数据库连接配置
- `seed`: 随机数种子,确保结果可重现 **文件位置**`GA_Agent_0925/conf_db.yaml`
- `pop_size`: 种群大小 **功能**配置MySQL数据库连接信息
- `n_gen`: 进化代数 **示例内容**
- `cx_prob`: 交叉概率 ```yaml
- `mut_prob`: 变异概率 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. 准备数据库 ### 4. conf_experiment.yaml - 实验参数配置
确保数据库服务运行,并配置正确的连接参数在`orm.py`中。 **文件位置**`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. 运行遗传算法 ### 5. conf.yaml - 其他全局配置
```bash **文件位置**`GA_Agent_0925/conf.yaml`
python main.py **功能**:系统级配置(日志、输出路径等)
## 工具脚本详细说明
### 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
- 临时表管理和清理 ```
### 结果存储 #### 1.2 配置数据库连接
- 每个GA个体分配唯一ID 编辑 `conf_db.yaml`
- 模拟结果与GA个体关联存储 ```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`中注册新基因 编辑 `main.py` 第10行
2.`evaluate_func.py``fitness`函数中映射参数 ```python
3. 更新ABM模型以使用新参数 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`中的遗传算子: ```python
- 选择策略:`tools.selTournament` from evaluate_func import fitness
- 交叉算子:`tools.cxTwoPoint` test_individual = [45, 0.632, 0.785, 1, 42, 0.234, 12, 0.15, 0.87, 0.56, 2.1, 3.2]
- 变异算子:`tools.mutShuffleIndexes` 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. 增加缓存命中率(使用舍入)
如有问题请联系项目维护团队。 #### 降低内存占用
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/
```
### 许可证
本项目仅供学术研究和半导体供应链韧性研究使用。
### 技术支持
如有问题或建议,请联系项目维护团队。

150
README.md
View File

@@ -15,11 +15,11 @@
```shell ```shell
python main.py --exp without_exp --job 6 --reset_db True 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 ```shell
python main.py --exp with_exp --job 6 --reset_db True 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*文件中结果复制入田口设计表格右侧列 4. 将output_result/resilience文件夹*experiment_result.csv*文件中结果复制入田口设计表格右侧列
5. 依次对各个韧性指标进行田口设计分析统计——DOE——田口——分析田口设计从mean_count_firm_prodmean_max_ts_firm_prodmean_n_remove_firm_prodmean_end_ts中选择一个韧性指标图形选项勾选均值分析选项中显示响应表勾选均值拟合线性模型勾选均值点击确定 5. 依次对各个韧性指标进行田口设计分析统计——DOE——田口——分析田口设计从mean_count_firm_prodmean_max_ts_firm_prodmean_n_remove_firm_prodmean_end_ts中选择一个韧性指标图形选项勾选均值分析选项中显示响应表勾选均值拟合线性模型勾选均值点击确定
6. 手工汇总方差分析结果至output_result/resilience文件夹*anova.csv*文件中,汇总响应表结果至*anova_visualization.csv*文件中 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 § 扩展开发指南 | 添加参数、自定义算子、多目标优化 |
## 许可证与联系
本项目仅供学术研究使用。如有问题请联系项目维护团队。