CPLEX报错:Data元素Products已重复定义的解决方案咨询
解决CPLEX OPL中"Data element 'Products' has already been set"错误
错误原因
你遇到的错误本质是OPL检测到Products集合被重复赋值,但从代码看你只在.dat里赋值了一次。问题出在参数的赋值方式:你给关联字符串集合的参数(如Stock、Demand)用了顺序数组赋值,而OPL对字符串集合的参数需要显式索引绑定,这种数组赋值方式会触发内部的集合元素重复初始化检测,导致报错。
正确解决步骤
1. 保留.mod文件中的集合声明
必须在.mod里声明集合类型,模型需要依赖这些定义来构建变量、约束和表达式,不能只在.dat里定义集合。你的.mod里的集合声明是正确的:
{string} Products; // 定义产品集合 {string} Resources; // 定义资源集合
2. 修改.dat文件的参数赋值方式
将原来的顺序数组赋值改为索引绑定赋值,明确指定每个集合元素对应的参数值,这样OPL能正确匹配,避免冲突:
修改后的.dat文件代码:
/********************************************* * OPL 22.1.1.0 Data * Author: berka * Creation Date: Nov 22, 2024 at 12:49:09 AM *********************************************/ // 集合赋值(保持不变) Products = {"Spaetzle", "Pasta"}; Resources = {"Flour", "Eggs"}; // 参数改为索引绑定赋值 Stock["Flour"] = 130; Stock["Eggs"] = 100; Consumption["Spaetzle"]["Flour"] = 3; Consumption["Spaetzle"]["Eggs"] = 1; Consumption["Pasta"]["Flour"] = 2; Consumption["Pasta"]["Eggs"] = 2; Demand["Spaetzle"] = 100; Demand["Pasta"] = 150; Income["Spaetzle"] = 1.5; Income["Pasta"] = 2;
3. 可选:简化二维参数赋值
对于二维参数Consumption,也可以用以下简化方式赋值,效果和逐行一致:
Consumption = [["Spaetzle": ["Flour":3, "Eggs":1]], ["Pasta": ["Flour":2, "Eggs":2]]];
为什么不能只在.dat里定义集合?
OPL的模型逻辑(变量、约束、表达式)依赖.mod里的集合类型定义,如果你删除.mod里的{string} Products;,模型无法识别Products的类型,会报"Products不存在"的错误,所以必须在.mod里声明集合,在.dat里赋值。
内容的提问来源于stack exchange,提问作者Tosawi
相关产品推荐
相关产品推荐

