【发布时间】:2015-10-15 12:54:03
【问题描述】:
我有一个向量A,即
A = [300; 165; 150; 150; 400; 300; 80; 250; 165; 80; 200]
我试图找到一组由该向量 A 的元素组成的向量,以便它们的元素总和的值尽可能接近 400,并且向量 A 的所有元素都是包含在不相交的向量集中。
例如,400 已经是 400,所以这是第一组没有松弛的向量。
另一个集合是[250 150]的向量,它们的和是400。
另外两个可以是两组向量[300 80],它们的和是380,所以20的slack就妥协了。
另一个是[165 165],它们总和为 330,余量为 70。最后一个是 200 和 150,余量为 50。总余量为 20+20+70+50=160 .
我正在尝试找到一种启发式或算法(不是编程模型),以最大限度地减少松弛。我在 Matlab 中编码。
【问题讨论】:
-
你必须更具体一点。您是否尝试将您的集合拆分为不相交的集合,以便它们的并集包含您原始集合的所有元素?
-
没错。我试图将它们分成不相交的集合,并且它们的联合必须包含原始集合的所有元素。我使用混合整数编程解决了这个问题,但我需要任何其他方法。
-
@aycaaltay 我仍然会理解该集合是一组满足约束的向量:A)向量由
A的元素组成,没有重复元素。 B) 每个向量的和小于等于 400。C) VectorA的所有元素都在其中一个向量中。 -
松弛是方向性的,即如果总和是
420,松弛是-20,总松弛将用-20计算? -
这是 NP-hard 通过减少分区问题。但是,您可以使用动态编程在 O(w*n) 中解决它,其中 w 是最大值,n 是数组元素的数量
标签: algorithm matlab combinatorics heuristics