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 中没有任何意义。那是一个索引表达式,但有什么用呢?您没有 sumprod 或任何需要该索引表达式的东西。

也许你只需要删除这个索引表达式,从而得到这个声明语句:

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语法错误:如何在变量定义中写公式的主要内容,如果未能解决你的问题,请参考以下文章

在Markdown中写公式块

Markdown语法(简书中加入数学公式)

终端上的Typescript变量语法错误

异常处理

layui 和 require 语法怎么兼容

go基础语法