2013-08-18 175 views
0

我在Java中使用cplex,我想從另一個類 (解決後)訪問變量的值。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

您可以使用語法OtherClass.p15訪問在另一個類中聲明的static變量。如果變量是一個實例變量(在聲明中沒有static關鍵字),那麼你需要其他的類的實例來訪問變量:

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

在這兩種情況下,你需要確保變量右引號access qualifiers,以便引用代碼可以訪問它。

不知道更多關於您的整體軟件結構,很難說什麼「最優雅」的方式來解決這個問題。

編輯:編輯後,我想我看到了問題。當方法buildModel返回時,局部變量p15不再存在(超出範圍)。您需要將數組存儲在某處。最簡單的變化,我想,會修改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); 
       } 
      } 
     } 
[...] 

然後在您的Ausführungmain方法,您可以訪問它像

. . . 
if(cplex.getValue(MainTSP.p15[i][j][q]) >= 1) . . . 

有沒有按」似乎沒有任何理由使p15成爲實例字段。 (如果某些其他原因,你需要它是一個實例字段,你這時就需要使用類似MainTSP tsp = new MainTSP();創建的MainTSP一個實例。)

另一種方法是使buildModel回報p15,然後你可以分配返回值在你Ausführung類名爲p15另一個變量:

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); 

(或許這就是s您計劃如何處理w參數?也許簡單地用代替w中的buildModel就可以解決你的問題。)

+0

我添加了一些關於程序結構的更多信息。我如何創建另一個類的實例? – Hendrik

+0

@亨德里克 - 這有幫助。我在我的答案中添加了一些代碼,提出了幾種處理此問題的方法。 –