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

如何通过Java API在CPLEX中为OPL模型添加数组至数据源?

在Java中给CPLEX OPL模型添加数组/多维数组数据

核心要点

直接传入Java原生数组或CPLEX提供的数组类型(如IloIntArray)即可,不能用字符串形式的数组(比如你尝试的"[1,1]")。以下是不同场景的代码示例:


1. 一维数组(对应OPL中的一维数组定义)

假设OPL模型里定义:

int c[1..2]; // 一维整数数组,索引范围1到2

Java中添加数据的两种方式:

// 方式1:使用Java原生int数组
int[] cArray = new int[]{1, 1};
dataSource.addElement(dataSource.makeElement("c", cArray));

// 方式2:使用CPLEX提供的IloIntArray(推荐,更贴合CPLEX API)
IloIntArray cplexCArray = env.intArray(new int[]{1, 1});
dataSource.addElement(dataSource.makeElement("c", cplexCArray));

2. 多维数组(对应OPL中的多维数组定义)

假设OPL模型里定义:

int d[1..2][1..2]; // 二维整数数组

Java中添加数据的两种方式:

// 方式1:使用Java原生二维数组
int[][] dArray = new int[][]{{1, 2}, {3, 4}};
dataSource.addElement(dataSource.makeElement("d", dArray));

// 方式2:使用CPLEX提供的IloIntArrayArray
IloIntArrayArray cplexDArray = env.intArrayArray();
cplexDArray.add(env.intArray(new int[]{1, 2}));
cplexDArray.add(env.intArray(new int[]{3, 4}));
dataSource.addElement(dataSource.makeElement("d", cplexDArray));

3. 基于自定义索引集的数组

如果OPL模型使用自定义索引集(而非连续数字索引),比如:

{string} Products = ...; // 字符串类型的索引集
int cost[Products]; // 对应索引集的数组

Java中需要先创建索引集,再添加对应数组(数组元素顺序要和索引集元素顺序一致):

// 第一步:创建并添加索引集元素
IloOplElement productsSet = dataSource.makeSetElement("Products", new String[]{"Apple", "Banana", "Orange"});
dataSource.addElement(productsSet);

// 第二步:添加对应数组,元素顺序和索引集匹配
int[] costArray = new int[]{5, 3, 4};
dataSource.addElement(dataSource.makeElement("cost", costArray));

注意事项

  • 确保Java数组的维度、元素数量和OPL模型中的数组定义完全匹配,否则会出现数据不兼容的错误。
  • CPLEX会自动处理Java数组的0-based索引和OPL的自定义索引范围之间的映射,无需手动调整索引值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:11:03