使用cplex在java中定义二进制决策变量

时间:2016-07-26 18:46:51

标签: java cplex

我正在尝试使用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);  
                    }   
                }

2 个答案:

答案 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 ...
}