AMPL语法报错:定义变量rita时公式编写出现语法错误如何修复
问题原因与修复方案
1 语法错误根源
你定义rita变量时重复声明了索引域:var rita{k in K, d in D,m in M}已经明确了每个rita对应的索引,等号右侧不需要再加{k in K, d in D,m in M}遍历前缀,这是语法报错的直接原因。
另外你当前的写法仍然属于非线性分式表达,哪怕修复语法错误,CPLEX作为线性规划求解器也无法求解这类模型,需要做线性化处理。
2 核心修改点
- 删去非线性的
rita变量定义,将速率约束直接线性化:原约束rita[k,d,m] >= rmin等价于p[k,d,m] * gmk[m,k] >= rmin * (I[k,d,m] + rou)(分母是干扰+噪声,恒为正,不等号方向不变),转换后为线性约束,可直接被CPLEX求解。 - 修复
cal2约束的索引不匹配问题:原约束左侧I[k,2,m]没有n维度,右侧却出现了n in M的遍历索引,需要根据你的干扰物理模型调整,这里假设你是对所有非m的基站干扰求和,修改为对应求和格式。
修改后的完整代码
set M; set K; set D; param Pmax; param rmin; param rou; param x_k {s in K} :=Uniform (0, 1000); param y_k {s in K} :=Uniform (0, 1000); param x_b{M}; param y_b{M}; param R1{i in M, t in K} = sqrt((x_b[i] - x_k[t])^2 + (y_b[i]-y_k[t])^2); param gmk{i in M, t in K} = 103.8 + 20.9 *log10(R1[i,t]/1000); param R2{i in K, t in K} = sqrt((x_k[i] - x_k[t])^2 + (y_k[i]-y_k[t])^2); param gjk{j in K, k in K:j<>k} = if R2[j,k] <=50 then 98.45 + 20*log10(R2[j,k]/1000) else 55.28 + 40*log10(R2[j,k]); param R4{i in M, t in M} = sqrt((x_b[i] - x_b[t])^2 + (y_b[i]-y_b[t])^2); param gnm{i in M, t in M:i<>t} = 40*log10(R4[i,t]/1000) + 169.36; var beta{M,D}; var p{K,D,M}; var I{K,D,M}; minimize total: (sum{k in K, d in D,m in M} I[k,d,m]) - (sum {m in M,k in K, d in D}p[k,d,m]) ; subject to C1: sum{k in K, d in D,m in M} p[k,d,m] <= Pmax; subject to C2{k in K,d in D,m in M}: p[k,d,m] >= 0; # 替换原rita约束的线性化版本 subject to C3{k in K, d in D,m in M}: p[k,d,m] * gmk[m,k] >= rmin * (I[k,d,m] + rou); subject to C4{d in D,m in M}: sum{k in K} p[k,d,m] >= beta[m,d]; subject to C5{d in D,m in M}: sum{k in K} p[k,d,m] <= 1000 * beta[m,d]; subject to C6{m in M}: sum{d in D} beta[m,d] = 1; subject to cal1{k in K, m in M}: I[k,1,m] = sum{j in K} p[j,1,m] * gmk[m,j] + sum{j in K:j<>k} p[j,2,m] * gjk[j,k]; # 修复索引不匹配问题,对所有非m基站的干扰求和 subject to cal2{k in K, m in M}: I[k,2,m] = sum{j in K} p[j,2,m] * gmk[m,j] + sum{j in K, n in M:n<>m} p[j,1,m] * gnm[n,m];
内容的提问来源于stack exchange,提问作者JING YANG
相关产品推荐
相关产品推荐

