C-PLEX编程中‘Type range cannot be used for int’错误的排查与解决
解决CPLEX中‘Type range cannot be used for int’错误
错误原因
这个错误源于决策变量pbatch的类型与约束右侧表达式的类型不匹配:
如果pbatch被定义为整数类型(int或integer),但约束中(0.7-soc[k][j])*100000的计算结果是浮点数(比如soc[k][j]为非整小数时,结果会带有小数部分),CPLEX无法将连续范围的浮点数赋值给整数变量,从而抛出类型错误。
具体修复方案
方案1:修改pbatch的变量类型
如果pbatch不需要是整数,将其定义为连续型变量:
dvar float pbatch[tavail][nport]; // 也可根据需求添加范围限制 dvar float pbatch[tavail][nport] >= 0;
方案2:将右侧表达式转换为整数
如果pbatch必须是整数,根据业务需求对右侧浮点数结果取整:
- 向下取整:
forall(i in nbus,j in tavail,k in nport) { ct3: if(soc[k][j]<=0.3 && pt[i][j]<pl[i][j]) { pbatch[j][k] - floor((0.7-soc[k][j])*100000) == 0; } else { pbatch[j][k] == 0; } }
- 向上取整:
forall(i in nbus,j in tavail,k in nport) { ct3: if(soc[k][j]<=0.3 && pt[i][j]<pl[i][j]) { pbatch[j][k] - ceil((0.7-soc[k][j])*100000) == 0; } else { pbatch[j][k] == 0; } }
- 四舍五入:
forall(i in nbus,j in tavail,k in nport) { ct3: if(soc[k][j]<=0.3 && pt[i][j]<pl[i][j]) { pbatch[j][k] - round((0.7-soc[k][j])*100000) == 0; } else { pbatch[j][k] == 0; } }
方案3:调整soc变量的计算逻辑
如果soc[k][j]是以百分比形式存储的整数(比如30代表0.3),可直接修改计算式避免浮点数:
// 假设soc[k][j]是0-100的整数 forall(i in nbus,j in tavail,k in nport) { ct3: if(soc[k][j]<=30 && pt[i][j]<pl[i][j]) { pbatch[j][k] - (70 - soc[k][j])*1000 == 0; } else { pbatch[j][k] == 0; } }
内容的提问来源于stack exchange,提问作者haripriya
相关产品推荐
相关产品推荐

