首页 > 解决方案 > 用于映射具有相等分布的两个向量的 MATLAB 代码

问题描述

我有一个我正在尝试移植到 MATLAB 的 python 代码。

该代码执行以下操作:

假设我有两个列表 A = [0,1,2,3,4] 和 B = [0,1,2]。它创建一个大小为 5x3 的关联矩阵 M,如果 A 和 B 之间存在关联,则其元素为 1,否则为 0。需要注意的是,A 必须在 B 之间平均分配(尽可能)。例如,B[0] 和 B[1] 可以与来自 A 的 2 个不同元素相关联,而 B[2] 与最后一个元素相关联。关联应该是随机的。此外,A 中的一个元素不能仅映射到 B 中的一个元素。

在python中,我通过

S = len(A)
V = len(B)
random.shuffle(A)
assoc = {v: A[v::V] for v in range(V)}
M = {(s, v): 1 if s in assoc[v] else 0 for s in range(S) for v in range(V)}

如何在 MATLAB 中实现这一点?我真的不需要中间关联。我感兴趣的是矩阵M。

标签: pythonmatlabvector

解决方案


好的,我使用整数编程解决了它。事情就是这样。

令 x_ij 是一个二进制变量,表示从列表 A 到列表 B 的映射。因此,加载到列表 B 中的元素上的是 L_j = sum_i x_ij。令 z = max_j L_j。我们想尽量减少这种情况。

约束是列表 A 中的一个元素不能映射到列表 B 中的多个元素。因此,sum_j x_ij = 1。

这是在 MATLAB 中使用优化工具箱实现的:

assignprob = optimproblem;
x = optimvar('x', numel(A), numel(B), 'Type', 'integer', ...
    'LowerBound', 0, 'UpperBound', 1);
z = optimvar('z', 'LowerBound', 0);

cons1 = sum(x, 2) == 1;
loads = sum(x, 1);
cons2 = z >= loads;

assignprob.Objective = z;
assignprob.Constraints.cons1 = cons1;
assignprob.Constraints.cons2 = cons2;

[sol, fval] = solve(assignprob);

我不知道这是否是最好的解决方案,但它确实有效。


推荐阅读