我在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无法解析为变量”。 那是因为变量是在另一个类中初始化的吗?
解决问题最优雅的方法是什么?
答案 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
即可解决您的问题。)