Q:AMPL语法错误:如何在变量定义中写公式
Posted
技术标签:
【中文标题】Q:AMPL语法错误:如何在变量定义中写公式【英文标题】:Q:AMPL syntax error:How to write a formula in the definition of a variable 【发布时间】:2021-12-25 15:52:10 【问题描述】:我是AMPL的超级新手,我的优化是最小化I(干扰功率)和最大化P(信号功率),同时观察rita(数据速率),因为数据的方程是非线性的,所以我没有放在约束里,因为我必须用cplex来解决,所以我把它放在rita的定义里,但是我的代码有错误,它显示:syntax error in "context: >>>
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_bM;
param y_bM;
param R1i in M, t in K =
sqrt((x_b[i] - x_k[t])^2 + (y_b[i]-y_k[t])^2);
param gmki in M, t in K =
103.8 + 20.9 *log10(R1[i,t]/1000);
param R2i in K, t in K =
sqrt((x_k[i] - x_k[t])^2 + (y_k[i]-y_k[t])^2);
param gjkj 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 R4i in M, t in M =
sqrt((x_b[i] - x_b[t])^2 + (y_b[i]-y_b[t])^2);
param gnmi in M, t in M:i<>t =
40*log10(R4[i,t]/1000) + 169.36;
var betaM,D;
var pK,D,M;
var IK,D,M;
var ritak in K, d in D,m in M =
k in K, d in D,m in Mp[k,d,m] * gmk[m,k] /(k in K, d in D,m in MI[k,d,m] + rou);
minimize total: (sumk in K, d in D,m in M I[k,d,m]) - (sum m in M,k in K, d in Dp[k,d,m]) ;
subject to C1: sumk in K, d in D,m in M p[k,d,m] <= Pmax;
subject to C2k in K,d in D,m in M: p[k,d,m] >= 0;
subject to C3k in K, d in D,m in M: rita[k,d,m] >= rmin;
subject to C4d in D,m in M: sumk in K p[k,d,m] >= beta[m,d];
subject to C5d in D,m in M: sumk in K p[k,d,m] <= 1000 * beta[m,d];
subject to C6m in M: sumd in D beta[m,d] = 1;
subject to cal1k in K, m in M: I[k,1,m] = sumj in K p[j,1,m] * gmk[m,j] + sumj in K:j<>k p[j,2,m] * gjk[j,k];
subject to cal2k in K, m in M,n in M:m<>n: I[k,2,m] = sumj in K p[j,2,m] * gmk[m,j] + sumj in K p[j,1,m] * gnm[n,m];
【问题讨论】:
【参考方案1】:rita
变量集合的声明不正确。第一部分,用var ritak in K, d in D,m in M
声明集合,没问题。这表示您有一个索引了所有三元组 (k,d,m) 的 3D 变量集合。
但是,等号右侧的定义表达式不是有效的 AMPL 语法。我不知道您要实现什么数学表达式,但是表达式中出现的两次 k in K, d in D,m in M
在 AMPL 中没有任何意义。那是一个索引表达式,但有什么用呢?您没有 sum
、prod
或任何需要该索引表达式的东西。
也许你只需要删除这个索引表达式,从而得到这个声明语句:
var ritak in K, d in D,m in M = p[k,d,m] * gmk[m,k] / (I[k,d,m] + rou);
不过话说回来,我不知道你要实现什么表达式。
如果您是 AMPL 的新手,我建议您阅读一些介绍性材料,例如我写的 https://pifop.com/help/ampl_programs.html。
【讨论】:
以上是关于Q:AMPL语法错误:如何在变量定义中写公式的主要内容,如果未能解决你的问题,请参考以下文章