CPLEX读写数据文件报错“Data element Example已设置”的解决方法
问题解决:Data element Example has been already set
错误原因
你在模型里已经通过int Example [i in Number]=i;给Example数组直接赋值了,之后main函数又加载了包含Example定义的Example.dat数据文件,同一个数据元素被重复设置,所以触发了这个错误。
解决方案
下面三种方法选一个就行:
方法1:模型只声明变量,让数据文件提供值
把模型里的Example改成仅声明不赋值,让数据文件来提供它的值:
range Number= 0..6; int Example [i in Number]; // 只声明,不赋值 execute { var o=new IloOplOutputFile("Example.dat"); o.writeln("Example="); o.writeln(Example); o.writeln(";"); o.close(); }
这样模型里的Example只是占位,实际值由加载的Example.dat提供,不会冲突。
方法2:重命名变量避免重复
如果要保留模型里的Example赋值,同时还要读取数据文件到另一个数组,就把其中一个变量名改掉:
- 修改execute块的写入代码,输出的变量名换成
ExampleFromFile:
execute { var o=new IloOplOutputFile("Example.dat"); o.writeln("ExampleFromFile="); o.writeln(Example); o.writeln(";"); o.close(); }
- 在模型里新增一个数组来接收这个值:
range Number= 0..6; int Example [i in Number]=i; int ExampleFromFile [i in Number]; // 新增数组,用来读数据文件的内容
两个变量名不同,就不会出现重复设置的问题。
方法3:去掉重复的数据源加载
如果你的需求只是写入数据文件,不需要在同一个模型里读取它,直接删掉main函数里加载Example.dat的代码:
main { var source = new IloOplModelSource("Write and read from the data file.mod"); var cplex = new IloCplex(); var def = new IloOplModelDefinition(source); var opl = new IloOplModel(def,cplex); // 删掉下面这两行,避免加载重复的数据源 // var data = new IloOplDataSource("Example.dat"); // opl.addDataSource(data); opl.generate(); if (cplex.solve()) { writeln("OBJ = " + cplex.getObjValue()); } else { writeln("No solution"); } }
内容的提问来源于stack exchange,提问作者MO MO MA
相关产品推荐
相关产品推荐

