如何解决AMPL代码中的语法与声明错误(含‘j未定义’问题)
AMPL代码错误排查与解决
核心错误修复
你遇到的j is not defined错误,根源是目标函数中最后一项Cj[j] * Xj[j]脱离了sum{j in J}的迭代范围,AMPL无法识别未绑定的索引j。
原错误代码:
maximize profit: sum{j in J} Pj[j] * Xj[j] - sum{j in J} Kj[j] * DELTAj[j] + Cj[j] * Xj[j] ;
修正后的目标函数(将所有涉及j的项纳入求和循环):
maximize profit: sum{j in J} (Pj[j] * Xj[j] - Kj[j] * DELTAj[j] + Cj[j] * Xj[j]);
也可以合并同类项简化写法(逻辑等价):
maximize profit: sum{j in J} (Pj[j] + Cj[j]) * Xj[j] - sum{j in J} Kj[j] * DELTAj[j];
其他潜在错误排查
结合你的代码文件,还需要确认以下几点:
.mod文件中必须正确定义集合J,以及关联的参数、变量:set J; # 定义项目/产品集合 param Cj{J}; # 单位成本参数 param Pj{J}; # 单位利润参数 param Kj{J}; # 固定成本参数 var Xj{J} >= 0; # 产量决策变量 var DELTAj{J} binary; # 0-1选择变量.dat文件中要为集合J和所有参数提供合法数据,示例格式:set J := 1 2 3; param Cj := 1 5 2 3 3 4; param Pj := 1 10 2 8 3 12; param Kj := 1 20 2 15 3 25;.run文件的命令顺序要正确:model your_model.mod; data your_data.dat; solve; display Xj, DELTAj, profit;
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

