从其他类cplex java变量访问

时间:2013-08-18 23:50:46

标签: java cplex

我在Java中使用cplex,我想从另一个类访问变量的值 (解决后)。

我应该打印变量p15 [i] [j] [q]的程序配置类如下所示:

import [...]
public class Ausführung {
public static void main(String[] args) throws IOException {
try{
            String filename = "[...]
            Data data = new Data(filename);

            IloCplex cplex = new IloCplex();
            IloNumVar[][][] w = new IloIntVar[n][n][n]; 

            MainTSP.buildModel(cplex, data, w);

            if(cplex.solve()){
            for(int q=0; q< data.distance1.length-1; q++){
                for(int ii=0; ii<data.distance1.length; ii++){
                    for(int j=0; j<data.distance1.length; j++){
                       if(cplex.getValue(p15[i][j][q]) >= 1) System.out.println("p15");
                    }
                }
            }
            cplex.end();
        }
        [...]
    }
}

变量在我的主程序类中初始化,如下所示:

public class MainTSP {
    static void buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

    IloNumVar[][][] p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
[...]

不幸的是,配置类中出现错误消息:“p15无法解析为变量”。 那是因为变量是在另一个类中初始化的吗?

解决问题最优雅的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用语法static访问在另一个类中声明的OtherClass.p15变量。如果变量是实例变量(声明中没有static关键字),那么您需要另一个类的实例来访问变量:

OtherClass thing = . . .;
. . . cplex.getValues(thing.p15[i][j][q]) . . .

在这两种情况下,您都需要确保变量具有正确的access qualifiers,以便引用代码可以访问它。

在不了解您的整体软件结构的情况下,很难说出解决问题的“最优雅”方式。

编辑:编辑后,我想我看到了问题。当方法p15返回时,局部变量buildModel不再存在(超出范围)。您需要将数组存储在任何位置。我认为最简单的改变是将MainTSP类修改为:

public class MainTSP {
    static IloNumVar[][][] p15;

    static void buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

        p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
[...]

然后在main类的Ausführung方法中,您可以像

一样访问它
. . .
if(cplex.getValue(MainTSP.p15[i][j][q]) >= 1) . . .

似乎没有任何理由让p15成为实例字段。 (如果由于某些其他原因,您需要将其作为实例字段,则需要使用MainTSP之类的内容创建MainTSP tsp = new MainTSP();的实例。)

另一种方法是让buildModel返回p15,然后您可以将返回值分配给p15类中另一个名为Ausführung的变量:

public class MainTSP {

    static IloNumVar[][][] buildModel(IloMPModeler model, Data data, IloNumVar[][][] w) throws IloException{

        p15 = new IloIntVar[n][n][n];           
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                for(int q=0; q<n; q++){
                    p15[i][j][q] = model.intVar(lb, ub);
                }
            }
        }
        return p15;
[...]

然后:

IloNumVar[][][] p15 = MainTSP.buildModel(cplex, data, w);

(也许这就是您计划对w参数执行的操作?也许只需将p15替换为w buildModel即可解决您的问题。)