CPLEX for循环添加tuple索引约束报类型无法索引错误如何解决
报错原因
type <int, int, int > cannot be used with indexation 报错由两个核心问题直接导致:
- 元组字段类型不匹配:定义
arcAndsegment对应的combinaison元组时,三个字段都声明为int类型,但生成集合时第二个位置传入的是arc集合的元素——arc本身是edge结构的元组,不是整数,后续用三个int组成的<i,j,k>做索引时,和元组实际字段类型完全不匹配。 - 索引值非法:初始容量约束里写的
<0,j,k>中0不在segmentset的1..12范围内,递推式里当i取分段最小值1时,i-1=0同样超出分段范围,且j是edge类型元组不是int,无法对应元组的int字段要求。
修正方案
- 先修正
arcAndsegment的元组定义,匹配实际存入的元素类型:
// 元组三个字段分别对应:分段ID、弧元素、车辆ID tuple combinaison{int seg; edge arc; int veh;} setof (combinaison) arcAndsegment={<a,b,c>| a in segmentset, b in arc ,c in Numofvehicles };
- 重写电池相关约束,避免硬编码索引导致的不匹配、越界问题:
subject to { forall ( u in arc,j in segmentset) y[u][j]>=z[u][j]; // 首段初始电池容量约束 forall (item in arcAndsegment: item.seg == 1) startBatteryCapacity: BatteryCapacity[item] == Imax; // 相邻分段电池递推约束,从第2段开始计算 forall (curr in arcAndsegment: curr.seg > 1) { // 匹配同弧、同车辆的上一个分段元组 combinaison prevSeg = first({x | x in arcAndsegment : x.seg == curr.seg-1 && x.arc == curr.arc && x.veh == curr.veh}); BatteryCapacity[curr] == remainingBatteryCapacity[prevSeg] + AddedCapacity[curr] - EnergyConsumption[curr]; } }
- 补充说明:当前代码中
remainingBatteryCapacity、AddedCapacity、EnergyConsumption三个数组仅做了声明,没有补充对应的赋值或约束逻辑,后续需要补全这部分内容才能正常运行模型。
内容的提问来源于stack exchange,提问作者E.sop
相关产品推荐
相关产品推荐

