【发布时间】:2016-01-26 14:39:14
【问题描述】:
我有以下向量(或 C 矩阵和 V 向量)和 K1、K2、K3 常量
Constraints [c11 + c12 + c13 + ... + c1n] <= K1
[c21 + c22 + c23 + ... + c2n] <= K2
[c31 + c32 + c33 + ... + c3n] <= K3
-------------------------------------------------
Values [ v1 + v2 + v3 + ... + vn] -> Max
作为输入,我得到 C 和 V 的值,作为输出,我想提供仅包含 0 和 1 值的 X 向量,并且给了我
[c11 * x1 + c12 * x2 + c13 * x3 + ... + c1n * xn <= K1
[c21 * x1 + c22 * x2 + c23 * x3 + ... + c2n * xn <= K2
[c31 * x1 + c32 * x2 + c33 * x3 + ... + c3n * xn <= K3
------------------------------------------------------
[ v1 * x1 + v2 * x2 + v3 * x3 + ... + vn * xn] -> Max
作为一个过于简化的例子:
输入:
K1 = 15
K2 = 20
K3 = 10
c1 = [3, 6, 8] | sum(c1 * X) <= 15
c2 = [8, 9, 3] | sum(c2 * X) <= 20
c3 = [7, 5, 2] | sum(c3 * x) <= 10
v = [2, 5, 3] | sum( v * X) -> Max
输出提供 X 向量,该向量使约束内的值最大化:
X = [0, 1, 1]
我正在寻找一种优雅的算法(也可能是 Java 或 C# 实现),根据输入为我提供输出。我们可以假设约束的数量始终为 3,并且提供了 C 和 V(以及 K1、K2、K3)的所有值。
另一个简单的例子是:你有一个房间(3D),所以你的约束是 width、height 和 length房间(K1、K2、K3),并且您有一个家具物品清单(n 个物品)。我所有的家具都有自己的 lenght (c1i)、width (c2i) 和 height (c3i) 和值 (vi)。您想用最有价值的家具物品打包房间,这些家具物品适合房间尺寸。所以输出是一个 n 长的 X 变量,它只包含 0 和 1 值,如果 xi = 1,第 i 个元素被选中进入房间,如果 xi = 0,第 i 个元素不会被选中在房间里。
【问题讨论】:
-
那是整数线性规划,但如果 X 只有三个元素,每个元素都是 0 或 1,那么尝试所有 8 个元素会简单得多。
-
这就是为什么我提到我的例子过于简化了。 X 有 n 个元素,与 V 相同。基本上每个 i 元素都有自己的 c1i、c2i、c3i 和 vi 值,并且该元素要么被选中(xi 为 1),要么不被选中(xi 为 0)
-
向量 X 有多大?
-
就像我在之前的评论中提到的:X 有 n 个元素,与 V 相同。基本上每个 i 元素都有自己的 c1i、c2i、c3i 和 vi 值,并且元素要么被选中(xi 为 1 ) 与否 (xi 为 0)
-
您要解决的问题称为multidimensional knapsack problem,请参阅this post
标签: algorithm linear-programming