【问题标题】:Problem with converting Tuple into 4D array in OPL在 OPL 中将元组转换为 4D 数组的问题
【发布时间】:2022-10-02 03:37:24
【问题描述】:

我正在使用 IBM Ilog Studio/OPL。

我想将一个元组转换为一个(4D)数组。 之前已经提出过类似的问题,但给定的答案在可能的情况下不起作用,我找不到原因。这里是链接。

How to represent and read 4D array in Opl Cplex from Excel

从 excel 中读取元组是有效的(我检查了“开始”是否正确读取)。 mod中的元组。文件定义为:

tuple mipstart { 
int  i;
int q;
int d;
int k;
int value; }


{mipstart} start =...;

int valuemip[I][Q][D][K]; 

execute
{
for(var x in start) valuemip[x.i][x.q][x.d][x.k]=x.value;
}

我得到的错误消息是“valuemip#0 超出了有效范围 (0)。”索引 (I,Q,D,K) 都被声明为以 1 开头的范围...... 换句话说,我正在尝试从元组开始构建 4D 数组 \"valuemip\"。

(更多信息:在 .dat 文件中,\"test\" 是命名数据空间 --> 有效)

start from SheetRead (sheet, \"test\");

我是使用元组的新手,以前主要使用 IBM Ilog Studio 的“基本学生”使用(在 mod 文件中编写模型(主要使用数组),并具有从 Excel 读取数据的相应 dat 文件)。

欢迎任何帮助。

  • 不要采取错误的方式,但经验表明将一组元组转换为 am 数组几乎总是倒退。如果您使用元组集而不是数组,大多数模型最终会变得更简单、更清晰。试试看 - 你可能会喜欢它。

标签: cplex opl


【解决方案1】:

我会从元组集中重新计算你的范围:

tuple mipstart { 
int  i;
int q;
int d;
int k;
int value; }


{mipstart} start ={<1,2,3,4,100>};

{int} I={e.i | e in start};
{int} Q={e.q | e in start};
{int} D={e.d | e in start};
{int} K={e.k | e in start};

int valuemip[I][Q][D][K]; 

execute
{
for(var x in start) valuemip[x.i][x.q][x.d][x.k]=x.value;
}

工作正常

【讨论】:

    【解决方案2】:

    如果元组成员为零并最终用作 valuemip 索引,则问题可能来自您的数据。

    【讨论】:

      猜你喜欢
      • 2019-11-07
      • 1970-01-01
      • 2018-10-07
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多