CPLEX OPL中如何用数组定义范围并指定元素为索引?
在CPLEX OPL中实现你的需求:完全可行!
没问题,你的需求在CPLEX OPL里是可以实现的!作为新手,咱们一步步拆解来调整和实现:
首先先看你给出的原始代码片段:
{int} t1 = {1,2,3}; {int} t2 = {4,5,6}; range t= t1..t2; C[t4] >= sum (d in d) d * task[t4][d];
这里有几个小语法问题需要修正,比如range不能直接用集合作为边界、sum里的变量名重复,咱们一步步解决这些问题并实现你的需求。
核心实现步骤
1. 定义特定值的集合
直接给t1、t2、t3赋值你需要的特定整数集合即可,比如:
{int} t1 = {1,2,3}; // 你要用来当索引的目标集合 {int} t2 = {4,5,6}; // 你的t2特定值集合 {int} t3 = {7,8,9}; // 你的t3特定值集合
2. 定义覆盖t1到t4的范围
OPL的range需要用整数作为起始和结束边界,如果你想让范围包含t1的所有元素到t4(假设t4是固定值或决策变量),可以用集合的min()函数取t1的最小元素作为范围起点:
// 假设t4是固定值,比如10;如果是决策变量,后面可以定义它的取值范围 int t4 = 10; // 定义范围:从t1的最小元素(1)开始,到t4(10)结束 range t = min(t1)..t4;
这样range t就包含了1到10的所有整数,自然覆盖了t1里的1、2、3,满足你用这些值当索引的需求。
3. 使用t1的元素作为索引
t1里的整数可以直接作为数组的索引,只要数组的索引范围包含这些值就行。比如定义你用到的数组:
// 定义d的集合(建议集合名和元素名区分开,避免原代码里的变量名重复问题) {int} D = {1,2}; // 替换成你实际的d集合 // 定义数组,索引范围用上面的range t(包含t1的元素) float C[t]; float task[t][D];
现在t1里的1、2、3就可以直接用来访问数组,比如C[1]、task[2][1]都是完全合法的。
4. 修正约束条件
原代码里的sum (d in d)存在变量名重复的问题,咱们把集合名改成D,元素用d,同时明确约束的适用范围:
subject to { // 针对t4这个值的约束(如果t4是决策变量,需要先定义它属于range t) C[t4] >= sum(d in D) d * task[t4][d]; }
完整示例代码
把上面的部分整合起来,就是一个可运行的框架:
// 定义特定值集合 {int} t1 = {1,2,3}; {int} t2 = {4,5,6}; {int} t3 = {7,8,9}; // 定义t4(如果是决策变量,改成int t4 in t;) int t4 = 10; // 定义范围 range t = min(t1)..t4; // 定义d的集合 {int} D = {1,2}; // 定义数组 float C[t]; float task[t][D]; // 约束条件 subject to { C[t4] >= sum(d in D) d * task[t4][d]; }
关键注意点
- 如果
t4是决策变量(不是固定值),需要把它定义为int t4 in t;,让它属于咱们之前定义的range t。 - 如果你想让范围只包含
t1的元素加上t2、t3的元素到t4,可以用集合合并:{int} allT = t1 union t2 union t3 union {t4};,然后基于这个集合来操作,但如果是连续范围的话,用min(t1)..t4会更高效。
内容的提问来源于stack exchange,提问作者katates
相关产品推荐
相关产品推荐

