0

我在 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 无法解析为变量”出现在配置类中。那是因为变量是在另一个类中初始化的吗?

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

4

1 回答 1

1

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

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

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

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

编辑:编辑后,我想我看到了问题。当方法返回时,局部变量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参数执行的操作?也许只需p15win替换即可buildModel解决您的问题。)

于 2013-08-18T23:53:57.540 回答