2016-01-22 70 views
1

有沒有辦法列出cplex模型中的所有cplex變量?我對C#界面感興趣。如果您的模型是從文件中讀取的,則Google搜索導致this solution。如果您的模型沒有從文件中讀取,那麼在模型中找不到ILPMatrix(除非您已經專門創建了LPMatrix)。Cplex列出所有模型變量(.NET)

我想我可以寫出來,並在讀回:

Cplex m = new Cplex(); 
// add lots of variables with lots of different names and constraints 
// perhaps even solve the model: m.Solve(); 

// now list out the variables: 
m.ExportModel("myModel.lp"); 
m.ImportModel("myMOdel.lp"); 
m.Solve(); 

IEnumerator mEnum = m.GetLPMatrixEnumerator(); 
mEnum.MoveNext(); 
ILPMatrix lpmatrix = (ILPMatrix)mEnum.Current; 
double[] x = m.GetValues(lpmatrix); 
for (int j = 0; j < lpmatrix.NumVars.Length; ++j) 
    System.Console.WriteLine("Variable Name:" + lpmatrix.GetNumVar(j).Name + "; Value = " + x[j]); 

但似乎應該有一個更好的辦法。我錯過了什麼嗎?

爲了便於比較,這裏是代碼做同樣的Gurobi型號:

foreach (GRBVar var in m.GetVars()) 
    Console.WriteLine("{0} = {1}", var.Get(GRB.StringAttr.VarName), var.Get(GRB.DoubleAttr.X)); 
+0

從內存中可以看到IloModel各個部分的迭代器。 – TimChippingtonDerrick

回答

1

遺憾的是沒有。您可以將可變對象保留在列表或數組中,並按如下方式訪問它們的值:

... 
Cplex  cplex = new Cplex(); 
INumVar[] varArray = new INumVar[nVariables]; 
... 
foreach (var v in varArray) 
    Console.WriteLine(cplex.GetValue(v).ToString());