【问题标题】:minimization of maximized non-overlapping numbers from matrix从矩阵中最小化最大化的非重叠数
【发布时间】:2023-03-05 19:02:01
【问题描述】:

我正在寻找一种有效的解决方案,它可以从矩阵中选择不重叠的值,而不考虑成本的最小化。匈牙利算法通过选择给出最小成本的组合来解决分配问题。但是我想要一个最大化的数字的最小化。

例如:

    J1 J2 J3
w1 | 5  4  5 |
w2 | 3  2  5 |
w3 | 1  5  2 |

匈牙利人会选择

W3 --> J1 = 1
W2 --> J2 = 2
W1 --> J3 = 5

总成本 = 1+2+5 = 8

但最大数量为 5。

我希望组合被选为

W1 --> J2 = 4
W2 --> J1 = 3
W3 --> J3 = 2

总成本 = 4+3+2 = 9

但最大数量是 4。

所以我想要的输出是: 4、3、2

而不是最小化成本。我想选择一个最大数量最少的组合。

【问题讨论】:

  • 你自己尝试过什么?你遇到了什么问题? StackOverflow 可以帮助您获得可行的解决方案,并且可能会帮助您找到更有效的解决方案,但在不提供自己的情况下就更好的解决方案征求意见绝对不是 SO 的目的。
  • 我尝试使用蛮力迭代和分配算法(匈牙利语)来解决它,但我的任务不是最小化成本,因此我正在寻找一个可以解决更大示例的智能解决方案。跨度>
  • this 的可能重复项。有一个我认为还可以的答案。它可以作为一个起点。

标签: algorithm matrix mathematical-optimization


【解决方案1】:

您可以选择 MIP 模型吗?

如果您表示您的矩阵A,添加二进制变量x_ij 表示是否选择了一个元素并将k 作为最大选择值,以下将起作用(ij 是行和列索引):

最大化k主题

1. Σ(j ∈ J) x_ij = 1, ∀i ∈ I(每行一个元素)

2. Σ(i ∈ I) x_ij = 1, ∀j ∈ J(每列一个元素)

3. k ≤ A_ij * x_ij, ∀i ∈ I, ∀j ∈ Jk 小于或等于每个选定元素)

MiniZinc 中的实现(使用给定数据):

int: Items = 3;

set of int: ITEM = 1..Items;

array[ITEM, ITEM] of int: A = [| 5, 4, 5
                               | 3, 2, 5 
                               | 1, 5, 2 |];
  
array[ITEM, ITEM] of var 0..1: x;

var int: k;

constraint forall(i in ITEM)
    (sum(j in ITEM)(x[i, j]) = 1);

constraint forall(j in ITEM)
    (sum(i in ITEM)(x[i, j]) = 1);

constraint forall(i, j in ITEM)
    (k >= A[i, j] * x[i, j]);

solve minimize k;

output ["k=\(k)\n"] ++ 
["x="] ++ [show2d(x)];

给予:

k=4
x=[| 0, 1, 0 |
     1, 0, 0 |
     0, 0, 1 |]

【讨论】:

  • 你能告诉我它是否适用于 n!=m 的 nxm 矩阵。如果是,如何合并到代码中
  • 如果n>m,您将更改1. Σ(j ∈ J) x_ij <= 1, ∀i ∈ I,如果n<m,您将更改2. Σ(i ∈ I) x_ij <= 1, ∀j ∈ J
猜你喜欢
  • 2012-05-09
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2011-01-15
  • 1970-01-01
  • 2020-05-27
相关资源
最近更新 更多