集成pevch与pevdis方程后CPLEX无解决方案技术求助
问题描述
在集成pevch[i][j](电动汽车充电功率)和pevdis[i][j](电动汽车放电功率)的约束方程后,CPLEX未输出任何解决方案。以下是对应的OPL代码:
int t=24; int n=10; int j=0; range number =1..n; // 电动汽车编号范围 range tavail=1..t; // 时段范围(1-24) float soc[number][tavail]=...; // 各时段每辆电动汽车的SOC(荷电状态),未初始化 // 24个时段的预测负荷 float pl[tavail]=[10000000,7000000,9000000,6000000,12000000,6000000,4000000,15000000,9000000,12000000,6000000,8000000,10000000,7000000,9000000,6000000,12000000,6000000,4000000,15000000,9000000,12000000,6000000,8000000]; // 24个时段的发电量 float pg[tavail]=[10000000,9500000,8500000,11000000,600000,7500000,10000000,9500000,8500000,11000000,600000,7500000,10000000,9500000,8500000,11000000,600000,7500000,10000000,9500000,8500000,11000000,600000,7500000]; // 24个时段的目标负荷 float pt[tavail]=[10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000,10000000]; // 24个时段的母线电压 float v[tavail]=[240,232,229,233,230,235,228,234,227,229,231,230,226,232,233,230,236,233,231,232,232,233,233,230]; // 24个时段的目标母线电压 float vt[tavail]=[230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230]; // 电动汽车充电功率决策变量(范围0-100000) dvar float pevch[tavail][number] in 0..100000; // 电动汽车放电功率决策变量(范围0-100000) dvar float pevdis[tavail][number] in 0..100000; // 目标函数 minimize sum(i in tavail)((pt[i]-pl[i])-sum(j in number)pevch[i][j]+sum(j in number)pevdis[i][j]); subject to forall(i in tavail,j in number) if(pt[i]-pl[i]<0 && soc[j][i]>0.7&& v[i]<vt[i]) pevch[i][j]==(0.9-soc[j][i])*100000/(24-i); else pevdis[i][j]==0; forall(i in tavail,j in number) if(pt[i]-pl[i]>0 && soc[j][i]<=0.7 && v[i]>vt[i]) pevch[i][j]==(0.7-soc[j][i])*100000/(24-i); else pevch[i][j]==0; // 原代码末尾多余的}已移除
导致无可行解的常见原因及修正方向
- 约束冲突:两个
forall约束对pevch[i][j]的赋值可能存在重叠场景。比如某个时段i和车辆j同时满足两个if的条件,此时pevch会被要求等于两个不同值,直接导致模型不可行。需重新梳理逻辑,确保各条件互斥,或调整约束优先级。 - 目标函数语法错误:原目标函数中
sum(j in number)-pevch[i][j]的写法逻辑错误,应改为-sum(j in number)pevch[i][j],否则会引发计算混乱,甚至模型解析失败。 - 放电变量约束缺失:当前仅强制
pevdis[i][j]==0的场景,未定义pevdis可取值的条件,导致pevdis始终为0,既失去决策意义,也可能让目标函数无法达到优化空间。 - SOC未初始化:
soc[number][tavail]=...未给出具体数值,若实际SOC值不满足约束中的阈值条件(如soc[j][i]>0.7或<=0.7均不成立),会导致所有pevch和pevdis被强制为0,或引发约束矛盾。 - 除以零风险:当
i=24时,24-i=0,约束中的计算式会出现除以零错误,需单独处理i=24的特殊情况(比如限制该时段不进行充放电操作)。 - 语法错误:原代码末尾多余的
}属于语法错误,会导致OPL编译失败,直接无法运行求解。
内容的提问来源于stack exchange,提问作者Haripriya M R
相关产品推荐
相关产品推荐

