2017-03-09 108 views
0

我想從我的MIP模型寫入一個決策變量到控制檯。我得到錯誤Gurobi&C#:索引超出範圍

System.ArgumentOutOfRangeException:索引超出範圍。必須是非負數且小於集合的大小。

我該如何解決這個問題?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Gurobi;  

if (status == GRB.Status.OPTIMAL) 
{ 
    List<List<List<int>>> X_ijk_list = new List<List<List<int>>>(); 

    Console.WriteLine("X_ijk:"); 
    for (int k = 0; k < n_machines; ++k) 
    { 
     Console.WriteLine("Maschine" + k); 
     X_ijk_list.Add(new List<List<int>>()); 

     for (int i = 0; i < n_jobs; ++i) 
     { 
     X_ijk_list[i].Add(new List<int>()); 

     for (int j = 0; j < n_tasks_job[i]; ++j) 
     { 
      X_ijk_list[i][j].Add(Convert.ToInt32(X_ijk[i, j, k].Get(GRB.DoubleAttr.X))); // error here 
      Console.Write(X_ijk_list[i][j][k]); 
      Console.Write(";"); 
      } 
     Console.WriteLine(); 
     } 
    } 
+1

調試程序,在那裏你會看到你的缺點是什麼。在沒有有效條目的情況下,您正在嘗試獲取或設置某些東西 – lordkain

+1

有一些東西在這裏,您沒有顯示。像'n_machines'和'n_jobs'這些東西的價值是什麼?請閱讀幫助,具體如何創建[mcve] – Equalsk

+1

更重要的是,什麼是'X_ijk'? – rbm

回答

2

你在混合你的循環變量。外環是k,然後i然後j,所以

X_ijk_list[i][j].Add(Convert.ToInt32(X_ijk[i, j, k].Get(GRB.DoubleAttr.X))); // error here 

應該是

X_ijk_list[k][i].Add(Convert.ToInt32(X_ijk[i, j, k].Get(GRB.DoubleAttr.X))); // error here 

X_ijk_list[k].Add(new List<int>()); 

可再現代碼與硬編碼n_*變量和虛設42

和相同而不是X_ijk[i, j, k].Get(GRB.DoubleAttr.X)

void Main() 
{ 
    var n_machines = 5; 
    var n_jobs = 5; 
    var n_tasks_job = new int[] { 5, 5, 5, 5, 5 }; 

    List<List<List<int>>> X_ijk_list = new List<List<List<int>>>(); 

    Console.WriteLine("X_ijk:"); 
    for (int k = 0; k < n_machines; ++k) 
    { 
     Console.WriteLine("Maschine" + k); 
     X_ijk_list.Add(new List<List<int>>()); 

     for (int i = 0; i < n_jobs; ++i) 
     { 
      X_ijk_list[k].Add(new List<int>()); 

      for (int j = 0; j < n_tasks_job[i]; ++j) 
      { 
       //X_ijk_list[i][j].Add(Convert.ToInt32(X_ijk[i, j, k].Get(GRB.DoubleAttr.X))); // error here 

       X_ijk_list[k][i].Add(42); // dummy data 

       Console.Write(X_ijk_list[k][i][j]); 
       Console.Write(";"); 
      } 
      Console.WriteLine(); 
     } 
    } 
} 

產生

X_ijk: 
Maschine0 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
Maschine1 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
Maschine2 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
Maschine3 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
Maschine4 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42; 
42;42;42;42;42;