首页 > 解决方案 > Q:AMPL语法错误:如何在变量定义中写公式

问题描述

我是AMPL的超级新手,我的优化是最小化I(干扰功率)和最大化P(信号功率),同时观察rita(数据速率),因为数据的方程是非线性的,所以我没有把它放进去约束,因为我必须用cplex来解决,所以我把它放在rita的定义中,但是我的代码有错误,它显示:syntax error in "context: >>> { <<< k in K, d在 D,m in M}p[k,d,m] * gmk[m,k] /({k in K, d in D,m in M}I[k,d,m] + rou);" ,你能告诉我我应该怎么做来修改它吗?非常感谢!

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};
var rita{k in K, d in D,m in M} = 
{k in K, d in D,m in M}p[k,d,m] * gmk[m,k] /({k in K, d in D,m in M}I[k,d,m] + rou);

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;

subject to C3{k in K, d in D,m in M}: rita[k,d,m] >= rmin;

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];

subject to cal2{k in K, m in M,n in M:m<>n}: I[k,2,m] = sum{j in K} p[j,2,m] * gmk[m,j] + sum{j in K} p[j,1,m] * gnm[n,m];                                         

标签: algorithmoptimizationampl

解决方案


rita变量集合的声明不正确。第一部分,你用 声明集合var rita{k 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 rita{k 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 。


推荐阅读