2017-03-09 5 views
0

Ich versuche eine Entscheidungsvariable aus meinem MIP-Modell in die Konsole zu schreiben. Ich erhalte den FehlerGurobi & C#: Index außerhalb des Bereichs

System.ArgumentOutOfRangeException: Index war außerhalb des Bereichs. Muss nicht negativ und kleiner als die Größe der Sammlung sein.

Wie kann ich das beheben?

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

Debug Ihr Programm, und dort werden Sie sehen, was Ihr Fehler ist. Du versuchst etwas zu bekommen oder zu setzen, solange es keinen gültigen Eintrag gibt. – lordkain

+1

Da ist eine Menge Zeug, die du hier nicht siehst. Wie lauten die Werte für 'n_machines' und' n_jobs'? Bitte lesen Sie die Hilfe, speziell, wie Sie eine [mcve] – Equalsk

+1

erstellen Was noch wichtiger ist, was ist 'X_ijk'? – rbm

Antwort

2

Sie mischen Ihre Loop-Variablen. Äußere Schleife ist k, dann i dann j, so

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 

und gleiche gilt für die

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

A reproduzierbaren Code mit fest codierten n_* Variablen sein sollte, und Dummy 42 anstelle von 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(); 
     } 
    } 
} 

produziert

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; 
Verwandte Themen