Gurobi,C#:无法将“int”转换为System.Collections.Generic.List<int>

3
我正在使用Gurobi求解器来解决一个调度问题。我想将我的Gurobi解决方案写入控制台。但是我收到了以下错误信息:
"第1个参数:无法从'int'转换为'System.Collections.Generic.List'"
这段代码在另外两个变量上成功运行并输出到控制台。请问这里出了什么问题?
using System;
using System.Collections.Generic;
using System.Linq;
using Gurobi;

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].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();
    }
}
3个回答

3
您有2个嵌套列表。在这一行中:
X_ijk_list[i].Add(Convert.ToInt32(X_ijk[i, j, k].Get(GRB.DoubleAttr.X))); //

您正在尝试将一个数字添加到第一个嵌套列表中。但是如果您查看声明:

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

你需要一个 List<int>!就像你在这行代码中已经做过的一样:
X_ijk_list[i].Add(new List<int>());

您的解决方案是使用第二个循环中的索引j并将其插入到第二个嵌套列表中:

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

当您在循环中深入时,需要更深入地了解嵌套列表:

X_ijk_list.Add(new List<List<int>>());
X_ijk_list[i].Add(new List<int>());
X_ijk_list[i][j].Add(3);

1
尽管我确信不会有任何关于负评的评论,但我仍然要问为什么? - Mong Zhu

1
在您的情况下,X_ijk_list[i]List<List<int>>,正如第一行所指出的那样。
List<List<List<int>>> X_ijk_list

我猜测可能存在打字错误,通过修改这行代码可以获得所需的行为效果:
X_ijk_list[i][j].Add(Convert.ToInt32(X_ijk[i, j, k].Get(GRB.DoubleAttr.X)));

0
您有一个嵌套了三层的int型List列表。您试图将一个int添加到第i个List中,但由于您的变量是一个嵌套了三层的List,即第i个元素是一个int型List嵌套的List,因此在添加元素时需要传递一个int型List作为参数。而由于您传递的是一个int,所以会出现问题。您需要将该int添加到您的int型List列表中第i个元素的最后一个List中。
X_ijk_list[i][X_ijk_list[i].Count() - 1].Add(Convert.ToInt32(X_ijk[i, j, k].Get(GRB.DoubleAttr.X)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接