AMPL实现学术论文优化模型运行时年份相关约束异常问题求助
问题定位
你代码的运行异常主要来自三类核心的索引匹配错误:
1. 年份集T的滞后索引错误
你定义的T是字符串型集合:set T := Year1 Year2 Year3 Year4 Year5;,但在多个约束中直接使用t-1获取上一年的索引,AMPL无法对字符串值做减法运算,且没有为第一年(Year1)定义前置状态,涉及的约束包括c3、c4、c7、c8、c91、c92、c10、c11、c12。
修复方案
- 将T改为有序数值集合:
set T := 1 2 3 4 5;,同步修改参数D的列名即可 - 给所有带
t-1的约束加上范围限制,仅对t≥2生效,示例如下:
subject to c3{q in Q , t in T: t >= 2}: n[q, t]= n[q, t-1] + sum {r in R} a[r, q, t-1] + N[q, t] - sum {r in R} a[q, r, t-1];
- 单独定义t=1时的初始状态约束,比如初始库存
n[q,1]、m[q,1]的取值,以及t=1时所有前置状态(如X[o,q,j,0])的默认值(通常设为0)
2. 集合O的索引值不匹配错误
你定义的集合O成员为字符串:set O := Treat1 Treat2 Treat3 Treat4 Treat5;,但多个约束中直接用数字1、2、3、4、5作为O的索引,无法匹配,涉及的约束包括c12、c13、c14、c16、c17。
修复方案
把所有数字索引替换为对应的字符串值即可,示例如下:
subject to c12{q in Q , t in T , j in J}: X['Treat3', q, j, t]- X['Treat3', q, j, t-1]<= Y[q, t];
其他约束对应把1改为'Treat1'、2改为'Treat2'、4改为'Treat4'、5改为'Treat5'即可。
3. 集合J的索引值不匹配错误
你定义的集合J成员为字符串:set J := Dewater1 Dewater2 Dewater3;,但多个约束中直接用数字1、2、3作为J的索引,无法匹配,涉及的约束包括c6、c91、c92、c17。
修复方案
把对应位置的数字替换为J的字符串值即可:1改为'Dewater1'、2改为'Dewater2'、3改为'Dewater3'。
额外注意事项
约束c15X[o, q, 1, t]<= M * (w-1)存在逻辑缺陷:w是二进制变量,取值为0或1,当w=1时右侧为0,会强制所有X[o,q,1,t]为0;当w=0时右侧为负数,而X是0-1变量,约束永远不成立,会导致模型无解,建议核对原始论文的约束逻辑修正。
内容的提问来源于stack exchange,提问作者SHAHROKH

