我正在尝试使用cplex在java中定义二进制决策变量。这是一个二维变量。这意味着如果路径从特定站开始,它应该是1或者其他0.我有一组站,J和一组路径,K和我的决策变量是Z_jk。目前我正在定义如下的代码,但它不起作用。有人可以帮帮我吗?
提前致谢。
// define variables
z = new IloNumVar[stations_start.size()][];
for (int j=0; j<stations_start.size();j++) {
z[j] = cplex.numVarArray(paths.size(),0,1);
for (int k=0;k<paths.size();k++) {
z[j][k] = cplex.numVar(new_column, 0, 1,"z");
z[j][k].setName("z."+j+"."+k);
}
}
答案 0 :(得分:0)
您正在尝试创建二元决策变量的二维数组。你得到了什么错误?
尝试查看CPLEX提供的一些示例代码。请参阅例如transport.java,其中包含一些声明和初始化的变量的2D数组,如下所示:
IloNumVar[][] x = new IloNumVar[nbSupply][];
IloNumVar[][] y = new IloNumVar[nbSupply][];
for (int i = 0; i < nbSupply; i++) {
x[i] = cplex.numVarArray(nbDemand, 0., Double.MAX_VALUE);
y[i] = cplex.numVarArray(nbDemand, 0., Double.MAX_VALUE);
}
答案 1 :(得分:0)
对于二进制决策变量,您可能更喜欢使用IloBoolVar
而不是IloNumVar
甚至是IloIntVar
选项。
但是,您确实需要以两种方式之一声明尺寸。您已声明new IloNumVar[stations_start.size()][];
,但未指定第二维。最简单的方法是声明:
z = new IloBoolVar[stations_start.size()][paths.size()];
或者,您可以保留现有的声明,但是在循环中添加第二个维度:
z = new IloBoolVar[stations_start.size()][];
for (int j=0; j<stations_start.size(); j++) {
z[j] = new IloBoolVar[paths.size()];
... existing assignments ...
}