Gurobi & C#:索引超出范围
Gurobi & C#: Index out of range
我正在尝试将我的 MIP 模型中的决策变量写入控制台。我收到错误
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
我该如何解决这个问题?
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();
}
}
您正在混合循环变量。外循环是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;
我正在尝试将我的 MIP 模型中的决策变量写入控制台。我收到错误
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
我该如何解决这个问题?
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();
}
}
您正在混合循环变量。外循环是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;