2017-03-09 38 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

루프 변수를 혼합합니다. 외부 루프 정도로

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

는 하드 n_* 변수 및 더미 42

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

재현 코드

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

과 동일한이어야하고, i 다음 jkX_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;