You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CPLEX OPL有序对建模正确性咨询:索引i复用是否合规

CPLEX建模正确性验证

我正尝试在CPLEX中完成建模,以下是我的代码实现,想确认模型是否正确,尤其不确定索引“i”的多次使用是否合规:

tuple _IU_ {
  int i;
  int t;
};
{_IU_} IU = {<1, 1>, <1, 2>,
             <2, 1>, <2, 2>};

tuple _IC_ {
  int i;
  int c;
};
{_IC_} IC = {<1, 1>, <1, 2>, <1, 3>, <1, 4>};

int NT = 31;

dvar float+ FCTU[1..NI, 1..NU, 1..NC, 1..NT];
dvar float+ FTU[1..NI, 1..NU, 1..NT];

subject to {
 sixteen: forall(<i, u> in IU, t in 1..NT) FTU[i, u, t] == sum(<i, c> in IC) FCTU[i, u, c, t];
};

问题分析与修正建议

  1. 未定义变量报错
    代码中NI、NU、NC三个变量未声明直接使用,会导致编译错误,需补充定义,例如:

    int NI = 2; // 对应IU中i的取值范围
    int NU = 2; // 对应IU中u的取值范围
    int NC = 4; // 对应IC中c的取值范围
    
  2. 索引“i”重复使用的逻辑错误
    约束sixteen中,外层forall的<i, u> in IU里的i,和内层sum(<i, c> in IC)里的i存在变量遮蔽问题:内层的i会覆盖外层的i,导致求和逻辑并非针对当前外层的i进行,完全不符合预期。

    正确写法需重命名内层索引,并添加匹配条件,确保求和仅针对与外层i相同的元组:

    subject to {
     sixteen: forall(<i, u> in IU, t in 1..NT) 
       FTU[i, u, t] == sum(<i_c, c> in IC : i_c == i) FCTU[i, u, c, t];
    };
    
  3. 元组字段名语义混淆
    _IU_元组的第二个字段是t,但约束中却用u作为变量名(<i, u> in IU),语法虽合法但语义易混淆,建议调整元组定义以匹配变量名:

    tuple _IU_ {
      int i;
      int u; // 改为u,和约束中的变量名对应
    };
    

内容的提问来源于stack exchange,提问作者Emerita Mangosing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:49:56