基于 拉丁超立方采样(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
git clone <your-repo-url> AutoSimProject
cd AutoSimProjectpython -m venv venv
venv\Scripts\activatepip install -r requirements.txt- 打开
config.py,设置ANSYS_EXE_PATH为你的AnsysWBU.exe实际路径。ANSYS_EXE_PATH = r"F:/RUANJIAN/ANSYS Inc/v251/aisol/bin/winx64/AnsysWBU.exe"
- 在 NX 中创建一个部件,建立 与
config.DESIGN_VARS中变量名完全一致 的表达式。 - 将该部件保存为固定路径,并修改
config.py中的NX_TEMPLATE_PATH变量。 - 重要:为需要计算容积的模型设置颜色标识:
- 封口面:RGB (246, 160, 104)
- 底面:RGB (255, 102, 0)
- 系统会自动检测 NX 安装路径,也可手动配置
NX_JOURNAL_PATH。 - 默认配置:常驻实例端口 9999,临时实例从 10000 开始分配。
- 可在
config.py中调整NX_TOTAL_WORKERS等参数。
- 双击
nx_integration/start_nx_service.bat启动常驻服务(端口 9999)。 - 或者让系统自动按需启动实例。
- 如果需要容积计算功能,确保已安装ANSYS Discovery。
- 在
config.py中设置DISCOVERY_ENABLED = True。 - 可调整
DISCOVERY_WORKERS控制并行实例数。
python main.py该脚本将自动:
- 根据
config.py中的变量范围生成初始LHS样本。 - 通过异步多实例NX服务批量导出 STEP 文件。
- (可选)使用Discovery批量计算容积。
- 启动多个 Mechanical 实例并行仿真。
- 训练高斯过程代理模型。
- 使用NSGA2算法进行多目标优化。
- 基于EHVI/dHV策略智能加点。
- 重复步骤2-7,完成多轮迭代优化。
- 生成可视化分析图表。
from apis.doe_api import run_doe_batch
df = run_doe_batch(n_samples=100)
print(df.head())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()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)| 变量名 | 说明 |
|---|---|
DESIGN_VARS |
设计变量字典,键为变量名(与NX表达式一致),值为 (min, max, unit) 元组。 |
| 变量名 | 说明 |
|---|---|
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_EXE_PATH |
Mechanical 可执行文件路径。 |
MECHANICAL_WORKERS |
并行 Mechanical 实例数(不超过许可证数量)。 |
| 变量名 | 说明 |
|---|---|
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 |
应力约束上限系数。 |
{
"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, ...},
...
]
}{
"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)。 - 按端口分离缓存文件,避免多实例冲突。
- 自动去重,避免重复处理失败任务。
- 颜色识别:通过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文件路径正确且可访问
- 基于GPyTorch实现的高斯过程回归模型。
- 支持多目标预测和不确定性估计。
- 自动超参数优化,确保模型精度。
- 基于pymoo库实现的NSGA-II算法。
- 支持任意数量目标函数优化。
- 自动生成帕累托前沿解集。
- EHVI(Expected Hypervolume Improvement):考虑预测不确定性的期望超体积增量。
- dHV(direct Hypervolume Improvement):直接超体积增量策略。
- 自动平衡探索与利用,提高优化效率。
- 在
config.py的DESIGN_VARS中添加新条目。 - 在 NX 模板部件中创建同名的表达式,并关联到几何特征。
- 运行代码即可,其他模块自动适配。
- 在
sampling/saea_optimizer.py中实现新的加点函数。 - 支持基于代理模型预测的各种策略。
- 编辑
mechanical/simulator.py中的 IronPython 脚本。 - 替换结果提取函数以获取所需物理量。
- 修改
config.py中的NX_TOTAL_WORKERS、MECHANICAL_WORKERS和DISCOVERY_WORKERS。 - 调整
NX_DEFAULT_BATCH_SIZE优化批次处理效率。
- 修改
main.py中的matplotlib配置。 - 添加自定义图表和分析功能。
- 编辑
discovery/simulator.py中的DISCOVERY_VOLUME_SCRIPT。 - 修改
SEAL_RGB和BOTTOM_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 或联系维护者。
愿你的优化循环永不中断! 🚀