Skip to content

Latest commit

 

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

冰箱抽屉仿真自动化框架

基于 拉丁超立方采样(LHS) + NX 参数化建模 + ANSYS Mechanical 批量仿真 + ANSYS Discovery 容积计算 + SAEA 代理模型优化 的自动化优化循环系统。支持自定义任意数量设计变量,采用异步任务队列和多实例NX服务实现高效并行仿真,集成Discovery容积计算功能,并支持基于代理模型的自适应加点迭代(如NSGA2、EHVI等)。

✨ 主要特性

  • 🎯 参数泛化:支持任意数量的设计变量(如加强筋高度、厚度、角度等),只需在配置文件中定义名称、范围和单位。
  • 🔁 智能采样:内置拉丁超立方采样(LHS)生成初始DOE点,提供多种自适应加点策略。
  • 🚀 异步多实例:基于Python asyncio实现异步多实例NX服务,支持动态负载均衡和连接池管理。
  • 🧩 智能通信:通过 Socket + JSON 与NX服务通信,支持环境变量参数传递,避免重复启动NX。
  • ⚙️ 并行仿真:基于工作池并行运行多个 Mechanical 实例,动态任务队列实现负载均衡。
  • 📦 容积计算:集成ANSYS Discovery进行封闭腔体容积计算,支持颜色识别和并行处理。
  • 🤖 代理模型:集成高斯过程代理模型,支持预测和不确定性估计。
  • 📈 多目标优化:支持NSGA2多目标优化算法,自动寻找帕累托前沿。
  • 🎯 智能加点:支持EHVI(期望超体积增量)和dHV(超体积增量)等加点策略。
  • 🗂️ 轻量数据管理:使用 CSV 存储所有设计点和仿真结果,便于查看和后处理。
  • 💾 客户端缓存:失败缓存管理在客户端实现,避免多实例并发访问冲突。
  • 📊 可视化分析:自动生成优化过程可视化图表,包括帕累托前沿、收敛曲线等。

📁 项目目录结构

AutoSimProject/
├── README.md
├── requirements.txt
├── config.py                     # 全局配置(变量、路径、并行数等)
├── main.py                       # 主控入口(DOE + SAEA优化)
│
├── apis/                         # 对外API
│   ├── __init__.py
│   ├── doe_api.py                # run_doe_batch() (异步版本)
│   └── adaptive_api.py           # run_adaptive_points()
│
├── nx_integration/               # NX集成模块
│   ├── __init__.py
│   ├── nx_client_async.py        # 异步批量导出客户端(Socket + 连接池)
│   ├── nx_client.py              # 同步批量导出客户端(兼容版本)
│   ├── nx_service.py             # NX服务端(IronPython,在NX中运行)
│   ├── nx_cache_manager.py       # 客户端缓存管理器
│   ├── start_nx_service.bat      # 启动NX服务的批处理
│   ├── cache/                    # 缓存目录
│   │   └── nx_failures_port_9999.csv  # 失败缓存文件(按端口分离)
│   ├── test_params.py            # 参数传递测试脚本
│   └── test_params.bat           # 参数传递测试批处理
│
├── mechanical/                   # Mechanical仿真模块
│   ├── __init__.py
│   ├── simulator.py              # 并行仿真 run_batch_simulation()
│   ├── worker.py                 # 工作进程管理
│   └── simulation_cache.csv      # 仿真缓存文件
│
├── discovery/                    # Discovery容积计算模块
│   ├── __init__.py
│   └── simulator.py              # 容积计算 run_batch_volume_calculation()
│
├── sampling/                     # 采样与优化策略
│   ├── __init__.py
│   ├── lhs_sampler.py            # 拉丁超立方采样
│   ├── adaptive_strategies.py    # 加点策略(LHS最大最小距离等)
│   ├── saea_optimizer.py         # SAEA优化器(NSGA2 + EHVI)
│   ├── surrogate_training.py     # 代理模型训练(高斯过程)
│   └── variable_utils.py         # 变量辅助函数
│
├── utils/                        # 通用工具
│   ├── __init__.py
│   ├── logger.py                 # 统一日志配置
│   ├── file_utils.py             # 目录/文件操作
│   └── validation.py             # 变量校验(如检查NX表达式是否存在)
│
├── data/                         # 运行时数据(自动创建)
│   ├── step_files/               # NX导出的STEP文件
│   ├── results.csv               # 所有仿真结果汇总
│   ├── results_doe.csv           # DOE阶段结果
│   ├── design_points.csv         # 设计点存档
│   ├── simulation_failed.csv     # 仿真失败缓存
│   ├── history_iterations.csv    # 迭代历史记录
│   ├── lhs_all_points.csv        # 所有LHS采样点
│   ├── lhs_feasible_points.csv   # 可行LHS采样点
│   ├── lhs_pareto_front.csv      # LHS帕累托前沿
│   ├── pareto_comparison.csv     # 帕累托前沿对比
│   └── saea_infill_points.csv    # SAEA加点记录
│
└── logs/                         # 日志目录
    ├── main.log
    ├── nx_client.log
    └── mechanical.log

🔧 环境要求

  • 操作系统:Windows(因为NX和ANSYS仅支持Windows)
  • NX:Siemens NX 12.0 或更高版本(需包含NXOpen Python API)
  • ANSYS Mechanical:2021 R2 或更高版本(需授权)
  • ANSYS Discovery:2023 R1 或更高版本(可选,用于容积计算)
  • Python:3.8~3.10(推荐3.9)
  • Python 包:见 requirements.txt

📦 安装步骤

1. 克隆或创建项目文件夹

git clone <your-repo-url> AutoSimProject
cd AutoSimProject

2. 创建虚拟环境(推荐)

python -m venv venv
venv\Scripts\activate

3. 安装依赖

pip install -r requirements.txt

4. 配置 ANSYS Mechanical 路径

  • 打开 config.py,设置 ANSYS_EXE_PATH 为你的 AnsysWBU.exe 实际路径。
    ANSYS_EXE_PATH = r"F:/RUANJIAN/ANSYS Inc/v251/aisol/bin/winx64/AnsysWBU.exe"

5. 准备 NX 参数化模板

  • 在 NX 中创建一个部件,建立 config.DESIGN_VARS 中变量名完全一致 的表达式。
  • 将该部件保存为固定路径,并修改 config.py 中的 NX_TEMPLATE_PATH 变量。
  • 重要:为需要计算容积的模型设置颜色标识:
    • 封口面:RGB (246, 160, 104)
    • 底面:RGB (255, 102, 0)

6. 配置 NX 服务

  • 系统会自动检测 NX 安装路径,也可手动配置 NX_JOURNAL_PATH
  • 默认配置:常驻实例端口 9999,临时实例从 10000 开始分配。
  • 可在 config.py 中调整 NX_TOTAL_WORKERS 等参数。

7. 启动 NX 常驻服务(可选)

  • 双击 nx_integration/start_nx_service.bat 启动常驻服务(端口 9999)。
  • 或者让系统自动按需启动实例。

8. 配置 Discovery(可选)

  • 如果需要容积计算功能,确保已安装ANSYS Discovery。
  • config.py 中设置 DISCOVERY_ENABLED = True
  • 可调整 DISCOVERY_WORKERS 控制并行实例数。

🚀 快速开始

运行完整优化循环(DOE + SAEA优化)

python main.py

该脚本将自动:

  1. 根据 config.py 中的变量范围生成初始LHS样本。
  2. 通过异步多实例NX服务批量导出 STEP 文件。
  3. (可选)使用Discovery批量计算容积。
  4. 启动多个 Mechanical 实例并行仿真。
  5. 训练高斯过程代理模型。
  6. 使用NSGA2算法进行多目标优化。
  7. 基于EHVI/dHV策略智能加点。
  8. 重复步骤2-7,完成多轮迭代优化。
  9. 生成可视化分析图表。

仅运行初始 DOE(不优化)

from apis.doe_api import run_doe_batch

df = run_doe_batch(n_samples=100)
print(df.head())

使用Discovery计算容积

from discovery.simulator import run_batch_volume_calculation, init_pool, shutdown_pool
import glob

# 初始化Discovery池
init_pool(n_workers=2, hidden=False)  # hidden=False显示窗口

# 获取STEP文件列表
step_files = glob.glob("data/step_files/*.step")

# 批量计算容积
results = run_batch_volume_calculation(step_files)

# 输出结果
for result in results:
    if result["success"]:
        print(f"{result['step_path']}: {result['volume_mm3']:.2f} mm³")

# 关闭Discovery池
shutdown_pool()

使用SAEA优化器进行多目标优化

import pandas as pd
from sampling.saea_optimizer import nsga2_optimize, select_new_points
from sampling.surrogate_training import SurrogateModel

# 加载已有数据
existing_data = pd.read_csv("data/results.csv")

# 训练代理模型
model = SurrogateModel()
model.fit(existing_data)

# NSGA2优化
pareto_points = nsga2_optimize(model, n_generations=100)

# 智能加点
new_points = select_new_points(model, pareto_points, strategy='ehvi', n_points=10)

⚙️ 核心配置说明 (config.py)

设计变量配置

变量名 说明
DESIGN_VARS 设计变量字典,键为变量名(与NX表达式一致),值为 (min, max, unit) 元组。

NX 服务配置

变量名 说明
NX_HOST NX 服务地址(默认 localhost)。
NX_PORT 默认端口(9999,常驻实例)。
NX_TOTAL_WORKERS 总NX服务数量(包括固定端口9999)。
NX_START_PORT 起始端口(默认 9999)。
NX_CONNECT_TIMEOUT 连接超时(秒)。
NX_RECV_TIMEOUT 接收超时(秒)。
NX_DEFAULT_BATCH_SIZE 默认批次大小。

ANSYS 配置

变量名 说明
ANSYS_EXE_PATH Mechanical 可执行文件路径。
MECHANICAL_WORKERS 并行 Mechanical 实例数(不超过许可证数量)。

Discovery 配置

变量名 说明
DISCOVERY_ENABLED 是否启用Discovery容积计算。
DISCOVERY_WORKERS 并行Discovery实例数(建议2个)。
DISCOVERY_TRANSPORT_MODE 传输模式(默认"insecure")。
DISCOVERY_HIDDEN 窗口显示模式:False=显示,True=隐藏。

采样与优化配置

变量名 说明
DOE_SAMPLES 初始拉丁超立方样本数。
ADAPTIVE_POINTS_PER_ITER 每轮加点数量。
ADAPTIVE_MAX_ITER 最大加点轮数。
INFILL_STRATEGY 加点策略:'dhv'(超体积增量)或 'ehvi'(期望超体积增量)。
STRESS_LIMIT_MULTIPLIER 应力约束上限系数。

📡 NX 通信协议(统一报文)

请求格式(主控 → NX)

{
  "type": "batch_doe",
  "task_id": "20250506_001",
  "export_root": "D:/sim_models/doe_batch/",
  "file_type": "step",
  "params_list": [
    {"rib_h": 12.0, "rib_w": 2.5, ...},
    ...
  ]
}

响应格式(NX → 主控)

{
  "task_id": "20250506_001",
  "global_status": "success",
  "code": 0,
  "msg": "",
  "detail": [
    {"idx": 0, "params": {...}, "status": "success", "model_path": "...", "error_msg": ""},
    ...
  ]
}

🔄 异步多实例架构

实例管理

  • 常驻实例:端口 9999,任务结束后保持运行,下次任务快速响应。
  • 临时实例:端口 10000+,任务开始时启动,任务结束后自动关闭。

连接池策略

  • 采用 LRU(Least Recently Used)负载均衡策略。
  • 自动检测实例可用性,按需启动临时实例。
  • 支持连接超时、重试机制和错误处理。

任务队列

  • 基于 asyncio.Queue 实现动态任务分配。
  • 工作协程从队列获取任务,自动处理失败重试。
  • 确保任务按原始顺序处理,保持文件命名一致性。

缓存管理

  • 客户端实现失败缓存管理(nx_cache_manager.py)。
  • 按端口分离缓存文件,避免多实例冲突。
  • 自动去重,避免重复处理失败任务。

📦 Discovery 容积计算

功能特点

  • 颜色识别:通过RGB颜色自动识别封口面和底面。
  • 容积提取:使用VolumeExtract功能计算封闭腔体容积。
  • 并行处理:支持多实例并行计算,提高效率。
  • 灵活配置:支持显示/隐藏窗口模式。

颜色标识要求

在NX建模时,需要为特定面设置颜色:

  • 封口面:RGB (246, 160, 104) - 橙色
  • 底面:RGB (255, 102, 0) - 深橙色

使用示例

from discovery.simulator import init_pool, run_batch_volume_calculation, shutdown_pool

# 初始化(显示窗口,便于调试)
init_pool(n_workers=2, hidden=False)

# 批量计算
step_files = ["path/to/model1.step", "path/to/model2.step"]
results = run_batch_volume_calculation(step_files)

# 查看结果
for r in results:
    if r["success"]:
        print(f"容积: {r['volume_mm3']:.2f} mm³")

# 关闭池
shutdown_pool()

性能优化

  • 建议使用2个Discovery实例并行处理
  • 隐藏窗口模式(hidden=True)可提升性能
  • 确保STEP文件路径正确且可访问

🤖 SAEA 代理模型优化

高斯过程代理模型

  • 基于GPyTorch实现的高斯过程回归模型。
  • 支持多目标预测和不确定性估计。
  • 自动超参数优化,确保模型精度。

NSGA2 多目标优化

  • 基于pymoo库实现的NSGA-II算法。
  • 支持任意数量目标函数优化。
  • 自动生成帕累托前沿解集。

智能加点策略

  • EHVI(Expected Hypervolume Improvement):考虑预测不确定性的期望超体积增量。
  • dHV(direct Hypervolume Improvement):直接超体积增量策略。
  • 自动平衡探索与利用,提高优化效率。

🧪 扩展与自定义

1. 添加新设计变量

  • config.pyDESIGN_VARS 中添加新条目。
  • 在 NX 模板部件中创建同名的表达式,并关联到几何特征。
  • 运行代码即可,其他模块自动适配。

2. 自定义加点策略

  • sampling/saea_optimizer.py 中实现新的加点函数。
  • 支持基于代理模型预测的各种策略。

3. 修改求解类型(如模态分析、热分析)

  • 编辑 mechanical/simulator.py 中的 IronPython 脚本。
  • 替换结果提取函数以获取所需物理量。

4. 调整并行策略

  • 修改 config.py 中的 NX_TOTAL_WORKERSMECHANICAL_WORKERSDISCOVERY_WORKERS
  • 调整 NX_DEFAULT_BATCH_SIZE 优化批次处理效率。

5. 自定义可视化

  • 修改 main.py 中的matplotlib配置。
  • 添加自定义图表和分析功能。

6. 自定义Discovery颜色识别

  • 编辑 discovery/simulator.py 中的 DISCOVERY_VOLUME_SCRIPT
  • 修改 SEAL_RGBBOTTOM_RGB 常量以匹配你的颜色标识。

🐛 常见问题

Q: NX 服务启动后,客户端连接超时?
A: 检查防火墙是否允许相应端口;确认 config.py 中的 NX_HOST 与服务器实际IP一致(本地用 localhost)。

Q: Mechanical 抛出 "No valid licenses available"
A: 减少 MECHANICAL_WORKERS 数值,或确认你的许可证支持并行多个实例。

Q: Discovery 容积计算失败?
A: 检查STEP文件中是否正确设置了封口面和底面的颜色;确认颜色RGB值是否为 (246, 160, 104) 和 (255, 102, 0)。

Q: 部分样本仿真失败,但整体流程继续运行?
A: 每个样本的异常会被捕获并记录日志,主控不会中断。失败样本会被记录到缓存中,避免重复处理。

Q: 如何从已有 CSV 恢复未完成的批次?
A: 系统会自动检查失败缓存,跳过已标记失败的任务。可以手动编辑 nx_integration/cache/nx_failures_port_*.csv 来管理失败任务列表。

Q: 多实例NX会导致文件名冲突吗?
A: 不会。系统使用确定性命名策略,基于原始任务索引生成文件名,确保串行和并行执行结果一致。

Q: 如何查看NX实例运行状态?
A: 每个NX实例都有独立的CMD窗口,显示实时日志。常驻实例(端口9999)保持运行,临时实例在任务结束后自动关闭。

Q: 代理模型训练需要多少数据?
A: 建议至少有50-100个样本点才能训练出可靠的代理模型。数据越多,模型精度越高。

Q: EHVI和dHV策略有什么区别?
A: EHVI考虑预测不确定性,更适合探索阶段;dHV直接优化超体积,更适合利用阶段。可以根据优化阶段选择合适策略。

Q: Discovery计算容积的精度如何?
A: Discovery基于几何体积提取,精度取决于STEP模型的几何质量。建议在NX中确保模型封闭且无几何错误。

Q: 如何提高Discovery计算速度?
A: 使用隐藏窗口模式(hidden=True),适当增加并行实例数(建议不超过2个),确保STEP文件在本地磁盘上。

📄 许可证

本项目仅供内部研究和学习使用。涉及的商业软件(NX、ANSYS)请遵循各自授权协议。

🤝 贡献与支持

如有问题或改进建议,请在项目中提交 Issue 或联系维护者。


愿你的优化循环永不中断! 🚀

About

OMRDS

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages