-2

我正在研究一个二进制线性程序问题。

我对任何计算机语言都不是很熟悉(刚学了几个月的 Java 和 C++),但我可能不得不使用计算机,因为问题相当复杂。

第一步是为(至少 8 X 8)矩阵 M 中的每个条目声明变量 m_ij。然后我将矩阵的每个元素的相应值分配给这些变量中的每一个。

接下来是生成其他变量集 x_ij1、x_ij2、x_ij3、x_ij4 和 x_ij5,只要 m_ij 的值不为 0。x_ijk 变量的值是 0 或 1,我不必为x_ijk 变量。

可能最简单的方法是为每个变量声明并分配一个值,例如

int* m_11 = 5, int* m_12 = 2, int* m_13 = 0, ... int* m_1n = 1

int* m_21 = 3, int* m_12 = 1, int* m_13 = 2, ... int* m_2n = 3

然后选择不为0的变量,并相应地声明x_ij1~x_ij5。

但这可能工作量太大,特别是因为我要为这个问题考虑许多不同的矩阵。

有没有办法自动做到这一点?

我知道一点 Java 和 C++,我正在考虑在 C++ 中使用 lp_solve 包(解决二进制整数线性程序问题),但如果我能轻松做到这一点,我愿意使用任何其他语言或程序。

我确信一定有某种方法可以做到这一点(可能使用循环,我猜?),这是一个非常简单的任务,但我只是不知道,因为我没有太多的编程语言。

我的一个团队编写了一个程序,用于生成满足我们需要的某些条件的随机矩阵,所以如果我可以使用该矩阵作为我的输入,它可能是理想的,但到目前为止,任何方法都可以。

比如说,如果有办法用 MS excel 来做,比如将矩阵条目放入 excel 文件中的单元格,然后将其导入 C++ 并自动生成变量并为其赋值,那么这将大大简化任务交易!

4

3 回答 3

0

在 C++ 中,你可以使用一个std::vector向量,比如

std::vector<std::vector<int>> matrix;

您不需要为矩阵值使用单独的变量,当您拥有矩阵时为什么要这样做?

我不明白您需要在评估truefalse. 而是直接放入std::vector您的条件评估为的坐标中true

std::vector<std::pair<int, int> true_values;
for (int i = 0; i < matrix.size(); i++)
{
    for (int j = 0; j < matrix[i].size(); j++)
    {
        if (some_condition_for_this_matrix_value(matrix[i][j], i, j) == true)
            true_values.emplace_back(std::make_pair(i, j));
    }
}

现在你有一个包含所有矩阵坐标的向量,你的条件是true


如果你真的想同时拥有truefalse值,你可以使用 astd::unordered_mapstd::pair包含矩阵坐标作为键和bool值的 a:

// Create a type alias, as this type will be used multiple times
typedef std::map<std::pair<int, int>, bool> bool_map_type;
bool_map_type bool_map;

将矩阵中的所有值插入此映射,矩阵的坐标作为键,映射值作为truefalse取决于您拥有的任何条件。

要从中获取所有条目的列表,bool_map您可以使用以下命令删除任何false条目std::remove_if

std::remove_if(bool_map.begin(), bool_map.end(),
    [](const bool_map_type::value_type& value) {
        return value.second == false;
    };

现在您有一个地图,其中仅包含其值为 的条目true。遍历此地图以获取矩阵的坐标


当然,我可能完全误解了你的问题,在这种情况下,你当然可以无视这个答案。:)

于 2013-02-15T16:25:22.477 回答
0

我知道 C++ 和 Matlab(不是 Python),在你的情况下,我真的会选择 Matlab,因为当你开始编程时它更容易使用(但当你发现 Matlab 的限制时不要忘记回到 C++ )。

在 Matlab 中,您可以很容易地定义矩阵:只需键入矩阵的名称和要设置的索引:

m(1,1) = 1
m(2,2) = 1

为您提供一个 2x2 单位矩阵(Matlab 中的索引以 1 开头,默认情况下条目为 0)。你也可以用同样的方法定义 3d 矩阵:

x(1,2,3) = 2

对于从 Excel 导入,如果您将 Excel 文件保存为 CSV 格式,则可以使用该功能dlmread在 Matlab 中读取它。您也可以稍后尝试直接在 Matlab 中实现您的算法。

最后,如果你想解决你的二进制整数程序,Matlab 中已经有一个内置函数,调用bintprog它可以为你解决它。

希望能帮助到你!

于 2013-02-15T16:34:11.840 回答
0

Matlab 似乎确实非常适合这项任务。尽管@Dr_Sam 提供的示例确实会即时创建矩阵,但我建议您在分配值之前初始化它们。这样,如果工作区中已经存在同名的东西,您的代码仍然会以正确的变量结束,并且您的变量将始终具有预期的大小。

假设您要定义一个 8x8 方形矩阵:

m = zeros(8)

imax现在一般来说,如果你想初始化一个大小为, jmax,的三维矩阵kmax

imax = 8;
jmax = 8;
kmax = 5;
x = zeros(imax,jmax,kmax);

现在分配或读取这些矩阵非常容易,请注意 m 的长度和 with 已选择与 的第一个维度相同x

m(3,4) = 4; %Assign a value
myvalue = m(3,4) %read the value
m(:,1) = 1:8 *Assign the values 1 through 8 to the first column

x(2,4,5) = 12; %Assign a single value to the three dimensional matrix
x(:,:,2) = m+1; Assign the entire matrix plus one to one of the planes in x.
于 2013-02-15T17:42:38.593 回答