无简化将AMPL .mod文件转换为.nl文件的问题咨询
问题解答
1. 关于模型简化的猜测是否正确?
正确。AMPL在将.mod转换为.nl文件的过程中,默认会执行一系列等价模型简化操作,包括线性定义变量的代入替换、冗余约束消除、常数项化简等。这些操作的核心是在不改变问题可行解集合和最优解的前提下,简化模型结构,方便后续处理。
2. 能否信任.nl文件与原模型等价?
完全可以信任。AMPL的内置简化逻辑经过严格验证,所有变换均为等价变换——简化后的模型与原模型在可行解、最优解的集合以及最优目标值上完全一致,不会改变问题的本质。
3. 如何避免此类简化?
你尝试的-P(关闭presolve)和-L0(将线性定义约束视为非线性)未解决问题,是因为还有其他层级的简化机制在起作用。需要同时设置多个选项来彻底关闭所有简化:
方法一:在.mod文件中添加配置
在hs041.mod最顶部加入以下选项:
option presolve 0; # 关闭预设预处理简化 option substitute 0; # 禁止将线性定义变量代入其他约束/目标 option skip_initial_checks 1; # 跳过初始约束冗余检查与变量替换 option linearize 0; # 关闭自动线性化转换
方法二:结合命令行参数执行
添加上述配置后,执行以下命令生成.nl文件:
ampl -P -L0 -ohs041 hs041.mod
关键说明
你的模型中constr1是x[4]的线性定义式,AMPL默认会自动将x[4]替换为x[1]+2*x[2]+2*x[3]并代入其他约束,这是导致模型大幅简化的核心原因。option substitute 0是阻止这种变量替换的关键设置,也是你之前缺失的选项。
内容的提问来源于stack exchange,提问作者Scacco Matto
相关产品推荐
相关产品推荐

